]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Skip Virtual Interface Masters.
authorRoy Marples <roy@marples.name>
Tue, 21 Jan 2014 15:57:30 +0000 (15:57 +0000)
committerRoy Marples <roy@marples.name>
Tue, 21 Jan 2014 15:57:30 +0000 (15:57 +0000)
Currently this only applies to FreeBSD VAP masters as dhcpcd should
only work on wlandev created clones.

net.c

diff --git a/net.c b/net.c
index 390fff9f1f7aeb8f45da1c24be6f73b936c9d56d..1cf601e429d5a6d37df1357b6dbccf53e7c3e3e9 100644 (file)
--- a/net.c
+++ b/net.c
@@ -186,6 +186,33 @@ carrier_status(struct interface *iface)
        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 @@ discover_interfaces(int argc, char * const *argv)
                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;