From owner-p4-projects@FreeBSD.ORG Fri Mar 7 01:22:35 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8F983106566C; Fri, 7 Mar 2008 01:22:35 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4E844106567B for ; Fri, 7 Mar 2008 01:22:35 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 3D8E08FC15 for ; Fri, 7 Mar 2008 01:22:35 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m271MZ54073854 for ; Fri, 7 Mar 2008 01:22:35 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m271MZ9H073852 for perforce@freebsd.org; Fri, 7 Mar 2008 01:22:35 GMT (envelope-from sam@freebsd.org) Date: Fri, 7 Mar 2008 01:22:35 GMT Message-Id: <200803070122.m271MZ9H073852@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 137042 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Mar 2008 01:22:36 -0000 http://perforce.freebsd.org/chv.cgi?CH=137042 Change 137042 by sam@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