Lines 60-67
Link Here
|
60 |
static const struct ng_cmdlist ng_eiface_cmdlist[] = { |
60 |
static const struct ng_cmdlist ng_eiface_cmdlist[] = { |
61 |
{ |
61 |
{ |
62 |
NGM_EIFACE_COOKIE, |
62 |
NGM_EIFACE_COOKIE, |
63 |
NGM_EIFACE_SET, |
63 |
NGM_EIFACE_GET_IFNAME, |
64 |
"set", |
64 |
"getifname", |
|
|
65 |
NULL, |
66 |
&ng_parse_string_type |
67 |
}, |
68 |
{ |
69 |
NGM_EIFACE_COOKIE, |
70 |
NGM_EIFACE_GET_IFINDEX, |
71 |
"getifindex", |
72 |
NULL, |
73 |
&ng_parse_int32_type |
74 |
}, |
75 |
{ |
76 |
NGM_EIFACE_COOKIE, |
77 |
NGM_EIFACE_GET_ENADDR, |
78 |
"getenaddr", |
79 |
NULL, |
80 |
&ng_parse_enaddr_type |
81 |
}, |
82 |
{ |
83 |
NGM_EIFACE_COOKIE, |
84 |
NGM_EIFACE_SET_ENADDR, |
85 |
"setenaddr", |
65 |
&ng_parse_enaddr_type, |
86 |
&ng_parse_enaddr_type, |
66 |
NULL |
87 |
NULL |
67 |
}, |
88 |
}, |
Lines 486-565
Link Here
|
486 |
switch (msg->header.typecookie) { |
507 |
switch (msg->header.typecookie) { |
487 |
case NGM_EIFACE_COOKIE: |
508 |
case NGM_EIFACE_COOKIE: |
488 |
switch (msg->header.cmd) { |
509 |
switch (msg->header.cmd) { |
489 |
case NGM_EIFACE_SET: |
510 |
case NGM_EIFACE_GET_IFNAME: |
490 |
{ |
511 |
NG_MKRESPONSE(resp, msg, IFNAMSIZ + 1, M_NOWAIT); |
491 |
struct ether_addr *eaddr; |
512 |
if (resp == NULL) { |
492 |
struct ifaddr *ifa; |
513 |
error = ENOMEM; |
493 |
struct sockaddr_dl *sdl; |
|
|
494 |
|
495 |
if (msg->header.arglen != sizeof(struct ether_addr)){ |
496 |
error = EINVAL; |
497 |
break; |
514 |
break; |
498 |
} |
515 |
} |
499 |
eaddr = (struct ether_addr *)(msg->data); |
516 |
strlcpy(resp->data, ifp->if_xname, IFNAMSIZ + 1); |
500 |
bcopy(eaddr, priv->arpcom.ac_enaddr, ETHER_ADDR_LEN); |
|
|
501 |
|
502 |
/* And put it in the ifaddr list */ |
503 |
TAILQ_FOREACH(ifa, &(ifp->if_addrhead), ifa_link) { |
504 |
sdl = (struct sockaddr_dl *)ifa->ifa_addr; |
505 |
if (sdl->sdl_type == IFT_ETHER) { |
506 |
bcopy((IFP2AC(ifp))->ac_enaddr, |
507 |
LLADDR(sdl), ifp->if_addrlen); |
508 |
break; |
509 |
} |
510 |
} |
511 |
break; |
517 |
break; |
512 |
} |
|
|
513 |
|
518 |
|
514 |
case NGM_EIFACE_GET_IFNAME: |
519 |
case NGM_EIFACE_GET_IFINDEX: |
515 |
{ |
520 |
NG_MKRESPONSE(resp, msg, sizeof(u_int32_t), M_NOWAIT); |
516 |
struct ng_eiface_ifname *arg; |
|
|
517 |
|
518 |
NG_MKRESPONSE(resp, msg, sizeof(*arg), M_NOWAIT); |
519 |
if (resp == NULL) { |
521 |
if (resp == NULL) { |
520 |
error = ENOMEM; |
522 |
error = ENOMEM; |
521 |
break; |
523 |
break; |
522 |
} |
524 |
} |
523 |
arg = (struct ng_eiface_ifname *)resp->data; |
525 |
*((u_int32_t *)resp->data) = ifp->if_index; |
524 |
strlcpy(arg->ngif_name, ifp->if_xname, |
|
|
525 |
sizeof(arg->ngif_name)); |
526 |
break; |
526 |
break; |
527 |
} |
|
|
528 |
|
527 |
|
529 |
case NGM_EIFACE_GET_IFADDRS: |
528 |
case NGM_EIFACE_GET_ENADDR: |
530 |
{ |
529 |
NG_MKRESPONSE(resp, msg, ETHER_ADDR_LEN, M_NOWAIT); |
531 |
struct ifaddr *ifa; |
|
|
532 |
caddr_t ptr; |
533 |
int buflen; |
534 |
|
535 |
#define SA_SIZE(s) ((s)->sa_len<sizeof(*(s))? sizeof(*(s)):(s)->sa_len) |
536 |
|
537 |
/* Determine size of response and allocate it */ |
538 |
buflen = 0; |
539 |
TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) |
540 |
buflen += SA_SIZE(ifa->ifa_addr); |
541 |
NG_MKRESPONSE(resp, msg, buflen, M_NOWAIT); |
542 |
if (resp == NULL) { |
530 |
if (resp == NULL) { |
543 |
error = ENOMEM; |
531 |
error = ENOMEM; |
544 |
break; |
532 |
break; |
545 |
} |
533 |
} |
546 |
/* Add addresses */ |
534 |
bcopy((IFP2AC(ifp))->ac_enaddr, |
547 |
ptr = resp->data; |
535 |
resp->data, ETHER_ADDR_LEN); |
548 |
TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { |
536 |
break; |
549 |
const int len = SA_SIZE(ifa->ifa_addr); |
537 |
|
550 |
|
538 |
case NGM_EIFACE_SET_ENADDR: |
551 |
if (buflen < len) { |
539 |
if (msg->header.arglen != ETHER_ADDR_LEN){ |
552 |
log(LOG_ERR, "%s: len changed?\n", |
540 |
error = EINVAL; |
553 |
ifp->if_xname); |
541 |
break; |
554 |
break; |
|
|
555 |
} |
556 |
bcopy(ifa->ifa_addr, ptr, len); |
557 |
ptr += len; |
558 |
buflen -= len; |
559 |
} |
542 |
} |
|
|
543 |
error = if_setlladdr(ifp, |
544 |
(u_char *)msg->data, ETHER_ADDR_LEN); |
560 |
break; |
545 |
break; |
561 |
#undef SA_SIZE |
|
|
562 |
} |
563 |
|
546 |
|
564 |
default: |
547 |
default: |
565 |
error = EINVAL; |
548 |
error = EINVAL; |