diff options
author | Richard Sharpe <realrichardsharpe@gmail.com> | 2021-01-02 14:40:24 -0800 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-02-01 19:34:55 +0000 |
commit | fb2a0b4a71b134a2830e39b6493a4007818ceda6 (patch) | |
tree | bb0805ab62e16d0bbd63acb0c77f75102f26d92b /epan/dissectors/packet-ieee80211-radiotap.c | |
parent | fc5d8db628f20f63e8e8f6435384086424c15a28 (diff) |
ieee80211: Add support for S1G including PV1.
S1G adapters should be shipping soon since Silex America has a dev-kit
available, so it is about time to add support for this.
Change-Id: I0225d87f78efbcbe88476921d4fce3d56a3ce0cd
Diffstat (limited to 'epan/dissectors/packet-ieee80211-radiotap.c')
-rw-r--r-- | epan/dissectors/packet-ieee80211-radiotap.c | 1160 |
1 files changed, 1153 insertions, 7 deletions
diff --git a/epan/dissectors/packet-ieee80211-radiotap.c b/epan/dissectors/packet-ieee80211-radiotap.c index a6489b87f6..cc514f87ff 100644 --- a/epan/dissectors/packet-ieee80211-radiotap.c +++ b/epan/dissectors/packet-ieee80211-radiotap.c @@ -39,7 +39,6 @@ static int hf_radiotap_pad = -1; static int hf_radiotap_length = -1; static int hf_radiotap_present = -1; -static int hf_radiotap_tlv = -1; static int hf_radiotap_tlv_type = -1; static int hf_radiotap_tlv_datalen = -1; static int hf_radiotap_unknown_tlv_data = -1; @@ -48,6 +47,9 @@ static int hf_radiotap_mactime = -1; /* static int hf_radiotap_channel = -1; */ static int hf_radiotap_channel_frequency = -1; static int hf_radiotap_channel_flags = -1; +static int hf_radiotap_channel_flags_700mhz = -1; +static int hf_radiotap_channel_flags_800mhz = -1; +static int hf_radiotap_channel_flags_900mhz = -1; static int hf_radiotap_channel_flags_turbo = -1; static int hf_radiotap_channel_flags_cck = -1; static int hf_radiotap_channel_flags_ofdm = -1; @@ -363,6 +365,120 @@ static int hf_radiotap_l_sig_data_2 = -1; static int hf_radiotap_l_sig_rate = -1; static int hf_radiotap_l_sig_length = -1; +/* S1G */ +static int hf_radiotap_s1g_known = -1; +static int hf_radiotap_s1g_s1g_ppdu_format_known = -1; +static int hf_radiotap_s1g_response_indication_known = -1; +static int hf_radiotap_s1g_guard_interval_known = -1; +static int hf_radiotap_s1g_nss_known = -1; +static int hf_radiotap_s1g_bandwidth_known = -1; +static int hf_radiotap_s1g_mcs_known = -1; +static int hf_radiotap_s1g_color_known = -1; +static int hf_radiotap_s1g_uplink_indication_known = -1; +static int hf_radiotap_s1g_reserved_1 = -1; +static int hf_radiotap_s1g_data_1 = -1; +static int hf_radiotap_s1g_s1g_ppdu_format = -1; +static int hf_radiotap_s1g_response_indication = -1; +static int hf_radiotap_s1g_reserved_2 = -1; +static int hf_radiotap_s1g_guard_interval = -1; +static int hf_radiotap_s1g_nss = -1; +static int hf_radiotap_s1g_bandwidth = -1; +static int hf_radiotap_s1g_mcs = -1; +static int hf_radiotap_s1g_data_2 = -1; +static int hf_radiotap_s1g_color = -1; +static int hf_radiotap_s1g_uplink_indication = -1; +static int hf_radiotap_s1g_rssi = -1; +static int hf_radiotap_s1g_reserved_3 = -1; + +/* S1G NDP */ +static int hf_radiotap_s1g_ndp_bytes = -1; +static int hf_radiotap_s1g_ndp_ctrl = -1; +static int hf_radiotap_s1g_ndp_mgmt = -1; +static int hf_radiotap_s1g_ndp_type_3bit = -1; +static int hf_radiotap_s1g_ndp_ack_1m = -1; +static int hf_radiotap_s1g_ndp_ack_1m_ack_id = -1; +static int hf_radiotap_s1g_ndp_ack_1m_more_data = -1; +static int hf_radiotap_s1g_ndp_ack_1m_idle_indication = -1; +static int hf_radiotap_s1g_ndp_ack_1m_duration = -1; +static int hf_radiotap_s1g_ndp_ack_1m_relayed_frame = -1; +static int hf_radiotap_s1g_ndp_ack_2m = -1; +static int hf_radiotap_s1g_ndp_ack_2m_ack_id = -1; +static int hf_radiotap_s1g_ndp_ack_2m_more_data = -1; +static int hf_radiotap_s1g_ndp_ack_2m_idle_indication = -1; +static int hf_radiotap_s1g_ndp_ack_2m_duration = -1; +static int hf_radiotap_s1g_ndp_ack_2m_relayed_frame = -1; +static int hf_radiotap_s1g_ndp_ack_2m_reserved = -1; +static int hf_radiotap_s1g_ndp_cts_1m = -1; +static int hf_radiotap_s1g_ndp_cts_cf_end_indic = -1; +static int hf_radiotap_s1g_ndp_cts_address_indic = -1; +static int hf_radiotap_s1g_ndp_cts_ra_partial_bssid = -1; +static int hf_radiotap_s1g_ndp_cts_duration_1m = -1; +static int hf_radiotap_s1g_ndp_cts_duration_2m = -1; +static int hf_radiotap_s1g_ndp_cts_early_sector_indic_1m = -1; +static int hf_radiotap_s1g_ndp_cts_2m = -1; +static int hf_radiotap_s1g_ndp_cts_early_sector_indic_2m = -1; +static int hf_radiotap_s1g_ndp_cts_bandwidth_indic_2m = -1; +static int hf_radiotap_s1g_ndp_cts_reserved = -1; +static int hf_radiotap_s1g_ndp_cf_end_1m = -1; +static int hf_radiotap_s1g_ndp_cf_end_partial_bssid = -1; +static int hf_radiotap_s1g_ndp_cf_end_duration_1m = -1; +static int hf_radiotap_s1g_ndp_cf_end_reserved_1m = -1; +static int hf_radiotap_s1g_ndp_cf_end_2m = -1; +static int hf_radiotap_s1g_ndp_cf_end_duration_2m = -1; +static int hf_radiotap_s1g_ndp_cf_end_reserved_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_1m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ra = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ta = -1; +static int hf_radiotap_s1g_ndp_ps_poll_preferred_mcs_1m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_udi_1m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_preferred_mcs_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_udi_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_1m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_id = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_more_data = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_idle_indication = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_duration_1m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_reserved_1m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_id_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_more_data_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_idle_indication_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_duration_2m = -1; +static int hf_radiotap_s1g_ndp_ps_poll_ack_reserved_2m = -1; +static int hf_radiotap_s1g_ndp_block_ack_1m = -1; +static int hf_radiotap_s1g_ndp_block_ack_id_1m = -1; +static int hf_radiotap_s1g_ndp_block_ack_starting_sequence_control_1m = -1; +static int hf_radiotap_s1g_ndp_block_ack_bitmap_1m = -1; +static int hf_radiotap_s1g_ndp_block_ack_unused_1m = -1; +static int hf_radiotap_s1g_ndp_block_ack_2m = -1; +static int hf_radiotap_s1g_ndp_block_ack_id_2m = -1; +static int hf_radiotap_s1g_ndp_block_ack_starting_sequence_control_2m = -1; +static int hf_radiotap_s1g_ndp_block_ack_bitmap_2m = -1; +static int hf_radiotap_s1g_ndp_beamforming_report_poll = -1; +static int hf_radiotap_s1g_ndp_beamforming_ap_address = -1; +static int hf_radiotap_s1g_ndp_beamforming_non_ap_sta_address = -1; +static int hf_radiotap_s1g_ndp_beamforming_feedback_segment_bitmap = -1; +static int hf_radiotap_s1g_ndp_beamforming_reserved = -1; +static int hf_radiotap_s1g_ndp_paging_1m = -1; +static int hf_radiotap_s1g_ndp_paging_p_id = -1; +static int hf_radiotap_s1g_ndp_paging_apdi_partial_aid = -1; +static int hf_radiotap_s1g_ndp_paging_direction = -1; +static int hf_radiotap_s1g_ndp_paging_reserved_1m = -1; +static int hf_radiotap_s1g_ndp_paging_2m = -1; +static int hf_radiotap_s1g_ndp_paging_reserved_2m = -1; +static int hf_radiotap_s1g_ndp_probe_1m = -1; +static int hf_radiotap_s1g_ndp_probe_cssid_ano_present = -1; +static int hf_radiotap_s1g_ndp_probe_1m_cssid_ano = -1; +static int hf_radiotap_s1g_ndp_probe_1m_requested_response_type = -1; +static int hf_radiotap_s1g_ndp_probe_1m_reserved = -1; +static int hf_radiotap_s1g_ndp_probe_2m = -1; +static int hf_radiotap_s1g_ndp_probe_2m_cssid_ano = -1; +static int hf_radiotap_s1g_ndp_probe_2m_requested_response_type = -1; +static int hf_radiotap_s1g_ndp_1m_unused = -1; +static int hf_radiotap_s1g_ndp_2m_unused = -1; +static int hf_radiotap_s1g_ndp_bw = -1; + static gint ett_radiotap = -1; static gint ett_radiotap_tlv = -1; static gint ett_radiotap_present = -1; @@ -398,6 +514,23 @@ static gint ett_radiotap_l_sig = -1; static gint ett_radiotap_l_sig_data_1 = -1; static gint ett_radiotap_l_sig_data_2 = -1; static gint ett_radiotap_unknown_tlv = -1; +/* S1G */ +static gint ett_radiotap_s1g = -1; +static gint ett_radiotap_s1g_known = -1; +static gint ett_radiotap_s1g_data_1 = -1; +static gint ett_radiotap_s1g_data_2 = -1; + +/* S1G NDP */ +static gint ett_s1g_ndp = -1; +static gint ett_s1g_ndp_ack = -1; +static gint ett_s1g_ndp_cts = -1; +static gint ett_s1g_ndp_cf_end = -1; +static gint ett_s1g_ndp_ps_poll = -1; +static gint ett_s1g_ndp_ps_poll_ack = -1; +static gint ett_s1g_ndp_block_ack = -1; +static gint ett_s1g_ndp_beamforming_report_poll = -1; +static gint ett_s1g_ndp_paging = -1; +static gint ett_s1g_ndp_probe = -1; static expert_field ei_radiotap_invalid_header_length = EI_INIT; static expert_field ei_radiotap_data_past_header = EI_INIT; @@ -737,6 +870,72 @@ static const value_string timestamp_spos[] = { { 0, NULL } }; +/* S1G */ +static const value_string s1g_ppdu_format[] = { + { 0, "S1G 1M" }, + { 1, "S1G Short" }, + { 2, "S1G Long" }, + { 0, NULL}, +}; + +static const value_string s1g_response_indication[] = { + { 0, "No response" }, + { 1, "NDP response" }, + { 2, "Normal response" }, + { 3, "Long response" }, + { 0, NULL}, +}; + +static const value_string s1g_guard_interval[] = { + { 0, "Long GI" }, + { 1, "Short GI" }, + { 0, NULL}, +}; + +static const value_string s1g_nss[] = { + { 0, "1" }, + { 1, "2" }, + { 2, "3" }, + { 3, "4" }, + { 0, NULL}, +}; + +static const value_string s1g_bandwidth[] = { + { 0, "1MHz channel" }, + { 1, "2MHz channel" }, + { 2, "4MHz channel" }, + { 3, "8MHz channel" }, + { 4, "16MHz channel" }, + { 0, NULL}, +}; + +static const value_string s1g_mcs[] = { + { 0, "0" }, + { 1, "1" }, + { 2, "2" }, + { 3, "3" }, + { 4, "4" }, + { 5, "5" }, + { 6, "6" }, + { 7, "7" }, + { 8, "8" }, + { 9, "9" }, + { 10, "10" }, + { 0, NULL}, +}; + +static const value_string s1g_color[] = { + { 0, "0" }, + { 1, "1" }, + { 2, "2" }, + { 3, "3" }, + { 4, "4" }, + { 5, "5" }, + { 6, "6" }, + { 7, "7" }, + { 0, NULL}, +}; + /* * The NetBSD ieee80211_radiotap man page * (http://netbsd.gw.com/cgi-bin/man-cgi?ieee80211_radiotap+9+NetBSD-current) @@ -1363,6 +1562,11 @@ dissect_radiotap_he_mu_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t } else { flags1_headers[5] = &hf_radiotap_he_mu_chan1_rus_known; } + if (!mu_chan2_rus_known) { + flags1_headers[6] = &hf_radiotap_he_mu_chan2_rus_unknown; + } else { + flags1_headers[6] = &hf_radiotap_he_mu_chan2_rus_known; + } if (!mu_chan1_center_26_tone_ru_bit_known) { flags1_headers[8] = &hf_radiotap_he_mu_chan1_center_26_tone_ru_bit_unknown; } else { @@ -1517,17 +1721,23 @@ dissect_radiotap_he_mu_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t static const range_string zero_length_psdu_rsvals[] = { { 0, 0, "sounding PPDU" }, - { 1, 254, "reserved" }, + { 1, 1, "reserved" }, + { 2, 2, "S1G NDP CMAC frame" }, + { 3, 254, "reserved" }, { 255, 255, "vendor-specific" }, { 0, 0, NULL } }; +static int +dissect_s1g_ndp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree); + static void dissect_radiotap_0_length_psdu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, struct ieee_802_11_phdr *phdr) { proto_tree *zero_len_tree = NULL; guint32 psdu_type; + tvbuff_t *new_tvb = NULL; zero_len_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_radiotap_0_length_psdu, NULL, "0-length PSDU"); @@ -1546,6 +1756,13 @@ dissect_radiotap_0_length_psdu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree phdr->zero_length_psdu_type = PHDR_802_11_DATA_NOT_CAPTURED; break; + case 2: + phdr->has_zero_length_psdu_type = TRUE; + phdr->zero_length_psdu_type = PHDR_802_11_0_LENGTH_PSDU_S1G_NDP; + new_tvb = tvb_new_subset_length(tvb, offset, 6); + dissect_s1g_ndp(new_tvb, pinfo, zero_len_tree); + break; + case 0xff: phdr->has_zero_length_psdu_type = TRUE; phdr->zero_length_psdu_type = PHDR_802_11_0_LENGTH_PSDU_VENDOR_SPECIFIC; @@ -1585,6 +1802,427 @@ dissect_radiotap_l_sig(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, l_sig_data2_headers, ENC_LITTLE_ENDIAN); } +/* + * Dissect an S1G NDP as it is currently. This is a 6-byte field, with the + * first byte looking like the first byte of the FCF, and coded using + * reserved values for the subtype. The remaining bytes are the NDP data, + * with the last two bits distinguishing between 1M and 2M. + */ + +#define S1G_NDP_CTS_CF_END 0x00 +#define S1G_NDP_PS_POLL 0x01 +#define S1G_NDP_ACK 0x02 +#define S1G_NDP_PS_POLL_ACK 0x03 +#define S1G_NDP_BLOCK_ACK 0x04 +#define S1G_NDP_BEAMFORMING_REPORT_POLL 0x05 +#define S1G_NDP_PAGING 0x06 +#define S1G_NDP_PROBE_REQ 0x07 + +static int * const ndp_ack_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_ack_1m_ack_id, + &hf_radiotap_s1g_ndp_ack_1m_more_data, + &hf_radiotap_s1g_ndp_ack_1m_idle_indication, + &hf_radiotap_s1g_ndp_ack_1m_duration, + &hf_radiotap_s1g_ndp_ack_1m_relayed_frame, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_ack_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_ack_2m_ack_id, + &hf_radiotap_s1g_ndp_ack_2m_more_data, + &hf_radiotap_s1g_ndp_ack_2m_idle_indication, + &hf_radiotap_s1g_ndp_ack_2m_duration, + &hf_radiotap_s1g_ndp_ack_2m_relayed_frame, + &hf_radiotap_s1g_ndp_ack_2m_reserved, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_probe_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_probe_cssid_ano_present, + &hf_radiotap_s1g_ndp_probe_1m_cssid_ano, + &hf_radiotap_s1g_ndp_probe_1m_requested_response_type, + &hf_radiotap_s1g_ndp_probe_1m_reserved, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_probe_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_probe_cssid_ano_present, + &hf_radiotap_s1g_ndp_probe_2m_cssid_ano, + &hf_radiotap_s1g_ndp_probe_2m_requested_response_type, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_cts_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_cts_cf_end_indic, + &hf_radiotap_s1g_ndp_cts_address_indic, + &hf_radiotap_s1g_ndp_cts_ra_partial_bssid, + &hf_radiotap_s1g_ndp_cts_duration_1m, + &hf_radiotap_s1g_ndp_cts_early_sector_indic_1m, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_cts_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_cts_cf_end_indic, + &hf_radiotap_s1g_ndp_cts_address_indic, + &hf_radiotap_s1g_ndp_cts_ra_partial_bssid, + &hf_radiotap_s1g_ndp_cts_duration_2m, + &hf_radiotap_s1g_ndp_cts_early_sector_indic_2m, + &hf_radiotap_s1g_ndp_cts_bandwidth_indic_2m, + &hf_radiotap_s1g_ndp_cts_reserved, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_cf_end_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_cts_cf_end_indic, + &hf_radiotap_s1g_ndp_cf_end_partial_bssid, + &hf_radiotap_s1g_ndp_cf_end_duration_1m, + &hf_radiotap_s1g_ndp_cf_end_reserved_1m, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_cf_end_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_cts_cf_end_indic, + &hf_radiotap_s1g_ndp_cf_end_partial_bssid, + &hf_radiotap_s1g_ndp_cf_end_duration_2m, + &hf_radiotap_s1g_ndp_cf_end_reserved_2m, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_ps_poll_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_ps_poll_ra, + &hf_radiotap_s1g_ndp_ps_poll_ta, + &hf_radiotap_s1g_ndp_ps_poll_preferred_mcs_1m, + &hf_radiotap_s1g_ndp_ps_poll_udi_1m, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_ps_poll_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_ps_poll_ra, + &hf_radiotap_s1g_ndp_ps_poll_ta, + &hf_radiotap_s1g_ndp_ps_poll_preferred_mcs_2m, + &hf_radiotap_s1g_ndp_ps_poll_udi_2m, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_ps_poll_ack_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_ps_poll_ack_id, + &hf_radiotap_s1g_ndp_ps_poll_ack_more_data, + &hf_radiotap_s1g_ndp_ps_poll_ack_idle_indication, + &hf_radiotap_s1g_ndp_ps_poll_ack_duration_1m, + &hf_radiotap_s1g_ndp_ps_poll_ack_reserved_1m, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_ps_poll_ack_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_ps_poll_ack_id_2m, + &hf_radiotap_s1g_ndp_ps_poll_ack_more_data_2m, + &hf_radiotap_s1g_ndp_ps_poll_ack_idle_indication_2m, + &hf_radiotap_s1g_ndp_ps_poll_ack_duration_2m, + &hf_radiotap_s1g_ndp_ps_poll_ack_reserved_2m, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_block_ack_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_block_ack_id_1m, + &hf_radiotap_s1g_ndp_block_ack_starting_sequence_control_1m, + &hf_radiotap_s1g_ndp_block_ack_bitmap_1m, + &hf_radiotap_s1g_ndp_block_ack_unused_1m, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_block_ack_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_block_ack_id_2m, + &hf_radiotap_s1g_ndp_block_ack_starting_sequence_control_2m, + &hf_radiotap_s1g_ndp_block_ack_bitmap_2m, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_beamforming_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_beamforming_ap_address, + &hf_radiotap_s1g_ndp_beamforming_non_ap_sta_address, + &hf_radiotap_s1g_ndp_beamforming_feedback_segment_bitmap, + &hf_radiotap_s1g_ndp_beamforming_reserved, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_paging_1m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_paging_p_id, + &hf_radiotap_s1g_ndp_paging_apdi_partial_aid, + &hf_radiotap_s1g_ndp_paging_direction, + &hf_radiotap_s1g_ndp_paging_reserved_1m, + &hf_radiotap_s1g_ndp_1m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int * const ndp_paging_2m_headers[] = { + &hf_radiotap_s1g_ndp_type_3bit, + &hf_radiotap_s1g_ndp_paging_p_id, + &hf_radiotap_s1g_ndp_paging_apdi_partial_aid, + &hf_radiotap_s1g_ndp_paging_direction, + &hf_radiotap_s1g_ndp_paging_reserved_2m, + &hf_radiotap_s1g_ndp_2m_unused, + &hf_radiotap_s1g_ndp_bw, + NULL +}; + +static int +dissect_s1g_ndp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) +{ + proto_tree *ndp_tree = NULL; + proto_item *ndp_item = NULL; + int offset = 0; + guint8 ndp_type = tvb_get_guint8(tvb, 1); + guint8 ndp_bw = tvb_get_guint8(tvb, 5) >> 7; + + ndp_tree = proto_tree_add_subtree(tree, tvb, offset, 6, ett_s1g_ndp, + &ndp_item, "S1G NDP"); + + switch (ndp_type & 0x07) { + case S1G_NDP_PROBE_REQ: + proto_tree_add_item(ndp_tree, hf_radiotap_s1g_ndp_mgmt, tvb, offset, 1, + ENC_NA); + break; + + default: + proto_tree_add_item(ndp_tree, hf_radiotap_s1g_ndp_ctrl, tvb, offset, 1, + ENC_NA); + } + offset += 1; + + col_append_str(pinfo->cinfo, COL_INFO, ", S1G"); + + switch (ndp_type & 0x07) { + case S1G_NDP_CTS_CF_END: /* This uses an extra bit to distinguish */ + if (ndp_type & 0x8) { /* NDP CF-END */ + proto_item_append_text(ndp_item, " CF-End"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " CF-End 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_cf_end_1m, + ett_s1g_ndp_cf_end, ndp_cf_end_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " CF-End 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_cf_end_2m, + ett_s1g_ndp_cf_end, ndp_cf_end_2m_headers, + ENC_LITTLE_ENDIAN); + } + } else { /* NDP CTS */ + proto_item_append_text(ndp_item, " CTS"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " CTS 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_cts_1m, + ett_s1g_ndp_cts, ndp_cts_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " CTS 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_cts_2m, + ett_s1g_ndp_cts, ndp_cts_2m_headers, + ENC_LITTLE_ENDIAN); + } + } + break; + + case S1G_NDP_PS_POLL: + proto_item_append_text(ndp_item, " PS-Poll"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " PS-Poll 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_ps_poll_1m, + ett_s1g_ndp_ps_poll, ndp_ps_poll_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " PS-Poll 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_ps_poll_2m, + ett_s1g_ndp_ps_poll, ndp_ps_poll_2m_headers, + ENC_LITTLE_ENDIAN); + } + break; + + case S1G_NDP_ACK: + proto_item_append_text(ndp_item, " Ack"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " ACK 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_ack_1m, + ett_s1g_ndp_ack, ndp_ack_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " ACK 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_ack_2m, + ett_s1g_ndp_ack, ndp_ack_2m_headers, + ENC_LITTLE_ENDIAN); + } + break; + + case S1G_NDP_PS_POLL_ACK: + proto_item_append_text(ndp_item, " PS-Poll-Ack"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " PS-Poll-Ack 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_ps_poll_ack_1m, + ett_s1g_ndp_ps_poll_ack, ndp_ps_poll_ack_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " PS-Poll-Ack 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_ps_poll_ack_2m, + ett_s1g_ndp_ps_poll_ack, ndp_ps_poll_ack_2m_headers, + ENC_LITTLE_ENDIAN); + } + break; + + case S1G_NDP_BLOCK_ACK: + proto_item_append_text(ndp_item, " BlockAck"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " BlockAck 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_block_ack_1m, + ett_s1g_ndp_block_ack, ndp_block_ack_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " BlockAck 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_block_ack_2m, + ett_s1g_ndp_block_ack, ndp_block_ack_2m_headers, + ENC_LITTLE_ENDIAN); + } + break; + + case S1G_NDP_BEAMFORMING_REPORT_POLL: + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_beamforming_report_poll, + ett_s1g_ndp_beamforming_report_poll, ndp_beamforming_headers, + ENC_LITTLE_ENDIAN); + break; + + case S1G_NDP_PAGING: + proto_item_append_text(ndp_item, " NDP Paging"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " NDP Paging 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_paging_1m, + ett_s1g_ndp_paging, ndp_paging_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " NDP Paging 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_paging_2m, + ett_s1g_ndp_paging, ndp_paging_2m_headers, + ENC_LITTLE_ENDIAN); + } + break; + + case S1G_NDP_PROBE_REQ: + proto_item_append_text(ndp_item, " Probe Request"); + if (ndp_bw == 0) { + col_append_str(pinfo->cinfo, COL_INFO, " Probe Request 1MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_probe_1m, + ett_s1g_ndp_probe, ndp_probe_1m_headers, + ENC_LITTLE_ENDIAN); + } else { + col_append_str(pinfo->cinfo, COL_INFO, " Probe Request 2MHz"); + proto_tree_add_bitmask(ndp_tree, tvb, offset, + hf_radiotap_s1g_ndp_probe_2m, + ett_s1g_ndp_probe, ndp_probe_2m_headers, + ENC_LITTLE_ENDIAN); + } + break; + default: + proto_item_append_text(ndp_item, ", Unknown NDP type"); + col_append_str(pinfo->cinfo, COL_INFO, " Unknown NDP type"); + proto_tree_add_item(ndp_tree, hf_radiotap_s1g_ndp_bytes, tvb, offset, + 5, ENC_NA); + } + + offset += 6; + return tvb_captured_length(tvb); +} + +static int * const s1g_known_headers[] = { + &hf_radiotap_s1g_s1g_ppdu_format_known, + &hf_radiotap_s1g_response_indication_known, + &hf_radiotap_s1g_guard_interval_known, + &hf_radiotap_s1g_nss_known, + &hf_radiotap_s1g_bandwidth_known, + &hf_radiotap_s1g_mcs_known, + &hf_radiotap_s1g_color_known, + &hf_radiotap_s1g_uplink_indication_known, + &hf_radiotap_s1g_reserved_1, + NULL +}; + +static int * const s1g_data1_headers[] = { + &hf_radiotap_s1g_s1g_ppdu_format, + &hf_radiotap_s1g_response_indication, + &hf_radiotap_s1g_reserved_2, + &hf_radiotap_s1g_guard_interval, + &hf_radiotap_s1g_nss, + &hf_radiotap_s1g_bandwidth, + &hf_radiotap_s1g_mcs, + NULL +}; + +static int * const s1g_data2_headers[] = { + &hf_radiotap_s1g_color, + &hf_radiotap_s1g_uplink_indication, + &hf_radiotap_s1g_reserved_3, + &hf_radiotap_s1g_rssi, + NULL +}; + static void dissect_radiotap_tlv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, struct ieee_802_11_phdr *phdr _U_) @@ -1592,9 +2230,29 @@ dissect_radiotap_tlv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint16 type = tvb_get_letohs(tvb, offset); guint16 length = tvb_get_letohs(tvb, offset + 2); proto_tree *unknown_tlv = NULL; + proto_tree *s1g_tree = NULL; /* Insert code here to call the dissector for your TLV type */ switch (type) { + case IEEE80211_RADIOTAP_TLV_S1G: + phdr->phy = PHDR_802_11_PHY_11AH; + s1g_tree = proto_tree_add_subtree(tree, tvb, offset, 6, + ett_radiotap_s1g, NULL, "S1G"); + + proto_tree_add_bitmask(s1g_tree, tvb, offset, + hf_radiotap_s1g_known, ett_radiotap_s1g_known, + s1g_known_headers, ENC_LITTLE_ENDIAN); + offset += 2; + + proto_tree_add_bitmask(s1g_tree, tvb, offset, + hf_radiotap_s1g_data_1, ett_radiotap_s1g_data_1, + s1g_data1_headers, ENC_LITTLE_ENDIAN); + offset += 2; + + proto_tree_add_bitmask(s1g_tree, tvb, offset, + hf_radiotap_s1g_data_2, ett_radiotap_s1g_data_2, + s1g_data2_headers, ENC_LITTLE_ENDIAN); + break; default: unknown_tlv = proto_tree_add_subtree(tree, tvb, offset, @@ -1822,6 +2480,9 @@ dissect_radiotap_channel(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree if (tree) { gchar *chan_str; static int * const channel_flags[] = { + &hf_radiotap_channel_flags_700mhz, + &hf_radiotap_channel_flags_800mhz, + &hf_radiotap_channel_flags_900mhz, &hf_radiotap_channel_flags_turbo, &hf_radiotap_channel_flags_cck, &hf_radiotap_channel_flags_ofdm, @@ -3136,11 +3797,6 @@ void proto_register_radiotap(void) FT_UINT32, BASE_HEX, NULL, 0x0, "Word from present flags bitmask", HFILL}}, - {&hf_radiotap_tlv, - {"TLV", "radiotap.tlv", - FT_BYTES, BASE_NONE, NULL, 0x0, - NULL, HFILL}}, - {&hf_radiotap_tlv_type, {"TLV type", "radiotap.tlv.type", FT_UINT32, BASE_DEC, NULL, 0x0, @@ -3393,6 +4049,18 @@ void proto_register_radiotap(void) {"Turbo", "radiotap.channel.flags.turbo", FT_BOOLEAN, 16, NULL, 0x0010, "Channel Flags Turbo", HFILL}}, + {&hf_radiotap_channel_flags_700mhz, + {"700 MHz spectrum", "radiotap.channel.flags.700mhz", + FT_BOOLEAN, 16, NULL, 0x0001, "Channel Flags Turbo", HFILL}}, + + {&hf_radiotap_channel_flags_800mhz, + {"800 MHz spectrum", "radiotap.channel.flags.800mhz", + FT_BOOLEAN, 16, NULL, 0x0002, "Channel Flags Turbo", HFILL}}, + + {&hf_radiotap_channel_flags_900mhz, + {"900 MHz spectrum", "radiotap.channel.flags.900mhz", + FT_BOOLEAN, 16, NULL, 0x0004, "Channel Flags Turbo", HFILL}}, + {&hf_radiotap_channel_flags_cck, {"Complementary Code Keying (CCK)", "radiotap.channel.flags.cck", FT_BOOLEAN, 16, NULL, 0x0020, @@ -4785,6 +5453,470 @@ void proto_register_radiotap(void) {"length", "radiotap.l_sig.length", FT_UINT16, BASE_DEC, NULL, IEEE80211_RADIOTAP_L_SIG_LENGTH_MASK, NULL, HFILL}}, + + {&hf_radiotap_s1g_known, + {"Known", "radiotap.s1g.known", + FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}}, + + {&hf_radiotap_s1g_s1g_ppdu_format_known, + {"S1G PPDU Format Known", "radiotap.s1g.s1g_ppdu_format_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_S1G_PPDU_FORMAT_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_response_indication_known, + {"Response Indication Known", "radiotap.s1g.response_indication_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_RESPONSE_INDICATION_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_guard_interval_known, + {"Guard Interval Known", "radiotap.s1g.guard_interval_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_GUARD_INTERVAL_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_nss_known, + {"NSS Known", "radiotap.s1g.nss_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_NSS_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_bandwidth_known, + {"Bandwidth Known", "radiotap.s1g.bandwidth_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_BANDWIDTH_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_mcs_known, + {"MCS Known", "radiotap.s1g.mcs_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_MCS_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_color_known, + {"Color Known", "radiotap.s1g.color_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_COLOR_KNOWN, NULL, HFILL}}, + + {&hf_radiotap_s1g_uplink_indication_known, + {"Uplink Indication Known", + "radiotap.s1g.uplink_indication_known", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_UPLINK_INDICATION_KNOWN, + NULL, HFILL}}, + + {&hf_radiotap_s1g_reserved_1, + {"Reserved 1", "radiotap.s1g.reserved_1", + FT_UINT16, BASE_HEX, NULL, + IEEE80211_RADIOTAP_TLV_S1G_RESERVED_1, NULL, HFILL}}, + + {&hf_radiotap_s1g_data_1, + {"Data1", "radiotap.s1g.data_1", + FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}}, + + {&hf_radiotap_s1g_s1g_ppdu_format, + {"S1G PPDU Format", "radiotap.s1g.s1g_ppdu_format", + FT_UINT16, BASE_DEC, VALS(s1g_ppdu_format), + IEEE80211_RADIOTAP_TLV_S1G_S1G_PPDU_FORMAT, NULL, HFILL}}, + + {&hf_radiotap_s1g_response_indication, + {"Response Indication", "radiotap.s1g.response_indication", + FT_UINT16, BASE_DEC, VALS(s1g_response_indication), + IEEE80211_RADIOTAP_TLV_S1G_RESPONSE_INDICATION, NULL, HFILL}}, + + {&hf_radiotap_s1g_reserved_2, + {"Reserved 2", "radiotap.s1g.reserved_2", + FT_UINT16, BASE_HEX, NULL, + IEEE80211_RADIOTAP_TLV_S1G_RESERVED_2, NULL, HFILL}}, + + {&hf_radiotap_s1g_guard_interval, + {"Guard Interval", "radiotap.s1g.guard_interval", + FT_UINT16, BASE_DEC, VALS(s1g_guard_interval), + IEEE80211_RADIOTAP_TLV_S1G_GUARD_INTERVAL, NULL, HFILL}}, + + {&hf_radiotap_s1g_nss, + {"NSS", "radiotap.s1g.nss", + FT_UINT16, BASE_DEC, VALS(s1g_nss), + IEEE80211_RADIOTAP_TLV_S1G_NSS, NULL, HFILL}}, + + {&hf_radiotap_s1g_bandwidth, + {"Bandwidth", "radiotap.s1g.bandwidth", + FT_UINT16, BASE_DEC, VALS(s1g_bandwidth), + IEEE80211_RADIOTAP_TLV_S1G_BANDWIDTH, NULL, HFILL}}, + + {&hf_radiotap_s1g_mcs, + {"MCS", "radiotap.s1g.mcs", + FT_UINT16, BASE_DEC, VALS(s1g_mcs), + IEEE80211_RADIOTAP_TLV_S1G_MCS, NULL, HFILL}}, + + {&hf_radiotap_s1g_data_2, + {"Data2", "radiotap.s1g.data_2", + FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}}, + + {&hf_radiotap_s1g_color, + {"Color", "radiotap.s1g.color", + FT_UINT16, BASE_DEC, VALS(s1g_color), + IEEE80211_RADIOTAP_TLV_S1G_COLOR, NULL, HFILL}}, + + {&hf_radiotap_s1g_uplink_indication, + {"Uplink Indication", "radiotap.s1g.uplink_indication", + FT_BOOLEAN, 16, NULL, + IEEE80211_RADIOTAP_TLV_S1G_UPLINK_INDICATION, NULL, HFILL}}, + + {&hf_radiotap_s1g_reserved_3, + {"Reserved 3", "radiotap.s1g.reserved_3", + FT_UINT16, BASE_HEX, NULL, + IEEE80211_RADIOTAP_TLV_S1G_RESERVED_3, NULL, HFILL}}, + + {&hf_radiotap_s1g_rssi, + {"RSSI", "radiotap.s1g.rssi", + FT_INT16, BASE_DEC, NULL, + IEEE80211_RADIOTAP_TLV_S1G_RSSI, NULL, HFILL}}, + + {&hf_radiotap_s1g_ndp_bytes, + {"NDP Bytes", "radiotap.s1g.ndp.bytes", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ctrl, + {"NDP Control", "radiotap.s1g.ndp.control", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_mgmt, + {"NDP Management", "radiotap.s1g.ndp.management", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_type_3bit, + {"NDP Type", "radiotap.s1g.ndp.type", + FT_UINT40, BASE_HEX, NULL, 0x0000000007, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_1m, + {"NDP Ack 1MHz", "radiotap.s1g.ndp.ack_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_1m_ack_id, + {"ACK Id", "radiotap.s1g.ndp.ack.ack_id", + FT_UINT40, BASE_HEX, NULL, 0x0000000FF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_1m_more_data, + {"More Data", "radiotap.s1g.ndp.ack.more_data", + FT_BOOLEAN, 40, NULL, 0x0000001000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_1m_idle_indication, + {"Idle Indication", "radiotap.s1g.ndp.ack.idle_indication", + FT_BOOLEAN, 40, NULL, 0x0000002000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_1m_duration, + {"Duration", "radiotap.s1g.ndp.ack.duration", + FT_UINT40, BASE_DEC, NULL, 0x0000FFC000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_1m_relayed_frame, + {"Relayed Frame", "radiotap.s1g.ndp.ack.relayed_frame", + FT_BOOLEAN, 40, NULL, 0x0001000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m, + {"NDP Ack 2MHz", "radiotap.s1g.ndp.ack_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m_ack_id, + {"ACK Id", "radiotap.s1g.ndp.ack.ack_id", + FT_UINT40, BASE_HEX, NULL, 0x000007FFF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m_more_data, + {"More Data", "radiotap.s1g.ndp.ack.more_data", + FT_BOOLEAN, 40, NULL, 0x0000080000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m_idle_indication, + {"Idle Indication", "radiotap.s1g.ndp.ack.idle_indication", + FT_BOOLEAN, 40, NULL, 0x0000100000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m_duration, + {"Duration", "radiotap.s1g.ndp.ack.duration", + FT_UINT40, BASE_DEC, NULL, 0x07FFE00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m_relayed_frame, + {"Relayed Frame", "radiotap.s1g.ndp.ack.relayed_frame", + FT_BOOLEAN, 40, NULL, 0x0800000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ack_2m_reserved, + {"Reserved", "radiotap.s1g.ndp.ack.reserved", + FT_UINT40, BASE_HEX, NULL, 0x1000000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_1m, + {"NDP CTS 1MHz", "radiotap.s1g.ndp.cts_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_cf_end_indic, + {"NDP CTS/CF_End Indicator", "radiotap.s1g.ndp.cts_cf_end_indic", + FT_BOOLEAN, 40, NULL, 0x0000000008, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_address_indic, + {"Address Indicator", "radiotap.s1g.ndp.cts.address_indic", + FT_BOOLEAN, 40, NULL, 0x0000000010, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_ra_partial_bssid, + {"RA/Partial BSSID", "radiotap.s1g.ndp.cts.ra_partial_bssid", + FT_UINT40, BASE_HEX, NULL, 0x0000003FE0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_duration_1m, + {"Duration", "radiotap.s1g.ndp.cts.duration_1m", + FT_UINT40, BASE_DEC, NULL, 0x0000FFC000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_early_sector_indic_1m, + {"Early Sector Indicator", "radiotap.s1g.ndp.cts.early_sector_indic_1m", + FT_BOOLEAN, 40, NULL, 0x0001000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_2m, + {"NDP CTS 2MHz", "radiotap.s1g.ndp.cts_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_duration_2m, + {"Duration", "radiotap.s1g.ndp.cts.duration_2m", + FT_UINT40, BASE_DEC, NULL, 0x001FFFC000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_early_sector_indic_2m, + {"Early Sector Indicator", "radiotap.s1g.ndp.cts.early_sector_indic_2m", + FT_BOOLEAN, 40, NULL, 0x020000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_bandwidth_indic_2m, + {"Address Indicator", "radiotap.s1g.ndp.cts.address_indic", + FT_UINT40, BASE_DEC, NULL, 0x01C0000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cts_reserved, + {"Reserved", "radiotap.s1g.ndp.cts.reserved", + FT_UINT40, BASE_HEX, NULL, 0x1E00000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_1m, + {"NDP CF-End 1MHz", "radiotap.s1g.ndp.cf_end_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_partial_bssid, + {"Patrtial BSSID (TA)", "radiotap.s1g.ndp.cf_end.partial_bssid", + FT_UINT40, BASE_HEX, NULL, 0x0000001FF0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_duration_1m, + {"Duration", "radiotap.s1g.ndp.cf_end.duration_1m", + FT_UINT40, BASE_HEX, NULL, 0x00007FE000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_reserved_1m, + {"Reserved", "radiotap.s1g.ndp.cf_end.reserved_1m", + FT_UINT40, BASE_HEX, NULL, 0x0001800000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_2m, + {"NDP CF-End 2MHz", "radiotap.s1g.ndp.cf_end_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_duration_2m, + {"Duration", "radiotap.s1g.ndp.cf_end.duration_2m", + FT_UINT40, BASE_HEX, NULL, 0x000FFFE000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_cf_end_reserved_2m, + {"Reserved", "radiotap.s1g.ndp.cf_end.reserved_2m", + FT_UINT40, BASE_HEX, NULL, 0x1FF0000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_1m, + {"NDP PS-Poll 1MHz", "radiotap.s1g.ndp.ps_poll_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ra, + {"RA", "radiotap.s1g.ndp.ps_poll.ra", + FT_UINT40, BASE_HEX, NULL, 0x0000000FF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ta, + {"TA", "radiotap.s1g.ndp.ps_poll.ta", + FT_UINT40, BASE_HEX, NULL, 0x00001FF000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_preferred_mcs_1m, + {"Preferred MCS", "radiotap.s1g.ndp.ps_poll.preferred_mcs", + FT_UINT40, BASE_HEX, NULL, 0x0000E00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_udi_1m, + {"UDI", "radiotap.s1g.ndp.ps_poll.udi", + FT_UINT40, BASE_HEX, NULL, 0x0001000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_2m, + {"NDP PS-Poll 2MHz", "radiotap.s1g.ndp.ps_poll_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_preferred_mcs_2m, + {"Preferred MCS", "radiotap.s1g.ndp.ps_poll.preferred_mcs", + FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_udi_2m, + {"UDI", "radiotap.s1g.ndp.ps_poll.udi", + FT_UINT40, BASE_HEX, NULL, 0x1FFE00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_1m, + {"NDP PS-Poll-Ack 1MHz", "radiotap.s1g.ndp.ndp_ps_poll_ack_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_id, + {"Ack ID", "radiotap.s1g.ndp.ps_poll.ack_id", + FT_UINT40, BASE_HEX, NULL, 0x0000000FF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_more_data, + {"More Data", "radiotap.s1g.ndp.ps_poll.more_data", + FT_BOOLEAN, 40, NULL, 0x0000001000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_idle_indication, + {"Idle Indication", "radiotap.s1g.ndp.ps_poll.idle_indication", + FT_BOOLEAN, 40, NULL, 0x0000002000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_duration_1m, + {"Duration", "radiotap.s1g.ndp.ps_poll.duration", + FT_UINT40, BASE_HEX, NULL, 0x0000FFC000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_reserved_1m, + {"Reserved", "radiotap.s1g.ndp.ps_poll.reserved_1m", + FT_UINT40, BASE_HEX, NULL, 0x0001000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_2m, + {"NDP PS-Poll-Ack 2MHz", "radiotap.s1g.ndp.ndp_ps_poll_ack_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_id_2m, + {"Ack ID", "radiotap.s1g.ndp.ps_poll.ack_id", + FT_UINT40, BASE_HEX, NULL, 0x000007FFF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_more_data_2m, + {"More Data", "radiotap.s1g.ndp.ps_poll.more_data", + FT_BOOLEAN, 40, NULL, 0x0000080000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_idle_indication_2m, + {"Idle Indication", "radiotap.s1g.ndp.ps_poll.idle_indication", + FT_BOOLEAN, 40, NULL, 0x0000100000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_duration_2m, + {"Duration", "radiotap.s1g.ndp.ps_poll.duration", + FT_UINT40, BASE_HEX, NULL, 0x07FFE00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_ps_poll_ack_reserved_2m, + {"Reserved", "radiotap.s1g.ndp.ps_poll.reserved", + FT_UINT40, BASE_HEX, NULL, 0x1800000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_1m, + {"NDP Block Ack 1MHz", "radiotap.s1g.ndp.block_ack_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_id_1m, + {"BlockAck ID", "radiotap.s1g.ndp.block_ack.blockack_id", + FT_UINT40, BASE_HEX, NULL, 0x0000000018, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_starting_sequence_control_1m, + {"Starting Sequence Control", "radiotap.s1g.ndp.ps_poll.starting_sequence_control", + FT_UINT40, BASE_HEX, NULL, 0x000001FFE0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_bitmap_1m, + {"Block Ack Bitmap", "radiotap.s1g.ndp.ps_poll.block_ack_bitmap", + FT_UINT40, BASE_HEX, NULL, 0x001FFE0000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_unused_1m, + {"Unused", "radiotap.s1g.ndp.ps_poll.block_ack_unused", + FT_UINT40, BASE_HEX, NULL, 0x3FE0000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_2m, + {"NDP Block Ack 2MHz", "radiotap.s1g.ndp.block_ack_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_id_2m, + {"BlockAck ID", "radiotap.s1g.ndp.ps_poll.blockack_id", + FT_UINT40, BASE_HEX, NULL, 0x00000001F8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_starting_sequence_control_2m, + {"Starting Sequence Control", "radiotap.s1g.ndp.ps_poll.starting_sequence_control", + FT_UINT40, BASE_HEX, NULL, 0x00001FFE00, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_block_ack_bitmap_2m, + {"Block Ack Bitmap", "radiotap.s1g.ndp.ps_poll.block_ack_bitmap", + FT_UINT40, BASE_HEX, NULL, 0x1FFFE00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_beamforming_report_poll, + {"Beamforming Report Poll", "radiotap.s1g.ndp.beamforming_report_poll", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_beamforming_ap_address, + {"AP Address", "radiotap.s1g.ndp.beamforming_report_poll.ap_address", + FT_UINT40, BASE_HEX, NULL, 0x0000000FF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_beamforming_non_ap_sta_address, + {"Non-AP STA Address", "radiotap.s1g.ndp.beamforming_report_poll.non_ap_sta_address", + FT_UINT40, BASE_HEX, NULL, 0x0001FFF000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_beamforming_feedback_segment_bitmap, + {"Retransmission Segment Retransmission Bitmap", + "radiotap.s1g.ndp.beamforming_report_poll.feedback_segment_retransmission_bitmap", + FT_UINT40, BASE_HEX, NULL, 0x01FE000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_beamforming_reserved, + {"Reserved", "radiotap.s1g.ndp.beamforming_report_poll.reserved", + FT_UINT40, BASE_HEX, NULL, 0x1E00000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_1m, + {"NDP Paging 1MHz", "radiotap.s1g.ndp.ndp_paging_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_p_id, + {"P-ID", "radiotap.s1g.ndp.ndp_paging.p_id", + FT_BOOLEAN, 40, NULL, 0x0000000FF8, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_apdi_partial_aid, + {"APDI/Partial AID", "radiotap.s1g.ndp.ndp_paging.apdi_partial_aid", + FT_BOOLEAN, 40, NULL, 0x00001FF000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_direction, + {"Direction", "radiotap.s1g.ndp.ndp_paging.direction", + FT_BOOLEAN, 40, NULL, 0x0000200000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_reserved_1m, + {"Reserved", "radiotap.s1g.ndp.ndp_paging.reserved", + FT_BOOLEAN, 40, NULL, 0x0001C00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_2m, + {"NDP Paging 2MHz", "radiotap.s1g.ndp.ndp_paging_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_paging_reserved_2m, + {"Reserved", "radiotap.s1g.ndp.reserved", + FT_BOOLEAN, 40, NULL, 0x1FFFC00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_1m, + {"NDP Probe 1MHz", "radiotap.s1g.ndp.ndp_probe_1m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_cssid_ano_present, + {"CSSID/ANO Present", "radiotap.s1g.ndp.ndp_probe.cssid_ano_present", + FT_BOOLEAN, 40, NULL, 0x0000000008, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_1m_cssid_ano, + {"Compressed SSID/ANO", "radiotap.s1g.ndp.ndp_probe.compressed_ssid_ano", + FT_UINT40, BASE_HEX, NULL, 0x00000FFFF0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_1m_requested_response_type, + {"Requested Response Type", "radiotap.s1g.ndp.ndp_probe.requested_response_type_1m", + FT_UINT40, BASE_HEX, NULL, 0x0000100000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_1m_reserved, + {"Reserved", "radiotap.s1g.ndp.probe_1m.ndp_probe.reserved", + FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_2m, + {"NDP Probe 2MHz", "radiotap.s1g.ndp.probe_2m", + FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_2m_cssid_ano, + {"Compressed SSID/ANO", "radiotap.s1g.ndp.ndp_probe.compressed_ssid_ano", + FT_UINT40, BASE_HEX, NULL, 0x0FFFFFFFF0, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_probe_2m_requested_response_type, + {"Requested Response Type", "radiotap.s1g.ndp.ndp_probe.requested_response_type_2m", + FT_UINT40, BASE_HEX, NULL, 0x1000000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_1m_unused, + {"Unused", "radiotap.s1g.ndp.ack.1m_unused", + FT_UINT40, BASE_HEX, NULL, 0x3FFE000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_2m_unused, + {"Unused", "radiotap.s1g.ndp.ack.2m_unused", + FT_UINT40, BASE_HEX, NULL, 0x2000000000, NULL, HFILL }}, + + {&hf_radiotap_s1g_ndp_bw, + {"NDP BW", "radiotap.s1g.ndp.bw", + FT_UINT40, BASE_HEX, NULL, 0xC000000000, NULL, HFILL }}, + }; static gint *ett[] = { &ett_radiotap, @@ -4821,6 +5953,20 @@ void proto_register_radiotap(void) &ett_radiotap_l_sig, &ett_radiotap_l_sig_data_1, &ett_radiotap_l_sig_data_2, + &ett_radiotap_s1g, + &ett_radiotap_s1g_known, + &ett_radiotap_s1g_data_1, + &ett_radiotap_s1g_data_2, + &ett_s1g_ndp, + &ett_s1g_ndp_ack, + &ett_s1g_ndp_cts, + &ett_s1g_ndp_cf_end, + &ett_s1g_ndp_ps_poll, + &ett_s1g_ndp_ps_poll_ack, + &ett_s1g_ndp_block_ack, + &ett_s1g_ndp_beamforming_report_poll, + &ett_s1g_ndp_paging, + &ett_s1g_ndp_probe, &ett_radiotap_unknown_tlv, }; static ei_register_info ei[] = { |