diff options
author | julian <julian@FreeBSD.org> | 2000-12-18 20:03:32 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 2000-12-18 20:03:32 +0000 |
commit | 0c949560a12dd18943b66fe09bd06d3c34e5cf7a (patch) | |
tree | 5466b04ac515e8d01f9b135b6c119744a1138d82 /sys/netgraph/ng_lmi.c | |
parent | e6bd476191c5b338634a02b0a6de56aa7f23cf37 (diff) | |
download | FreeBSD-src-0c949560a12dd18943b66fe09bd06d3c34e5cf7a.zip FreeBSD-src-0c949560a12dd18943b66fe09bd06d3c34e5cf7a.tar.gz |
Divorce the kernel binary ABI version number from the message
format version number. (userland programs should not need to be
recompiled when the netgraph kernel internal ABI is changed.
Also fix modules that don;t handle the fact that a caller may not supply
a return message pointer. (benign at the moment because the calling code
checks, but that will change)
Diffstat (limited to 'sys/netgraph/ng_lmi.c')
-rw-r--r-- | sys/netgraph/ng_lmi.c | 27 |
1 files changed, 17 insertions, 10 deletions
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); } |