Index: sys/compat/linux/linux.c =================================================================== --- sys/compat/linux/linux.c +++ sys/compat/linux/linux.c @@ -227,18 +227,23 @@ struct ifnet *ifp; int len, unit; char *ep; - int is_eth, index; + int index; + bool is_eth, is_lo; for (len = 0; len < LINUX_IFNAMSIZ; ++len) - if (!isalpha(lxname[len])) + if (isalpha(lxname[len]) == 0 || lxname[len] == 0) break; if (len == 0 || len == LINUX_IFNAMSIZ) return (NULL); + /* Linux loopback interface name is lo (not lo0) */ + is_lo = (len == 2 && strncmp(lxname, "lo", len) == 0); unit = (int)strtoul(lxname + len, &ep, 10); - if (ep == NULL || ep == lxname + len || ep >= lxname + LINUX_IFNAMSIZ) + if ((ep == NULL || ep == lxname + len || ep >= lxname + LINUX_IFNAMSIZ) && + is_lo == 0) return (NULL); index = 0; - is_eth = (len == 3 && !strncmp(lxname, "eth", len)) ? 1 : 0; + is_eth = (len == 3 && strncmp(lxname, "eth", len) == 0); + CURVNET_SET(TD_TO_VNET(td)); IFNET_RLOCK(); CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { @@ -251,10 +256,12 @@ break; if (is_eth && IFP_IS_ETH(ifp) && unit == index++) break; + if (is_lo && IFP_IS_LOOP(ifp)) + break; } IFNET_RUNLOCK(); CURVNET_RESTORE(); - if (ifp != NULL) + if (ifp != NULL && bsdname != NULL) strlcpy(bsdname, ifp->if_xname, IFNAMSIZ); return (ifp); } @@ -302,6 +309,3 @@ return (ENOENT); } - - -