diff options
Diffstat (limited to 'sys/netgraph')
-rw-r--r-- | sys/netgraph/netgraph.h | 9 | ||||
-rw-r--r-- | sys/netgraph/ng_UI.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_async.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_base.c | 16 | ||||
-rw-r--r-- | sys/netgraph/ng_bpf.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_bridge.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_cisco.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_echo.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_ether.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_frame_relay.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_hole.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_iface.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_ksocket.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_lmi.c | 27 | ||||
-rw-r--r-- | sys/netgraph/ng_message.h | 9 | ||||
-rw-r--r-- | sys/netgraph/ng_mppc.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_one2many.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_ppp.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_pppoe.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_pptpgre.c | 4 | ||||
-rw-r--r-- | sys/netgraph/ng_rfc1490.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_sample.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_socket.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_tee.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_tty.c | 2 | ||||
-rw-r--r-- | sys/netgraph/ng_vjc.c | 2 |
26 files changed, 70 insertions, 37 deletions
diff --git a/sys/netgraph/netgraph.h b/sys/netgraph/netgraph.h index 48fb4f5..56cf7d6f 100644 --- a/sys/netgraph/netgraph.h +++ b/sys/netgraph/netgraph.h @@ -172,7 +172,7 @@ struct ng_cmdlist { */ struct ng_type { - u_int32_t version; /* must equal NG_VERSION */ + u_int32_t version; /* must equal NG_API_VERSION */ const char *name; /* Unique type name */ modeventhand_t mod_event; /* Module event handler (optional) */ ng_constructor_t *constructor; /* Node constructor */ @@ -191,6 +191,13 @@ struct ng_type { int refs; /* number of instances */ }; +/* + * This defines the in-kernel binary interface version. + * It is possible to change this but leave the external message + * API the same. Each type also has it's own cookies for versioning as well. + */ +#define NG_ABI_VERSION 5 + /* Send data packet with meta-data */ #define NG_SEND_DATA(err, hook, m, meta) \ do { \ diff --git a/sys/netgraph/ng_UI.c b/sys/netgraph/ng_UI.c index 9d490b9..0e2ef10 100644 --- a/sys/netgraph/ng_UI.c +++ b/sys/netgraph/ng_UI.c @@ -77,7 +77,7 @@ static ng_disconnect_t ng_UI_disconnect; /* Node type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_UI_NODE_TYPE, NULL, ng_UI_constructor, diff --git a/sys/netgraph/ng_async.c b/sys/netgraph/ng_async.c index 8dc951a..cbc51bb 100644 --- a/sys/netgraph/ng_async.c +++ b/sys/netgraph/ng_async.c @@ -148,7 +148,7 @@ static const struct ng_cmdlist nga_cmdlist[] = { /* Define the netgraph node type */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_ASYNC_NODE_TYPE, NULL, nga_constructor, diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c index 981d0bf..d9b26f4 100644 --- a/sys/netgraph/ng_base.c +++ b/sys/netgraph/ng_base.c @@ -856,7 +856,9 @@ ng_newtype(struct ng_type *tp) const size_t namelen = strlen(tp->name); /* Check version and type name fields */ - if (tp->version != NG_VERSION || namelen == 0 || namelen > NG_TYPELEN) { + if ((tp->version != NG_ABI_VERSION) + || (namelen == 0) + || (namelen > NG_TYPELEN)) { TRAP_ERROR; return (EINVAL); } @@ -1489,6 +1491,12 @@ ng_generic_msg(node_p here, struct ng_mesg *msg, const char *retaddr, break; } + /* Check response pointer */ + if (resp == NULL) { + error = EINVAL; + break; + } + /* Get a response message with lots of room */ NG_MKRESPONSE(rp, msg, sizeof(*ascii) + bufSize, M_NOWAIT); if (rp == NULL) { @@ -1565,6 +1573,12 @@ ng_generic_msg(node_p here, struct ng_mesg *msg, const char *retaddr, } ascii->data[ascii->header.arglen - 1] = '\0'; + /* Check response pointer */ + if (resp == NULL) { + error = EINVAL; + break; + } + /* Get a response message with lots of room */ NG_MKRESPONSE(rp, msg, sizeof(*binary) + bufSize, M_NOWAIT); if (rp == NULL) { diff --git a/sys/netgraph/ng_bpf.c b/sys/netgraph/ng_bpf.c index 49cc3e7..6d19550 100644 --- a/sys/netgraph/ng_bpf.c +++ b/sys/netgraph/ng_bpf.c @@ -186,7 +186,7 @@ static const struct ng_cmdlist ng_bpf_cmdlist[] = { /* Netgraph type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_BPF_NODE_TYPE, NULL, ng_bpf_constructor, diff --git a/sys/netgraph/ng_bridge.c b/sys/netgraph/ng_bridge.c index 68a4c0c..59ba0cc 100644 --- a/sys/netgraph/ng_bridge.c +++ b/sys/netgraph/ng_bridge.c @@ -266,7 +266,7 @@ static const struct ng_cmdlist ng_bridge_cmdlist[] = { /* Node type descriptor */ static struct ng_type ng_bridge_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_BRIDGE_NODE_TYPE, NULL, ng_bridge_constructor, diff --git a/sys/netgraph/ng_cisco.c b/sys/netgraph/ng_cisco.c index 76316c4..539e684 100644 --- a/sys/netgraph/ng_cisco.c +++ b/sys/netgraph/ng_cisco.c @@ -171,7 +171,7 @@ static const struct ng_cmdlist ng_cisco_cmdlist[] = { /* Node type */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_CISCO_NODE_TYPE, NULL, cisco_constructor, diff --git a/sys/netgraph/ng_echo.c b/sys/netgraph/ng_echo.c index 8ef95a4..6c46341 100644 --- a/sys/netgraph/ng_echo.c +++ b/sys/netgraph/ng_echo.c @@ -61,7 +61,7 @@ static ng_disconnect_t nge_disconnect; /* Netgraph type */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_ECHO_NODE_TYPE, NULL, NULL, diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c index 806798a..194b5ee 100644 --- a/sys/netgraph/ng_ether.c +++ b/sys/netgraph/ng_ether.c @@ -180,7 +180,7 @@ static const struct ng_cmdlist ng_ether_cmdlist[] = { }; static struct ng_type ng_ether_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_ETHER_NODE_TYPE, ng_ether_mod_event, ng_ether_constructor, diff --git a/sys/netgraph/ng_frame_relay.c b/sys/netgraph/ng_frame_relay.c index 830800b..96d56bf 100644 --- a/sys/netgraph/ng_frame_relay.c +++ b/sys/netgraph/ng_frame_relay.c @@ -137,7 +137,7 @@ static int ngfrm_allocate_CTX(sc_p sc, int dlci); /* Netgraph type */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_FRAMERELAY_NODE_TYPE, NULL, ngfrm_constructor, diff --git a/sys/netgraph/ng_hole.c b/sys/netgraph/ng_hole.c index 43ed1f2..1da47b6 100644 --- a/sys/netgraph/ng_hole.c +++ b/sys/netgraph/ng_hole.c @@ -57,7 +57,7 @@ static ng_rcvdata_t ngh_rcvdata; static ng_disconnect_t ngh_disconnect; static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_HOLE_NODE_TYPE, NULL, NULL, diff --git a/sys/netgraph/ng_iface.c b/sys/netgraph/ng_iface.c index 992d9b9..3df564a 100644 --- a/sys/netgraph/ng_iface.c +++ b/sys/netgraph/ng_iface.c @@ -181,7 +181,7 @@ static const struct ng_cmdlist ng_iface_cmds[] = { /* Node type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_IFACE_NODE_TYPE, NULL, ng_iface_constructor, diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c index c01f679..9898da9 100644 --- a/sys/netgraph/ng_ksocket.c +++ b/sys/netgraph/ng_ksocket.c @@ -459,7 +459,7 @@ static const struct ng_cmdlist ng_ksocket_cmds[] = { /* Node type descriptor */ static struct ng_type ng_ksocket_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_KSOCKET_NODE_TYPE, NULL, ng_ksocket_constructor, diff --git a/sys/netgraph/ng_lmi.c b/sys/netgraph/ng_lmi.c index 7019464..9bede71 100644 --- a/sys/netgraph/ng_lmi.c +++ b/sys/netgraph/ng_lmi.c @@ -98,7 +98,7 @@ static ng_disconnect_t nglmi_disconnect; static int nglmi_checkdata(hook_p hook, struct mbuf *m, meta_p meta); static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_LMI_NODE_TYPE, NULL, nglmi_constructor, @@ -450,10 +450,11 @@ ngauto_state_machine(sc_p sc) */ static int nglmi_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr, - struct ng_mesg **resp, hook_p lasthook) + struct ng_mesg **rptr, hook_p lasthook) { - int error = 0; sc_p sc = node->private; + struct ng_mesg *resp = NULL; + int error = 0; switch (msg->header.typecookie) { case NGM_GENERIC_COOKIE: @@ -463,12 +464,12 @@ nglmi_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr, char *arg; int pos, count; - NG_MKRESPONSE(*resp, msg, NG_TEXTRESPONSE, M_NOWAIT); - if (*resp == NULL) { + NG_MKRESPONSE(resp, msg, NG_TEXTRESPONSE, M_NOWAIT); + if (resp == NULL) { error = ENOMEM; break; } - arg = (*resp)->data; + arg = resp->data; pos = sprintf(arg, "protocol %s ", sc->protoname); if (sc->flags & SCF_FIXED) pos += sprintf(arg + pos, "fixed\n"); @@ -494,7 +495,7 @@ nglmi_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr, == DLCI_UP) ? "up" : "down"); } } - (*resp)->header.arglen = pos + 1; + resp->header.arglen = pos + 1; break; } default: @@ -509,12 +510,12 @@ nglmi_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr, struct nglmistat *stat; int k; - NG_MKRESPONSE(*resp, msg, sizeof(*stat), M_NOWAIT); - if (!*resp) { + NG_MKRESPONSE(resp, msg, sizeof(*stat), M_NOWAIT); + if (!resp) { error = ENOMEM; break; } - stat = (struct nglmistat *) (*resp)->data; + stat = (struct nglmistat *) resp->data; strncpy(stat->proto, sc->protoname, sizeof(stat->proto) - 1); strncpy(stat->hook, @@ -542,6 +543,12 @@ nglmi_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr, error = EINVAL; break; } + + if (rptr) + *rptr = resp; + else if (resp != NULL) + FREE(resp, M_NETGRAPH); + FREE(msg, M_NETGRAPH); return (error); } diff --git a/sys/netgraph/ng_message.h b/sys/netgraph/ng_message.h index 3eb6096..993768d 100644 --- a/sys/netgraph/ng_message.h +++ b/sys/netgraph/ng_message.h @@ -54,7 +54,7 @@ /* A netgraph message */ struct ng_mesg { struct ng_msghdr { - u_char version; /* must == NG_VERSION */ + u_char version; /* == NGM_VERSION */ u_char spare; /* pad to 2 bytes */ u_int16_t arglen; /* length of data */ u_int32_t flags; /* message status */ @@ -66,6 +66,7 @@ struct ng_mesg { char data[0]; /* placeholder for actual data */ }; + /* Keep this in sync with the above structure definition */ #define NG_GENERIC_NG_MESG_INFO(dtype) { \ { \ @@ -82,7 +83,11 @@ struct ng_mesg { } \ } -/* Negraph type binary compatibility field */ +/* + * Netgraph message header compatibility field + * Interfaces within the kernel are defined by a different + * value (see NG_ABI_VERSION in netgraph.g) + */ #define NG_VERSION 4 /* Flags field flags */ diff --git a/sys/netgraph/ng_mppc.c b/sys/netgraph/ng_mppc.c index 6c84cda..d9c5a31 100644 --- a/sys/netgraph/ng_mppc.c +++ b/sys/netgraph/ng_mppc.c @@ -143,7 +143,7 @@ static void ng_mppc_reset_req(node_p node); /* Node type descriptor */ static struct ng_type ng_mppc_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_MPPC_NODE_TYPE, NULL, ng_mppc_constructor, diff --git a/sys/netgraph/ng_one2many.c b/sys/netgraph/ng_one2many.c index 96f93c9..ad0f90f 100644 --- a/sys/netgraph/ng_one2many.c +++ b/sys/netgraph/ng_one2many.c @@ -162,7 +162,7 @@ static const struct ng_cmdlist ng_one2many_cmdlist[] = { /* Node type descriptor */ static struct ng_type ng_one2many_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_ONE2MANY_NODE_TYPE, NULL, ng_one2many_constructor, diff --git a/sys/netgraph/ng_ppp.c b/sys/netgraph/ng_ppp.c index 88caa63..a2fea53 100644 --- a/sys/netgraph/ng_ppp.c +++ b/sys/netgraph/ng_ppp.c @@ -342,7 +342,7 @@ static const struct ng_cmdlist ng_ppp_cmds[] = { /* Node type descriptor */ static struct ng_type ng_ppp_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_PPP_NODE_TYPE, NULL, ng_ppp_constructor, diff --git a/sys/netgraph/ng_pppoe.c b/sys/netgraph/ng_pppoe.c index af82ac0..14bf650 100644 --- a/sys/netgraph/ng_pppoe.c +++ b/sys/netgraph/ng_pppoe.c @@ -148,7 +148,7 @@ static const struct ng_cmdlist ng_pppoe_cmds[] = { /* Netgraph node type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_PPPOE_NODE_TYPE, NULL, ng_pppoe_constructor, diff --git a/sys/netgraph/ng_pptpgre.c b/sys/netgraph/ng_pptpgre.c index 7d4fedf..c5306b0 100644 --- a/sys/netgraph/ng_pptpgre.c +++ b/sys/netgraph/ng_pptpgre.c @@ -245,7 +245,7 @@ static const struct ng_cmdlist ng_pptpgre_cmdlist[] = { /* Node type descriptor */ static struct ng_type ng_pptpgre_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_PPTPGRE_NODE_TYPE, NULL, ng_pptpgre_constructor, @@ -378,12 +378,12 @@ ng_pptpgre_rcvmsg(node_p node, struct ng_mesg *msg, error = EINVAL; break; } +done: if (rptr) *rptr = resp; else if (resp) FREE(resp, M_NETGRAPH); -done: FREE(msg, M_NETGRAPH); return (error); } diff --git a/sys/netgraph/ng_rfc1490.c b/sys/netgraph/ng_rfc1490.c index 0eb090f..b31fdca 100644 --- a/sys/netgraph/ng_rfc1490.c +++ b/sys/netgraph/ng_rfc1490.c @@ -96,7 +96,7 @@ static ng_disconnect_t ng_rfc1490_disconnect; /* Node type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_RFC1490_NODE_TYPE, NULL, ng_rfc1490_constructor, diff --git a/sys/netgraph/ng_sample.c b/sys/netgraph/ng_sample.c index 4d4bfba..831e070 100644 --- a/sys/netgraph/ng_sample.c +++ b/sys/netgraph/ng_sample.c @@ -96,7 +96,7 @@ static const struct ng_cmdlist ng_xxx_cmdlist[] = { /* Netgraph node type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_XXX_NODE_TYPE, NULL, ng_xxx_constructor, diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c index 7608aba..19ea5e0 100644 --- a/sys/netgraph/ng_socket.c +++ b/sys/netgraph/ng_socket.c @@ -120,7 +120,7 @@ static int ship_msg(struct ngpcb *pcbp, struct ng_mesg *msg, /* Netgraph type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_SOCKET_NODE_TYPE, ngs_mod_event, ngs_constructor, diff --git a/sys/netgraph/ng_tee.c b/sys/netgraph/ng_tee.c index be6111a..89ae12e 100644 --- a/sys/netgraph/ng_tee.c +++ b/sys/netgraph/ng_tee.c @@ -128,7 +128,7 @@ static const struct ng_cmdlist ng_tee_cmds[] = { /* Netgraph type descriptor */ static struct ng_type ng_tee_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_TEE_NODE_TYPE, NULL, ngt_constructor, diff --git a/sys/netgraph/ng_tty.c b/sys/netgraph/ng_tty.c index 6236d6e..54ad7d5 100644 --- a/sys/netgraph/ng_tty.c +++ b/sys/netgraph/ng_tty.c @@ -159,7 +159,7 @@ static struct linesw ngt_disc = { /* Netgraph node type descriptor */ static struct ng_type typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_TTY_NODE_TYPE, ngt_mod_event, ngt_constructor, diff --git a/sys/netgraph/ng_vjc.c b/sys/netgraph/ng_vjc.c index 41a16d6..60da6b2 100644 --- a/sys/netgraph/ng_vjc.c +++ b/sys/netgraph/ng_vjc.c @@ -222,7 +222,7 @@ static const struct ng_cmdlist ng_vjc_cmds[] = { /* Node type descriptor */ static struct ng_type ng_vjc_typestruct = { - NG_VERSION, + NG_ABI_VERSION, NG_VJC_NODE_TYPE, NULL, ng_vjc_constructor, |