Mercurial > hg > dhcpcd
changeset 2236:d1cd3082f593 draft
Skip Virtual Interface Masters.
Currently this only applies to FreeBSD VAP masters as dhcpcd should
only work on wlandev created clones.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Tue, 21 Jan 2014 15:57:30 +0000 |
| parents | c6ef4773e366 |
| children | b2bf5887f15a |
| files | net.c |
| diffstat | 1 files changed, 34 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/net.c Tue Jan 21 13:40:33 2014 +0000 +++ b/net.c Tue Jan 21 15:57:30 2014 +0000 @@ -186,6 +186,33 @@ return ret; } +/* + * FreeBSD allows for Virtual Access Points + * We need to check if the interface is a Virtual Interface Master + * and if so, don't use it. + */ +static int +vi_master(const char *ifname) +{ +#ifdef SIOCGIFMEDIA + struct ifmediareq ifmr; + char ssid[IF_SSIDSIZE]; + + memset(&ifmr, 0, sizeof(ifmr)); + strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name)); + if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) == -1) + return -1; + if (ifmr.ifm_status & IFM_AVALID && + IFM_TYPE(ifmr.ifm_active) == IFM_IEEE80211) + { + if (getifssid(ifname, ssid) == -1) + return 1; + } +#endif + + return 0; +} + int up_interface(struct interface *iface) { @@ -318,6 +345,13 @@ if (ifac && i == ifac) continue; + if (vi_master(ifa->ifa_name) == 1) { + syslog(LOG_DEBUG, + "%s: is a Virtual Interface Master, skipping", + ifa->ifa_name); + continue; + } + ifp = calloc(1, sizeof(*ifp)); if (ifp == NULL) return NULL;
