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

📄 r8180_wx.c

📁 RTL8187 for linux驱动 提供内核支持802.11g的模块
💻 C
📖 第 1 页 / 共 2 页
字号:
	rtl8180_commit(dev);out:	up(&priv->wx_sem);	return ret;}static int r8180_wx_get_essid(struct net_device *dev, 			      struct iw_request_info *a,			      union iwreq_data *wrqu, char *b){	int ret;	struct r8180_priv *priv = dev->priv;		down(&priv->wx_sem);		ret = ieee80211_r8180_wx_get_essid(priv->ieee80211, a, wrqu, b);	up(&priv->wx_sem);		return ret;}static int r8180_wx_set_freq(struct net_device *dev, struct iw_request_info *a,			     union iwreq_data *wrqu, char *b){	int ret;	struct r8180_priv *priv = dev->priv;	struct iw_freq *fwrq = & wrqu->freq;	down(&priv->wx_sem);		if(priv->ieee80211->iw_mode == IW_MODE_INFRA){ 		ret = -1;		goto out;	}	/* if setting by freq convert to channel */	if (fwrq->e == 1) {		if ((fwrq->m >= (int) 2.412e8 &&		     fwrq->m <= (int) 2.487e8)) {			int f = fwrq->m / 100000;			int c = 0;						while ((c < 14) && (f != wlan_frequencies[c]))				c++;						/* hack to fall through */			fwrq->e = 0;			fwrq->m = c + 1;		}	}		if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ 		ret = -EOPNOTSUPP;		goto out;		}else { /* Set the channel */				//	DMESG("setting ch %d",fwrq->m);		rtl8180_rtx_disable(dev);		priv->chan=fwrq->m;		rtl8180_set_chan(dev, fwrq->m);				if(priv->up){			// fix_rx_fifo(dev); // already done in rx_enable			rtl8180_rx_enable(dev);			rtl8180_tx_enable(dev);					}		ret = 0;		goto out;	}	ret = 0;out:	up(&priv->wx_sem);	return ret;}static int r8180_wx_get_name(struct net_device *dev, 			     struct iw_request_info *info, 			     union iwreq_data *wrqu, char *extra){	strcpy(wrqu->name, "IEEE 802.11b");		return 0;}static int r8180_wx_set_frag(struct net_device *dev, 			     struct iw_request_info *info, 			     union iwreq_data *wrqu, char *extra){	struct r8180_priv *priv = dev->priv;	if (wrqu->frag.disabled)		priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;	else {		if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||		    wrqu->frag.value > MAX_FRAG_THRESHOLD)			return -EINVAL;				priv->ieee80211->fts = wrqu->frag.value & ~0x1;	}	return 0;}static int r8180_wx_get_frag(struct net_device *dev, 			     struct iw_request_info *info, 			     union iwreq_data *wrqu, char *extra){	struct r8180_priv *priv = dev->priv;	wrqu->frag.value = priv->ieee80211->fts;	wrqu->frag.fixed = 0;	/* no auto select */	wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);	return 0;}static int r8180_wx_set_wap(struct net_device *dev,			 struct iw_request_info *info,			 union iwreq_data *awrq,			 char *extra){	int ret;	struct r8180_priv *priv = dev->priv;		down(&priv->wx_sem);			if(priv->ieee80211->iw_mode == IW_MODE_MASTER){		ret = -EINVAL;		goto out;	}				ret = ieee80211_r8180_wx_set_wap(priv->ieee80211, info, awrq, extra);	/*	r8180_set_mac_adr_(dev,awrq);	*/		if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)		rtl8180_commit(dev);		out:	up(&priv->wx_sem);	return ret;	}	static int r8180_wx_get_wap(struct net_device *dev, 			    struct iw_request_info *info, 			    union iwreq_data *wrqu, char *extra){	struct r8180_priv *priv = dev->priv;		wrqu->ap_addr.sa_family = ARPHRD_ETHER;		if(priv->ieee80211->iw_mode == IW_MODE_INFRA)	{		if(priv->ieee80211->link_state != WLAN_LINK_ASSOCIATED){			memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);		}else{			memcpy(wrqu->ap_addr.sa_data, 		       		priv->ieee80211->ass_beacon->bssid, ETH_ALEN);		}	}else if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){		memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);	}else if(priv->ieee80211->iw_mode == IW_MODE_ADHOC ||		priv->ieee80211->iw_mode == IW_MODE_MASTER){		memcpy(wrqu->ap_addr.sa_data, 		       priv->ieee80211->beacon_cell_ssid, ETH_ALEN);	}	return 0;}static int r8180_wx_set_enc(struct net_device *dev, 			    struct iw_request_info *info, 			    union iwreq_data *wrqu, char *key){	struct r8180_priv *priv = dev->priv;	int ret;		down(&priv->wx_sem);		#ifndef CONFIG_IEEE80211_NOWEP	if(priv->hw_wep) ret = r8180_wx_set_key(dev,info,wrqu,key);	else{		DMESG("Setting SW wep key");		ret = ieee80211_r8180_wx_set_encode(priv->ieee80211,info,wrqu,key);	}#else	ret = r8180_wx_set_key(dev,info,wrqu,key);	#endif	if (priv->ieee80211->iw_mode == IW_MODE_ADHOC ||		priv->ieee80211->iw_mode == IW_MODE_MASTER)			rtl8180_update_beacon_security(priv->dev);							up(&priv->wx_sem);	return ret;}static int r8180_wx_get_enc(struct net_device *dev, 			    struct iw_request_info *info, 			    union iwreq_data *wrqu, char *key){	struct r8180_priv *priv = dev->priv;	#ifdef CONFIG_IEEE80211_NOWEP	return -1; //FIXME: what is going on here?	if(priv->hw_wep) return -1;#else	return ieee80211_r8180_wx_get_encode(priv->ieee80211, info, wrqu, key);#endif}static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){   	struct r8180_priv *priv = dev->priv;	int *parms=(int*)p;	int mode=parms[0];		priv->active_probe = mode;		return 1;}/* added by christian */static int r8180_wx_set_monitor_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){   	struct r8180_priv *priv = dev->priv;	int *parms=(int*)p;	int mode=parms[0];	if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) return -1;  	priv->prism_hdr = mode;	if(!mode)dev->type=ARPHRD_IEEE80211;	else dev->type=ARPHRD_IEEE80211_PRISM;	return 0;	} //of         r8180_wx_set_monitor_type/* end added christian */static int r8180_wx_set_retry(struct net_device *dev, 				struct iw_request_info *info, 				union iwreq_data *wrqu, char *extra){	struct r8180_priv *priv = dev->priv;		down(&priv->wx_sem);		if (wrqu->retry.flags & IW_RETRY_LIFETIME || 	    wrqu->retry.disabled)		return -EINVAL;	if (!(wrqu->retry.flags & IW_RETRY_LIMIT))		return -EINVAL;	if(wrqu->retry.value > R8180_MAX_RETRY) return -EINVAL;		if (wrqu->retry.flags & IW_RETRY_MAX) {		priv->retry_rts = wrqu->retry.value;		DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value);		}else {		priv->retry_data = wrqu->retry.value;		DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value);	}		/* FIXME ! 	 * We might try to write directly the TX config register	 * or to restart just the (R)TX process.	 * I'm unsure if whole reset is really needed	 */ 	rtl8180_commit(dev);	/*	if(priv->up){		rtl8180_rtx_disable(dev);		rtl8180_rx_enable(dev);		rtl8180_tx_enable(dev);				}	*/		up(&priv->wx_sem);		return 0;}static int r8180_wx_get_retry(struct net_device *dev, 				struct iw_request_info *info, 				union iwreq_data *wrqu, char *extra){	struct r8180_priv *priv = dev->priv;		wrqu->retry.disabled = 0; /* can't be disabled */	if ((wrqu->retry.flags & IW_RETRY_TYPE) == 	    IW_RETRY_LIFETIME) 		return -EINVAL;		if (wrqu->retry.flags & IW_RETRY_MAX) {		wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX;		wrqu->retry.value = priv->retry_rts;	} else {		wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MIN;		wrqu->retry.value = priv->retry_data;	}	//DMESG("returning %d",wrqu->retry.value);		return 0;}static int dummy(struct net_device *dev, struct iw_request_info *a,		 union iwreq_data *wrqu,char *b){	return -1;}static iw_handler r8180_wx_handlers[] ={        NULL,                     /* SIOCSIWCOMMIT */        r8180_wx_get_name,   	  /* SIOCGIWNAME */        dummy,                    /* SIOCSIWNWID */        dummy,                    /* SIOCGIWNWID */        r8180_wx_set_freq,        /* SIOCSIWFREQ */        r8180_wx_get_freq,        /* SIOCGIWFREQ */        r8180_wx_set_mode,        /* SIOCSIWMODE */        r8180_wx_get_mode,        /* SIOCGIWMODE */        dummy,                    /* SIOCSIWSENS */        dummy,                    /* SIOCGIWSENS */        NULL,                     /* SIOCSIWRANGE */        rtl8180_wx_get_range,	  /* SIOCGIWRANGE */        NULL,                     /* SIOCSIWPRIV */        NULL,                     /* SIOCGIWPRIV */        NULL,                     /* SIOCSIWSTATS */        NULL,                     /* SIOCGIWSTATS */        dummy,                    /* SIOCSIWSPY */        dummy,                    /* SIOCGIWSPY */        NULL,                     /* SIOCGIWTHRSPY */        NULL,                     /* SIOCWIWTHRSPY */        r8180_wx_set_wap,      	  /* SIOCSIWAP */        r8180_wx_get_wap,         /* SIOCGIWAP */        NULL,                     /* -- hole -- */        dummy,                     /* SIOCGIWAPLIST -- depricated */        r8180_wx_set_scan,        /* SIOCSIWSCAN */        r8180_wx_get_scan,        /* SIOCGIWSCAN */        r8180_wx_set_essid,       /* SIOCSIWESSID */        r8180_wx_get_essid,       /* SIOCGIWESSID */        dummy,                    /* SIOCSIWNICKN */        dummy,                    /* SIOCGIWNICKN */        NULL,                     /* -- hole -- */        NULL,                     /* -- hole -- */        r8180_wx_set_rate,        /* SIOCSIWRATE */        r8180_wx_get_rate,        /* SIOCGIWRATE */        dummy,                    /* SIOCSIWRTS */        dummy,                    /* SIOCGIWRTS */        r8180_wx_set_frag,        /* SIOCSIWFRAG */        r8180_wx_get_frag,        /* SIOCGIWFRAG */        dummy,                    /* SIOCSIWTXPOW */        dummy,                    /* SIOCGIWTXPOW */        r8180_wx_set_retry,       /* SIOCSIWRETRY */        r8180_wx_get_retry,       /* SIOCGIWRETRY */        r8180_wx_set_enc,         /* SIOCSIWENCODE */        r8180_wx_get_enc,         /* SIOCGIWENCODE */        dummy,                    /* SIOCSIWPOWER */        dummy,                    /* SIOCGIWPOWER */}; static const struct iw_priv_args r8180_private_args[] = { 	{		SIOCIWFIRSTPRIV + 0x0, 		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor" 	}, 	{		SIOCIWFIRSTPRIV + 0x1, 		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" 	}, 	{		SIOCIWFIRSTPRIV + 0x2, 		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "debugtx" 	}, 	{		SIOCIWFIRSTPRIV + 0x3, 		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "beaconint" 	},	/* added by christian */	{		SIOCIWFIRSTPRIV + 0x4,		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "prismhdr"	},	/* end added by christian */	{		SIOCIWFIRSTPRIV + 0x5,		IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan"		}};static iw_handler r8180_private_handler[] = {	r8180_wx_set_monitor,  /* SIOCIWFIRSTPRIV */	r8180_wx_set_crcmon,   /*SIOCIWSECONDPRIV*/	r8180_debug_tx,	r8180_set_beaconinterval,	r8180_wx_set_monitor_type,	r8180_wx_set_scan_type,};#if WIRELESS_EXT > 17static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev){       struct r8180_priv *priv = dev->priv;       return &priv->wstats;}struct iw_handler_def  r8180_wx_handlers_def={	sizeof(r8180_wx_handlers) / sizeof(iw_handler),	sizeof(r8180_private_handler) / sizeof(iw_handler), 	sizeof(r8180_private_args) / sizeof(struct iw_priv_args),	r8180_wx_handlers,	r8180_private_handler,	(struct iw_priv_args *)r8180_private_args,	        0,        (struct iw_statistics *)r8180_get_wireless_stats};#elsestruct iw_handler_def  r8180_wx_handlers_def={	.standard r8180_wx_handlers,	.num_standard = sizeof(r8180_wx_handlers) / sizeof(iw_handler),	.private = r8180_private_handler,	.num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), 	.num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args),	.private_args = (struct iw_priv_args *)r8180_private_args,	};#endif

⌨️ 快捷键说明

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