⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p80211req.c

📁 对于无线网卡采用prism芯片的linux的开源驱动.
💻 C
字号:
/* src/p80211/p80211req.c** Request/Indication/MacMgmt interface handling functions** Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.* --------------------------------------------------------------------** linux-wlan**   The contents of this file are subject to the Mozilla Public*   License Version 1.1 (the "License"); you may not use this file*   except in compliance with the License. You may obtain a copy of*   the License at http://www.mozilla.org/MPL/**   Software distributed under the License is distributed on an "AS*   IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or*   implied. See the License for the specific language governing*   rights and limitations under the License.**   Alternatively, the contents of this file may be used under the*   terms of the GNU Public License version 2 (the "GPL"), in which*   case the provisions of the GPL are applicable instead of the*   above.  If you wish to allow the use of your version of this file*   only under the terms of the GPL and not to allow others to use*   your version of this file under the MPL, indicate your decision*   by deleting the provisions above and replace them with the notice*   and other provisions required by the GPL.  If you do not delete*   the provisions above, a recipient may use your version of this*   file under either the MPL or the GPL.** --------------------------------------------------------------------** Inquiries regarding the linux-wlan Open Source project can be* made directly to:** AbsoluteValue Systems Inc.* info@linux-wlan.com* http://www.linux-wlan.com** --------------------------------------------------------------------** Portions of the development of this software were funded by * Intersil Corporation as part of PRISM(R) chipset product development.** --------------------------------------------------------------------** This file contains the functions, types, and macros to support the* MLME request interface that's implemented via the device ioctls.* * --------------------------------------------------------------------*//*================================================================*//* System Includes */#include <linux/config.h>#include <linux/version.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/skbuff.h>#include <linux/slab.h>#include <linux/wireless.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <net/sock.h>#include <linux/netlink.h>#include <wlan/version.h>#include <wlan/wlan_compat.h>/*================================================================*//* Project Includes */#include <wlan/p80211types.h>#include <wlan/p80211hdr.h>#include <wlan/p80211mgmt.h>#include <wlan/p80211conv.h>#include <wlan/p80211msg.h>#include <wlan/p80211netdev.h>#include <wlan/p80211ioctl.h>#include <wlan/p80211metadef.h>#include <wlan/p80211metastruct.h>/*================================================================*//* Local Constants *//* Maximum amount of time we'll wait for a request to complete */#define P80211REQ_MAXTIME	3*HZ	/* 3 seconds *//*================================================================*//* Local Macros *//*================================================================*//* Local Types *//*================================================================*//* Local Static Definitions *//*================================================================*//* Local Function Declarations */static void p80211req_handlemsg( wlandevice_t *wlandev, p80211msg_t *msg);static int p80211req_mibset_mibget(wlandevice_t *wlandev, p80211msg_dot11req_mibget_t *mib_msg, int isget);/*================================================================*//* Function Definitions *//*----------------------------------------------------------------* p80211req_dorequest** Handles an MLME reqest/confirm message.* * Arguments:*	wlandev		WLAN device struct*	msgbuf		Buffer containing a request message** Returns: *	0 on success, an errno otherwise*	* Call context:*	Potentially blocks the caller, so it's a good idea to *	not call this function from an interrupt context.----------------------------------------------------------------*/int p80211req_dorequest( wlandevice_t *wlandev, UINT8 *msgbuf){	int		result = 0;	p80211msg_t	*msg = (p80211msg_t*)msgbuf;	DBFENTER;	/* Check to make sure the MSD is running */	if ( 	!((wlandev->msdstate == WLAN_MSD_HWPRESENT &&	msg->msgcode == DIDmsg_lnxreq_ifstate) ||	wlandev->msdstate == WLAN_MSD_RUNNING || 	wlandev->msdstate == WLAN_MSD_FWLOAD) ) {		return -ENODEV;	}	/* Check Permissions */	if (!capable(CAP_NET_ADMIN) && 	    (msg->msgcode != DIDmsg_dot11req_mibget)) {		WLAN_LOG_ERROR("%s: only dot11req_mibget allowed for non-root.\n", wlandev->name);		return -EPERM;	}	/* Check for busy status */	if ( test_and_set_bit(1, &(wlandev->request_pending))) {		return -EBUSY;	}	/* Allow p80211 to look at msg and handle if desired. */	/* So far, all p80211 msgs are immediate, no waitq/timer necessary */	/* This may change. */	p80211req_handlemsg(wlandev, msg);	/* Pass it down to wlandev via wlandev->mlmerequest */	if ( wlandev->mlmerequest != NULL ) 		wlandev->mlmerequest(wlandev, msg);	clear_bit( 1, &(wlandev->request_pending));	DBFEXIT;	return result;	/* if result==0, msg->status still may contain an err */}/*----------------------------------------------------------------* p80211req_handlemsg** p80211 message handler.  Primarily looks for messages that* belong to p80211 and then dispatches the appropriate response.* TODO: we don't do anything yet.  Once the linuxMIB is better*	defined we'll need a get/set handler.  * * Arguments:*	wlandev		WLAN device struct*	msg		message structure** Returns: *	nothing (any results are set in the status field of the msg)*	* Call context:*	Process thread----------------------------------------------------------------*/void p80211req_handlemsg( wlandevice_t *wlandev, p80211msg_t *msg){        DBFENTER;        	switch (msg->msgcode) {	case DIDmsg_lnxreq_hostwep: {		p80211msg_lnxreq_hostwep_t *req = (p80211msg_lnxreq_hostwep_t*) msg;		wlandev->hostwep &= ~(HOSTWEP_DECRYPT|HOSTWEP_ENCRYPT);		if (req->decrypt.data == P80211ENUM_truth_true)			wlandev->hostwep |= HOSTWEP_DECRYPT;		if (req->encrypt.data == P80211ENUM_truth_true)			wlandev->hostwep |= HOSTWEP_ENCRYPT;		break;	}	case DIDmsg_dot11req_mibget:	case DIDmsg_dot11req_mibset: {		int isget = (msg->msgcode == DIDmsg_dot11req_mibget);		p80211msg_dot11req_mibget_t  *mib_msg = (p80211msg_dot11req_mibget_t *) msg;		p80211req_mibset_mibget (wlandev, mib_msg, isget);	}	default:		// XXX do nothing!		;	} /* switch msg->msgcode */	DBFEXIT;	return;}int p80211req_mibset_mibget(wlandevice_t *wlandev, p80211msg_dot11req_mibget_t *mib_msg, int isget){	p80211itemd_t   *mibitem = (p80211itemd_t *) mib_msg->mibattribute.data;	p80211pstrd_t  *pstr = (p80211pstrd_t*) mibitem->data;	UINT8 *key = mibitem->data + sizeof(p80211pstrd_t);	DBFENTER;	switch (mibitem->did) {	case DIDmib_dot11smt_p80211Table_p80211_ifstate: {		UINT32 *data = (UINT32 *) mibitem->data;		if (isget)			switch (wlandev->msdstate) {			case WLAN_MSD_HWPRESENT:				*data = P80211ENUM_ifstate_disable;				break;			case WLAN_MSD_FWLOAD:				*data = P80211ENUM_ifstate_fwload;				break;			case WLAN_MSD_RUNNING:				*data = P80211ENUM_ifstate_enable;				break;			default:				*data = P80211ENUM_ifstate_enable;			}		break;	}			case DIDmib_dot11phy_dot11PhyOperationTable_dot11ShortPreambleEnabled: {		UINT32 *data = (UINT32 *) mibitem->data;		if (isget)			*data = wlandev->shortpreamble;		else			wlandev->shortpreamble = *data;		break;		}	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey0: {		if (!isget)			wep_change_key(wlandev, 0, key, pstr->len);		break;	}	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey1: {		if (!isget)			wep_change_key(wlandev, 1, key, pstr->len);		break;	}	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey2: {		if (!isget)			wep_change_key(wlandev, 2, key, pstr->len);		break;	}	case DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey3: {		if (!isget)			wep_change_key(wlandev, 3, key, pstr->len);		break;	}	case DIDmib_dot11smt_dot11PrivacyTable_dot11WEPDefaultKeyID: {		UINT32 *data = (UINT32 *) mibitem->data;				if (isget) {			*data = wlandev->hostwep & HOSTWEP_DEFAULTKEY_MASK;			} else {				wlandev->hostwep &= ~(HOSTWEP_DEFAULTKEY_MASK);								wlandev->hostwep |= (*data & HOSTWEP_DEFAULTKEY_MASK);			}		break;	}	case DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked: {		UINT32 *data = (UINT32 *) mibitem->data;				if (isget) {			if (wlandev->hostwep & HOSTWEP_PRIVACYINVOKED)				*data = P80211ENUM_truth_true;			else				*data = P80211ENUM_truth_false;		} else {				wlandev->hostwep &= ~(HOSTWEP_PRIVACYINVOKED);				if (*data == P80211ENUM_truth_true)					wlandev->hostwep |= HOSTWEP_PRIVACYINVOKED;		}		break;	}	case DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted: {		UINT32 *data = (UINT32 *) mibitem->data;		if (isget) {			if (wlandev->hostwep & HOSTWEP_EXCLUDEUNENCRYPTED)				*data = P80211ENUM_truth_true;			else				*data = P80211ENUM_truth_false;		} else {						wlandev->hostwep &= ~(HOSTWEP_EXCLUDEUNENCRYPTED);			if (*data == P80211ENUM_truth_true)				wlandev->hostwep |= HOSTWEP_EXCLUDEUNENCRYPTED;		}		break;	}	default:		// XXXX do nothing!		;	}	DBFEXIT;	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -