📄 wlan_rx.c
字号:
/*
* File : wlan_rx.c
*/
#include "include.h"
/*
* If we recieve the rx data process and push them to the above layers
*/
static int wlan_compute_rssi(wlan_private * priv, RxPD * pRxPD)
{
wlan_adapter *Adapter = priv->adapter;
ENTER();
PRINTK1("RxPD: SNR = %d, NF = %d\n", pRxPD->SNR, pRxPD->NF);
PRINTK1("Before computing SNR and NF\n");
PRINTK1("Adapter: 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] = pRxPD->SNR;
Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPD->NF;
Adapter->RxPDSNRAge = os_time_get();
/*
* Average out the SNR from the received packet
*/
Adapter->SNR[TYPE_RXPD][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->SNR[TYPE_RXPD][TYPE_AVG], pRxPD->SNR, Adapter->data_avg_factor);
/*
* Average out the NF value
*/
Adapter->NF[TYPE_RXPD][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->NF[TYPE_RXPD][TYPE_AVG], pRxPD->NF, Adapter->data_avg_factor);
PRINTK1("After computing SNR and NF\n");
PRINTK1("Adapter: 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);
LEAVE();
return 0;
}
int ProcessRxed_802_3_Packet(wlan_private * priv, struct sk_buff *skb)
{
wlan_adapter *Adapter = priv->adapter;
RxPD *pRxPD = (RxPD *) skb->data;
u8 *ptr = skb->data;
int i;
ENTER();
HEXDUMP("Before chop RxPD", ptr, MIN(skb->len, 100));
if (skb->len < (ETH_HLEN + 8 + sizeof(RxPD))) {
PRINTK1("WARNING!! FRAME RECEIVED WITH BAD LENGTH\n");
priv->stats.rx_length_errors++;
LEAVE();
return 0;
}
#ifdef BIG_ENDIAN
endian_convert_RxPD(pRxPD);
#endif
// Check RxPD status and update 802.3 stat,
// we should have more bits to test
if (!(pRxPD->Status & MRVDRV_RXPD_STATUS_OK)) {
PRINTK1("WARNING: frame received with bad status\n");
priv->stats.rx_errors++;
LEAVE();
return 0;
}
ptr += sizeof(RxPD);
HEXDUMP("After chop RxPD", ptr, skb->len-sizeof(RxPD));
HEXDUMP("Dest Mac", ptr, MRVDRV_ETH_ADDR_LEN);
HEXDUMP("Source Mac", (ptr + MRVDRV_ETH_ADDR_LEN), MRVDRV_ETH_ADDR_LEN);
#ifndef FW_REMOVED_SNAP_HEADER
// Shift everything after the DEST/SRC 8 bytes forward...
// to take care of the SNAP header that is somewhere here...
for (i = 11; i >= 0; i--)
ptr[MRVDRV_SNAP_HEADER_LEN + i] = ptr[i];
ptr += MRVDRV_SNAP_HEADER_LEN;
#endif
/* Take the data rate from the RxPD structure
* only if the rate is auto */
if (Adapter->Is_DataRate_Auto)
Adapter->DataRate = index_to_data_rate(pRxPD->RxRate);
wlan_compute_rssi(priv, pRxPD);
#ifndef FW_REMOVED_SNAP_HEADER
/* Compute actual packet size */
i = MRVDRV_SNAP_HEADER_LEN + sizeof(RxPD);
#else
i = sizeof(RxPD);
#endif
skb_pull(skb, i);
PRINTK1("Size of actual 802.3 packet = %d\n", skb->len);
if (!os_upload_rx_packet(priv, skb)) {
priv->stats.rx_bytes += skb->len;
priv->stats.rx_packets++;
LEAVE();
return 0;
} else {
LEAVE();
return WLAN_STATUS_FAILURE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -