Add three more control messages to complement their opposites:
NGM_ETHER_SET_ENADDR, NGM_ETHER_GET_PROMISC, and NGM_ETHER_GET_AUTOSRC. Alter parsing algorithm so the EN address really looks like one.
This commit is contained in:
parent
11572abf62
commit
56045c6673
@ -104,15 +104,17 @@ static ng_rcvdata_t ng_ether_rcvdata;
|
|||||||
static ng_disconnect_t ng_ether_disconnect;
|
static ng_disconnect_t ng_ether_disconnect;
|
||||||
static int ng_ether_mod_event(module_t mod, int event, void *data);
|
static int ng_ether_mod_event(module_t mod, int event, void *data);
|
||||||
|
|
||||||
/* Parse type for an Ethernet address. Slightly better than an array of
|
/* Parse type for an Ethernet address */
|
||||||
six hint8's would be the more common colon-separated hex byte format. */
|
static ng_parse_t ng_enaddr_parse;
|
||||||
static const struct ng_parse_fixedarray_info ng_ether_enaddr_type_info = {
|
static ng_unparse_t ng_enaddr_unparse;
|
||||||
&ng_parse_hint8_type,
|
const struct ng_parse_type ng_ether_enaddr_type = {
|
||||||
ETHER_ADDR_LEN
|
NULL,
|
||||||
};
|
NULL,
|
||||||
static const struct ng_parse_type ng_ether_enaddr_type = {
|
NULL,
|
||||||
&ng_parse_fixedarray_type,
|
ng_enaddr_parse,
|
||||||
&ng_ether_enaddr_type_info
|
ng_enaddr_unparse,
|
||||||
|
NULL, /* no such thing as a "default" EN address */
|
||||||
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
/* List of commands and how to convert arguments to/from ASCII */
|
/* List of commands and how to convert arguments to/from ASCII */
|
||||||
@ -138,6 +140,20 @@ static const struct ng_cmdlist ng_ether_cmdlist[] = {
|
|||||||
NULL,
|
NULL,
|
||||||
&ng_ether_enaddr_type
|
&ng_ether_enaddr_type
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
NGM_ETHER_COOKIE,
|
||||||
|
NGM_ETHER_SET_ENADDR,
|
||||||
|
"setenaddr",
|
||||||
|
&ng_ether_enaddr_type,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NGM_ETHER_COOKIE,
|
||||||
|
NGM_ETHER_GET_PROMISC,
|
||||||
|
"getpromisc",
|
||||||
|
NULL,
|
||||||
|
&ng_parse_int32_type
|
||||||
|
},
|
||||||
{
|
{
|
||||||
NGM_ETHER_COOKIE,
|
NGM_ETHER_COOKIE,
|
||||||
NGM_ETHER_SET_PROMISC,
|
NGM_ETHER_SET_PROMISC,
|
||||||
@ -145,6 +161,13 @@ static const struct ng_cmdlist ng_ether_cmdlist[] = {
|
|||||||
&ng_parse_int32_type,
|
&ng_parse_int32_type,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
NGM_ETHER_COOKIE,
|
||||||
|
NGM_ETHER_GET_AUTOSRC,
|
||||||
|
"getautosrc",
|
||||||
|
NULL,
|
||||||
|
&ng_parse_int32_type
|
||||||
|
},
|
||||||
{
|
{
|
||||||
NGM_ETHER_COOKIE,
|
NGM_ETHER_COOKIE,
|
||||||
NGM_ETHER_SET_AUTOSRC,
|
NGM_ETHER_SET_AUTOSRC,
|
||||||
@ -498,6 +521,24 @@ ng_ether_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
|
|||||||
bcopy((IFP2AC(priv->ifp))->ac_enaddr,
|
bcopy((IFP2AC(priv->ifp))->ac_enaddr,
|
||||||
resp->data, ETHER_ADDR_LEN);
|
resp->data, ETHER_ADDR_LEN);
|
||||||
break;
|
break;
|
||||||
|
case NGM_ETHER_SET_ENADDR:
|
||||||
|
{
|
||||||
|
if (msg->header.arglen != ETHER_ADDR_LEN) {
|
||||||
|
error = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
error = if_setlladdr(priv->ifp,
|
||||||
|
(u_char *)msg->data, ETHER_ADDR_LEN);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NGM_ETHER_GET_PROMISC:
|
||||||
|
NG_MKRESPONSE(resp, msg, sizeof(u_int32_t), M_NOWAIT);
|
||||||
|
if (resp == NULL) {
|
||||||
|
error = ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*((u_int32_t *)resp->data) = priv->promisc;
|
||||||
|
break;
|
||||||
case NGM_ETHER_SET_PROMISC:
|
case NGM_ETHER_SET_PROMISC:
|
||||||
{
|
{
|
||||||
u_char want;
|
u_char want;
|
||||||
@ -514,6 +555,14 @@ ng_ether_rcvmsg(node_p node, struct ng_mesg *msg, const char *retaddr,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case NGM_ETHER_GET_AUTOSRC:
|
||||||
|
NG_MKRESPONSE(resp, msg, sizeof(u_int32_t), M_NOWAIT);
|
||||||
|
if (resp == NULL) {
|
||||||
|
error = ENOMEM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*((u_int32_t *)resp->data) = priv->autoSrcAddr;
|
||||||
|
break;
|
||||||
case NGM_ETHER_SET_AUTOSRC:
|
case NGM_ETHER_SET_AUTOSRC:
|
||||||
if (msg->header.arglen != sizeof(u_int32_t)) {
|
if (msg->header.arglen != sizeof(u_int32_t)) {
|
||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
@ -651,6 +700,47 @@ ng_ether_disconnect(hook_p hook)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ng_enaddr_parse(const struct ng_parse_type *type,
|
||||||
|
const char *s, int *const off, const u_char *const start,
|
||||||
|
u_char *const buf, int *const buflen)
|
||||||
|
{
|
||||||
|
char *eptr;
|
||||||
|
u_long val;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (*buflen < ETHER_ADDR_LEN)
|
||||||
|
return (ERANGE);
|
||||||
|
for (i = 0; i < ETHER_ADDR_LEN; i++) {
|
||||||
|
val = strtoul(s + *off, &eptr, 16);
|
||||||
|
if (val > 0xff || eptr == s + *off)
|
||||||
|
return (EINVAL);
|
||||||
|
buf[i] = (u_char)val;
|
||||||
|
*off = (eptr - s);
|
||||||
|
if (i < ETHER_ADDR_LEN - 1) {
|
||||||
|
if (*eptr != ':')
|
||||||
|
return (EINVAL);
|
||||||
|
(*off)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*buflen = ETHER_ADDR_LEN;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ng_enaddr_unparse(const struct ng_parse_type *type,
|
||||||
|
const u_char *data, int *off, char *cbuf, int cbuflen)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = snprintf(cbuf, cbuflen, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
|
data[0], data[1], data[2], data[3], data[4], data[5]);
|
||||||
|
if (len >= cbuflen)
|
||||||
|
return (ERANGE);
|
||||||
|
*off += ETHER_ADDR_LEN;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
INITIALIZATION
|
INITIALIZATION
|
||||||
******************************************************************/
|
******************************************************************/
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
/* Node type name and magic cookie */
|
/* Node type name and magic cookie */
|
||||||
#define NG_ETHER_NODE_TYPE "ether"
|
#define NG_ETHER_NODE_TYPE "ether"
|
||||||
#define NGM_ETHER_COOKIE 917786905
|
#define NGM_ETHER_COOKIE 917786906
|
||||||
|
|
||||||
/* Hook names */
|
/* Hook names */
|
||||||
#define NG_ETHER_HOOK_LOWER "lower" /* connection to raw device */
|
#define NG_ETHER_HOOK_LOWER "lower" /* connection to raw device */
|
||||||
@ -58,7 +58,10 @@ enum {
|
|||||||
NGM_ETHER_GET_IFNAME = 1, /* get the interface name */
|
NGM_ETHER_GET_IFNAME = 1, /* get the interface name */
|
||||||
NGM_ETHER_GET_IFINDEX, /* get the interface global index # */
|
NGM_ETHER_GET_IFINDEX, /* get the interface global index # */
|
||||||
NGM_ETHER_GET_ENADDR, /* get Ethernet address */
|
NGM_ETHER_GET_ENADDR, /* get Ethernet address */
|
||||||
|
NGM_ETHER_SET_ENADDR, /* set Ethernet address */
|
||||||
|
NGM_ETHER_GET_PROMISC, /* get node's promiscuous mode bit */
|
||||||
NGM_ETHER_SET_PROMISC, /* enable/disable promiscuous mode */
|
NGM_ETHER_SET_PROMISC, /* enable/disable promiscuous mode */
|
||||||
|
NGM_ETHER_GET_AUTOSRC, /* get source address override */
|
||||||
NGM_ETHER_SET_AUTOSRC, /* enable/disable src addr override */
|
NGM_ETHER_SET_AUTOSRC, /* enable/disable src addr override */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user