100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman/* src/p80211/p80211req.c
200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Request/Indication/MacMgmt interface handling functions
400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* --------------------------------------------------------------------
700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* linux-wlan
900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
1000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   The contents of this file are subject to the Mozilla Public
1100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   License Version 1.1 (the "License"); you may not use this file
1200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   except in compliance with the License. You may obtain a copy of
1300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   the License at http://www.mozilla.org/MPL/
1400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
1500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   Software distributed under the License is distributed on an "AS
1600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
1700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   implied. See the License for the specific language governing
1800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   rights and limitations under the License.
1900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
2000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   Alternatively, the contents of this file may be used under the
2100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   terms of the GNU Public License version 2 (the "GPL"), in which
2200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   case the provisions of the GPL are applicable instead of the
2300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   above.  If you wish to allow the use of your version of this file
2400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   only under the terms of the GPL and not to allow others to use
2500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   your version of this file under the MPL, indicate your decision
2600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   by deleting the provisions above and replace them with the notice
2700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   and other provisions required by the GPL.  If you do not delete
2800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   the provisions above, a recipient may use your version of this
2900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*   file under either the MPL or the GPL.
3000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
3100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* --------------------------------------------------------------------
3200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
3300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Inquiries regarding the linux-wlan Open Source project can be
3400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* made directly to:
3500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
3600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* AbsoluteValue Systems Inc.
3700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* info@linux-wlan.com
3800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* http://www.linux-wlan.com
3900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
4000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* --------------------------------------------------------------------
4100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
4200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Portions of the development of this software were funded by
4300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Intersil Corporation as part of PRISM(R) chipset product development.
4400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
4500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* --------------------------------------------------------------------
4600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
4700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* This file contains the functions, types, and macros to support the
4800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* MLME request interface that's implemented via the device ioctls.
4900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
5000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* --------------------------------------------------------------------
5100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*/
5200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
5300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/module.h>
5400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/kernel.h>
5500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/sched.h>
5600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/types.h>
5700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/skbuff.h>
5800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/wireless.h>
5900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/netdevice.h>
6000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/etherdevice.h>
6100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <net/sock.h>
6200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/netlink.h>
6300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
6400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211types.h"
6500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211hdr.h"
6600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211mgmt.h"
6700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211conv.h"
6800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211msg.h"
6900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211netdev.h"
7000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211ioctl.h"
7100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211metadef.h"
7200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211metastruct.h"
7300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211req.h"
7400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
753d049431e08a847a222e20f406332529751b4365Edgardo Hamesstatic void p80211req_handlemsg(wlandevice_t *wlandev, struct p80211msg *msg);
76297f06cea635ea4552541a11e7fb7014425110c6Mithlesh Thukralstatic int p80211req_mibset_mibget(wlandevice_t *wlandev,
77b6bb56e6aa28085550179335247c649752ff2994Edgardo Hames				   struct p80211msg_dot11req_mibget *mib_msg,
78b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				   int isget);
7900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
8000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman/*----------------------------------------------------------------
8100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* p80211req_dorequest
8200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
8300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Handles an MLME reqest/confirm message.
8400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
8500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Arguments:
8600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	wlandev		WLAN device struct
8700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	msgbuf		Buffer containing a request message
8800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
8900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Returns:
9000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	0 on success, an errno otherwise
9100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
9200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Call context:
9300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	Potentially blocks the caller, so it's a good idea to
9400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	not call this function from an interrupt context.
9500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman----------------------------------------------------------------*/
965dd8acc8fd6b0476a2dc49bc6de4712d22c368c0Svenne Krapint p80211req_dorequest(wlandevice_t *wlandev, u8 *msgbuf)
9700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman{
98b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	int result = 0;
993d049431e08a847a222e20f406332529751b4365Edgardo Hames	struct p80211msg *msg = (struct p80211msg *) msgbuf;
10000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
10100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Check to make sure the MSD is running */
102b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (!((wlandev->msdstate == WLAN_MSD_HWPRESENT &&
103b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	       msg->msgcode == DIDmsg_lnxreq_ifstate) ||
104b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	      wlandev->msdstate == WLAN_MSD_RUNNING ||
105b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	      wlandev->msdstate == WLAN_MSD_FWLOAD)) {
10600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		return -ENODEV;
10700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	}
10800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
10900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Check Permissions */
11067a7b3788cd2b9f63a6cfe68e9e937c25709f053Patrick Rooney	if (!capable(CAP_NET_ADMIN) &&
11167a7b3788cd2b9f63a6cfe68e9e937c25709f053Patrick Rooney	(msg->msgcode != DIDmsg_dot11req_mibget)) {
112b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		printk(KERN_ERR
113b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		       "%s: only dot11req_mibget allowed for non-root.\n",
114b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		       wlandev->name);
11500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		return -EPERM;
11600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	}
11700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
11800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Check for busy status */
119b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (test_and_set_bit(1, &(wlandev->request_pending)))
12000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		return -EBUSY;
12100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
12200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Allow p80211 to look at msg and handle if desired. */
12300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* So far, all p80211 msgs are immediate, no waitq/timer necessary */
12400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* This may change. */
12500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	p80211req_handlemsg(wlandev, msg);
12600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
12700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Pass it down to wlandev via wlandev->mlmerequest */
128b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (wlandev->mlmerequest != NULL)
12900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		wlandev->mlmerequest(wlandev, msg);
13000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
131b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	clear_bit(1, &(wlandev->request_pending));
13267a7b3788cd2b9f63a6cfe68e9e937c25709f053Patrick Rooney	return result;	/* if result==0, msg->status still may contain an err */
13300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman}
13400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
13500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman/*----------------------------------------------------------------
13600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* p80211req_handlemsg
13700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
13800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* p80211 message handler.  Primarily looks for messages that
13900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* belong to p80211 and then dispatches the appropriate response.
14000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* TODO: we don't do anything yet.  Once the linuxMIB is better
14100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	defined we'll need a get/set handler.
14200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
14300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Arguments:
14400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	wlandev		WLAN device struct
14500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	msg		message structure
14600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
14700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Returns:
14800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	nothing (any results are set in the status field of the msg)
14900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
15000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Call context:
15100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	Process thread
15200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman----------------------------------------------------------------*/
1533d049431e08a847a222e20f406332529751b4365Edgardo Hamesstatic void p80211req_handlemsg(wlandevice_t *wlandev, struct p80211msg *msg)
15400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman{
15500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	switch (msg->msgcode) {
15600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
157b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmsg_lnxreq_hostwep:{
158b6bb56e6aa28085550179335247c649752ff2994Edgardo Hames			struct p80211msg_lnxreq_hostwep *req =
159b6bb56e6aa28085550179335247c649752ff2994Edgardo Hames			    (struct p80211msg_lnxreq_hostwep *) msg;
160b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			wlandev->hostwep &=
161b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			    ~(HOSTWEP_DECRYPT | HOSTWEP_ENCRYPT);
162b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (req->decrypt.data == P80211ENUM_truth_true)
163b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep |= HOSTWEP_DECRYPT;
164b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (req->encrypt.data == P80211ENUM_truth_true)
165b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep |= HOSTWEP_ENCRYPT;
16600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
167b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
168b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
16900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	case DIDmsg_dot11req_mibget:
170b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmsg_dot11req_mibset:{
171b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			int isget = (msg->msgcode == DIDmsg_dot11req_mibget);
172b6bb56e6aa28085550179335247c649752ff2994Edgardo Hames			struct p80211msg_dot11req_mibget *mib_msg =
173b6bb56e6aa28085550179335247c649752ff2994Edgardo Hames			    (struct p80211msg_dot11req_mibget *) msg;
174b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			p80211req_mibset_mibget(wlandev, mib_msg, isget);
175b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
17600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	default:
17700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		;
178b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	}			/* switch msg->msgcode */
17900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
18000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	return;
18100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman}
18200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
183297f06cea635ea4552541a11e7fb7014425110c6Mithlesh Thukralstatic int p80211req_mibset_mibget(wlandevice_t *wlandev,
184b6bb56e6aa28085550179335247c649752ff2994Edgardo Hames				   struct p80211msg_dot11req_mibget *mib_msg,
18500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				   int isget)
18600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman{
187b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	p80211itemd_t *mibitem = (p80211itemd_t *) mib_msg->mibattribute.data;
188b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	p80211pstrd_t *pstr = (p80211pstrd_t *) mibitem->data;
189aaad430378dd128ee015c8ed6e77809317c496a5Solomon Peachy	u8 *key = mibitem->data + sizeof(p80211pstrd_t);
19000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
19100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	switch (mibitem->did) {
192b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey0:{
193b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
194b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 0, key, pstr->len);
195b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
196b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
197b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey1:{
198b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
199b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 1, key, pstr->len);
200b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
201b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
202b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey2:{
203b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
204b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 2, key, pstr->len);
205b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
206b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
207b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey3:{
208b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
209b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 3, key, pstr->len);
210b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
211b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
212b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11PrivacyTable_dot11WEPDefaultKeyID:{
213b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			u32 *data = (u32 *) mibitem->data;
21400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
215b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (isget) {
216b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				*data =
217b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    wlandev->hostwep & HOSTWEP_DEFAULTKEY_MASK;
21800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman			} else {
21900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				wlandev->hostwep &= ~(HOSTWEP_DEFAULTKEY_MASK);
22000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
221b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep |=
222b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    (*data & HOSTWEP_DEFAULTKEY_MASK);
22300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman			}
224b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
225b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
226b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked:{
227b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			u32 *data = (u32 *) mibitem->data;
22800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
229b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (isget) {
230b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				if (wlandev->hostwep & HOSTWEP_PRIVACYINVOKED)
231b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_true;
232b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				else
233b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_false;
234b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			} else {
23500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				wlandev->hostwep &= ~(HOSTWEP_PRIVACYINVOKED);
23600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				if (*data == P80211ENUM_truth_true)
237b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					wlandev->hostwep |=
238b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					    HOSTWEP_PRIVACYINVOKED;
239b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			}
240b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
24100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		}
242b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted:{
243b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			u32 *data = (u32 *) mibitem->data;
24400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
245b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (isget) {
24675f49e07520d036c2a0903694fdc0bcfb5523b76Mithlesh Thukral				if (wlandev->hostwep &
24775f49e07520d036c2a0903694fdc0bcfb5523b76Mithlesh Thukral				    HOSTWEP_EXCLUDEUNENCRYPTED)
248b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_true;
249b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				else
250b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_false;
251b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			} else {
252b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep &=
253b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    ~(HOSTWEP_EXCLUDEUNENCRYPTED);
254b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				if (*data == P80211ENUM_truth_true)
255b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					wlandev->hostwep |=
256b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					    HOSTWEP_EXCLUDEUNENCRYPTED;
257b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			}
258b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
25900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		}
26000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	default:
26100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		;
26200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	}
26300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
26400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	return 0;
26500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman}
266