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

📄 wl_iw.c

📁 wi-fi sources for asus wl138g v2 pci card
💻 C
📖 第 1 页 / 共 4 页
字号:
{	WL_TRACE(("%s: SIOCGIWENCODEEXT\n", dev->name));	return 0;}static intwl_iw_set_wpaauth(	struct net_device *dev,	struct iw_request_info *info,	struct iw_param *vwrq,	char *extra){	int error = 0;	int paramid;	int paramval;	int val = 0;	WL_TRACE(("%s: SIOCSIWAUTH\n", dev->name));	paramid = vwrq->flags & IW_AUTH_INDEX;	paramval = vwrq->value;	switch(paramid) {	case IW_AUTH_WPA_VERSION:		/* supported wpa version disabled or wpa or wpa2 */		if (paramval & IW_AUTH_WPA_VERSION_DISABLED)			val = WPA_AUTH_DISABLED;		else if (paramval & (IW_AUTH_WPA_VERSION_WPA))			val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;#ifdef BCMWPA2		else if (paramval & IW_AUTH_WPA_VERSION_WPA2)			val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;#endif /* BCMWPA2 */		WL_ERROR(("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val));		if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val)))			return error;		break;	case IW_AUTH_CIPHER_PAIRWISE:	case IW_AUTH_CIPHER_GROUP:		/* none, wep40, tkip, ccmp, wep104 */		/* wsec: none, wep40, tkip, aes, wep104 */		if (paramval & (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104))			val |= 	WEP_ENABLED;		if (paramval & IW_AUTH_CIPHER_TKIP)			val |= TKIP_ENABLED;		if (paramval & IW_AUTH_CIPHER_CCMP)			val |= AES_ENABLED;		if (paramid == IW_AUTH_CIPHER_PAIRWISE) {			if ((error = dev_wlc_intvar_set(dev, "pwsec", val)))				return error;		}		else {			if ((error = dev_wlc_intvar_set(dev, "gwsec", val)))				return error;		}		break;	case IW_AUTH_KEY_MGMT:		if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val)))			return error;		if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) {				if (paramval & IW_AUTH_KEY_MGMT_PSK)				val = WPA_AUTH_PSK ;			else 				val = WPA_AUTH_UNSPECIFIED;		}#ifdef BCMWPA2		else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) {			if (paramval & IW_AUTH_KEY_MGMT_PSK)				val = WPA2_AUTH_PSK;			else 				val = WPA2_AUTH_UNSPECIFIED;		}#endif /* BCMWPA2 */		WL_ERROR(("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val));		if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val)))			return error;		break;	case IW_AUTH_TKIP_COUNTERMEASURES:		dev_wlc_bufvar_set(dev, "tkip_countermeasures", (char *)&paramval, 1);		break;	case IW_AUTH_80211_AUTH_ALG:		/* open shared */		WL_ERROR(("Setting the D11auth %d\n", paramval));		if (paramval & IW_AUTH_ALG_OPEN_SYSTEM)			val = 0;		else if (paramval & IW_AUTH_ALG_SHARED_KEY)			val = 1;		else 			error = 1;		if (!error && (error = dev_wlc_intvar_set(dev, "auth", val)))			return error;		break;	case IW_AUTH_WPA_ENABLED:				if (paramval == 0) {			if ((error = dev_wlc_intvar_get(dev, "wsec", &val)))				return error;			if (val & (TKIP_ENABLED | AES_ENABLED)) {				val &= ~(TKIP_ENABLED | AES_ENABLED);		 		dev_wlc_intvar_set(dev, "wsec", val);			}			val = 0;		WL_ERROR(("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val));			dev_wlc_intvar_set(dev, "wpa_auth", 0);			return error;		}		/* nothing really needs to be done if wpa_auth enabled */		break;	case IW_AUTH_DROP_UNENCRYPTED:		dev_wlc_bufvar_set(dev, "wsec_restrict", (char *)&paramval, 1);		break;	case IW_AUTH_RX_UNENCRYPTED_EAPOL:		dev_wlc_bufvar_set(dev, "rx_unencrypted_eapol", (char *)&paramval, 1);		break;#if WIRELESS_EXT > 18	case IW_AUTH_ROAMING_CONTROL:		WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__));		/* driver control or user space app control */		break;	case IW_AUTH_PRIVACY_INVOKED:		WL_ERROR(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__));		break;#endif /* WIRELESS_EXT > 18 */	default:		break;	}	return 0;}static intwl_iw_get_wpaauth(	struct net_device *dev,	struct iw_request_info *info,	struct iw_param *vwrq,	char *extra){	int error;	int paramid;	int paramval = 0;	int val;	WL_TRACE(("%s: SIOCGIWAUTH\n", dev->name));	paramid = vwrq->flags & IW_AUTH_INDEX;	switch(paramid) {	case IW_AUTH_WPA_VERSION:		/* supported wpa version disabled or wpa or wpa2 */		if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val)))			return error;		if (val & (WPA_AUTH_NONE | WPA_AUTH_DISABLED))			paramval = IW_AUTH_WPA_VERSION_DISABLED;		else if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED))			paramval = IW_AUTH_WPA_VERSION_WPA;#ifdef BCMWPA2		else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED))			paramval = IW_AUTH_WPA_VERSION_WPA2;#endif /* BCMWPA2 */		break;	case IW_AUTH_CIPHER_PAIRWISE:	case IW_AUTH_CIPHER_GROUP:		if (paramid == IW_AUTH_CIPHER_PAIRWISE) {			if ((error = dev_wlc_intvar_get(dev, "pwsec", &val)))				return error;		}		else {			if ((error = dev_wlc_intvar_get(dev, "gwsec", &val)))				return error;		}		paramval = 0;		if (val) {			if (val & WEP_ENABLED)				paramval |= (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104) ;			if (val & TKIP_ENABLED)				paramval |= (IW_AUTH_CIPHER_TKIP) ;			if (val & AES_ENABLED)				paramval |= (IW_AUTH_CIPHER_CCMP) ;		}		else 			paramval = IW_AUTH_CIPHER_NONE;		break;	case IW_AUTH_KEY_MGMT:		/* psk, 1x */		if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val)))			return error;		if ( (val & WPA_AUTH_PSK)#ifdef BCMWPA2		|| (val & WPA2_AUTH_PSK)#endif /* BCMWPA2 */		)			paramval = IW_AUTH_KEY_MGMT_PSK;		else 			paramval = IW_AUTH_KEY_MGMT_802_1X;				break;	case IW_AUTH_TKIP_COUNTERMEASURES:		dev_wlc_bufvar_get(dev, "tkip_countermeasures", (char *)&paramval, 1);		break;	case IW_AUTH_DROP_UNENCRYPTED:		dev_wlc_bufvar_get(dev, "wsec_restrict", (char *)&paramval, 1);		break;	case IW_AUTH_RX_UNENCRYPTED_EAPOL:		dev_wlc_bufvar_get(dev, "rx_unencrypted_eapol", (char *)&paramval, 1);		break;	case IW_AUTH_80211_AUTH_ALG:		/* open, shared, leap */		if ((error = dev_wlc_intvar_get(dev, "auth", &val)))			return error;		if (!val)			paramval = IW_AUTH_ALG_OPEN_SYSTEM;		else 			paramval = IW_AUTH_ALG_SHARED_KEY;		break;	case IW_AUTH_WPA_ENABLED:		if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val)))			return error;		if (val)			paramval = TRUE;		else 			paramval = FALSE;		break;#if WIRELESS_EXT > 18	case IW_AUTH_ROAMING_CONTROL:		WL_ERROR(("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__));		/* driver control or user space app control */		break;	case IW_AUTH_PRIVACY_INVOKED:		WL_ERROR(("%s: IW_AUTH_PRIVACY_INVOKED\n", __FUNCTION__));		break;#endif /* WIRELESS_EXT > 18 */	}	vwrq->value = paramval;	return 0;}#endifstatic const iw_handler wl_iw_handler[] ={	(iw_handler) wl_iw_config_commit,	/* SIOCSIWCOMMIT */	(iw_handler) wl_iw_get_name,		/* SIOCGIWNAME */	(iw_handler) NULL,			/* SIOCSIWNWID */	(iw_handler) NULL,			/* SIOCGIWNWID */	(iw_handler) wl_iw_set_freq,		/* SIOCSIWFREQ */	(iw_handler) wl_iw_get_freq,		/* SIOCGIWFREQ */	(iw_handler) wl_iw_set_mode,		/* SIOCSIWMODE */	(iw_handler) wl_iw_get_mode,		/* SIOCGIWMODE */	(iw_handler) NULL,			/* SIOCSIWSENS */	(iw_handler) NULL,			/* SIOCGIWSENS */	(iw_handler) NULL,			/* SIOCSIWRANGE */	(iw_handler) wl_iw_get_range,		/* SIOCGIWRANGE */	(iw_handler) NULL,			/* SIOCSIWPRIV */	(iw_handler) NULL,			/* SIOCGIWPRIV */	(iw_handler) NULL,			/* SIOCSIWSTATS */	(iw_handler) NULL,			/* SIOCGIWSTATS */	(iw_handler) wl_iw_set_spy,		/* SIOCSIWSPY */	(iw_handler) wl_iw_get_spy,		/* SIOCGIWSPY */	(iw_handler) NULL,			/* -- hole -- */	(iw_handler) NULL,			/* -- hole -- */	(iw_handler) wl_iw_set_wap,		/* SIOCSIWAP */	(iw_handler) wl_iw_get_wap,		/* SIOCGIWAP */#if WIRELESS_EXT > 17	(iw_handler) wl_iw_mlme,		/* SIOCSIWMLME */#else	(iw_handler) NULL,			/* -- hole -- */#endif	(iw_handler) wl_iw_get_aplist,		/* SIOCGIWAPLIST */#if WIRELESS_EXT > 13	(iw_handler) wl_iw_set_scan,		/* SIOCSIWSCAN */	(iw_handler) wl_iw_get_scan,		/* SIOCGIWSCAN */#else	/* WIRELESS_EXT > 13 */	(iw_handler) NULL,			/* SIOCSIWSCAN */	(iw_handler) NULL,			/* SIOCGIWSCAN */#endif	/* WIRELESS_EXT > 13 */	(iw_handler) wl_iw_set_essid,		/* SIOCSIWESSID */	(iw_handler) wl_iw_get_essid,		/* SIOCGIWESSID */	(iw_handler) wl_iw_set_nick,		/* SIOCSIWNICKN */	(iw_handler) wl_iw_get_nick,		/* SIOCGIWNICKN */	(iw_handler) NULL,			/* -- hole -- */	(iw_handler) NULL,			/* -- hole -- */	(iw_handler) wl_iw_set_rate,		/* SIOCSIWRATE */	(iw_handler) wl_iw_get_rate,		/* SIOCGIWRATE */	(iw_handler) wl_iw_set_rts,		/* SIOCSIWRTS */	(iw_handler) wl_iw_get_rts,		/* SIOCGIWRTS */	(iw_handler) wl_iw_set_frag,		/* SIOCSIWFRAG */	(iw_handler) wl_iw_get_frag,		/* SIOCGIWFRAG */	(iw_handler) wl_iw_set_txpow,		/* SIOCSIWTXPOW */	(iw_handler) wl_iw_get_txpow,		/* SIOCGIWTXPOW */#if WIRELESS_EXT > 10	(iw_handler) wl_iw_set_retry,		/* SIOCSIWRETRY */	(iw_handler) wl_iw_get_retry,		/* SIOCGIWRETRY */#endif /* WIRELESS_EXT > 10 */	(iw_handler) wl_iw_set_encode,		/* SIOCSIWENCODE */	(iw_handler) wl_iw_get_encode,		/* SIOCGIWENCODE */	(iw_handler) wl_iw_set_power,		/* SIOCSIWPOWER */	(iw_handler) wl_iw_get_power,		/* SIOCGIWPOWER */#if WIRELESS_EXT > 17	(iw_handler) NULL,			/* -- hole -- */	(iw_handler) NULL,			/* -- hole -- */	(iw_handler) wl_iw_set_wpaie,		/* SIOCSIWGENIE */	(iw_handler) wl_iw_get_wpaie,		/* SIOCGIWGENIE */	(iw_handler) wl_iw_set_wpaauth,		/* SIOCSIWAUTH */	(iw_handler) wl_iw_get_wpaauth,		/* SIOCGIWAUTH */	(iw_handler) wl_iw_set_encodeext,	/* SIOCSIWENCODEEXT */	(iw_handler) wl_iw_get_encodeext,	/* SIOCGIWENCODEEXT */#ifdef BCMWPA2	(iw_handler) NULL,			/* SIOCSIWPMKSA */#endif#endif};#if WIRELESS_EXT > 12const struct iw_handler_def wl_iw_handler_def ={	num_standard: ARRAYSIZE(wl_iw_handler),	num_private: 0,	num_private_args: 0,	standard: (iw_handler *) wl_iw_handler,	private: NULL,	private_args: NULL,	};#endif /* WIRELESS_EXT > 12 */intwl_iw_ioctl(	struct net_device *dev,	struct ifreq *rq,	int cmd){	struct iwreq *wrq = (struct iwreq *) rq;	struct iw_request_info info;	iw_handler handler;	char *extra = NULL;	int token_size = 1, max_tokens = 0, ret = 0;	if (cmd < SIOCIWFIRST ||	    (cmd - SIOCIWFIRST) >= ARRAYSIZE(wl_iw_handler) ||	    !(handler = wl_iw_handler[cmd - SIOCIWFIRST]))		return -EOPNOTSUPP;	switch (cmd) {	case SIOCSIWESSID:	case SIOCGIWESSID:	case SIOCSIWNICKN:	case SIOCGIWNICKN:		max_tokens = IW_ESSID_MAX_SIZE + 1;		break;	case SIOCSIWENCODE:	case SIOCGIWENCODE:#if WIRELESS_EXT > 17	case SIOCSIWENCODEEXT:	case SIOCGIWENCODEEXT:#endif		max_tokens = IW_ENCODING_TOKEN_MAX;		break;	case SIOCGIWRANGE:		max_tokens = sizeof(struct iw_range);		break;	case SIOCGIWAPLIST:		token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality);		max_tokens = IW_MAX_AP;		break;#if WIRELESS_EXT > 13	case SIOCGIWSCAN:		max_tokens = IW_SCAN_MAX_DATA;		break;#endif /* WIRELESS_EXT > 13 */	case SIOCSIWSPY:		token_size = sizeof(struct sockaddr);		max_tokens = IW_MAX_SPY;		break;	case SIOCGIWSPY:		token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality);		max_tokens = IW_MAX_SPY;		break;	}	if (max_tokens && wrq->u.data.pointer) {		if (wrq->u.data.length > max_tokens)			return -E2BIG;		if (!(extra = kmalloc(max_tokens * token_size, GFP_KERNEL)))			return -ENOMEM;		if (copy_from_user(extra, wrq->u.data.pointer, wrq->u.data.length * token_size)) {			kfree(extra);			return -EFAULT;		}	}	info.cmd = cmd;	info.flags = 0;	ret = handler(dev, &info, &wrq->u, extra);	if (extra) {		if (copy_to_user(wrq->u.data.pointer, extra, wrq->u.data.length * token_size)) {			kfree(extra);			return -EFAULT;		}		kfree(extra);	}	return ret;}#ifndef IW_CeSTOM_MAX#define IW_CUSTOM_MAX 256 /* size of extra buffer used for translation of events */#endif /* IW_CUSTOM_MAX */voidwl_iw_event(struct net_device *dev, wlc_event_t *e){#if WIRELESS_EXT > 13	union iwreq_data wrqu;	char extra[IW_CUSTOM_MAX + 1];	int cmd;	memset(&wrqu, 0, sizeof(wrqu));	memset(extra, 0, sizeof(extra));	if (e->addr) {		memcpy(wrqu.addr.sa_data, e->addr, ETHER_ADDR_LEN);		wrqu.addr.sa_family = ARPHRD_ETHER;	}	switch (e->event.event_type) {	case WLC_E_TXFAIL:		cmd = IWEVTXDROP;		break;#if WIRELESS_EXT > 14	case WLC_E_JOIN:	case WLC_E_ASSOC_IND:	case WLC_E_REASSOC_IND:		cmd = IWEVREGISTERED;		break;	case WLC_E_DEAUTH_IND:	case WLC_E_DISASSOC_IND:		cmd = SIOCGIWAP;		wrqu.data.length = strlen(extra);		bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN);		bzero(&extra, ETHER_ADDR_LEN);		break;	case WLC_E_LINK:	case WLC_E_NDIS_LINK:		cmd = SIOCGIWAP;		wrqu.data.length = strlen(extra);		if (!e->event.flags & WLC_EVENT_MSG_LINK) {			bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN);			bzero(&extra, ETHER_ADDR_LEN);		}		break;#endif /* WIRELESS_EXT > 14 */#if WIRELESS_EXT > 17	case WLC_E_MIC_ERROR: {		struct	iw_michaelmicfailure  *micerrevt = (struct  iw_michaelmicfailure  *)&extra;		cmd = IWEVMICHAELMICFAILURE;		wrqu.data.length = sizeof(struct iw_michaelmicfailure);		if (e->event.flags & WLC_EVENT_MSG_GROUP)			micerrevt->flags |= IW_MICFAILURE_GROUP;		else 			micerrevt->flags |= IW_MICFAILURE_PAIRWISE;		if (e->addr) {			memcpy(micerrevt->src_addr.sa_data, e->addr, ETHER_ADDR_LEN);			micerrevt->src_addr.sa_family = ARPHRD_ETHER;		}					break;	}#ifdef BCMWPA2	case WLC_E_PMKID_CACHE: {		struct iw_pmkid_cand *iwpmkidcand = (struct iw_pmkid_cand *)&extra;		pmkid_cand_list_t *pmkcandlist;		pmkid_cand_t	*pmkidcand;		int count;		cmd = IWEVPMKIDCAND;		pmkcandlist = e->data; 		count = pmkcandlist->npmkid_cand;		wrqu.data.length = sizeof(struct iw_pmkid_cand);		pmkidcand = pmkcandlist->pmkid_cand;		while (count) {			bzero(iwpmkidcand, sizeof (struct iw_pmkid_cand));			if (pmkidcand->preauth)				iwpmkidcand->flags |= IW_PMKID_CAND_PREAUTH;			bcopy(&pmkidcand->BSSID, &iwpmkidcand->bssid.sa_data, ETHER_ADDR_LEN);			wireless_send_event(dev, cmd, &wrqu, extra);			pmkidcand++;			count--;		}		return;	}#endif /* BCMWPA2 */#endif	default:		/* Cannot translate event */		return;	}		wireless_send_event(dev, cmd, &wrqu, extra);#endif /* WIRELESS_EXT > 13 */}

⌨️ 快捷键说明

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