diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index 52d403d1a680..36424644822f 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -227,7 +227,7 @@ typedef void af_getaddr __P((const char *, int)); typedef void af_getprefix __P((const char *, int)); af_status in_status, ipx_status, at_status, ether_status; -af_getaddr in_getaddr, ipx_getaddr, at_getaddr; +af_getaddr in_getaddr, ipx_getaddr, at_getaddr, ether_getaddr; #ifdef INET6 af_status in6_status; @@ -268,13 +268,14 @@ struct afswtch { { "ns", AF_NS, xns_status, xns_getaddr, NULL, SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, #endif - { "ether", AF_INET, ether_status, NULL, NULL }, /* XXX not real!! */ + { "ether", AF_LINK, ether_status, ether_getaddr, NULL, + 0, SIOCSIFLLADDR, NULL, C(ridreq) }, #if 0 /* XXX conflicts with the media command */ #ifdef USE_IF_MEDIA - { "media", AF_INET, media_status, NULL, NULL, }, /* XXX not real!! */ + { "media", AF_UNSPEC, media_status, NULL, NULL, }, /* XXX not real!! */ #endif #ifdef USE_VLANS - { "vlan", AF_INET, media_status, NULL, NULL, }, /* XXX not real!! */ + { "vlan", AF_UNSPEC, vlan_status, NULL, NULL, }, /* XXX not real!! */ #endif #endif { 0, 0, 0, 0 } @@ -541,7 +542,7 @@ ifconfig(argc, argv, afp) if (afp == NULL) afp = &afs[0]; - ifr.ifr_addr.sa_family = afp->af_af; + ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af; strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) @@ -653,7 +654,7 @@ setifaddr(addr, param, s, afp) * and the flags may change when the address is set. */ setaddr++; - if (doalias == 0) + if (doalias == 0 && afp->af_af != AF_LINK) clearaddr = 1; (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); } @@ -869,7 +870,7 @@ status(afp, addrcount, sdl, ifm, ifam) } else allfamilies = 0; - ifr.ifr_addr.sa_family = afp->af_af; + ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af; strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) @@ -908,26 +909,12 @@ status(afp, addrcount, sdl, ifm, ifam) &info); if (!allfamilies) { - if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family && -#ifdef USE_IF_MEDIA - afp->af_status != media_status && -#endif -#ifdef USE_VLANS - afp->af_status != vlan_status && -#endif - afp->af_status != ether_status) { + if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family) { p = afp; (*p->af_status)(s, &info); } } else for (p = afs; p->af_name; p++) { - if (p->af_af == info.rti_info[RTAX_IFA]->sa_family && -#ifdef USE_IF_MEDIA - p->af_status != media_status && -#endif -#ifdef USE_VLANS - p->af_status != vlan_status && -#endif - p->af_status != ether_status) + if (p->af_af == info.rti_info[RTAX_IFA]->sa_family) (*p->af_status)(s, &info); } addrcount--; @@ -1402,6 +1389,24 @@ at_getaddr(addr, which) sat->sat_addr.s_node = node; } +void +ether_getaddr(addr, which) + const char *addr; + int which; +{ + struct ether_addr *ea; + struct sockaddr *sea = &ridreq.ifr_addr; + + ea = ether_aton(addr); + if (ea == NULL) + errx(1, "malformed ether address"); + if (which == MASK) + errx(1, "Ethernet does not use netmasks"); + sea->sa_family = AF_LINK; + sea->sa_len = ETHER_ADDR_LEN; + bcopy(ea, sea->sa_data, ETHER_ADDR_LEN); +} + /* XXX FIXME -- should use strtoul for better parsing. */ void setatrange(range, dummy, s, afp)