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

📄 p80211wext.c

📁 对于无线网卡采用prism芯片的linux的开源驱动.
💻 C
📖 第 1 页 / 共 3 页
字号:
	int err = 0;	int result = 0;	int enable = 0;	int i;	DBFENTER;	if (!wlan_wext_write) {		err = (-EOPNOTSUPP);		goto exit;	}	/* Check the Key index first. */	if((i = (erq->flags & IW_ENCODE_INDEX))) {				if ((i < 1) || (i > NUM_WEPKEYS)) {			err = -EINVAL;			goto exit;			}				else			i--;		result = p80211wext_dorequest(wlandev, DIDmib_dot11smt_dot11PrivacyTable_dot11WEPDefaultKeyID, i);				if (result) {			err = -EFAULT;			goto exit;		}		else {			enable = 1;		}	}	else {		// Do not thing when no Key Index	}	/* Check if there is no key information in the iwconfig request */	if((erq->flags & IW_ENCODE_NOKEY) == 0 && enable == 1) {		/*------------------------------------------------------------ 		 * If there is WEP Key for setting, check the Key Information 		 * and then set it to the firmware.		 -------------------------------------------------------------*/			if (erq->length > 0) {			/* copy the key from the driver cache as the keys are read-only MIBs */			wlandev->wep_keylens[i] = erq->length;			memcpy(wlandev->wep_keys[i], key, erq->length);			/* Prepare data struture for p80211req_dorequest. */			memcpy(pstr.data.data, key, erq->length);			pstr.data.len = erq->length;			switch(i)			{				case 0:					pstr.did = DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey0;					break;							case 1:					pstr.did = DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey1;					break;								case 2: 					pstr.did = DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey2;					break;					case 3:					pstr.did = DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey3;					break;						default:					err = -EINVAL;					goto exit;			}			msg.msgcode = DIDmsg_dot11req_mibset;			memcpy(&msg.mibattribute.data, &pstr, sizeof(pstr));			result = p80211req_dorequest(wlandev, (UINT8*)&msg);			if (result) {				err = -EFAULT;				goto exit;			}		}	}		/* Check the PrivacyInvoked flag */	if (erq->flags & IW_ENCODE_DISABLED) {		result = p80211wext_dorequest(wlandev, DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked, P80211ENUM_truth_false);	}	else if((erq->flags & IW_ENCODE_ENABLED) || enable == 1) {		result = p80211wext_dorequest(wlandev, DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked, P80211ENUM_truth_true);	}	if (result) {		err = -EFAULT;		goto exit;	}	/* Check the ExcludeUnencrypted flag */	if (erq->flags & IW_ENCODE_RESTRICTED) {		result = p80211wext_dorequest(wlandev, DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted, P80211ENUM_truth_true);	}	else if (erq->flags & IW_ENCODE_OPEN) {		result = p80211wext_dorequest(wlandev, DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted, P80211ENUM_truth_false);	}	if (result) {		err = -EFAULT;		goto exit;	} exit:	DBFEXIT;	return err;}static int p80211wext_giwessid(netdevice_t *dev,			       struct iw_request_info *info,			       struct iw_point *data, char *essid){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	DBFENTER;	if (wlandev->ssid.len) {		data->length = wlandev->ssid.len;		data->flags = 1;		memcpy(essid, wlandev->ssid.data, data->length);		essid[data->length] = 0;#if (WIRELESS_EXT < 21)		data->length++;#endif	} else {		memset(essid, 0, sizeof(wlandev->ssid.data));		data->length = 0;		data->flags = 0;	}	DBFEXIT;	return 0;}static int p80211wext_siwessid(netdevice_t *dev,			       struct iw_request_info *info,			       struct iw_point *data, char *essid){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211msg_dot11req_mibset_t     msg;	p80211item_pstr32_t             pstr;	int result;	int err = 0;	DBFENTER;	if (!wlan_wext_write) {		err = (-EOPNOTSUPP);		goto exit;	}	memset(&msg, 0, sizeof(msg));	memset(&pstr, 0, sizeof(pstr));  	msg.msgcode = DIDmsg_dot11req_mibset;#warning "Get rid of p2mib here!"	if (wlandev->macmode == WLAN_MACMODE_ESS_AP)		pstr.did = DIDmib_p2_p2Static_p2CnfOwnSSID;	else		pstr.did = DIDmib_dot11smt_dot11StationConfigTable_dot11DesiredSSID;        if (data->flags == 0) {		pstr.data.len = 0;		memset(pstr.data.data, 0, sizeof(pstr.data.data));	} else {#if (WIRELESS_EXT < 21)		pstr.data.len = data->length - 1;#else		pstr.data.len = data->length;#endif		memcpy(pstr.data.data, essid, pstr.data.len);	}	memcpy(&msg.mibattribute.data, &pstr, sizeof(pstr));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	}	/* Auto Join */	err = p80211wext_autojoin(wlandev);  exit:	DBFEXIT;	return err;}static int p80211wext_siwcommit(netdevice_t *dev,				struct iw_request_info *info,				struct iw_point *data, char *essid){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	int err = 0;	DBFENTER;	if (!wlan_wext_write) {		err = (-EOPNOTSUPP);		goto exit;	}	/* Auto Join */	err = p80211wext_autojoin(wlandev);  exit: 	DBFEXIT;	return err;}static int p80211wext_giwrate(netdevice_t *dev,			      struct iw_request_info *info,			      struct iw_param *rrq, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	DBFENTER;	msg.msgcode = DIDmsg_dot11req_mibget;	mibitem.did = DIDmib_p2_p2MAC_p2CurrentTxRate;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);		if (result) {		err = -EFAULT;		goto exit;	}	memcpy(&mibitem, &msg.mibattribute.data, sizeof(mibitem));	rrq->fixed = 0;   /* can it change? */	rrq->disabled = 0; 	rrq->value = 0;#define		HFA384x_RATEBIT_1			((UINT16)1)#define		HFA384x_RATEBIT_2			((UINT16)2)#define		HFA384x_RATEBIT_5dot5			((UINT16)4)#define		HFA384x_RATEBIT_11			((UINT16)8)	switch (mibitem.data) {	case HFA384x_RATEBIT_1:		rrq->value = 1000000;		break;	case HFA384x_RATEBIT_2:		rrq->value = 2000000;		break;	case HFA384x_RATEBIT_5dot5:		rrq->value = 5500000;		break;	case HFA384x_RATEBIT_11:		rrq->value = 11000000;		break;	default:		err = -EINVAL;	} exit:	DBFEXIT;	return err;}static int p80211wext_giwrts(netdevice_t *dev,			     struct iw_request_info *info,			     struct iw_param *rts, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	DBFENTER;	msg.msgcode = DIDmsg_dot11req_mibget;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11RTSThreshold;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	}	memcpy(&mibitem, &msg.mibattribute.data, sizeof(mibitem));	rts->value = mibitem.data;	rts->disabled = (rts->value == 2347);	rts->fixed = 1; exit:	DBFEXIT;	return err;}static int p80211wext_siwrts(netdevice_t *dev,			     struct iw_request_info *info,			     struct iw_param *rts, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	DBFENTER;	if (!wlan_wext_write) {		err = (-EOPNOTSUPP);		goto exit;	}	msg.msgcode = DIDmsg_dot11req_mibget;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11RTSThreshold;	if (rts->disabled)		mibitem.data = 2347;	else		mibitem.data = rts->value;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	} exit:	DBFEXIT;	return err;}static int p80211wext_giwfrag(netdevice_t *dev,			      struct iw_request_info *info,			      struct iw_param *frag, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	DBFENTER;	msg.msgcode = DIDmsg_dot11req_mibget;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11FragmentationThreshold;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	}	memcpy(&mibitem, &msg.mibattribute.data, sizeof(mibitem));	frag->value = mibitem.data;	frag->disabled = (frag->value == 2346);	frag->fixed = 1; exit:	DBFEXIT;	return err;}static int p80211wext_siwfrag(netdevice_t *dev,			      struct iw_request_info *info,			      struct iw_param *frag, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	DBFENTER;	if (!wlan_wext_write) {		err = (-EOPNOTSUPP);		goto exit;	}	msg.msgcode = DIDmsg_dot11req_mibset;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11FragmentationThreshold;	if (frag->disabled)		mibitem.data = 2346;	else		mibitem.data = frag->value;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	} exit:	DBFEXIT;	return err;}#endif  /* WIRELESS_EXT > 8 */#if WIRELESS_EXT > 10#ifndef IW_RETRY_LONG#define IW_RETRY_LONG IW_RETRY_MAX#endif#ifndef IW_RETRY_SHORT#define IW_RETRY_SHORT IW_RETRY_MIN#endifstatic int p80211wext_giwretry(netdevice_t *dev,			       struct iw_request_info *info,			       struct iw_param *rrq, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	UINT16 shortretry, longretry, lifetime;	DBFENTER;	msg.msgcode = DIDmsg_dot11req_mibget;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11ShortRetryLimit;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	}	memcpy(&mibitem, &msg.mibattribute.data, sizeof(mibitem));	shortretry = mibitem.data;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11LongRetryLimit;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	}	memcpy(&mibitem, &msg.mibattribute.data, sizeof(mibitem));	longretry = mibitem.data;	mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11MaxTransmitMSDULifetime;	memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));	result = p80211req_dorequest(wlandev, (UINT8*)&msg);	if (result) {		err = -EFAULT;		goto exit;	}	memcpy(&mibitem, &msg.mibattribute.data, sizeof(mibitem));	lifetime = mibitem.data;		rrq->disabled = 0;	if ((rrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {		rrq->flags = IW_RETRY_LIFETIME;		rrq->value = lifetime * 1024;	} else {		if (rrq->flags & IW_RETRY_LONG) {			rrq->flags = IW_RETRY_LIMIT | IW_RETRY_LONG;			rrq->value = longretry;		} else {			rrq->flags = IW_RETRY_LIMIT;			rrq->value = shortretry;			if (shortretry != longretry)				rrq->flags |= IW_RETRY_SHORT;		}	} exit:	DBFEXIT;	return err;}static int p80211wext_siwretry(netdevice_t *dev,			       struct iw_request_info *info,			       struct iw_param *rrq, char *extra){	wlandevice_t *wlandev = (wlandevice_t*)dev->priv;	p80211item_uint32_t             mibitem;	p80211msg_dot11req_mibset_t     msg;	int result;	int err = 0;	DBFENTER;	if (!wlan_wext_write) {		err = (-EOPNOTSUPP);		goto exit;	}	if (rrq->disabled) {		err = -EINVAL;		goto exit;	}	msg.msgcode = DIDmsg_dot11req_mibset;	if ((rrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {		mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11MaxTransmitMSDULifetime;		mibitem.data =  rrq->value /= 1024;				memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));		result = p80211req_dorequest(wlandev, (UINT8*)&msg);				if (result) {			err = -EFAULT;			goto exit;		}	} else {		if (rrq->flags & IW_RETRY_LONG) {			mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11LongRetryLimit;			mibitem.data = rrq->value;			memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));			result = p80211req_dorequest(wlandev, (UINT8*)&msg);						if (result) {				err = -EFAULT;				goto exit;			}		}		if (rrq->flags & IW_RETRY_SHORT) {			mibitem.did = DIDmib_dot11mac_dot11OperationTable_dot11ShortRetryLimit;			mibitem.data = rrq->value;			memcpy(&msg.mibattribute.data, &mibitem, sizeof(mibitem));			result = p80211req_dorequest(wlandev, (UINT8*)&msg);						if (result) {				err = -EFAULT;				goto exit;			}		}	} exit:	DBFEXIT;	return err;}#endif /* WIRELESS_EXT > 10 */#if WIRELESS_EXT > 9static int p80211wext_siwtxpow(netdevice_t *dev,                               struct iw_request_info *info,                               struct iw_param *rrq, char *extra){        wlandevice_t *wlandev = (wlandevice_t*)dev->priv;        p80211item_uint32_t             mibitem;        p80211msg_dot11req_mibset_t     msg;        int result;

⌨️ 快捷键说明

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