亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ieee80211_linux.c

?? Linux下wifi實現
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*- * Copyright (c) 2003-2005 Sam Leffler, Errno Consulting * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products *    derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: ieee80211_linux.c 1690 2006-07-21 08:59:10Z kelmo $ */#ifndef EXPORT_SYMTAB#define	EXPORT_SYMTAB#endif/* * IEEE 802.11 support (Linux-specific code) */#include <linux/config.h>#include <linux/version.h>#include <linux/module.h>#include <linux/kmod.h>#include <linux/init.h>#include <linux/skbuff.h>#include <linux/sysctl.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <linux/if_vlan.h>#include <linux/vmalloc.h>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)#include <linux/proc_fs.h>#endif#include <net/iw_handler.h>#include <linux/wireless.h>#include <linux/if_arp.h>		/* XXX for ARPHRD_* */#include <asm/uaccess.h>#include "if_media.h"#include "if_ethersubr.h"#include <net80211/ieee80211_var.h>#include <net80211/ieee80211_monitor.h>/* * Print a console message with the device name prepended. */voidif_printf(struct net_device *dev, const char *fmt, ...){	va_list ap;	char buf[512];		/* XXX */	va_start(ap, fmt);	vsnprintf(buf, sizeof(buf), fmt, ap);	va_end(ap);	printk("%s: %s", dev->name, buf);}/* * Allocate and setup a management frame of the specified * size.  We return the sk_buff and a pointer to the start * of the contiguous data area that's been reserved based * on the packet length.  The data area is forced to 32-bit * alignment and the buffer length to a multiple of 4 bytes. * This is done mainly so beacon frames (that require this) * can use this interface too. */struct sk_buff *ieee80211_getmgtframe(u_int8_t **frm, u_int pktlen){	const u_int align = sizeof(u_int32_t);	struct ieee80211_cb *cb;	struct sk_buff *skb;	u_int len;	len = roundup(sizeof(struct ieee80211_frame) + pktlen, 4);	skb = dev_alloc_skb(len + align-1);	if (skb != NULL) {		u_int off = ((unsigned long) skb->data) % align;		if (off != 0)			skb_reserve(skb, align - off);		cb = (struct ieee80211_cb *)skb->cb;		cb->ni = NULL;		cb->flags = 0;		cb->next = NULL;		skb_reserve(skb, sizeof(struct ieee80211_frame));		*frm = skb_put(skb, pktlen);	}	return skb;}#if 0/* * Drain a queue of sk_buff's. */void__skb_queue_drain(struct sk_buff_head *q){	struct sk_buff *skb;	while ((skb = __skb_dequeue(q)) != NULL)		dev_kfree_skb(skb);}#endif#if IEEE80211_VLAN_TAG_USED/* * VLAN support. *//* * Register a vlan group. */static voidieee80211_vlan_register(struct net_device *dev, struct vlan_group *grp){	struct ieee80211vap *vap = dev->priv;	vap->iv_vlgrp = grp;}/* * Add an rx vlan identifier */static voidieee80211_vlan_add_vid(struct net_device *dev, unsigned short vid){	struct ieee80211vap *vap = dev->priv;	if (vap->iv_vlgrp != NULL)		vap->iv_bss->ni_vlan = vid;}/* * Kill (i.e. delete) a vlan identifier. */static voidieee80211_vlan_kill_vid(struct net_device *dev, unsigned short vid){	struct ieee80211vap *vap = dev->priv;	if (vap->iv_vlgrp != NULL)		vap->iv_vlgrp->vlan_devices[vid] = NULL;}#endif /* IEEE80211_VLAN_TAG_USED */voidieee80211_vlan_vattach(struct ieee80211vap *vap){#if IEEE80211_VLAN_TAG_USED	struct net_device *dev = vap->iv_dev;	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX |			 NETIF_F_HW_VLAN_FILTER;	dev->vlan_rx_register = ieee80211_vlan_register;	dev->vlan_rx_add_vid = ieee80211_vlan_add_vid;	dev->vlan_rx_kill_vid = ieee80211_vlan_kill_vid;#endif /* IEEE80211_VLAN_TAG_USED */}voidieee80211_vlan_vdetach(struct ieee80211vap *vap){}voidieee80211_notify_node_join(struct ieee80211_node *ni, int newassoc){	struct ieee80211vap *vap = ni->ni_vap;	struct net_device *dev = vap->iv_dev;	union iwreq_data wreq;	if (ni == vap->iv_bss) { 		if (newassoc) 			netif_carrier_on(dev);		memset(&wreq, 0, sizeof(wreq));		IEEE80211_ADDR_COPY(wreq.addr.sa_data, ni->ni_bssid);		wreq.addr.sa_family = ARPHRD_ETHER;#ifdef ATH_SUPERG_XR		if (vap->iv_xrvap && vap->iv_flags & IEEE80211_F_XR)			dev = vap->iv_xrvap->iv_dev;#endif		wireless_send_event(dev, SIOCGIWAP, &wreq, NULL);	} else {		memset(&wreq, 0, sizeof(wreq));		IEEE80211_ADDR_COPY(wreq.addr.sa_data, ni->ni_macaddr);		wreq.addr.sa_family = ARPHRD_ETHER;#ifdef ATH_SUPERG_XR		if (vap->iv_xrvap && vap->iv_flags & IEEE80211_F_XR)			dev = vap->iv_xrvap->iv_dev;#endif		wireless_send_event(dev, IWEVREGISTERED, &wreq, NULL);	}}voidieee80211_notify_node_leave(struct ieee80211_node *ni){	struct ieee80211vap *vap = ni->ni_vap;	struct net_device *dev = vap->iv_dev;	union iwreq_data wreq;	if (ni == vap->iv_bss) {		netif_carrier_off(dev);		memset(wreq.ap_addr.sa_data, 0, ETHER_ADDR_LEN);		wreq.ap_addr.sa_family = ARPHRD_ETHER;		wireless_send_event(dev, SIOCGIWAP, &wreq, NULL);	} else {		/* fire off wireless event station leaving */		memset(&wreq, 0, sizeof(wreq));		IEEE80211_ADDR_COPY(wreq.addr.sa_data, ni->ni_macaddr);		wreq.addr.sa_family = ARPHRD_ETHER;		wireless_send_event(dev, IWEVEXPIRED, &wreq, NULL);	}}voidieee80211_notify_scan_done(struct ieee80211vap *vap){	struct net_device *dev = vap->iv_dev;	union iwreq_data wreq;	IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, "%s\n", "notify scan done");	/* dispatch wireless event indicating scan completed */	wreq.data.length = 0;	wreq.data.flags = 0;	wireless_send_event(dev, SIOCGIWSCAN, &wreq, NULL);}voidieee80211_notify_replay_failure(struct ieee80211vap *vap,	const struct ieee80211_frame *wh, const struct ieee80211_key *k,	u_int64_t rsc){	static const char *tag = "MLME-REPLAYFAILURE.indication";	struct net_device *dev = vap->iv_dev;	union iwreq_data wrqu;	char buf[128];		/* XXX */	IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO, wh->i_addr2,		"%s replay detected <keyix %d, rsc %llu >",		k->wk_cipher->ic_name, k->wk_keyix, rsc );	/* TODO: needed parameters: count, keyid, key type, src address, TSC */	snprintf(buf, sizeof(buf), "%s(keyid=%d %scast addr=%s)", tag,		k->wk_keyix,		IEEE80211_IS_MULTICAST(wh->i_addr1) ?  "broad" : "uni",		ether_sprintf(wh->i_addr1));	memset(&wrqu, 0, sizeof(wrqu));	wrqu.data.length = strlen(buf);	wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);}EXPORT_SYMBOL(ieee80211_notify_replay_failure);voidieee80211_notify_michael_failure(struct ieee80211vap *vap,	const struct ieee80211_frame *wh, u_int keyix){	static const char *tag = "MLME-MICHAELMICFAILURE.indication";	struct net_device *dev = vap->iv_dev;	union iwreq_data wrqu;	char buf[128];		/* XXX */	IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO, wh->i_addr2,		"Michael MIC verification failed <keyix %d>", keyix);	vap->iv_stats.is_rx_tkipmic++;	/* TODO: needed parameters: count, keyid, key type, src address, TSC */	snprintf(buf, sizeof(buf), "%s(keyid=%d %scast addr=%s)", tag,		keyix, IEEE80211_IS_MULTICAST(wh->i_addr1) ?  "broad" : "uni",		ether_sprintf(wh->i_addr1));	memset(&wrqu, 0, sizeof(wrqu));	wrqu.data.length = strlen(buf);	wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);}EXPORT_SYMBOL(ieee80211_notify_michael_failure);intieee80211_load_module(const char *modname){	int rv;		rv = request_module(modname);		if (rv < 0)		printk(KERN_ERR "couldn't load module '%s' (%d)\n",			modname, rv);	/*	 * XXX Further checking needed if module has been loaded successfully:	 *	 * "Note that a successful module load does not mean the module did not	 * then unload and exit on an error of its own. Callers must check that	 * the service they requested is now available not blindly invoke it."	 * http://kernelnewbies.org/documents/kdoc/kernel-api/r7338.html	 */	return rv;}#ifdef CONFIG_SYSCTLstatic struct proc_dir_entry *proc_madwifi;static int proc_madwifi_count = 0;static intproc_read_nodes(struct ieee80211vap *vap, char *buf, int space){        char *p = buf;        struct ieee80211_node *ni;        struct ieee80211_node_table *nt = (struct ieee80211_node_table *) &vap->iv_ic->ic_sta;        //IEEE80211_NODE_LOCK(nt);                                                                                       TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {                /* Assume each node needs 500 bytes */                if (buf + space < p + 500)                        break;		if (ni->ni_vap == vap &&		    0 != memcmp(vap->iv_myaddr, ni->ni_macaddr, IEEE80211_ADDR_LEN)) {			struct timespec t;			jiffies_to_timespec(jiffies - ni->ni_last_rx, &t);			p += sprintf(p, "macaddr: <%s>\n", ether_sprintf(ni->ni_macaddr));			p += sprintf(p, " rssi %d\n", ni->ni_rssi);						p += sprintf(p, " last_rx %ld.%06ld\n", 				     t.tv_sec, t.tv_nsec / 1000);		}        }        //IEEE80211_NODE_UNLOCK(nt);                                                                                     return (p - buf);}static ssize_tproc_ieee80211_read(struct file *file, char __user *buf, size_t len, loff_t *offset){	loff_t pos = *offset;	struct proc_ieee80211_priv *pv = (struct proc_ieee80211_priv *) file->private_data;	if (!pv->rbuf)		return -EINVAL;	if (pos < 0)		return -EINVAL;	if (pos > pv->rlen)		return -EFAULT;	if (len > pv->rlen - pos)		len = pv->rlen - pos;	if (copy_to_user(buf, pv->rbuf + pos, len))		return -EFAULT;	*offset = pos + len;	return len;}static intproc_ieee80211_open(struct inode *inode, struct file *file){	struct proc_ieee80211_priv *pv = NULL;	struct proc_dir_entry *dp = PDE(inode);	struct ieee80211vap *vap = dp->data;	if (!(file->private_data = kmalloc(sizeof(struct proc_ieee80211_priv), GFP_KERNEL)))		return -ENOMEM;	/* intially allocate both read and write buffers */	pv = (struct proc_ieee80211_priv *) file->private_data;	memset(pv, 0, sizeof(struct proc_ieee80211_priv));	pv->rbuf = vmalloc(MAX_PROC_IEEE80211_SIZE);	if (!pv->rbuf) {		kfree(pv);		return -ENOMEM;	}	pv->wbuf = vmalloc(MAX_PROC_IEEE80211_SIZE);	if (!pv->wbuf) {		vfree(pv->rbuf);		kfree(pv);		return -ENOMEM;	}	memset(pv->wbuf, 0, MAX_PROC_IEEE80211_SIZE);	memset(pv->rbuf, 0, MAX_PROC_IEEE80211_SIZE);	pv->max_wlen = MAX_PROC_IEEE80211_SIZE;	pv->max_rlen = MAX_PROC_IEEE80211_SIZE;	/* now read the data into the buffer */	pv->rlen = proc_read_nodes(vap, pv->rbuf, MAX_PROC_IEEE80211_SIZE);	return 0;}static ssize_tproc_ieee80211_write(struct file *file, const char __user *buf, size_t len, loff_t *offset){	loff_t pos = *offset;	struct proc_ieee80211_priv *pv =		(struct proc_ieee80211_priv *) file->private_data;	if (!pv->wbuf)		return -EINVAL;	if (pos < 0)		return -EINVAL;	if (pos >= pv->max_wlen)		return 0;	if (len > pv->max_wlen - pos)		len = pv->max_wlen - pos;	if (copy_from_user(pv->wbuf + pos, buf, len))		return -EFAULT;	if (pos + len > pv->wlen)		pv->wlen = pos + len;	*offset = pos + len;	return len;}static intproc_ieee80211_close(struct inode *inode, struct file *file){	struct proc_ieee80211_priv *pv =		(struct proc_ieee80211_priv *) file->private_data;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩高清在线一区| 91丨九色丨尤物| 欧美成人video| 国产一区二区三区在线看麻豆| 欧美二区三区91| 男男成人高潮片免费网站| 精品婷婷伊人一区三区三| 中文字幕亚洲精品在线观看| 色香蕉成人二区免费| 一区二区三区在线免费播放| 欧美天堂一区二区三区| 免费久久99精品国产| 久久亚洲精精品中文字幕早川悠里 | 久久久综合视频| 不卡av在线免费观看| 亚洲成人免费看| 精品久久久久99| 91美女精品福利| 蜜桃av一区二区在线观看| 国产日韩av一区| 欧美麻豆精品久久久久久| 国产自产v一区二区三区c| 中文字幕欧美国产| 欧美一区二区二区| 成人免费视频视频在线观看免费| 亚洲伊人伊色伊影伊综合网| 日韩欧美一区电影| 91麻豆精品国产91久久久使用方法| 国产精品一区二区91| 五月天欧美精品| 亚洲成av人片一区二区梦乃| 精品久久久久久无| 91精品国产综合久久精品| proumb性欧美在线观看| 国产乱子伦视频一区二区三区 | 亚洲va中文字幕| 国产精品婷婷午夜在线观看| 日韩一区二区三区视频在线观看| 色8久久人人97超碰香蕉987| 夫妻av一区二区| 粉嫩aⅴ一区二区三区四区| 麻豆91在线播放免费| 亚洲成a人片在线不卡一二三区| 国产精品午夜免费| 欧美国产日韩精品免费观看| 国产丝袜欧美中文另类| 精品国产3级a| 欧美va亚洲va| 亚洲精品一区二区在线观看| 日韩欧美国产午夜精品| 日韩视频免费观看高清完整版在线观看 | 亚洲综合一区二区三区| 亚洲成人午夜影院| 国产精品中文欧美| 中文字幕一区日韩精品欧美| 亚洲男人的天堂网| 一区二区三区精品视频| 亚洲伊人伊色伊影伊综合网| 丝袜美腿亚洲一区| 精品伊人久久久久7777人| 国产成人午夜精品5599| 99精品国产热久久91蜜凸| 91一区二区在线| 欧美日韩精品电影| 久久久影视传媒| 亚洲制服丝袜av| 国产一区二区在线电影| 不卡的看片网站| 9191精品国产综合久久久久久| 精品少妇一区二区三区| 伊人开心综合网| 亚洲一区av在线| 亚洲精品成人天堂一二三| av男人天堂一区| 欧美影片第一页| 久久精品水蜜桃av综合天堂| 成人免费在线播放视频| 水野朝阳av一区二区三区| 激情小说亚洲一区| 欧美日韩一区成人| 成人免费小视频| 91首页免费视频| 成人免费在线观看入口| 久久精品999| 8x8x8国产精品| 麻豆91精品91久久久的内涵| 日韩视频不卡中文| 亚洲欧美视频在线观看| 欧美视频在线播放| 视频一区二区国产| 制服丝袜日韩国产| 日韩 欧美一区二区三区| 91黄色免费看| 伊人一区二区三区| 精品视频在线免费看| 视频一区视频二区在线观看| 欧美午夜一区二区| 丝袜诱惑制服诱惑色一区在线观看 | 欧美日韩三级一区二区| 日日噜噜夜夜狠狠视频欧美人| 欧美天堂一区二区三区| 午夜精品成人在线视频| 51精品久久久久久久蜜臀| 日韩av电影免费观看高清完整版在线观看 | 亚洲一区二区中文在线| 欧美久久久久久久久中文字幕| 五月天亚洲精品| 久久综合色8888| 国产高清久久久| 亚洲综合激情网| 日韩免费一区二区| heyzo一本久久综合| 午夜精品一区二区三区免费视频 | av电影一区二区| 日韩高清在线观看| 亚洲欧洲日韩一区二区三区| 欧美日韩在线三区| 成人国产精品免费网站| 麻豆成人av在线| 亚洲大尺度视频在线观看| 国产欧美视频一区二区三区| 色综合天天综合网国产成人综合天 | 欧美日韩小视频| 99久久精品情趣| 国产不卡高清在线观看视频| 美女视频黄免费的久久 | 国产91对白在线观看九色| 青娱乐精品视频| 午夜伊人狠狠久久| 椎名由奈av一区二区三区| 亚洲精品一区二区三区香蕉| 欧美日本一区二区三区| 91黄色免费版| 色综合天天综合在线视频| 国产+成+人+亚洲欧洲自线| 亚洲成av人片一区二区| 亚洲欧美电影一区二区| 国产精品理论在线观看| 成人免费在线视频| 日韩制服丝袜先锋影音| 美女网站色91| 成人性生交大片免费看中文网站| 免费看欧美美女黄的网站| 亚洲成人你懂的| 蜜臀av在线播放一区二区三区| 丝袜美腿成人在线| 奇米精品一区二区三区四区| 久久99九九99精品| 国产高清不卡二三区| 成人激情校园春色| 色综合天天视频在线观看| 一本到三区不卡视频| 欧美日韩二区三区| 日韩精品一区国产麻豆| 精品国产伦理网| 国产精品久99| 午夜一区二区三区视频| 日韩福利视频导航| 丰满白嫩尤物一区二区| 色综合激情久久| 91精选在线观看| 国产亚洲精品精华液| 一区二区三区免费| 国产在线看一区| 一本久久精品一区二区| 日韩欧美一区中文| 国产精品国产馆在线真实露脸 | 亚洲另类中文字| 日韩成人一区二区三区在线观看| 精品亚洲国内自在自线福利| 91麻豆精品秘密| 日韩精品中文字幕一区| 一区二区三区在线看| 成人性视频免费网站| 欧美成人video| 午夜精品久久久久| 91亚洲国产成人精品一区二区三| 日韩一级片网址| 亚洲午夜在线观看视频在线| av成人免费在线观看| 国产午夜亚洲精品午夜鲁丝片 | 国产精品免费丝袜| 国产成人在线视频网站| 日韩欧美美女一区二区三区| 亚洲成av人片在www色猫咪| 成人18视频在线播放| 久久久精品黄色| 国产麻豆成人传媒免费观看| 日韩精品中午字幕| 六月丁香综合在线视频| 日韩一区二区在线观看视频播放| 一区二区激情小说| 91免费看片在线观看| 日韩美女啊v在线免费观看| 97精品久久久午夜一区二区三区| 中文字幕精品一区二区精品绿巨人 | 久久久精品人体av艺术| 国产成人三级在线观看| 国产精品网站在线播放| av电影一区二区|