}
-static void rx_data_process(struct wlantest *wt, const u8 *bssid,
+static void rx_data_process(struct wlantest *wt, struct wlantest_bss *bss,
+ const u8 *bssid,
const u8 *sta_addr,
const u8 *dst, const u8 *src,
const u8 *data, size_t len, int prot,
- const u8 *peer_addr)
+ const u8 *peer_addr, const u8 *qos)
{
if (len == 0)
return;
+ if (bss && bss->mesh && qos && !(qos[0] & BIT(7)) &&
+ (qos[1] & BIT(0))) {
+ u8 addr_ext_mode;
+ size_t mesh_control_len = 6;
+
+ /* Skip Mesh Control field if this is not an A-MSDU */
+ if (len < mesh_control_len) {
+ wpa_printf(MSG_DEBUG,
+ "Not enough room for Mesh Control field");
+ return;
+ }
+
+ addr_ext_mode = data[0] & 0x03;
+ if (addr_ext_mode == 3) {
+ wpa_printf(MSG_DEBUG,
+ "Reserved Mesh Control :: Address Extension Mode");
+ return;
+ }
+
+ mesh_control_len += addr_ext_mode * ETH_ALEN;
+ if (len < mesh_control_len) {
+ wpa_printf(MSG_DEBUG,
+ "Not enough room for Mesh Address Extension");
+ return;
+ }
+
+ len -= mesh_control_len;
+ data += mesh_control_len;
+ }
+
if (len >= 8 && os_memcmp(data, "\xaa\xaa\x03\x00\x00\x00", 6) == 0) {
rx_data_eth(wt, bssid, sta_addr, dst, src,
WPA_GET_BE16(data + 6), data + 8, len - 8, prot,
bss->gtk_len[keyid]);
add_note(wt, MSG_EXCESSIVE, "GTK[%d] %s", keyid, gtk);
process:
- rx_data_process(wt, bss->bssid, NULL, dst, src, decrypted,
- dlen, 1, NULL);
+ rx_data_process(wt, bss, bss->bssid, NULL, dst, src, decrypted,
+ dlen, 1, NULL, qos);
if (!replay)
os_memcpy(bss->rsc[keyid], pn, 6);
write_pcap_decrypted(wt, (const u8 *) hdr, hdrlen,
peer_addr = hdr->addr1;
if (!replay && rsc)
os_memcpy(rsc, pn, 6);
- rx_data_process(wt, bss->bssid, sta->addr, dst, src, decrypted,
- dlen, 1, peer_addr);
+ rx_data_process(wt, bss, bss->bssid, sta->addr, dst, src,
+ decrypted, dlen, 1, peer_addr, qos);
write_pcap_decrypted(wt, (const u8 *) hdr, hdrlen,
decrypted, dlen);
} else if (sta->tptk_set) {
}
}
- rx_data_process(wt, bssid, sta_addr, dst, src, data, len, 0,
- peer_addr);
+ rx_data_process(wt, bss, bssid, sta_addr, dst, src, data, len,
+ 0, peer_addr, qos);
}
}