44#ifndef _NETGRAPH_NETGRAPH_H_
45#define _NETGRAPH_NETGRAPH_H_
48#error "This file should not be included in user level programs"
53#include <sys/malloc.h>
54#include <sys/module.h>
56#include <sys/refcount.h>
58#ifdef HAVE_KERNEL_OPTION_HEADERS
59#include "opt_netgraph.h"
64#define NG_SEPARATE_MALLOC
73#define _NG_ABI_VERSION 12
75#define NG_ABI_VERSION (_NG_ABI_VERSION + 0x10000)
77#define NG_ABI_VERSION _NG_ABI_VERSION
128#define HK_MAGIC 0x78573011
136#define HK_INVALID 0x0001
137#define HK_QUEUE 0x0002
138#define HK_FORCE_WRITER 0x0004
139#define HK_DEAD 0x0008
140#define HK_HI_STACK 0x0010
141#define HK_TO_INBOUND 0x0020
148#define _NG_HOOK_REF(hook) refcount_acquire(&(hook)->hk_refs)
149#define _NG_HOOK_NAME(hook) ((hook)->hk_name)
150#define _NG_HOOK_UNREF(hook) ng_unref_hook(hook)
151#define _NG_HOOK_SET_PRIVATE(hook, val) do {(hook)->hk_private = val;} while (0)
152#define _NG_HOOK_SET_RCVMSG(hook, val) do {(hook)->hk_rcvmsg = val;} while (0)
153#define _NG_HOOK_SET_RCVDATA(hook, val) do {(hook)->hk_rcvdata = val;} while (0)
154#define _NG_HOOK_PRIVATE(hook) ((hook)->hk_private)
155#define _NG_HOOK_NOT_VALID(hook) ((hook)->hk_flags & HK_INVALID)
156#define _NG_HOOK_IS_VALID(hook) (!((hook)->hk_flags & HK_INVALID))
157#define _NG_HOOK_NODE(hook) ((hook)->hk_node)
158#define _NG_HOOK_PEER(hook) ((hook)->hk_peer)
159#define _NG_HOOK_FORCE_WRITER(hook) \
160 do { hook->hk_flags |= HK_FORCE_WRITER; } while (0)
161#define _NG_HOOK_FORCE_QUEUE(hook) do { hook->hk_flags |= HK_QUEUE; } while (0)
162#define _NG_HOOK_SET_TO_INBOUND(hook) \
163 do { hook->hk_flags |= HK_TO_INBOUND; } while (0)
164#define _NG_HOOK_HI_STACK(hook) do { hook->hk_flags |= HK_HI_STACK; } while (0)
167#define NG_PEER_NODE(hook) NG_HOOK_NODE(NG_HOOK_PEER(hook))
168#define NG_PEER_HOOK_NAME(hook) NG_HOOK_NAME(NG_HOOK_PEER(hook))
169#define NG_PEER_NODE_NAME(hook) NG_NODE_NAME(NG_PEER_NODE(hook))
172#define _NN_ __FILE__,__LINE__
173void dumphook (
hook_p hook,
char *file,
int line);
174static __inline
void _chkhook(
hook_p hook,
char *file,
int line);
175static __inline
void _ng_hook_ref(
hook_p hook,
char * file,
int line);
176static __inline
char * _ng_hook_name(
hook_p hook,
char * file,
int line);
177static __inline
void _ng_hook_unref(
hook_p hook,
char * file,
int line);
178static __inline
void _ng_hook_set_private(
hook_p hook,
179 void * val,
char * file,
int line);
180static __inline
void _ng_hook_set_rcvmsg(
hook_p hook,
182static __inline
void _ng_hook_set_rcvdata(
hook_p hook,
184static __inline
void * _ng_hook_private(
hook_p hook,
char * file,
int line);
185static __inline
int _ng_hook_not_valid(
hook_p hook,
char * file,
int line);
186static __inline
int _ng_hook_is_valid(
hook_p hook,
char * file,
int line);
187static __inline
node_p _ng_hook_node(
hook_p hook,
char * file,
int line);
188static __inline
hook_p _ng_hook_peer(
hook_p hook,
char * file,
int line);
189static __inline
void _ng_hook_force_writer(
hook_p hook,
char * file,
191static __inline
void _ng_hook_force_queue(
hook_p hook,
char * file,
193static __inline
void _ng_hook_set_to_inbound(
hook_p hook,
char * file,
197_chkhook(
hook_p hook,
char *file,
int line)
199 if (hook->hk_magic != HK_MAGIC) {
200 printf(
"Accessing freed ");
201 dumphook(hook, file, line);
203 hook->lastline = line;
204 hook->lastfile = file;
208_ng_hook_ref(
hook_p hook,
char * file,
int line)
210 _chkhook(hook, file, line);
214static __inline
char *
215_ng_hook_name(
hook_p hook,
char * file,
int line)
217 _chkhook(hook, file, line);
222_ng_hook_unref(
hook_p hook,
char * file,
int line)
224 _chkhook(hook, file, line);
229_ng_hook_set_private(
hook_p hook,
void *val,
char * file,
int line)
231 _chkhook(hook, file, line);
238 _chkhook(hook, file, line);
245 _chkhook(hook, file, line);
249static __inline
void *
250_ng_hook_private(
hook_p hook,
char * file,
int line)
252 _chkhook(hook, file, line);
257_ng_hook_not_valid(
hook_p hook,
char * file,
int line)
259 _chkhook(hook, file, line);
264_ng_hook_is_valid(
hook_p hook,
char * file,
int line)
266 _chkhook(hook, file, line);
271_ng_hook_node(
hook_p hook,
char * file,
int line)
273 _chkhook(hook, file, line);
278_ng_hook_peer(
hook_p hook,
char * file,
int line)
280 _chkhook(hook, file, line);
285_ng_hook_force_writer(
hook_p hook,
char * file,
int line)
287 _chkhook(hook, file, line);
292_ng_hook_force_queue(
hook_p hook,
char * file,
int line)
294 _chkhook(hook, file, line);
299_ng_hook_set_to_inbound(
hook_p hook,
char * file,
int line)
301 _chkhook(hook, file, line);
306_ng_hook_hi_stack(
hook_p hook,
char * file,
int line)
308 _chkhook(hook, file, line);
312#define NG_HOOK_REF(hook) _ng_hook_ref(hook, _NN_)
313#define NG_HOOK_NAME(hook) _ng_hook_name(hook, _NN_)
314#define NG_HOOK_UNREF(hook) _ng_hook_unref(hook, _NN_)
315#define NG_HOOK_SET_PRIVATE(hook, val) _ng_hook_set_private(hook, val, _NN_)
316#define NG_HOOK_SET_RCVMSG(hook, val) _ng_hook_set_rcvmsg(hook, val, _NN_)
317#define NG_HOOK_SET_RCVDATA(hook, val) _ng_hook_set_rcvdata(hook, val, _NN_)
318#define NG_HOOK_PRIVATE(hook) _ng_hook_private(hook, _NN_)
319#define NG_HOOK_NOT_VALID(hook) _ng_hook_not_valid(hook, _NN_)
320#define NG_HOOK_IS_VALID(hook) _ng_hook_is_valid(hook, _NN_)
321#define NG_HOOK_NODE(hook) _ng_hook_node(hook, _NN_)
322#define NG_HOOK_PEER(hook) _ng_hook_peer(hook, _NN_)
323#define NG_HOOK_FORCE_WRITER(hook) _ng_hook_force_writer(hook, _NN_)
324#define NG_HOOK_FORCE_QUEUE(hook) _ng_hook_force_queue(hook, _NN_)
325#define NG_HOOK_SET_TO_INBOUND(hook) _ng_hook_set_to_inbound(hook, _NN_)
326#define NG_HOOK_HI_STACK(hook) _ng_hook_hi_stack(hook, _NN_)
330#define NG_HOOK_REF(hook) _NG_HOOK_REF(hook)
331#define NG_HOOK_NAME(hook) _NG_HOOK_NAME(hook)
332#define NG_HOOK_UNREF(hook) _NG_HOOK_UNREF(hook)
333#define NG_HOOK_SET_PRIVATE(hook, val) _NG_HOOK_SET_PRIVATE(hook, val)
334#define NG_HOOK_SET_RCVMSG(hook, val) _NG_HOOK_SET_RCVMSG(hook, val)
335#define NG_HOOK_SET_RCVDATA(hook, val) _NG_HOOK_SET_RCVDATA(hook, val)
336#define NG_HOOK_PRIVATE(hook) _NG_HOOK_PRIVATE(hook)
337#define NG_HOOK_NOT_VALID(hook) _NG_HOOK_NOT_VALID(hook)
338#define NG_HOOK_IS_VALID(hook) _NG_HOOK_IS_VALID(hook)
339#define NG_HOOK_NODE(hook) _NG_HOOK_NODE(hook)
340#define NG_HOOK_PEER(hook) _NG_HOOK_PEER(hook)
341#define NG_HOOK_FORCE_WRITER(hook) _NG_HOOK_FORCE_WRITER(hook)
342#define NG_HOOK_FORCE_QUEUE(hook) _NG_HOOK_FORCE_QUEUE(hook)
343#define NG_HOOK_SET_TO_INBOUND(hook) _NG_HOOK_SET_TO_INBOUND(hook)
344#define NG_HOOK_HI_STACK(hook) _NG_HOOK_HI_STACK(hook)
379#define ND_MAGIC 0x59264837
388#define NGF_INVALID 0x00000001
389#define NG_INVALID NGF_INVALID
390#define NGF_FORCE_WRITER 0x00000004
391#define NG_FORCE_WRITER NGF_FORCE_WRITER
392#define NGF_CLOSING 0x00000008
393#define NG_CLOSING NGF_CLOSING
394#define NGF_REALLY_DIE 0x00000010
395#define NG_REALLY_DIE NGF_REALLY_DIE
396#define NGF_HI_STACK 0x00000020
397#define NGF_TYPE1 0x10000000
398#define NGF_TYPE2 0x20000000
399#define NGF_TYPE3 0x40000000
400#define NGF_TYPE4 0x80000000
407#define _NG_NODE_NAME(node) ((node)->nd_name + 0)
408#define _NG_NODE_HAS_NAME(node) ((node)->nd_name[0] + 0)
409#define _NG_NODE_ID(node) ((node)->nd_ID + 0)
410#define _NG_NODE_REF(node) refcount_acquire(&(node)->nd_refs)
411#define _NG_NODE_UNREF(node) ng_unref_node(node)
412#define _NG_NODE_SET_PRIVATE(node, val) do {(node)->nd_private = val;} while (0)
413#define _NG_NODE_PRIVATE(node) ((node)->nd_private)
414#define _NG_NODE_IS_VALID(node) (!((node)->nd_flags & NGF_INVALID))
415#define _NG_NODE_NOT_VALID(node) ((node)->nd_flags & NGF_INVALID)
416#define _NG_NODE_NUMHOOKS(node) ((node)->nd_numhooks + 0)
417#define _NG_NODE_FORCE_WRITER(node) \
418 do{ node->nd_flags |= NGF_FORCE_WRITER; }while (0)
419#define _NG_NODE_HI_STACK(node) \
420 do{ node->nd_flags |= NGF_HI_STACK; }while (0)
421#define _NG_NODE_REALLY_DIE(node) \
422 do{ node->nd_flags |= (NGF_REALLY_DIE|NGF_INVALID); }while (0)
423#define _NG_NODE_REVIVE(node) \
424 do { node->nd_flags &= ~NGF_INVALID; } while (0)
432#define _NG_NODE_FOREACH_HOOK(node, fn, arg, rethook) \
436 LIST_FOREACH(_hook, &((node)->nd_hooks), hk_hooks) { \
437 if ((fn)(_hook, arg) == 0) { \
445void dumpnode(
node_p node,
char *file,
int line);
446static __inline
void _chknode(
node_p node,
char *file,
int line);
447static __inline
char * _ng_node_name(
node_p node,
char *file,
int line);
448static __inline
int _ng_node_has_name(
node_p node,
char *file,
int line);
449static __inline
ng_ID_t _ng_node_id(
node_p node,
char *file,
int line);
450static __inline
void _ng_node_ref(
node_p node,
char *file,
int line);
451static __inline
void _ng_node_unref(
node_p node,
char *file,
int line);
452static __inline
void _ng_node_set_private(
node_p node,
void * val,
453 char *file,
int line);
454static __inline
void * _ng_node_private(
node_p node,
char *file,
int line);
455static __inline
int _ng_node_is_valid(
node_p node,
char *file,
int line);
456static __inline
int _ng_node_not_valid(
node_p node,
char *file,
int line);
457static __inline
int _ng_node_numhooks(
node_p node,
char *file,
int line);
458static __inline
void _ng_node_force_writer(
node_p node,
char *file,
int line);
459static __inline
hook_p _ng_node_foreach_hook(
node_p node,
461static __inline
void _ng_node_revive(
node_p node,
char *file,
int line);
464_chknode(
node_p node,
char *file,
int line)
466 if (node->nd_magic != ND_MAGIC) {
467 printf(
"Accessing freed ");
468 dumpnode(node, file, line);
470 node->lastline = line;
471 node->lastfile = file;
474static __inline
char *
475_ng_node_name(
node_p node,
char *file,
int line)
477 _chknode(node, file, line);
482_ng_node_has_name(
node_p node,
char *file,
int line)
484 _chknode(node, file, line);
489_ng_node_id(
node_p node,
char *file,
int line)
491 _chknode(node, file, line);
496_ng_node_ref(
node_p node,
char *file,
int line)
498 _chknode(node, file, line);
503_ng_node_unref(
node_p node,
char *file,
int line)
505 _chknode(node, file, line);
510_ng_node_set_private(
node_p node,
void * val,
char *file,
int line)
512 _chknode(node, file, line);
516static __inline
void *
517_ng_node_private(
node_p node,
char *file,
int line)
519 _chknode(node, file, line);
524_ng_node_is_valid(
node_p node,
char *file,
int line)
526 _chknode(node, file, line);
531_ng_node_not_valid(
node_p node,
char *file,
int line)
533 _chknode(node, file, line);
538_ng_node_numhooks(
node_p node,
char *file,
int line)
540 _chknode(node, file, line);
545_ng_node_force_writer(
node_p node,
char *file,
int line)
547 _chknode(node, file, line);
552_ng_node_hi_stack(
node_p node,
char *file,
int line)
554 _chknode(node, file, line);
559_ng_node_really_die(
node_p node,
char *file,
int line)
561 _chknode(node, file, line);
566_ng_node_revive(
node_p node,
char *file,
int line)
568 _chknode(node, file, line);
574 char *file,
int line)
577 _chknode(node, file, line);
582#define NG_NODE_NAME(node) _ng_node_name(node, _NN_)
583#define NG_NODE_HAS_NAME(node) _ng_node_has_name(node, _NN_)
584#define NG_NODE_ID(node) _ng_node_id(node, _NN_)
585#define NG_NODE_REF(node) _ng_node_ref(node, _NN_)
586#define NG_NODE_UNREF(node) _ng_node_unref(node, _NN_)
587#define NG_NODE_SET_PRIVATE(node, val) _ng_node_set_private(node, val, _NN_)
588#define NG_NODE_PRIVATE(node) _ng_node_private(node, _NN_)
589#define NG_NODE_IS_VALID(node) _ng_node_is_valid(node, _NN_)
590#define NG_NODE_NOT_VALID(node) _ng_node_not_valid(node, _NN_)
591#define NG_NODE_FORCE_WRITER(node) _ng_node_force_writer(node, _NN_)
592#define NG_NODE_HI_STACK(node) _ng_node_hi_stack(node, _NN_)
593#define NG_NODE_REALLY_DIE(node) _ng_node_really_die(node, _NN_)
594#define NG_NODE_NUMHOOKS(node) _ng_node_numhooks(node, _NN_)
595#define NG_NODE_REVIVE(node) _ng_node_revive(node, _NN_)
596#define NG_NODE_FOREACH_HOOK(node, fn, arg, rethook) \
598 rethook = _ng_node_foreach_hook(node, fn, (void *)arg, _NN_); \
603#define NG_NODE_NAME(node) _NG_NODE_NAME(node)
604#define NG_NODE_HAS_NAME(node) _NG_NODE_HAS_NAME(node)
605#define NG_NODE_ID(node) _NG_NODE_ID(node)
606#define NG_NODE_REF(node) _NG_NODE_REF(node)
607#define NG_NODE_UNREF(node) _NG_NODE_UNREF(node)
608#define NG_NODE_SET_PRIVATE(node, val) _NG_NODE_SET_PRIVATE(node, val)
609#define NG_NODE_PRIVATE(node) _NG_NODE_PRIVATE(node)
610#define NG_NODE_IS_VALID(node) _NG_NODE_IS_VALID(node)
611#define NG_NODE_NOT_VALID(node) _NG_NODE_NOT_VALID(node)
612#define NG_NODE_FORCE_WRITER(node) _NG_NODE_FORCE_WRITER(node)
613#define NG_NODE_HI_STACK(node) _NG_NODE_HI_STACK(node)
614#define NG_NODE_REALLY_DIE(node) _NG_NODE_REALLY_DIE(node)
615#define NG_NODE_NUMHOOKS(node) _NG_NODE_NUMHOOKS(node)
616#define NG_NODE_REVIVE(node) _NG_NODE_REVIVE(node)
617#define NG_NODE_FOREACH_HOOK(node, fn, arg, rethook) \
618 _NG_NODE_FOREACH_HOOK(node, fn, arg, rethook)
668#define NGQF_TYPE 0x03
669#define NGQF_MESG 0x00
670#define NGQF_DATA 0x01
675#define NGQF_READER 0x04
676#define NGQF_WRITER 0x00
678#define NGQF_QMODE 0x08
679#define NGQF_QREADER 0x08
680#define NGQF_QWRITER 0x00
692#define _NGI_M(i) ((i)->body.da_m)
693#define _NGI_MSG(i) ((i)->body.msg.msg_msg)
694#define _NGI_RETADDR(i) ((i)->body.msg.msg_retaddr)
695#define _NGI_FN(i) ((i)->body.fn.fn_fn.fn_fn)
696#define _NGI_FN2(i) ((i)->body.fn.fn_fn.fn_fn2)
697#define _NGI_ARG1(i) ((i)->body.fn.fn_arg1)
698#define _NGI_ARG2(i) ((i)->body.fn.fn_arg2)
699#define _NGI_NODE(i) ((i)->el_dest)
700#define _NGI_HOOK(i) ((i)->el_hook)
701#define _NGI_SET_HOOK(i,h) do { _NGI_HOOK(i) = h; h = NULL;} while (0)
702#define _NGI_CLR_HOOK(i) do { \
703 hook_p _hook = _NGI_HOOK(i); \
705 _NG_HOOK_UNREF(_hook); \
706 _NGI_HOOK(i) = NULL; \
709#define _NGI_SET_NODE(i,n) do { _NGI_NODE(i) = n; n = NULL;} while (0)
710#define _NGI_CLR_NODE(i) do { \
711 node_p _node = _NGI_NODE(i); \
713 _NG_NODE_UNREF(_node); \
714 _NGI_NODE(i) = NULL; \
719void dumpitem(
item_p item,
char *file,
int line);
720static __inline
void _ngi_check(
item_p item,
char *file,
int line) ;
721static __inline
struct mbuf ** _ngi_m(
item_p item,
char *file,
int line) ;
722static __inline
ng_ID_t * _ngi_retaddr(
item_p item,
char *file,
int line);
723static __inline
struct ng_mesg ** _ngi_msg(
item_p item,
char *file,
int line) ;
726static __inline
void ** _ngi_arg1(
item_p item,
char *file,
int line) ;
727static __inline
int * _ngi_arg2(
item_p item,
char *file,
int line) ;
728static __inline
node_p _ngi_node(
item_p item,
char *file,
int line);
729static __inline
hook_p _ngi_hook(
item_p item,
char *file,
int line);
732_ngi_check(
item_p item,
char *file,
int line)
734 (item)->lastline = line;
735 (item)->lastfile = file;
738static __inline
struct mbuf **
739_ngi_m(
item_p item,
char *file,
int line)
741 _ngi_check(item, file, line);
745static __inline
struct ng_mesg **
746_ngi_msg(
item_p item,
char *file,
int line)
748 _ngi_check(item, file, line);
753_ngi_retaddr(
item_p item,
char *file,
int line)
755 _ngi_check(item, file, line);
760_ngi_fn(
item_p item,
char *file,
int line)
762 _ngi_check(item, file, line);
767_ngi_fn2(
item_p item,
char *file,
int line)
769 _ngi_check(item, file, line);
773static __inline
void **
774_ngi_arg1(
item_p item,
char *file,
int line)
776 _ngi_check(item, file, line);
781_ngi_arg2(
item_p item,
char *file,
int line)
783 _ngi_check(item, file, line);
788_ngi_node(
item_p item,
char *file,
int line)
790 _ngi_check(item, file, line);
795_ngi_hook(
item_p item,
char *file,
int line)
797 _ngi_check(item, file, line);
801#define NGI_M(i) (*_ngi_m(i, _NN_))
802#define NGI_MSG(i) (*_ngi_msg(i, _NN_))
803#define NGI_RETADDR(i) (*_ngi_retaddr(i, _NN_))
804#define NGI_FN(i) (*_ngi_fn(i, _NN_))
805#define NGI_FN2(i) (*_ngi_fn2(i, _NN_))
806#define NGI_ARG1(i) (*_ngi_arg1(i, _NN_))
807#define NGI_ARG2(i) (*_ngi_arg2(i, _NN_))
808#define NGI_HOOK(i) _ngi_hook(i, _NN_)
809#define NGI_NODE(i) _ngi_node(i, _NN_)
810#define NGI_SET_HOOK(i,h) \
811 do { _ngi_check(i, _NN_); _NGI_SET_HOOK(i, h); } while (0)
812#define NGI_CLR_HOOK(i) \
813 do { _ngi_check(i, _NN_); _NGI_CLR_HOOK(i); } while (0)
814#define NGI_SET_NODE(i,n) \
815 do { _ngi_check(i, _NN_); _NGI_SET_NODE(i, n); } while (0)
816#define NGI_CLR_NODE(i) \
817 do { _ngi_check(i, _NN_); _NGI_CLR_NODE(i); } while (0)
819#define NG_FREE_ITEM(item) \
821 _ngi_check(item, _NN_); \
822 ng_free_item((item)); \
825#define SAVE_LINE(item) \
827 (item)->lastline = __LINE__; \
828 (item)->lastfile = __FILE__; \
833#define NGI_M(i) _NGI_M(i)
834#define NGI_MSG(i) _NGI_MSG(i)
835#define NGI_RETADDR(i) _NGI_RETADDR(i)
836#define NGI_FN(i) _NGI_FN(i)
837#define NGI_FN2(i) _NGI_FN2(i)
838#define NGI_ARG1(i) _NGI_ARG1(i)
839#define NGI_ARG2(i) _NGI_ARG2(i)
840#define NGI_NODE(i) _NGI_NODE(i)
841#define NGI_HOOK(i) _NGI_HOOK(i)
842#define NGI_SET_HOOK(i,h) _NGI_SET_HOOK(i,h)
843#define NGI_CLR_HOOK(i) _NGI_CLR_HOOK(i)
844#define NGI_SET_NODE(i,n) _NGI_SET_NODE(i,n)
845#define NGI_CLR_NODE(i) _NGI_CLR_NODE(i)
847#define NG_FREE_ITEM(item) ng_free_item((item))
848#define SAVE_LINE(item) do {} while (0)
852#define NGI_GET_M(i,m) \
858#define NGI_GET_MSG(i,m) \
861 _NGI_MSG(i) = NULL; \
864#define NGI_GET_NODE(i,n) \
867 _NGI_NODE(i) = NULL; \
870#define NGI_GET_HOOK(i,h) \
873 _NGI_HOOK(i) = NULL; \
876#define NGI_SET_WRITER(i) ((i)->el_flags &= ~NGQF_QMODE)
877#define NGI_SET_READER(i) ((i)->el_flags |= NGQF_QREADER)
879#define NGI_QUEUED_READER(i) ((i)->el_flags & NGQF_QREADER)
880#define NGI_QUEUED_WRITER(i) (((i)->el_flags & NGQF_QMODE) == NGQF_QWRITER)
888#define NG_FWD_ITEM_HOOK_FLAGS(error, item, hook, flags) \
891 ng_address_hook(NULL, (item), (hook), NG_NOFLAGS); \
894 (error) = ng_snd_item((item), (flags)); \
898#define NG_FWD_ITEM_HOOK(error, item, hook) \
899 NG_FWD_ITEM_HOOK_FLAGS(error, item, hook, NG_NOFLAGS)
908#define NG_FWD_NEW_DATA_FLAGS(error, item, hook, m, flags) \
912 NG_FWD_ITEM_HOOK_FLAGS(error, item, hook, flags); \
914#define NG_FWD_NEW_DATA(error, item, hook, m) \
915 NG_FWD_NEW_DATA_FLAGS(error, item, hook, m, NG_NOFLAGS)
921#define NG_SEND_DATA_FLAGS(error, hook, m, flags) \
924 if ((_item = ng_package_data((m), flags))) { \
925 NG_FWD_ITEM_HOOK_FLAGS(error, _item, hook, flags);\
932#define NG_SEND_DATA_ONLY(error, hook, m) \
933 NG_SEND_DATA_FLAGS(error, hook, m, NG_NOFLAGS)
935#define NG_SEND_DATA(error, hook, m, x) \
936 NG_SEND_DATA_FLAGS(error, hook, m, NG_NOFLAGS)
938#define NG_FREE_MSG(msg) \
941 free((msg), M_NETGRAPH_MSG); \
946#define NG_FREE_M(m) \
958#define NG_SEND_MSG_HOOK(error, here, msg, hook, retaddr) \
961 if ((_item = ng_package_msg(msg, NG_NOFLAGS)) == NULL) {\
966 if (((error) = ng_address_hook((here), (_item), \
967 (hook), (retaddr))) == 0) { \
969 (error) = ng_snd_item((_item), 0); \
974#define NG_SEND_MSG_PATH(error, here, msg, path, retaddr) \
977 if ((_item = ng_package_msg(msg, NG_NOFLAGS)) == NULL) {\
982 if (((error) = ng_address_path((here), (_item), \
983 (path), (retaddr))) == 0) { \
985 (error) = ng_snd_item((_item), 0); \
990#define NG_SEND_MSG_ID(error, here, msg, ID, retaddr) \
993 if ((_item = ng_package_msg(msg, NG_NOFLAGS)) == NULL) {\
998 if (((error) = ng_address_ID((here), (_item), \
999 (ID), (retaddr))) == 0) { \
1001 (error) = ng_snd_item((_item), 0); \
1011#define NG_FWD_MSG_HOOK(error, here, item, hook, retaddr) \
1013 if (((error) = ng_address_hook((here), (item), \
1014 (hook), (retaddr))) == 0) { \
1016 (error) = ng_snd_item((item), 0); \
1025#define NG_RESPOND_MSG(error, here, item, resp) \
1028 ng_ID_t _dest = NGI_RETADDR(item); \
1029 NGI_RETADDR(item) = 0; \
1030 NGI_MSG(item) = resp; \
1031 if ((error = ng_address_ID((here), (item), \
1032 _dest, 0)) == 0) { \
1034 (error) = ng_snd_item((item), NG_QUEUE);\
1037 NG_FREE_ITEM(item); \
1109#define NETGRAPH_INIT_ORDERED(typename, typestructp, sub, order) \
1110static moduledata_t ng_##typename##_mod = { \
1115DECLARE_MODULE(ng_##typename, ng_##typename##_mod, sub, order); \
1116MODULE_DEPEND(ng_##typename, netgraph, NG_ABI_VERSION, \
1120#define NETGRAPH_INIT(tn, tp) \
1121 NETGRAPH_INIT_ORDERED(tn, tp, SI_SUB_PSEUDO, SI_ORDER_MIDDLE)
1131SYSCTL_DECL(_net_graph);
1161 int arg2,
int flags);
1163 void *arg1,
int arg2,
int flags);
1168#define ng_callout_init(c) callout_init(c, 1)
1171#define NG_NOFLAGS 0x00000000
1172#define NG_QUEUE 0x00000001
1173#define NG_WAITOK 0x00000002
1175#define NG_PROGRESS 0x00000004
1176#define NG_REUSE_ITEM 0x00000008
1188#define NG_TAG_PRIO 1
1196#define NG_PRIO_CUTOFF 32
1197#define NG_PRIO_LINKSTATE 64
1203#define _NGI_META(i) NULL
1204#define NGI_META(i) NULL
1205#define NG_FREE_META(meta)
1206#define NGI_GET_META(i,m)
1207#define ng_copy_meta(meta) NULL
1214#define NG_OUTBOUND_THREAD_REF() \
1215 curthread->td_ng_outbound++
1216#define NG_OUTBOUND_THREAD_UNREF() \
1218 curthread->td_ng_outbound--; \
1219 KASSERT(curthread->td_ng_outbound >= 0, \
1220 ("%s: negative td_ng_outbound", __func__)); \
int ng_mod_event(module_t mod, int what, void *arg)
#define _NG_HOOK_IS_VALID(hook)
int ng_fn_eachhook(hook_p hook, void *arg)
int ng_connect_t(hook_p hook)
void ng_unref_hook(hook_p hook)
struct ng_type * ng_findtype(const char *type)
int ng_item_fn2(node_p node, struct ng_item *item, hook_p hook)
MALLOC_DECLARE(M_NETGRAPH)
void ng_unref_node(node_p node)
int ng_uncallout_drain(struct callout *c, node_p node)
void ng_free_item(item_p item)
#define _NG_NODE_REALLY_DIE(node)
#define _NG_NODE_NOT_VALID(node)
#define _NG_HOOK_NAME(hook)
#define _NG_NODE_PRIVATE(node)
item_p ng_package_msg_self(node_p here, hook_p hook, struct ng_mesg *msg)
hook_p ng_findhook_t(node_p node, const char *name)
int ng_rcvmsg_t(node_p node, item_p item, hook_p lasthook)
#define _NG_HOOK_SET_PRIVATE(hook, val)
#define _NG_NODE_NUMHOOKS(node)
int ng_disconnect_t(hook_p hook)
int ng_newtype(struct ng_type *tp)
#define _NG_HOOK_NODE(hook)
int ng_rmhook_self(hook_p hook)
struct ng_node const * node_cp
void ng_item_fn(node_p node, hook_p hook, void *arg1, int arg2)
#define _NG_NODE_HI_STACK(node)
struct ng_item const * item_cp
int ng_rmnode_self(node_p here)
int ng_send_fn1(node_p node, hook_p hook, ng_item_fn *fn, void *arg1, int arg2, int flags)
#define _NG_NODE_FORCE_WRITER(node)
#define _NG_NODE_SET_PRIVATE(node, val)
#define _NG_NODE_ID(node)
item_p ng_package_data(struct mbuf *m, int flags)
int ng_rcvitem(node_p node, hook_p hook, item_p item)
int ng_address_ID(node_p here, item_p item, ng_ID_t ID, ng_ID_t retaddr)
#define _NG_HOOK_SET_RCVMSG(hook, val)
int ng_address_path(node_p here, item_p item, const char *address, ng_ID_t raddr)
#define _NG_HOOK_REF(hook)
#define _NG_NODE_HAS_NAME(node)
void ng_replace_retaddr(node_p here, item_p item, ng_ID_t retaddr)
#define _NG_HOOK_UNREF(hook)
#define _NG_HOOK_FORCE_QUEUE(hook)
#define _NG_NODE_REVIVE(node)
int ng_close_t(node_p node)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
int ng_uncallout(struct callout *c, node_p node)
#define _NG_NODE_FOREACH_HOOK(node, fn, arg, rethook)
#define _NG_NODE_IS_VALID(node)
int ng_rmtype(struct ng_type *tp)
int ng_snd_item(item_p item, int queue)
#define _NG_HOOK_FORCE_WRITER(hook)
int ng_make_node_common(struct ng_type *typep, node_p *nodep)
#define _NG_NODE_UNREF(node)
int ng_name_node(node_p node, const char *name)
int ng_constructor_t(node_p node)
int ng_send_fn(node_p node, hook_p hook, ng_item_fn *fn, void *arg1, int arg2)
item_p ng_package_msg(struct ng_mesg *msg, int flags)
#define _NG_HOOK_HI_STACK(hook)
node_p ng_name2noderef(node_p node, const char *name)
ng_ID_t ng_node2ID(node_cp node)
#define _NG_HOOK_SET_TO_INBOUND(hook)
int ng_bypass(hook_p hook1, hook_p hook2)
struct ng_hook const * hook_cp
int ng_address_hook(node_p here, item_p item, hook_p hook, ng_ID_t retaddr)
#define _NG_HOOK_PRIVATE(hook)
#define _NG_NODE_REF(node)
int ng_send_fn2(node_p node, hook_p hook, item_p pitem, ng_item_fn2 *fn, void *arg1, int arg2, int flags)
void ng_apply_t(void *context, int error)
#define _NG_NODE_NAME(node)
int ng_callout(struct callout *c, node_p node, hook_p hook, int ticks, ng_item_fn *fn, void *arg1, int arg2)
#define _NG_HOOK_NOT_VALID(hook)
int ng_newhook_t(node_p node, hook_p hook, const char *name)
#define _NG_HOOK_PEER(hook)
#define _NG_HOOK_SET_RCVDATA(hook, val)
hook_p ng_findhook(node_p node, const char *name)
typedef TAILQ_ENTRY(sscfu_sig) sscfu_sigq_link_t
const struct ng_parse_type * respType
const struct ng_parse_type * mesgType
ng_rcvdata_t * hk_rcvdata
LIST_ENTRY(ng_hook) hk_hooks
STAILQ_ENTRY(ng_item) el_next
struct ng_apply_info * apply
struct ng_item::@23::@25 fn
struct ng_item::@23::@24 msg
LIST_HEAD(hooks, ng_hook) nd_hooks
LIST_ENTRY(ng_node) nd_nodes
struct ng_queue nd_input_queue
LIST_ENTRY(ng_node) nd_idnodes
STAILQ_ENTRY(ng_node) q_work
STAILQ_HEAD(, ng_item) queue
ng_disconnect_t * disconnect
const struct ng_cmdlist * cmdlist
ng_constructor_t * constructor
LIST_ENTRY(ng_type) types