Changeset View
Changeset View
Standalone View
Standalone View
head/sbin/ifconfig/af_link.c
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
static struct ifreq link_ridreq; | static struct ifreq link_ridreq; | ||||
extern char *f_ether; | extern char *f_ether; | ||||
static void | static void | ||||
link_status(int s __unused, const struct ifaddrs *ifa) | link_status(int s __unused, const struct ifaddrs *ifa) | ||||
{ | { | ||||
/* XXX no const 'cuz LLADDR is defined wrong */ | /* XXX no const 'cuz LLADDR is defined wrong */ | ||||
struct sockaddr_dl *sdl = (struct sockaddr_dl *) ifa->ifa_addr; | struct sockaddr_dl *sdl; | ||||
char *ether_format, *format_char; | char *ether_format, *format_char; | ||||
struct ifreq ifr; | |||||
int n, rc, sock_hw; | |||||
static const u_char laggaddr[6] = {0}; | |||||
if (sdl != NULL && sdl->sdl_alen > 0) { | sdl = (struct sockaddr_dl *) ifa->ifa_addr; | ||||
if ((sdl->sdl_type == IFT_ETHER || | if (sdl == NULL || sdl->sdl_alen == 0) | ||||
sdl->sdl_type == IFT_L2VLAN || | return; | ||||
sdl->sdl_type == IFT_BRIDGE) && | |||||
sdl->sdl_alen == ETHER_ADDR_LEN) { | if ((sdl->sdl_type == IFT_ETHER || sdl->sdl_type == IFT_L2VLAN || | ||||
sdl->sdl_type == IFT_BRIDGE) && sdl->sdl_alen == ETHER_ADDR_LEN) { | |||||
ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl)); | ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl)); | ||||
if (f_ether != NULL && strcmp(f_ether, "dash") == 0) { | if (f_ether != NULL && strcmp(f_ether, "dash") == 0) { | ||||
for (format_char = strchr(ether_format, ':'); | for (format_char = strchr(ether_format, ':'); | ||||
format_char != NULL; | format_char != NULL; | ||||
format_char = strchr(ether_format, ':')) | format_char = strchr(ether_format, ':')) | ||||
*format_char = '-'; | *format_char = '-'; | ||||
} | } | ||||
printf("\tether %s\n", ether_format); | printf("\tether %s\n", ether_format); | ||||
} else { | } else { | ||||
int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0; | n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0; | ||||
printf("\tlladdr %s\n", link_ntoa(sdl) + n); | printf("\tlladdr %s\n", link_ntoa(sdl) + n); | ||||
} | } | ||||
/* Best-effort (i.e. failures are silent) to get original | |||||
/* | |||||
* Best-effort (i.e. failures are silent) to get original | |||||
* hardware address, as read by NIC driver at attach time. Only | * hardware address, as read by NIC driver at attach time. Only | ||||
* applies to Ethernet NICs (IFT_ETHER). However, laggX | * applies to Ethernet NICs (IFT_ETHER). However, laggX | ||||
* interfaces claim to be IFT_ETHER, and re-type their component | * interfaces claim to be IFT_ETHER, and re-type their component | ||||
* Ethernet NICs as IFT_IEEE8023ADLAG. So, check for both. If | * Ethernet NICs as IFT_IEEE8023ADLAG. So, check for both. If | ||||
* the MAC is zeroed, then it's actually a lagg. | * the MAC is zeroed, then it's actually a lagg. | ||||
*/ | */ | ||||
if ((sdl->sdl_type == IFT_ETHER || | if ((sdl->sdl_type != IFT_ETHER && | ||||
sdl->sdl_type == IFT_IEEE8023ADLAG) && | sdl->sdl_type != IFT_IEEE8023ADLAG) || | ||||
sdl->sdl_alen == ETHER_ADDR_LEN) { | sdl->sdl_alen != ETHER_ADDR_LEN) | ||||
struct ifreq ifr; | return; | ||||
int sock_hw; | |||||
int rc; | |||||
static const u_char laggaddr[6] = {0}; | |||||
strncpy(ifr.ifr_name, ifa->ifa_name, | strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); | ||||
sizeof(ifr.ifr_name)); | memcpy(&ifr.ifr_addr, ifa->ifa_addr, sizeof(ifa->ifa_addr->sa_len)); | ||||
memcpy(&ifr.ifr_addr, ifa->ifa_addr, | |||||
sizeof(ifa->ifa_addr->sa_len)); | |||||
ifr.ifr_addr.sa_family = AF_LOCAL; | ifr.ifr_addr.sa_family = AF_LOCAL; | ||||
if ((sock_hw = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) { | if ((sock_hw = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) { | ||||
warn("socket(AF_LOCAL,SOCK_DGRAM)"); | warn("socket(AF_LOCAL,SOCK_DGRAM)"); | ||||
return; | return; | ||||
} | } | ||||
rc = ioctl(sock_hw, SIOCGHWADDR, &ifr); | rc = ioctl(sock_hw, SIOCGHWADDR, &ifr); | ||||
close(sock_hw); | close(sock_hw); | ||||
if (rc != 0) { | if (rc != 0) | ||||
return; | return; | ||||
} | |||||
/* | /* | ||||
* If this is definitely a lagg device or the hwaddr | * If this is definitely a lagg device or the hwaddr | ||||
* matches the link addr, don't bother. | * matches the link addr, don't bother. | ||||
*/ | */ | ||||
if (memcmp(ifr.ifr_addr.sa_data, laggaddr, | if (memcmp(ifr.ifr_addr.sa_data, laggaddr, sdl->sdl_alen) == 0 || | ||||
sdl->sdl_alen) == 0 || | memcmp(ifr.ifr_addr.sa_data, LLADDR(sdl), sdl->sdl_alen) == 0) | ||||
memcmp(ifr.ifr_addr.sa_data, LLADDR(sdl), | goto pcp; | ||||
sdl->sdl_alen) == 0) { | |||||
return; | |||||
} | |||||
ether_format = ether_ntoa((const struct ether_addr *) | ether_format = ether_ntoa((const struct ether_addr *) | ||||
&ifr.ifr_addr.sa_data); | &ifr.ifr_addr.sa_data); | ||||
if (f_ether != NULL && strcmp(f_ether, "dash") == 0) { | if (f_ether != NULL && strcmp(f_ether, "dash") == 0) { | ||||
for (format_char = strchr(ether_format, ':'); | for (format_char = strchr(ether_format, ':'); | ||||
format_char != NULL; | format_char != NULL; | ||||
format_char = strchr(ether_format, ':')) | format_char = strchr(ether_format, ':')) | ||||
*format_char = '-'; | *format_char = '-'; | ||||
} | } | ||||
printf("\thwaddr %s\n", ether_format); | printf("\thwaddr %s\n", ether_format); | ||||
} | |||||
} | pcp: | ||||
if (ioctl(s, SIOCGLANPCP, (caddr_t)&ifr) == 0 && | |||||
ifr.ifr_lan_pcp != IFNET_PCP_NONE) | |||||
printf("\tpcp %d\n", ifr.ifr_lan_pcp); | |||||
} | } | ||||
static void | static void | ||||
link_getaddr(const char *addr, int which) | link_getaddr(const char *addr, int which) | ||||
{ | { | ||||
char *temp; | char *temp; | ||||
struct sockaddr_dl sdl; | struct sockaddr_dl sdl; | ||||
struct sockaddr *sa = &link_ridreq.ifr_addr; | struct sockaddr *sa = &link_ridreq.ifr_addr; | ||||
▲ Show 20 Lines • Show All 60 Lines • Show Last 20 Lines |