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