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;