PERFORCE change 137042 for review

Sam Leffler sam at FreeBSD.org
Fri Mar 7 01:22:36 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=137042

Change 137042 by sam at sam_ebb on 2008/03/07 01:22:20

	add IEEE80211_IOC_STA_VLAN to get+set the vlan tag; by
	convention mac address 0 is the bss node

Affected files ...

.. //depot/projects/vap/sys/net80211/ieee80211_ioctl.c#36 edit
.. //depot/projects/vap/sys/net80211/ieee80211_ioctl.h#13 edit

Differences ...

==== //depot/projects/vap/sys/net80211/ieee80211_ioctl.c#36 (text+ko) ====

@@ -67,6 +67,7 @@
 	(IFNET_IS_UP_RUNNING(vap->iv_ifp) && \
 	 (_vap)->iv_roaming == IEEE80211_ROAMING_AUTO)
 
+static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
 static struct ieee80211_channel *findchannel(struct ieee80211com *,
 		int ieee, int mode);
 
@@ -695,6 +696,31 @@
 	return error;
 }
 
+static __noinline int
+ieee80211_ioctl_getstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	struct ieee80211_node *ni;
+	struct ieee80211req_sta_vlan vlan;
+	int error;
+
+	if (ireq->i_len != sizeof(vlan))
+		return EINVAL;
+	error = copyin(ireq->i_data, &vlan, sizeof(vlan));
+	if (error != 0)
+		return error;
+	if (!IEEE80211_ADDR_EQ(vlan.sv_macaddr, zerobssid)) {
+		ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
+		    vlan.sv_macaddr);
+		if (ni == NULL)
+			return ENOENT;
+	} else
+		ni = ieee80211_ref_node(vap->iv_bss);
+	vlan.sv_vlan = ni->ni_vlan;
+	error = copyout(&vlan, ireq->i_data, sizeof(vlan));
+	ieee80211_free_node(ni);
+	return error;
+}
+
 /*
  * When building the kernel with -O2 on the i386 architecture, gcc
  * seems to want to inline this function into ieee80211_ioctl()
@@ -1027,6 +1053,9 @@
 		} else
 			ireq->i_val = 0;
 		break;
+	case IEEE80211_IOC_STA_VLAN:
+		error = ieee80211_ioctl_getstavlan(vap, ireq);
+		break;
 	default:
 		error = EINVAL;
 		break;
@@ -2390,6 +2419,30 @@
 #undef IEEE80211_IOC_SCAN_FLAGS
 }
 
+static __noinline int
+ieee80211_ioctl_setstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	struct ieee80211_node *ni;
+	struct ieee80211req_sta_vlan vlan;
+	int error;
+
+	if (ireq->i_len != sizeof(vlan))
+		return EINVAL;
+	error = copyin(ireq->i_data, &vlan, sizeof(vlan));
+	if (error != 0)
+		return error;
+	if (!IEEE80211_ADDR_EQ(vlan.sv_macaddr, zerobssid)) {
+		ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
+		    vlan.sv_macaddr);
+		if (ni == NULL)
+			return ENOENT;
+	} else
+		ni = ieee80211_ref_node(vap->iv_bss);
+	ni->ni_vlan = vlan.sv_vlan;
+	ieee80211_free_node(ni);
+	return error;
+}
+
 static int
 isvap11g(const struct ieee80211vap *vap)
 {
@@ -2409,7 +2462,6 @@
 static __noinline int
 ieee80211_ioctl_set80211(struct ieee80211vap *vap, u_long cmd, struct ieee80211req *ireq)
 {
-	static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
 	struct ieee80211com *ic = vap->iv_ic;
 	int error;
 	const struct ieee80211_authenticator *auth;
@@ -3029,6 +3081,9 @@
 		if (isvapht(vap))
 			error = ERESTART;
 		break;
+	case IEEE80211_IOC_STA_VLAN:
+		error = ieee80211_ioctl_setstavlan(vap, ireq);
+		break;
 	default:
 		error = EINVAL;
 		break;

==== //depot/projects/vap/sys/net80211/ieee80211_ioctl.h#13 (text+ko) ====

@@ -474,6 +474,14 @@
 	int		csa_count;		/* beacon count to switch */
 };
 
+/*
+ * Get/set per-station vlan tag.
+ */
+struct ieee80211req_sta_vlan {
+	uint8_t		sv_macaddr[IEEE80211_ADDR_LEN];
+	uint16_t	sv_vlan;
+};
+
 #ifdef __FreeBSD__
 /*
  * FreeBSD-style ioctls.
@@ -593,6 +601,7 @@
 #define	IEEE80211_IOC_REGDOMAIN		106	/* regulatory domain info */
 #define	IEEE80211_IOC_ROAM		107	/* roaming params en masse */
 #define	IEEE80211_IOC_TXPARAMS		108	/* tx parameters */
+#define	IEEE80211_IOC_STA_VLAN		109	/* per-station vlan tag */
 
 /*
  * Parameters for controlling a scan requested with


More information about the p4-projects mailing list