p80211req.c revision b1de9675ac51aeff61a5a71247455d6cfaa86bb6
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/slab.h>
5900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/wireless.h>
6000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/netdevice.h>
6100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/etherdevice.h>
6200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <net/sock.h>
6300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include <linux/netlink.h>
6400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
6500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "wlan_compat.h"
6600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
6700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211types.h"
6800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211hdr.h"
6900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211mgmt.h"
7000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211conv.h"
7100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211msg.h"
7200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211netdev.h"
7300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211ioctl.h"
7400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211metadef.h"
7500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211metastruct.h"
7600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman#include "p80211req.h"
7700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
78b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoffstatic void p80211req_handlemsg(wlandevice_t *wlandev, p80211msg_t *msg);
79b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoffstatic int p80211req_mibset_mibget(wlandevice_t *wlandev,
80b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				   p80211msg_dot11req_mibget_t *mib_msg,
81b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				   int isget);
8200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
8300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman/*----------------------------------------------------------------
8400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* p80211req_dorequest
8500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
8600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Handles an MLME reqest/confirm message.
8700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
8800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Arguments:
8900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	wlandev		WLAN device struct
9000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	msgbuf		Buffer containing a request message
9100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
9200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Returns:
9300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	0 on success, an errno otherwise
9400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
9500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Call context:
9600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	Potentially blocks the caller, so it's a good idea to
9700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	not call this function from an interrupt context.
9800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman----------------------------------------------------------------*/
99b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoffint p80211req_dorequest(wlandevice_t *wlandev, u8 *msgbuf)
10000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman{
101b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	int result = 0;
102b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	p80211msg_t *msg = (p80211msg_t *) msgbuf;
10300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
10400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Check to make sure the MSD is running */
105b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (!((wlandev->msdstate == WLAN_MSD_HWPRESENT &&
106b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	       msg->msgcode == DIDmsg_lnxreq_ifstate) ||
107b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	      wlandev->msdstate == WLAN_MSD_RUNNING ||
108b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	      wlandev->msdstate == WLAN_MSD_FWLOAD)) {
10900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		return -ENODEV;
11000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	}
11100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
11200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Check Permissions */
113b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (!capable(CAP_NET_ADMIN) && (msg->msgcode != DIDmsg_dot11req_mibget)) {
114b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		printk(KERN_ERR
115b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		       "%s: only dot11req_mibget allowed for non-root.\n",
116b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		       wlandev->name);
11700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		return -EPERM;
11800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	}
11900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
12000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Check for busy status */
121b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (test_and_set_bit(1, &(wlandev->request_pending)))
12200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		return -EBUSY;
12300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
12400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Allow p80211 to look at msg and handle if desired. */
12500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* So far, all p80211 msgs are immediate, no waitq/timer necessary */
12600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* This may change. */
12700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	p80211req_handlemsg(wlandev, msg);
12800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
12900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	/* Pass it down to wlandev via wlandev->mlmerequest */
130b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	if (wlandev->mlmerequest != NULL)
13100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		wlandev->mlmerequest(wlandev, msg);
13200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
133b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	clear_bit(1, &(wlandev->request_pending));
134b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	return result; /* if result==0, msg->status still may contain an err */
13500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman}
13600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
13700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman/*----------------------------------------------------------------
13800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* p80211req_handlemsg
13900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
14000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* p80211 message handler.  Primarily looks for messages that
14100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* belong to p80211 and then dispatches the appropriate response.
14200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* TODO: we don't do anything yet.  Once the linuxMIB is better
14300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	defined we'll need a get/set handler.
14400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
14500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Arguments:
14600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	wlandev		WLAN device struct
14700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	msg		message structure
14800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
14900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Returns:
15000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	nothing (any results are set in the status field of the msg)
15100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*
15200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman* Call context:
15300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman*	Process thread
15400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman----------------------------------------------------------------*/
155b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoffstatic void p80211req_handlemsg(wlandevice_t *wlandev, p80211msg_t *msg)
15600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman{
15700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	switch (msg->msgcode) {
15800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
159b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmsg_lnxreq_hostwep:{
160b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			p80211msg_lnxreq_hostwep_t *req =
161b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			    (p80211msg_lnxreq_hostwep_t *) msg;
162b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			wlandev->hostwep &=
163b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			    ~(HOSTWEP_DECRYPT | HOSTWEP_ENCRYPT);
164b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (req->decrypt.data == P80211ENUM_truth_true)
165b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep |= HOSTWEP_DECRYPT;
166b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (req->encrypt.data == P80211ENUM_truth_true)
167b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep |= HOSTWEP_ENCRYPT;
16800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
169b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
170b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
17100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	case DIDmsg_dot11req_mibget:
172b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmsg_dot11req_mibset:{
173b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			int isget = (msg->msgcode == DIDmsg_dot11req_mibget);
174b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			p80211msg_dot11req_mibget_t *mib_msg =
175b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			    (p80211msg_dot11req_mibget_t *) msg;
176b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			p80211req_mibset_mibget(wlandev, mib_msg, isget);
177b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
17800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	default:
17900b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		;
180b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	}			/* switch msg->msgcode */
18100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
18200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	return;
18300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman}
18400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
18500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartmanstatic int p80211req_mibset_mibget(wlandevice_t *wlandev,
18600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				   p80211msg_dot11req_mibget_t *mib_msg,
18700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				   int isget)
18800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman{
189b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	p80211itemd_t *mibitem = (p80211itemd_t *) mib_msg->mibattribute.data;
190b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	p80211pstrd_t *pstr = (p80211pstrd_t *) mibitem->data;
191aaad430378dd128ee015c8ed6e77809317c496a5Solomon Peachy	u8 *key = mibitem->data + sizeof(p80211pstrd_t);
19200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
19300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	switch (mibitem->did) {
194b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey0:{
195b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
196b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 0, key, pstr->len);
197b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
198b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
199b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey1:{
200b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
201b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 1, key, pstr->len);
202b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
203b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
204b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey2:{
205b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
206b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 2, key, pstr->len);
207b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
208b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
209b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey3:{
210b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (!isget)
211b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wep_change_key(wlandev, 3, key, pstr->len);
212b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
213b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
214b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11PrivacyTable_dot11WEPDefaultKeyID:{
215b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			u32 *data = (u32 *) mibitem->data;
21600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
217b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (isget) {
218b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				*data =
219b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    wlandev->hostwep & HOSTWEP_DEFAULTKEY_MASK;
22000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman			} else {
22100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				wlandev->hostwep &= ~(HOSTWEP_DEFAULTKEY_MASK);
22200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
223b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep |=
224b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    (*data & HOSTWEP_DEFAULTKEY_MASK);
22500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman			}
226b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
227b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff		}
228b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked:{
229b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			u32 *data = (u32 *) mibitem->data;
23000b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
231b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (isget) {
232b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				if (wlandev->hostwep & HOSTWEP_PRIVACYINVOKED)
233b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_true;
234b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				else
235b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_false;
236b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			} else {
23700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				wlandev->hostwep &= ~(HOSTWEP_PRIVACYINVOKED);
23800b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman				if (*data == P80211ENUM_truth_true)
239b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					wlandev->hostwep |=
240b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					    HOSTWEP_PRIVACYINVOKED;
241b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			}
242b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
24300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		}
244b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff	case DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted:{
245b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			u32 *data = (u32 *) mibitem->data;
24600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
247b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			if (isget) {
248b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				if (wlandev->
249b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    hostwep & HOSTWEP_EXCLUDEUNENCRYPTED)
250b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_true;
251b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				else
252b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					*data = P80211ENUM_truth_false;
253b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			} else {
254b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				wlandev->hostwep &=
255b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				    ~(HOSTWEP_EXCLUDEUNENCRYPTED);
256b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff				if (*data == P80211ENUM_truth_true)
257b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					wlandev->hostwep |=
258b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff					    HOSTWEP_EXCLUDEUNENCRYPTED;
259b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			}
260b1de9675ac51aeff61a5a71247455d6cfaa86bb6Moritz Muehlenhoff			break;
26100b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		}
26200b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	default:
26300b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman		;
26400b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	}
26500b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman
26600b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman	return 0;
26700b3ed1685089ff52169a715de11106ed37df087Greg Kroah-Hartman}
268