--- libaitio/src/bpf.c 2013/10/21 21:12:42 1.4 +++ libaitio/src/bpf.c 2013/12/04 10:08:41 1.4.16.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: bpf.c,v 1.4 2013/10/21 21:12:42 misho Exp $ +* $Id: bpf.c,v 1.4.16.1 2013/12/04 10:08:41 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -65,6 +65,43 @@ io_get1stiface(char *szIface, int iflen) strlcpy(szIface, ifa->ifa_name, iflen); freeifaddrs(ifa); return 0; +} + +/* + * io_getmaciface() - Get MAC address from interface name + * + * @csIface = interface name + * @ea = ethernet address + * return: -1 error, 0 ok or 1 not found + */ +int +io_getmaciface(const char *csIface, ether_addr_t * __restrict ea) +{ + struct ifaddrs *ifa, *ifp; + struct sockaddr_dl *dl; + int ret = 1; + + if (!csIface || !ea) + return -1; + else + memset(ea, 0, sizeof(ether_addr_t)); + + getifaddrs(&ifa); + for (ifp = ifa; ifp; ifp = ifp->ifa_next) + if (!strcmp(csIface, ifp->ifa_name) && ifp->ifa_addr && + ifp->ifa_addr->sa_family == AF_LINK) { + dl = (struct sockaddr_dl*) ifp->ifa_addr; + if ((dl->sdl_type == IFT_ETHER || dl->sdl_type == IFT_L2VLAN || + dl->sdl_type == IFT_BRIDGE) && + dl->sdl_alen == ETHER_ADDR_LEN) { + memcpy(ea, LLADDR(dl), sizeof(ether_addr_t)); + ret = 0; + break; + } + } + freeifaddrs(ifa); + + return ret; } /*