Probe Request 帧结构详细分解

Probe Request帧结构

概述

probe request属于管理帧,其遵循管理帧的一般格式,在《802.11无线权威指南》中管理帧的一般格式为:
在这里插入图片描述

因为probe request属于管理帧,所以其也遵循这个格式。但是不同的是不同的管理帧的Frame Body是不同的。下图是Probe Request帧的组成细节:
Probe Request

帧主体中大部份的数据,如果使用长度固定的位,就称为固定式位。

如果位长度不定,就称为信息元素( information element)。所谓信息元素,是指长度不定的数据区块。 每个数据区块均会标注上类型编号与大小, 各种信息元素的数据位都有特定的解释方式。

下面结合抓取的报文,来仔细分析下Probe Request帧各部分内容和含义。

MAC Header(24字节)

下图截取的是利用Omnipeek抓取的Probe Request帧,已经将其MAC Header标记起来。

在这里插入图片描述

对应于右边的16进制格式,我们可以看到MAC Header刚好是24字节(即2+2+6+6+6+2)这和802.11 协议规定的是一致的。

Frame Control(2字节)

先看frame control板块内容:

在这里插入图片描述

这两个字节的内容主要包含了一下内容:

  • version:版本,802.11定义了版本1,0表示保留未用,2未定义。
  • Type:帧类型,这里显示是管理帧
  • Subtype:那种帧,即Probe Request
  • Frame Control Flags:1个字节表示出帧的一些属性,如会否是重传帧,是否分段、设备是否处于power save mode 。
Duration(2字节)

因为这里属于管理帧,无需等待回复ACK所以这里该值为0。

DA(6字节)

在这里插入图片描述
即目的MAC地址,因为是广播这里可以看到它是:FF:FF:FF:FF:FF:FF

SA(6字节)

在这里插入图片描述

即源MAC地址,就是我们发出这包帧的设备的地址。

BSSID(6字节)

在这里插入图片描述

我们所在的BSS网络的MAC地址,简单来说就是AP的MAC地址。因为现在还未连上网络,且是以广播的形式发送帧,所以这里是FF:FF:FF:FF:FF:FF。

seq_ctrl(2字节)

在这里插入图片描述

当前帧的编号。

Frame Body(0~2312字节)

这部分是可变的,会根据填写的长度的大小来改变其大小。

在这里插入图片描述

Frame Body部分携带了Probe request帧所包含的所有信息,Probe request 会携带当前设备所具有的一些能力信息。主要有一下三个部分:

  1. 想要加入的AP的SSID(可变的,根据实际情况选择)
  2. 支持的速率(supported rate)(可变的,根据硬件和驱动的支持情况改变)
  3. 扩展支持速率(Extended Supported Rate)

FCS(4字节)

在这里插入图片描述

帧校验序列,是802.11为了提高通信的可靠性提出的。比如说数据帧在空气中传播的时候受到了干扰而改变了数据的内容(我们知道无线通信属于不可靠通信,这种情况是比较常见的),那么在进行FCS校验的时候MAC层会将FCS校验不合格的帧丢弃掉。

int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb) { struct wmi_mgmt_rx_ev_arg arg = {}; struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_hdr *hdr; struct ieee80211_supported_band *sband; u32 rx_status; u32 channel; u32 phy_mode; u32 snr, rssi; u32 rate; u16 fc; int ret, i; ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg); if (ret) { ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret); dev_kfree_skb(skb); return ret; } channel = __le32_to_cpu(arg.channel); rx_status = __le32_to_cpu(arg.status); snr = __le32_to_cpu(arg.snr); phy_mode = __le32_to_cpu(arg.phy_mode); rate = __le32_to_cpu(arg.rate); memset(status, 0, sizeof(*status)); ath10k_dbg(ar, ATH10K_DBG_MGMT, "event mgmt rx status %08x\n", rx_status); if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) || (rx_status & (WMI_RX_STATUS_ERR_DECRYPT | WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) { dev_kfree_skb(skb); return 0; } if (rx_status & WMI_RX_STATUS_ERR_MIC) status->flag |= RX_FLAG_MMIC_ERROR; if (rx_status & WMI_RX_STATUS_EXT_INFO) { status->mactime = __le64_to_cpu(arg.ext_info.rx_mac_timestamp); status->flag |= RX_FLAG_MACTIME_END; } /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to * MODE_11B. This means phy_mode is not a reliable source for the band * of mgmt rx. */ if (channel >= 1 && channel <= 14) { status->band = NL80211_BAND_2GHZ; } else if (channel >= 36 && channel <= ATH10K_MAX_5G_CHAN) { status->band = NL80211_BAND_5GHZ; } else { /* Shouldn't happen unless list of advertised channels to * mac80211 has been changed. */ WARN_ON_ONCE(1); dev_kfree_skb(skb); return 0; } if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ) ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n"); sband = &ar->mac.sbands[status->band]; status->freq = ieee80211_channel_to_frequency(channel, status->band); status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR; BUILD_BUG_ON(ARRAY_SIZE(status->chain_signal) != ARRAY_SIZE(arg.rssi)); for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { status->chains &= ~BIT(i); rssi = __le32_to_cpu(arg.rssi[i]); ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt rssi[%d]:%d\n", i, arg.rssi[i]); if (rssi != ATH10K_INVALID_RSSI && rssi != 0) { status->chain_signal[i] = ATH10K_DEFAULT_NOISE_FLOOR + rssi; status->chains |= BIT(i); } } status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100); hdr = (struct ieee80211_hdr *)skb->data; fc = le16_to_cpu(hdr->frame_control); /* Firmware is guaranteed to report all essential management frames via * WMI while it can deliver some extra via HTT. Since there can be * duplicates split the reporting wrt monitor/sniffing. */ status->flag |= RX_FLAG_SKIP_MONITOR; ath10k_wmi_handle_wep_reauth(ar, skb, status); if (ath10k_wmi_rx_is_decrypted(ar, hdr)) { status->flag |= RX_FLAG_DECRYPTED; if (!ieee80211_is_action(hdr->frame_control) && !ieee80211_is_deauth(hdr->frame_control) && !ieee80211_is_disassoc(hdr->frame_control)) { status->flag |= RX_FLAG_IV_STRIPPED | RX_FLAG_MMIC_STRIPPED; hdr->frame_control = __cpu_to_le16(fc & ~IEEE80211_FCTL_PROTECTED); } } if (ieee80211_is_beacon(hdr->frame_control)) ath10k_mac_handle_beacon(ar, skb); if (ieee80211_is_beacon(hdr->frame_control) || ieee80211_is_probe_resp(hdr->frame_control)) status->boottime_ns = ktime_get_boottime_ns(); ath10k_dbg(ar, ATH10K_DBG_MGMT, "event mgmt rx skb %pK len %d ftype %02x stype %02x\n", skb, skb->len, fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE); ath10k_dbg(ar, ATH10K_DBG_MGMT, "event mgmt rx freq %d band %d snr %d, rate_idx %d\n", status->freq, status->band, status->signal, status->rate_idx); ieee80211_rx_ni(ar->hw, skb); return 0; }这个函数在做什么
最新发布
04-09
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值