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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rx.c

?? linux內(nèi)核源碼
?? C
字號(hào):
/**  * This file contains the handling of RX in wlan driver.  */#include <linux/etherdevice.h>#include <linux/types.h>#include "hostcmd.h"#include "radiotap.h"#include "decl.h"#include "dev.h"#include "wext.h"struct eth803hdr {	u8 dest_addr[6];	u8 src_addr[6];	u16 h803_len;} __attribute__ ((packed));struct rfc1042hdr {	u8 llc_dsap;	u8 llc_ssap;	u8 llc_ctrl;	u8 snap_oui[3];	u16 snap_type;} __attribute__ ((packed));struct rxpackethdr {	struct rxpd rx_pd;	struct eth803hdr eth803_hdr;	struct rfc1042hdr rfc1042_hdr;} __attribute__ ((packed));struct rx80211packethdr {	struct rxpd rx_pd;	void *eth80211_hdr;} __attribute__ ((packed));static int process_rxed_802_11_packet(wlan_private * priv, struct sk_buff *skb);/** *  @brief This function computes the avgSNR . * *  @param priv    A pointer to wlan_private structure *  @return 	   avgSNR */static u8 wlan_getavgsnr(wlan_private * priv){	u8 i;	u16 temp = 0;	wlan_adapter *adapter = priv->adapter;	if (adapter->numSNRNF == 0)		return 0;	for (i = 0; i < adapter->numSNRNF; i++)		temp += adapter->rawSNR[i];	return (u8) (temp / adapter->numSNRNF);}/** *  @brief This function computes the AvgNF * *  @param priv    A pointer to wlan_private structure *  @return 	   AvgNF */static u8 wlan_getavgnf(wlan_private * priv){	u8 i;	u16 temp = 0;	wlan_adapter *adapter = priv->adapter;	if (adapter->numSNRNF == 0)		return 0;	for (i = 0; i < adapter->numSNRNF; i++)		temp += adapter->rawNF[i];	return (u8) (temp / adapter->numSNRNF);}/** *  @brief This function save the raw SNR/NF to our internel buffer * *  @param priv    A pointer to wlan_private structure *  @param prxpd   A pointer to rxpd structure of received packet *  @return 	   n/a */static void wlan_save_rawSNRNF(wlan_private * priv, struct rxpd *p_rx_pd){	wlan_adapter *adapter = priv->adapter;	if (adapter->numSNRNF < DEFAULT_DATA_AVG_FACTOR)		adapter->numSNRNF++;	adapter->rawSNR[adapter->nextSNRNF] = p_rx_pd->snr;	adapter->rawNF[adapter->nextSNRNF] = p_rx_pd->nf;	adapter->nextSNRNF++;	if (adapter->nextSNRNF >= DEFAULT_DATA_AVG_FACTOR)		adapter->nextSNRNF = 0;	return;}/** *  @brief This function computes the RSSI in received packet. * *  @param priv    A pointer to wlan_private structure *  @param prxpd   A pointer to rxpd structure of received packet *  @return 	   n/a */static void wlan_compute_rssi(wlan_private * priv, struct rxpd *p_rx_pd){	wlan_adapter *adapter = priv->adapter;	lbs_deb_enter(LBS_DEB_RX);	lbs_deb_rx("rxpd: SNR %d, NF %d\n", p_rx_pd->snr, p_rx_pd->nf);	lbs_deb_rx("before computing SNR: SNR-avg = %d, NF-avg = %d\n",	       adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,	       adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);	adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->snr;	adapter->NF[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->nf;	wlan_save_rawSNRNF(priv, p_rx_pd);	adapter->SNR[TYPE_RXPD][TYPE_AVG] = wlan_getavgsnr(priv) * AVG_SCALE;	adapter->NF[TYPE_RXPD][TYPE_AVG] = wlan_getavgnf(priv) * AVG_SCALE;	lbs_deb_rx("after computing SNR: SNR-avg = %d, NF-avg = %d\n",	       adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,	       adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);	adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] =	    CAL_RSSI(adapter->SNR[TYPE_RXPD][TYPE_NOAVG],		     adapter->NF[TYPE_RXPD][TYPE_NOAVG]);	adapter->RSSI[TYPE_RXPD][TYPE_AVG] =	    CAL_RSSI(adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,		     adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);	lbs_deb_leave(LBS_DEB_RX);}void libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb){	lbs_deb_rx("skb->data %p\n", skb->data);	if (priv->adapter->monitormode != WLAN_MONITOR_OFF) {		skb->protocol = eth_type_trans(skb, priv->rtap_net_dev);	} else {		if (priv->mesh_dev && IS_MESH_FRAME(skb))			skb->protocol = eth_type_trans(skb, priv->mesh_dev);		else			skb->protocol = eth_type_trans(skb, priv->dev);	}	skb->ip_summed = CHECKSUM_UNNECESSARY;	netif_rx(skb);}/** *  @brief This function processes received packet and forwards it *  to kernel/upper layer * *  @param priv    A pointer to wlan_private *  @param skb     A pointer to skb which includes the received packet *  @return 	   0 or -1 */int libertas_process_rxed_packet(wlan_private * priv, struct sk_buff *skb){	wlan_adapter *adapter = priv->adapter;	int ret = 0;	struct rxpackethdr *p_rx_pkt;	struct rxpd *p_rx_pd;	int hdrchop;	struct ethhdr *p_ethhdr;	const u8 rfc1042_eth_hdr[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };	lbs_deb_enter(LBS_DEB_RX);	if (priv->adapter->monitormode != WLAN_MONITOR_OFF)		return process_rxed_802_11_packet(priv, skb);	p_rx_pkt = (struct rxpackethdr *) skb->data;	p_rx_pd = &p_rx_pkt->rx_pd;	if (p_rx_pd->rx_control & RxPD_MESH_FRAME)		SET_MESH_FRAME(skb);	else		UNSET_MESH_FRAME(skb);	lbs_deb_hex(LBS_DEB_RX, "RX Data: Before chop rxpd", skb->data,		 min_t(unsigned int, skb->len, 100));	if (skb->len < (ETH_HLEN + 8 + sizeof(struct rxpd))) {		lbs_deb_rx("rx err: frame received with bad length\n");		priv->stats.rx_length_errors++;		ret = 0;		goto done;	}	/*	 * Check rxpd status and update 802.3 stat,	 */	if (!(p_rx_pd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK))) {		lbs_deb_rx("rx err: frame received with bad status\n");		lbs_pr_alert("rxpd not ok\n");		priv->stats.rx_errors++;		ret = 0;		goto done;	}	lbs_deb_rx("rx data: skb->len-sizeof(RxPd) = %d-%zd = %zd\n",	       skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd));	lbs_deb_hex(LBS_DEB_RX, "RX Data: Dest", p_rx_pkt->eth803_hdr.dest_addr,		sizeof(p_rx_pkt->eth803_hdr.dest_addr));	lbs_deb_hex(LBS_DEB_RX, "RX Data: Src", p_rx_pkt->eth803_hdr.src_addr,		sizeof(p_rx_pkt->eth803_hdr.src_addr));	if (memcmp(&p_rx_pkt->rfc1042_hdr,		   rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr)) == 0) {		/*		 *  Replace the 803 header and rfc1042 header (llc/snap) with an		 *    EthernetII header, keep the src/dst and snap_type (ethertype)		 *		 *  The firmware only passes up SNAP frames converting		 *    all RX Data from 802.11 to 802.2/LLC/SNAP frames.		 *		 *  To create the Ethernet II, just move the src, dst address right		 *    before the snap_type.		 */		p_ethhdr = (struct ethhdr *)		    ((u8 *) & p_rx_pkt->eth803_hdr		     + sizeof(p_rx_pkt->eth803_hdr) + sizeof(p_rx_pkt->rfc1042_hdr)		     - sizeof(p_rx_pkt->eth803_hdr.dest_addr)		     - sizeof(p_rx_pkt->eth803_hdr.src_addr)		     - sizeof(p_rx_pkt->rfc1042_hdr.snap_type));		memcpy(p_ethhdr->h_source, p_rx_pkt->eth803_hdr.src_addr,		       sizeof(p_ethhdr->h_source));		memcpy(p_ethhdr->h_dest, p_rx_pkt->eth803_hdr.dest_addr,		       sizeof(p_ethhdr->h_dest));		/* Chop off the rxpd + the excess memory from the 802.2/llc/snap header		 *   that was removed		 */		hdrchop = (u8 *) p_ethhdr - (u8 *) p_rx_pkt;	} else {		lbs_deb_hex(LBS_DEB_RX, "RX Data: LLC/SNAP",			(u8 *) & p_rx_pkt->rfc1042_hdr,			sizeof(p_rx_pkt->rfc1042_hdr));		/* Chop off the rxpd */		hdrchop = (u8 *) & p_rx_pkt->eth803_hdr - (u8 *) p_rx_pkt;	}	/* Chop off the leading header bytes so the skb points to the start of	 *   either the reconstructed EthII frame or the 802.2/llc/snap frame	 */	skb_pull(skb, hdrchop);	/* Take the data rate from the rxpd structure	 * only if the rate is auto	 */	if (adapter->auto_rate)		adapter->cur_rate = libertas_fw_index_to_data_rate(p_rx_pd->rx_rate);	wlan_compute_rssi(priv, p_rx_pd);	lbs_deb_rx("rx data: size of actual packet %d\n", skb->len);	priv->stats.rx_bytes += skb->len;	priv->stats.rx_packets++;	libertas_upload_rx_packet(priv, skb);	ret = 0;done:	lbs_deb_leave_args(LBS_DEB_RX, "ret %d", ret);	return ret;}EXPORT_SYMBOL_GPL(libertas_process_rxed_packet);/** *  @brief This function converts Tx/Rx rates from the Marvell WLAN format *  (see Table 2 in Section 3.1) to IEEE80211_RADIOTAP_RATE units (500 Kb/s) * *  @param rate    Input rate *  @return 	   Output Rate (0 if invalid) */static u8 convert_mv_rate_to_radiotap(u8 rate){	switch (rate) {	case 0:		/*   1 Mbps */		return 2;	case 1:		/*   2 Mbps */		return 4;	case 2:		/* 5.5 Mbps */		return 11;	case 3:		/*  11 Mbps */		return 22;	/* case 4: reserved */	case 5:		/*   6 Mbps */		return 12;	case 6:		/*   9 Mbps */		return 18;	case 7:		/*  12 Mbps */		return 24;	case 8:		/*  18 Mbps */		return 36;	case 9:		/*  24 Mbps */		return 48;	case 10:		/*  36 Mbps */		return 72;	case 11:		/*  48 Mbps */		return 96;	case 12:		/*  54 Mbps */		return 108;	}	lbs_pr_alert("Invalid Marvell WLAN rate %i\n", rate);	return 0;}/** *  @brief This function processes a received 802.11 packet and forwards it *  to kernel/upper layer * *  @param priv    A pointer to wlan_private *  @param skb     A pointer to skb which includes the received packet *  @return 	   0 or -1 */static int process_rxed_802_11_packet(wlan_private * priv, struct sk_buff *skb){	wlan_adapter *adapter = priv->adapter;	int ret = 0;	struct rx80211packethdr *p_rx_pkt;	struct rxpd *prxpd;	struct rx_radiotap_hdr radiotap_hdr;	struct rx_radiotap_hdr *pradiotap_hdr;	lbs_deb_enter(LBS_DEB_RX);	p_rx_pkt = (struct rx80211packethdr *) skb->data;	prxpd = &p_rx_pkt->rx_pd;	// lbs_deb_hex(LBS_DEB_RX, "RX Data: Before chop rxpd", skb->data, min(skb->len, 100));	if (skb->len < (ETH_HLEN + 8 + sizeof(struct rxpd))) {		lbs_deb_rx("rx err: frame received wit bad length\n");		priv->stats.rx_length_errors++;		ret = 0;		goto done;	}	/*	 * Check rxpd status and update 802.3 stat,	 */	if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK))) {		//lbs_deb_rx("rx err: frame received with bad status\n");		priv->stats.rx_errors++;	}	lbs_deb_rx("rx data: skb->len-sizeof(RxPd) = %d-%zd = %zd\n",	       skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd));	/* create the exported radio header */	if(priv->adapter->monitormode == WLAN_MONITOR_OFF) {		/* no radio header */		/* chop the rxpd */		skb_pull(skb, sizeof(struct rxpd));	}	else {		/* radiotap header */		radiotap_hdr.hdr.it_version = 0;		/* XXX must check this value for pad */		radiotap_hdr.hdr.it_pad = 0;		radiotap_hdr.hdr.it_len = cpu_to_le16 (sizeof(struct rx_radiotap_hdr));		radiotap_hdr.hdr.it_present = cpu_to_le32 (RX_RADIOTAP_PRESENT);		/* unknown values */		radiotap_hdr.flags = 0;		radiotap_hdr.chan_freq = 0;		radiotap_hdr.chan_flags = 0;		radiotap_hdr.antenna = 0;		/* known values */		radiotap_hdr.rate = convert_mv_rate_to_radiotap(prxpd->rx_rate);		/* XXX must check no carryout */		radiotap_hdr.antsignal = prxpd->snr + prxpd->nf;		radiotap_hdr.rx_flags = 0;		if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))			radiotap_hdr.rx_flags |= IEEE80211_RADIOTAP_F_RX_BADFCS;		//memset(radiotap_hdr.pad, 0x11, IEEE80211_RADIOTAP_HDRLEN - 18);		/* chop the rxpd */		skb_pull(skb, sizeof(struct rxpd));		/* add space for the new radio header */		if ((skb_headroom(skb) < sizeof(struct rx_radiotap_hdr)) &&		    pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0,				     GFP_ATOMIC)) {			lbs_pr_alert("%s: couldn't pskb_expand_head\n",			       __func__);		}		pradiotap_hdr =		    (struct rx_radiotap_hdr *)skb_push(skb,						     sizeof(struct							    rx_radiotap_hdr));		memcpy(pradiotap_hdr, &radiotap_hdr,		       sizeof(struct rx_radiotap_hdr));	}	/* Take the data rate from the rxpd structure	 * only if the rate is auto	 */	if (adapter->auto_rate)		adapter->cur_rate = libertas_fw_index_to_data_rate(prxpd->rx_rate);	wlan_compute_rssi(priv, prxpd);	lbs_deb_rx("rx data: size of actual packet %d\n", skb->len);	priv->stats.rx_bytes += skb->len;	priv->stats.rx_packets++;	libertas_upload_rx_packet(priv, skb);	ret = 0;done:	lbs_deb_leave_args(LBS_DEB_RX, "ret %d", ret);	return ret;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品99久久久久久有的能看| 亚洲乱码日产精品bd| 岛国一区二区在线观看| 亚洲一区二区三区自拍| 久久伊人中文字幕| 欧美在线不卡一区| 国产精品一区久久久久| 亚洲国产一二三| 国产欧美综合在线观看第十页| 欧美自拍偷拍一区| 国产成人av电影免费在线观看| 亚洲国产精品一区二区尤物区| 国产偷国产偷亚洲高清人白洁| 欧美日韩亚洲综合在线 | 亚洲午夜激情av| 久久午夜国产精品| 91精品国产麻豆| 色婷婷精品久久二区二区蜜臀av| 狠狠色狠狠色综合系列| 亚洲男人都懂的| 精品国产第一区二区三区观看体验| 99久久久久久| 国产成人精品亚洲777人妖| 麻豆精品国产91久久久久久| 亚洲精品视频自拍| 欧美激情中文字幕一区二区| 日韩午夜在线观看| 在线免费视频一区二区| aaa国产一区| 国产成人一区在线| 人人狠狠综合久久亚洲| 亚洲444eee在线观看| 中文字幕在线观看一区二区| 国产性天天综合网| 日韩欧美的一区| 5566中文字幕一区二区电影| 在线观看亚洲专区| 日本高清无吗v一区| 不卡av在线免费观看| 国产麻豆成人传媒免费观看| 久久精品国产99国产| 奇米色一区二区| 首页亚洲欧美制服丝腿| 亚洲地区一二三色| 亚洲一区二区三区爽爽爽爽爽| 亚洲欧美一区二区在线观看| 国产精品女主播av| 中文字幕av一区二区三区免费看| 久久久久久久久免费| 久久久久九九视频| 久久久久亚洲综合| 国产精品视频一二三区| 国产精品久久久久四虎| 中文字幕色av一区二区三区| 亚洲综合在线免费观看| 中文字幕av免费专区久久| 国产欧美日韩三区| 中文字幕av一区二区三区高 | 精品久久一区二区| 日韩欧美色综合网站| 欧美成人aa大片| 久久综合九色综合欧美98| 久久久综合九色合综国产精品| 久久久另类综合| 中文字幕av一区二区三区免费看| 亚洲欧洲日韩综合一区二区| 亚洲精品综合在线| 午夜精品福利一区二区三区蜜桃| 亚洲成av人片一区二区梦乃| 午夜视频一区在线观看| 久久se精品一区精品二区| 国内不卡的二区三区中文字幕| 国产成人免费在线观看不卡| 91视频观看免费| 欧美日韩一区成人| 日韩你懂的电影在线观看| 国产亚洲精品中文字幕| 国产精品国产三级国产a| 亚洲精品福利视频网站| 日韩黄色在线观看| 国产精品中文字幕日韩精品 | 亚洲综合图片区| 日韩1区2区日韩1区2区| 国产一区二区伦理片| 成人免费视频网站在线观看| 色婷婷综合久久久久中文 | 国产福利一区二区三区视频| 99re亚洲国产精品| 欧美伦理影视网| 国产日韩综合av| 亚洲毛片av在线| 蜜桃在线一区二区三区| 成人av电影在线播放| 欧美日韩久久一区| 久久婷婷国产综合精品青草 | 国产日韩精品视频一区| 亚洲精品视频自拍| 国产曰批免费观看久久久| 色综合久久综合中文综合网| 日韩亚洲欧美在线观看| 国产精品久久久久久久蜜臀| 天堂资源在线中文精品| 成人午夜在线免费| 在线不卡中文字幕播放| 欧美国产禁国产网站cc| 午夜影视日本亚洲欧洲精品| 成人午夜免费av| 欧美一级高清片在线观看| 中文字幕在线视频一区| 美女一区二区久久| 欧洲一区在线电影| 中文文精品字幕一区二区| 日韩一区精品视频| 91视视频在线直接观看在线看网页在线看 | 人人狠狠综合久久亚洲| 成人高清视频在线观看| 欧美成人aa大片| 亚洲图片欧美色图| 91无套直看片红桃| 久久综合久久综合九色| 日本美女一区二区三区| 色视频欧美一区二区三区| 久久一区二区视频| 捆绑调教一区二区三区| 欧美日韩国产首页| 亚洲啪啪综合av一区二区三区| 国产精品自拍av| 精品日韩一区二区| 日韩成人免费在线| 欧美午夜精品久久久久久超碰| 国产精品少妇自拍| 国产美女主播视频一区| 日韩视频免费观看高清完整版在线观看 | 亚洲精品国产无天堂网2021| 成人污视频在线观看| 久久精品一区蜜桃臀影院| 美国十次综合导航| 91麻豆精品91久久久久久清纯| 怡红院av一区二区三区| 99国产精品国产精品久久| 国产精品久久久一区麻豆最新章节| 狠狠色丁香婷婷综合| 日韩欧美久久一区| 久久精品国产久精国产| 日韩一卡二卡三卡四卡| 青草av.久久免费一区| 91精品国产综合久久蜜臀| 亚洲bt欧美bt精品777| 欧美日韩久久一区| 日韩av中文字幕一区二区三区| 欧美色图天堂网| 亚洲成人综合在线| 欧美三片在线视频观看 | 九一九一国产精品| 精品久久久久久久久久久久久久久 | 亚洲精品日日夜夜| 在线看不卡av| 亚洲成av人片在www色猫咪| 欧美精品自拍偷拍动漫精品| 亚洲高清视频在线| 欧美精品第1页| 日韩影院精彩在线| 久久亚洲精品小早川怜子| 国产成人免费在线视频| 亚洲婷婷在线视频| 欧美美女一区二区在线观看| 石原莉奈在线亚洲三区| 日韩欧美中文字幕公布| 国产盗摄女厕一区二区三区| 国产欧美一区二区精品性| 不卡视频免费播放| 亚洲第一狼人社区| 精品国精品自拍自在线| 国产剧情一区在线| 亚洲女爱视频在线| 欧美一区在线视频| 国产激情视频一区二区在线观看| 国产精品久久久久久一区二区三区 | 亚洲小说欧美激情另类| 日韩天堂在线观看| 成人网在线免费视频| 亚洲午夜精品网| 久久青草欧美一区二区三区| 菠萝蜜视频在线观看一区| 亚洲国产成人高清精品| 精品久久久网站| 色综合久久88色综合天天6| 午夜电影网亚洲视频| 久久久久久日产精品| 欧日韩精品视频| 激情文学综合丁香| 一区二区三区蜜桃网| 精品久久久久久久久久久院品网| www.99精品| 六月丁香婷婷久久| 亚洲免费成人av| 久久久久九九视频| 91精品国产综合久久蜜臀| aa级大片欧美| 国产伦精品一区二区三区视频青涩 |