aboutsummaryrefslogtreecommitdiff
path: root/sys/netgraph/ng_ksocket.c
diff options
context:
space:
mode:
authorJulian Elischer <julian@FreeBSD.org>2004-06-25 19:22:05 +0000
committerJulian Elischer <julian@FreeBSD.org>2004-06-25 19:22:05 +0000
commit327b288e5ce5515e6914ef443418cf2401384fe7 (patch)
treee6486f45de5c63b28a090942d8f046694d0329cb /sys/netgraph/ng_ksocket.c
parent865897c9f1191913bae430d5d7ec86ad6c7d782b (diff)
downloadsrc-327b288e5ce5515e6914ef443418cf2401384fe7.tar.gz
src-327b288e5ce5515e6914ef443418cf2401384fe7.zip
Convert Netgraph to use mbuf tags to pass its meta information around.
Thanks to Sam for importing tags in a way that allowed this to be done. Submitted by: Gleb Smirnoff <glebius@cell.sick.ru> Also allow the sr and ar drivers to create netgraph versions of their modules. Document the change to the ksocket node.
Notes
Notes: svn path=/head/; revision=131108
Diffstat (limited to 'sys/netgraph/ng_ksocket.c')
-rw-r--r--sys/netgraph/ng_ksocket.c53
1 files changed, 15 insertions, 38 deletions
diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c
index 458bbdee41e9..715baa961811 100644
--- a/sys/netgraph/ng_ksocket.c
+++ b/sys/netgraph/ng_ksocket.c
@@ -893,9 +893,9 @@ ng_ksocket_rcvdata(hook_p hook, item_p item)
const priv_p priv = NG_NODE_PRIVATE(node);
struct socket *const so = priv->so;
struct sockaddr *sa = NULL;
- meta_p meta;
int error;
struct mbuf *m;
+ struct sa_tag *stag;
/* Avoid reentrantly sending on the socket */
if ((priv->flags & KSF_SENDING) != 0) {
@@ -903,35 +903,20 @@ ng_ksocket_rcvdata(hook_p hook, item_p item)
return (EDEADLK);
}
- /* Extract data and meta information */
+ /* Extract data */
NGI_GET_M(item, m);
- NGI_GET_META(item, meta);
NG_FREE_ITEM(item);
- /* If any meta info, look for peer socket address */
- if (meta != NULL) {
- struct meta_field_header *field;
-
- /* Look for peer socket address */
- for (field = &meta->options[0];
- (caddr_t)field < (caddr_t)meta + meta->used_len;
- field = (struct meta_field_header *)
- ((caddr_t)field + field->len)) {
- if (field->cookie != NGM_KSOCKET_COOKIE
- || field->type != NG_KSOCKET_META_SOCKADDR)
- continue;
- sa = (struct sockaddr *)field->data;
- break;
- }
- }
+ /* Look if socket address is stored in packet tags */
+ if ((stag = (struct sa_tag *)m_tag_locate(m, NGM_KSOCKET_COOKIE,
+ NG_KSOCKET_TAG_SOCKADDR, NULL)) != NULL)
+ sa = &stag->sa;
/* Send packet */
priv->flags |= KSF_SENDING;
error = (*so->so_proto->pr_usrreqs->pru_sosend)(so, sa, 0, m, 0, 0, td);
priv->flags &= ~KSF_SENDING;
- /* Clean up and exit */
- NG_FREE_META(meta);
return (error);
}
@@ -1103,7 +1088,6 @@ ng_ksocket_incoming2(node_p node, hook_p hook, void *arg1, int waitflag)
flags = MSG_DONTWAIT;
while (1) {
struct sockaddr *sa = NULL;
- meta_p meta = NULL;
struct mbuf *n;
/* Try to get next packet from socket */
@@ -1124,30 +1108,23 @@ ng_ksocket_incoming2(node_p node, hook_p hook, void *arg1, int waitflag)
for (n = m, m->m_pkthdr.len = 0; n != NULL; n = n->m_next)
m->m_pkthdr.len += n->m_len;
- /* Put peer's socket address (if any) into a meta info blob */
+ /* Put peer's socket address (if any) into a tag */
if (sa != NULL) {
- struct meta_field_header *mhead;
- u_int len;
+ struct sa_tag *stag;
- len = sizeof(*meta) + sizeof(*mhead) + sa->sa_len;
- MALLOC(meta, meta_p, len, M_NETGRAPH_META,
- M_NOWAIT | M_ZERO);
- if (meta == NULL) {
+ stag = (struct sa_tag *)m_tag_alloc(NGM_KSOCKET_COOKIE,
+ NG_KSOCKET_TAG_SOCKADDR, sa->sa_len, M_NOWAIT);
+ if (stag == NULL) {
FREE(sa, M_SONAME);
goto sendit;
}
- mhead = &meta->options[0];
- meta->allocated_len = len;
- meta->used_len = len;
- mhead->cookie = NGM_KSOCKET_COOKIE;
- mhead->type = NG_KSOCKET_META_SOCKADDR;
- mhead->len = sizeof(*mhead) + sa->sa_len;
- bcopy(sa, mhead->data, sa->sa_len);
+ bcopy(sa, &stag->sa, sa->sa_len);
FREE(sa, M_SONAME);
+ m_tag_prepend(m, &stag->tag);
}
-sendit: /* Forward data with optional peer sockaddr as meta info */
- NG_SEND_DATA(error, priv->hook, m, meta);
+sendit: /* Forward data with optional peer sockaddr as packet tag */
+ NG_SEND_DATA_ONLY(error, priv->hook, m);
}
/*