diff options
author | julian <julian@FreeBSD.org> | 2001-01-06 00:46:47 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 2001-01-06 00:46:47 +0000 |
commit | f0c46a9d00fc9fe4644cef5784e76b360f5036c7 (patch) | |
tree | 561902279f2f361f3e137f7fc029ce2714981289 /sys/netgraph/ng_vjc.c | |
parent | e06f071f56cf6badae9215f8a14ccc66a3fc0f5a (diff) | |
download | FreeBSD-src-f0c46a9d00fc9fe4644cef5784e76b360f5036c7.zip FreeBSD-src-f0c46a9d00fc9fe4644cef5784e76b360f5036c7.tar.gz |
Rewrite of netgraph to start getting ready for SMP.
This version is functional and is aproaching solid..
notice I said APROACHING. There are many node types I cannot test
I have tested: echo hole ppp socket vjc iface tee bpf async tty
The rest compile and "Look" right. More changes to follow.
DEBUGGING is enabled in this code to help if people have problems.
Diffstat (limited to 'sys/netgraph/ng_vjc.c')
-rw-r--r-- | sys/netgraph/ng_vjc.c | 67 |
1 files changed, 32 insertions, 35 deletions
diff --git a/sys/netgraph/ng_vjc.c b/sys/netgraph/ng_vjc.c index 60da6b2..a9c9515 100644 --- a/sys/netgraph/ng_vjc.c +++ b/sys/netgraph/ng_vjc.c @@ -89,7 +89,7 @@ typedef struct ng_vjc_private *priv_p; /* Netgraph node methods */ static ng_constructor_t ng_vjc_constructor; static ng_rcvmsg_t ng_vjc_rcvmsg; -static ng_shutdown_t ng_vjc_rmnode; +static ng_shutdown_t ng_vjc_shutdown; static ng_newhook_t ng_vjc_newhook; static ng_rcvdata_t ng_vjc_rcvdata; static ng_disconnect_t ng_vjc_disconnect; @@ -227,7 +227,7 @@ static struct ng_type ng_vjc_typestruct = { NULL, ng_vjc_constructor, ng_vjc_rcvmsg, - ng_vjc_rmnode, + ng_vjc_shutdown, ng_vjc_newhook, NULL, NULL, @@ -245,22 +245,16 @@ NETGRAPH_INIT(vjc, &ng_vjc_typestruct); * Create a new node */ static int -ng_vjc_constructor(node_p *nodep) +ng_vjc_constructor(node_p node) { priv_p priv; - int error; /* Allocate private structure */ MALLOC(priv, priv_p, sizeof(*priv), M_NETGRAPH, M_NOWAIT | M_ZERO); if (priv == NULL) return (ENOMEM); - /* Call generic node constructor */ - if ((error = ng_make_node_common(&ng_vjc_typestruct, nodep))) { - FREE(priv, M_NETGRAPH); - return (error); - } - (*nodep)->private = priv; + node->private = priv; /* Done */ return (0); @@ -300,13 +294,14 @@ ng_vjc_newhook(node_p node, hook_p hook, const char *name) * Receive a control message */ static int -ng_vjc_rcvmsg(node_p node, struct ng_mesg *msg, - const char *raddr, struct ng_mesg **rptr, hook_p lasthook) +ng_vjc_rcvmsg(node_p node, item_p item, hook_p lasthook) { const priv_p priv = (priv_p) node->private; struct ng_mesg *resp = NULL; int error = 0; + struct ng_mesg *msg; + NGI_GET_MSG(item, msg); /* Check type cookie */ switch (msg->header.typecookie) { case NGM_VJC_COOKIE: @@ -396,13 +391,9 @@ ng_vjc_rcvmsg(node_p node, struct ng_mesg *msg, error = EINVAL; break; } - if (rptr) - *rptr = resp; - else if (resp) - FREE(resp, M_NETGRAPH); - done: - FREE(msg, M_NETGRAPH); + NG_RESPOND_MSG(error, node, item, resp); + NG_FREE_MSG(msg); return (error); } @@ -410,13 +401,14 @@ done: * Receive data */ static int -ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, - struct mbuf **ret_m, meta_p *ret_meta, struct ng_mesg **resp) +ng_vjc_rcvdata(hook_p hook, item_p item) { const node_p node = hook->node; const priv_p priv = (priv_p) node->private; int error = 0; + struct mbuf *m; + NGI_GET_M(item, m); if (hook == priv->ip) { /* outgoing packet */ u_int type = TYPE_IP; @@ -425,7 +417,7 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, struct ip *ip; if ((m = ng_vjc_pulluphdrs(m, 0)) == NULL) { - NG_FREE_META(meta); + NG_FREE_ITEM(item); return (ENOBUFS); } ip = mtod(m, struct ip *); @@ -460,7 +452,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, /* Are we decompressing? */ if (!priv->conf.enableDecomp) { - NG_FREE_DATA(m, meta); + NG_FREE_M(m); + NG_FREE_ITEM(item); return (ENXIO); } @@ -471,7 +464,7 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, if (m->m_len < need2pullup && (m = m_pullup(m, need2pullup)) == NULL) { priv->slc.sls_errorin++; - NG_FREE_META(meta); + NG_FREE_ITEM(item); return (ENOBUFS); } @@ -480,7 +473,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, m->m_len, m->m_pkthdr.len, TYPE_COMPRESSED_TCP, &priv->slc, &hdr, &hlen); if (vjlen <= 0) { - NG_FREE_DATA(m, meta); + NG_FREE_M(m); + NG_FREE_ITEM(item); return (EINVAL); } m_adj(m, vjlen); @@ -489,7 +483,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, MGETHDR(hm, M_DONTWAIT, MT_DATA); if (hm == NULL) { priv->slc.sls_errorin++; - NG_FREE_DATA(m, meta); + NG_FREE_M(m); + NG_FREE_ITEM(item); return (ENOBUFS); } hm->m_len = 0; @@ -499,7 +494,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, if ((hm->m_flags & M_EXT) == 0) { m_freem(hm); priv->slc.sls_errorin++; - NG_FREE_DATA(m, meta); + NG_FREE_M(m); + NG_FREE_ITEM(item); return (ENOBUFS); } } @@ -517,13 +513,14 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, /* Are we decompressing? */ if (!priv->conf.enableDecomp) { - NG_FREE_DATA(m, meta); + NG_FREE_M(m); + NG_FREE_ITEM(item); return (ENXIO); } /* Pull up IP+TCP headers */ if ((m = ng_vjc_pulluphdrs(m, 1)) == NULL) { - NG_FREE_META(meta); + NG_FREE_ITEM(item); return (ENOBUFS); } @@ -531,7 +528,8 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, if (sl_uncompress_tcp_core(mtod(m, u_char *), m->m_len, m->m_pkthdr.len, TYPE_UNCOMPRESSED_TCP, &priv->slc, &hdr, &hlen) < 0) { - NG_FREE_DATA(m, meta); + NG_FREE_M(m); + NG_FREE_ITEM(item); return (EINVAL); } hook = priv->ip; @@ -541,7 +539,7 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, panic("%s: unknown hook", __FUNCTION__); /* Send result back out */ - NG_SEND_DATA(error, hook, m, meta); + NG_FWD_NEW_DATA(error, item, hook, m); return (error); } @@ -549,13 +547,11 @@ ng_vjc_rcvdata(hook_p hook, struct mbuf *m, meta_p meta, * Shutdown node */ static int -ng_vjc_rmnode(node_p node) +ng_vjc_shutdown(node_p node) { const priv_p priv = (priv_p) node->private; node->flags |= NG_INVALID; - ng_cutlinks(node); - ng_unname(node); bzero(priv, sizeof(*priv)); FREE(priv, M_NETGRAPH); node->private = NULL; @@ -585,8 +581,9 @@ ng_vjc_disconnect(hook_p hook) panic("%s: unknown hook", __FUNCTION__); /* Go away if no hooks left */ - if (node->numhooks == 0) - ng_rmnode(node); + if ((node->numhooks == 0) + && ((node->flags & NG_INVALID) == 0)) + ng_rmnode_self(node); return (0); } |