13 #include <linux/version.h>
16 #ifdef UNIFI_SNIFF_ARPHRD
19 #if (UNIFI_SNIFF_ARPHRD == ARPHRD_IEEE80211_RADIOTAP)
23 #ifndef ETH_P_80211_RAW
24 #define ETH_P_80211_RAW ETH_P_ALL
45 CSR_MLME_SNIFFJOIN_REQUEST *
req = &signal.
u.MlmeSniffjoinRequest;
50 req->Channel = priv->wext_conf.channel;
51 req->ChannelStartingFactor = 0;
57 unifi_error(priv,
"failed to send SNIFFJOIN request, error %d\n", r);
63 unifi_notice(priv,
"SNIFFJOIN request was rejected with result 0x%X (%s)\n",
89 #if (UNIFI_SNIFF_ARPHRD == ARPHRD_IEEE80211_RADIOTAP)
92 const CSR_MA_SNIFFDATA_INDICATION *
ind,
100 struct unifi_rx_radiotap_header {
122 struct unifi_rx_radiotap_header *unifi_rt;
123 int signal, noise,
snr;
127 if (ind_data_len <= 0) {
128 unifi_error(priv,
"Invalid length in CSR_MA_SNIFFDATA_INDICATION.\n");
136 skb = dev_alloc_skb(ind_data_len +
sizeof(
struct unifi_rx_radiotap_header) + 4);
139 priv->stats.rx_errors++;
146 unifi_rt = (
struct unifi_rx_radiotap_header *)
147 skb_put(skb,
sizeof(
struct unifi_rx_radiotap_header));
150 ptr =
skb_put(skb, ind_data_len);
154 unifi_rt->rt_hdr.it_pad = 0;
155 unifi_rt->rt_hdr.it_len =
sizeof(
struct unifi_rx_radiotap_header);
158 unifi_rt->rt_hdr.it_present = 0
170 unifi_rt->rt_tsft = (((
u64)ind->Timestamp.x[7]) | (((
u64)ind->Timestamp.x[6]) << 8) |
171 (((
u64)ind->Timestamp.x[5]) << 16) | (((
u64)ind->Timestamp.x[4]) << 24) |
172 (((
u64)ind->Timestamp.x[3]) << 32) | (((
u64)ind->Timestamp.x[2]) << 40) |
173 (((
u64)ind->Timestamp.x[1]) << 48) | (((
u64)ind->Timestamp.x[0]) << 56));
175 unifi_rt->rt_flags = 0;
177 unifi_rt->rt_rate = ind->Rate;
180 unifi_rt->rt_chan_flags = 0;
183 signal = (
s16)unifi2host_16(ind->Rssi);
184 snr = (
s16)unifi2host_16(ind->Snr);
185 noise = signal -
snr;
187 unifi_rt->rt_dbm_antsignal = signal;
188 unifi_rt->rt_dbm_antnoise = noise;
190 unifi_rt->rt_antenna = ind->AntennaId;
197 memset(skb->cb, 0,
sizeof(skb->cb));
205 priv->stats.rx_packets++;
206 priv->stats.rx_bytes += ind_data_len;
229 #if (UNIFI_SNIFF_ARPHRD == ARPHRD_IEEE80211_PRISM)
232 const CSR_MA_SNIFFDATA_INDICATION *ind,
240 #define WLANCAP_MAGIC_COOKIE_V1 0x80211001
241 struct avs_header_v1 {
257 int signal, noise,
snr;
261 if (ind_data_len <= 0) {
262 unifi_error(priv,
"Invalid length in CSR_MA_SNIFFDATA_INDICATION.\n");
270 skb = dev_alloc_skb(ind_data_len +
sizeof(
struct avs_header_v1) + 4);
273 priv->stats.rx_errors++;
280 avs = (
struct avs_header_v1 *)
skb_put(skb,
sizeof(
struct avs_header_v1));
283 ptr =
skb_put(skb, ind_data_len);
287 signal = 0x10000 - ((
s16)unifi2host_16(ind->Rssi));
288 snr = (
s16)unifi2host_16(ind->Snr);
289 noise = signal -
snr;
291 avs->version =
htonl(WLANCAP_MAGIC_COOKIE_V1);
292 avs->length =
htonl(
sizeof(
struct avs_header_v1));
295 avs->phytype =
htonl(9);
296 avs->channel =
htonl(priv->wext_conf.channel);
297 avs->datarate =
htonl(ind->Rate * 5);
298 avs->antenna =
htonl(ind->Antenna);
299 avs->priority =
htonl(0);
300 avs->ssi_type =
htonl(2);
301 avs->ssi_signal =
htonl(signal);
302 avs->ssi_noise =
htonl(noise);
303 avs->preamble =
htonl(0);
304 avs->encoding =
htonl(0);
308 skb->mac.raw = skb->
data;
311 memset(skb->cb, 0,
sizeof(skb->cb));
319 priv->stats.rx_packets++;
320 priv->stats.rx_bytes += ind_data_len;
346 ma_sniffdata_ind(
void *ospriv,
347 const CSR_MA_SNIFFDATA_INDICATION *ind,
357 unifi_warning(priv,
"rx: MA-SNIFFDATA indication with zero bulk data\n");
365 if (
unlikely(!netif_running(dev))) {
366 priv->stats.rx_dropped++;
367 priv->wext_conf.wireless_stats.discard.misc++;
372 if (ind->ReceptionStatus) {
373 priv->stats.rx_dropped++;
374 priv->wext_conf.wireless_stats.discard.misc++;
380 #if (UNIFI_SNIFF_ARPHRD == ARPHRD_IEEE80211_PRISM)
381 netrx_prism(priv, ind, skb);
384 #if (UNIFI_SNIFF_ARPHRD == ARPHRD_IEEE80211_RADIOTAP)
385 netrx_radiotap(priv, ind, skb);