diff options
author | Martin Mathieson <martin.r.mathieson@googlemail.com> | 2013-08-10 20:57:46 +0000 |
---|---|---|
committer | Martin Mathieson <martin.r.mathieson@googlemail.com> | 2013-08-10 20:57:46 +0000 |
commit | 1abc2eb1911cad8590420d76baa3c51849aa4303 (patch) | |
tree | 7cc86293daf30939623409e4dda2ab9cb393332f /epan/dissectors/packet-ixveriwave.c | |
parent | c6669a3c63315725ddcd5941ec83d471f9a93595 (diff) |
IxVeriwave 11ac patch (bug 8912) from Tom Cook.
This was the 4th patch, but also:
- use gmalloc0() to allocate vwr struct. Otherwise, valgrind says that
many of fields were still uninitialised when parse_s1_W_stats later
read them
- whitespace tidyup, got rid of remaining tabs and trailing whitespace
Did a fair bit of fuzz-testing without seeing any problems.
svn path=/trunk/; revision=51248
Diffstat (limited to 'epan/dissectors/packet-ixveriwave.c')
-rw-r--r-- | epan/dissectors/packet-ixveriwave.c | 1322 |
1 files changed, 628 insertions, 694 deletions
diff --git a/epan/dissectors/packet-ixveriwave.c b/epan/dissectors/packet-ixveriwave.c index 7084623ae6..37b36230d7 100644 --- a/epan/dissectors/packet-ixveriwave.c +++ b/epan/dissectors/packet-ixveriwave.c @@ -77,27 +77,42 @@ static frame_end_data previous_frame_data = {0,0}; #define IEEE80211_RADIOTAP_F_FCS 0x0010 /* frame includes FCS */ #define IEEE80211_RADIOTAP_F_DATAPAD 0x0020 /* frame has padding between - * 802.11 header and payload - * (to 32-bit boundary) - */ + * 802.11 header and payload + * (to 32-bit boundary) + */ #define IEEE80211_RADIOTAP_F_HT 0x0040 /* HT mode */ +#define IEEE80211_RADIOTAP_F_VHT 0x0080 /* VHT mode */ #define IEEE80211_RADIOTAP_F_CFP 0x0001 /* sent/received - * during CFP - */ + * during CFP + */ #define IEEE80211_RADIOTAP_F_SHORTPRE 0x0002 /* sent/received - * with short - * preamble - */ + * with short + * preamble + */ #define IEEE80211_RADIOTAP_F_WEP 0x0004 /* sent/received - * with WEP encryption - */ + * with WEP encryption + */ #define IEEE80211_RADIOTAP_F_FRAG 0x0008 /* sent/received - * with fragmentation - */ + * with fragmentation + */ #define IEEE80211_PLCP_RATE_MASK 0x7f /* parses out the rate or MCS index from the PLCP header(s) */ -#define IEEE80211_RADIOTAP_F_40MHZ 0x0080 /* 40 Mhz channel bandwidth */ +#define IEEE80211_RADIOTAP_F_40MHZ 0x0200 /* 40 Mhz channel bandwidth */ +#define IEEE80211_RADIOTAP_F_80MHZ 0x0400 /* 80 Mhz channel bandwidth */ +#define IEEE80211_RADIOTAP_F_160MHZ 0x0800 /* 80 Mhz channel bandwidth */ #define IEEE80211_RADIOTAP_F_SHORTGI 0x0100 +/* For RADIOTAP_FLAGS */ +#define RADIOTAP_F_CFP 0x001 /* sent/received during CFP */ +#define RADIOTAP_F_SHORTPRE 0x002 /* sent/received with short preamble */ +#define RADIOTAP_F_WEP 0x004 /* sent/received with WEP encryption */ +#define RADIOTAP_F_FRAG 0x008 /* sent/received with fragmentation */ +#define RADIOTAP_F_FCS 0x010 /* frame includes FCS */ +#define RADIOTAP_F_DATAPAD 0x020 /* padding between 802.11 hdr & payload */ +#define RADIOTAP_F_CHAN_HT 0x040 /* In HT mode */ +#define RADIOTAP_F_CHAN_40MHZ 0x080 /* 40 Mhz CBW */ +#define RADIOTAP_F_CHAN_80MHZ 0x100 /* 80 Mhz CBW */ +#define RADIOTAP_F_CHAN_SHORTGI 0x200 /* Short guard interval */ + #define ETHERNET_PORT 1 #define WLAN_PORT 0 @@ -149,7 +164,6 @@ static int hf_ixveriwave_vw_l4id = -1; /*veriwave note: i know the below method seems clunky, but they didn't have a item_format at the time to dynamically add the appropriate decode text*/ static int hf_ixveriwave_vw_info_retryCount = -1; -/* static int hf_ixveriwave_vw_info_tx_bit15 = -1; */ static int hf_ixveriwave_vw_info_rx_1_bit8 = -1; static int hf_ixveriwave_vw_info_rx_1_bit9 = -1; @@ -174,9 +188,13 @@ static int hf_ixveriwave_vw_error_rx_1_bit9 = -1; static int hf_radiotap_flags = -1; static int hf_radiotap_datarate = -1; +static int hf_radiotap_mcsindex = -1; +static int hf_radiotap_nss = -1; static int hf_radiotap_dbm_antsignal = -1; -static int hf_radiotap_txpower = -1; -/* static int hf_radiotap_fcs_bad = -1; */ +static int hf_radiotap_dbm_antb = -1; +static int hf_radiotap_dbm_antc = -1; +static int hf_radiotap_dbm_antd = -1; +static int hf_radiotap_fcs_bad = -1; static int hf_radiotap_flags_cfp = -1; static int hf_radiotap_flags_preamble = -1; @@ -185,7 +203,9 @@ static int hf_radiotap_flags_frag = -1; static int hf_radiotap_flags_fcs = -1; static int hf_radiotap_flags_datapad = -1; static int hf_radiotap_flags_ht = -1; +static int hf_radiotap_flags_vht = -1; static int hf_radiotap_flags_40mhz = -1; +static int hf_radiotap_flags_80mhz = -1; static int hf_radiotap_flags_shortgi = -1; /* start VeriWave specific 6-2007*/ @@ -209,25 +229,6 @@ static int hf_radiotap_vw_info_rx_2_bit13 = -1; static int hf_radiotap_vw_info_rx_2_bit14 = -1; static int hf_radiotap_vw_info_rx_2_bit15 = -1; -#if 0 -static int hf_radiotap_vw_errors_rx_1_bit0 = -1; -static int hf_radiotap_vw_errors_rx_1_bit1 = -1; -static int hf_radiotap_vw_errors_rx_1_bit2 = -1; -static int hf_radiotap_vw_errors_rx_1_bit3 = -1; -static int hf_radiotap_vw_errors_rx_1_bit4 = -1; -static int hf_radiotap_vw_errors_rx_1_bit5 = -1; -static int hf_radiotap_vw_errors_rx_1_bit6 = -1; -static int hf_radiotap_vw_errors_rx_1_bit7 = -1; -static int hf_radiotap_vw_errors_rx_1_bit8 = -1; -static int hf_radiotap_vw_errors_rx_1_bit9 = -1; -static int hf_radiotap_vw_errors_rx_1_bit10 = -1; -static int hf_radiotap_vw_errors_rx_1_bit11 = -1; -static int hf_radiotap_vw_errors_rx_1_bit12 = -1; -static int hf_radiotap_vw_errors_rx_1_bit13 = -1; -static int hf_radiotap_vw_errors_rx_1_bit14 = -1; -static int hf_radiotap_vw_errors_rx_1_bit15 = -1; -#endif - static int hf_radiotap_vw_errors_rx_2_bit0 = -1; static int hf_radiotap_vw_errors_rx_2_bit1 = -1; static int hf_radiotap_vw_errors_rx_2_bit2 = -1; @@ -257,22 +258,17 @@ static dissector_handle_t ixveriwave_handle; #define ALIGN_OFFSET(offset, width) \ ( (((offset) + ((width) - 1)) & (~((width) - 1))) - offset ) -/* Conversion of MCS index, guard interval, channel bandwidth to HT rate */ -static int canonical_ndbps_20[] = {26, 52, 78, 104, 156, 208, 234, 260}; -static int canonical_ndbps_40[] = {54, 108, 162, 216, 324, 432, 486, 540}; -static float getHTrate( guint8 rate, guint8 rflags ); - static void dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_tree *common_tree = NULL; - proto_item *ti = NULL; - proto_item *vw_times_ti = NULL; - proto_tree *vw_times_tree = NULL; - int align_offset, offset, time_tree_offset = 0; + proto_tree *common_tree = NULL; + proto_item *ti = NULL; + proto_item *vw_times_ti = NULL; + proto_tree *vw_times_tree = NULL; + int offset, time_tree_offset = 0; guint16 version, length; guint length_remaining; - guint64 vw_startt = 0, vw_endt=0; + guint64 vw_startt=0, vw_endt=0; guint32 true_length; guint32 vw_latency, vw_pktdur, vw_flowid; guint16 vw_vcid, vw_msdu_length, vw_seqnum; @@ -282,20 +278,21 @@ dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) offset = 0; version = tvb_get_letohs(tvb, offset); - col_set_str(pinfo->cinfo, COL_PROTOCOL, version ? "ETH" : "WLAN"); - col_clear(pinfo->cinfo, COL_INFO); - length = tvb_get_letohs(tvb, offset + COMMON_LENGTH_OFFSET); + col_add_fstr(pinfo->cinfo, COL_PROTOCOL, "%s", version ? "ETH" : "WLAN"); + col_clear(pinfo->cinfo, COL_INFO); + true_length = pinfo->fd->pkt_len - length - tvb_get_letohs(tvb, offset + length) + 4; /* add FCS length into captured length */ col_add_fstr(pinfo->cinfo, COL_INFO, "%s Capture, Length %u", - version ? "IxVeriWave Ethernet Tap" : "IxVeriWave Radio Tap", length); + version ? "IxVeriWave Ethernet Tap" : "IxVeriWave Radio Tap", length); /* Dissect the packet */ if (tree) { ti = proto_tree_add_protocol_format(tree, proto_ixveriwave, - tvb, 0, length, "%s Header, Length %u", version ? "IxVeriWave Ethernet Tap" : "IxVeriWave Radio Tap", length); + tvb, 0, length, "%s Header, Length %u", + version ? "IxVeriWave Ethernet Tap" : "IxVeriWave Radio Tap", length); common_tree = proto_item_add_subtree(ti, ett_commontap); @@ -305,56 +302,43 @@ dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) length_remaining = length; - offset += 4; - length_remaining -= 4; - - /*extract msdu/octets , 2 bytes*/ - align_offset = ALIGN_OFFSET(offset, 2); - offset += align_offset; - length_remaining -= align_offset; + offset +=4; + length_remaining -=4; if (length_remaining >= 2) { vw_msdu_length = tvb_get_letohs(tvb, offset); if (tree) { proto_tree_add_uint(common_tree, hf_ixveriwave_vw_msdu_length, - tvb, offset, 2, vw_msdu_length); + tvb, offset, 2, vw_msdu_length); } - offset += 2; - length_remaining -= 2; + offset +=2; + length_remaining -=2; } /*extract flow id , 4bytes*/ if (length_remaining >= 4) { - align_offset = ALIGN_OFFSET(offset, 4); - offset += align_offset; - length_remaining -= align_offset; - vw_flowid = tvb_get_letohl(tvb, offset); if (tree) { proto_tree_add_uint(common_tree, hf_ixveriwave_vw_flowid, - tvb, offset, 4, vw_flowid); + tvb, offset, 4, vw_flowid); } - offset += 4; - length_remaining -= 4; + offset +=4; + length_remaining -=4; } /*extract client id, 2bytes*/ if (length_remaining >= 2) { - align_offset = ALIGN_OFFSET(offset, 2); - offset += align_offset; - length_remaining -= align_offset; - vw_vcid = tvb_get_letohs(tvb, offset); if (tree) { proto_tree_add_uint(common_tree, hf_ixveriwave_vw_vcid, - tvb, offset, 2, vw_vcid); + tvb, offset, 2, vw_vcid); } - offset += 2; - length_remaining -= 2; + offset +=2; + length_remaining -=2; } /*extract sequence number , 2bytes*/ @@ -363,19 +347,15 @@ dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) vw_seqnum = tvb_get_letohs(tvb, offset); if (tree) { proto_tree_add_uint(common_tree, hf_ixveriwave_vw_seqnum, - tvb, offset, 2, vw_seqnum); + tvb, offset, 2, vw_seqnum); } - offset += 2; - length_remaining -= 2; + offset +=2; + length_remaining -=2; } /*extract latency, 4 bytes*/ if (length_remaining >= 4) { - align_offset = ALIGN_OFFSET(offset, 4); - offset += align_offset; - length_remaining -= align_offset; - vw_latency = tvb_get_letohl(tvb, offset); if (tree) { @@ -406,100 +386,90 @@ dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } - offset += 4; - length_remaining -= 4; + offset +=4; + length_remaining -=4; } /*extract signature timestamp, 4 bytes (32 LSBs only, nsec)*/ if (length_remaining >= 4) { - align_offset = ALIGN_OFFSET(offset, 4); - offset += align_offset; - length_remaining -= align_offset; - if (tree) { if (vw_times_tree != NULL) { - /* TODO: what should this fieldname be? */ - proto_tree_add_item(vw_times_tree, hf_ixveriwave, - tvb, offset, 4, ENC_BIG_ENDIAN); + /* TODO: what should this fieldname be? */ + proto_tree_add_item(vw_times_tree, hf_ixveriwave, + tvb, offset, 4, ENC_BIG_ENDIAN); } } - time_tree_offset = offset; - offset += 4; - length_remaining -= 4; + time_tree_offset = offset; + offset +=4; + length_remaining -=4; } /*extract frame start timestamp, 8 bytes (nsec)*/ if (length_remaining >= 8) { - align_offset = ALIGN_OFFSET(offset, 8); - offset += align_offset; - length_remaining -= align_offset; - vw_startt = tvb_get_letoh64(tvb, offset); if (tree) { if (vw_times_tree != NULL) { - proto_tree_add_uint64_format(vw_times_tree, hf_ixveriwave_vw_startt, - tvb, offset, 8, vw_startt, - "Frame start timestamp: %" G_GINT64_MODIFIER "u usec", vw_startt); + proto_tree_add_uint64_format(vw_times_tree, hf_ixveriwave_vw_startt, + tvb, offset, 8, vw_startt, + "Frame start timestamp: %" G_GINT64_MODIFIER "u usec", vw_startt); } } - offset += 8; - length_remaining -= 8; + offset +=8; + length_remaining -=8; } - /*extract frame end timestamp, 8 bytes (nsec)*/ + /* extract frame end timestamp, 8 bytes (nsec)*/ if (length_remaining >= 8) { - align_offset = ALIGN_OFFSET(offset, 8); - offset += align_offset; - length_remaining -= align_offset; - vw_endt = tvb_get_letoh64(tvb, offset); if (tree) { if (vw_times_tree != NULL) { - proto_tree_add_uint64_format(vw_times_tree, hf_ixveriwave_vw_endt, - tvb, offset, 8, vw_endt, - "Frame end timestamp: %" G_GINT64_MODIFIER "u usec", vw_endt); + proto_tree_add_uint64_format(vw_times_tree, hf_ixveriwave_vw_endt, + tvb, offset, 8, vw_endt, + "Frame end timestamp: %" G_GINT64_MODIFIER "u usec", vw_endt); } } - offset += 8; - length_remaining -= 8; + offset +=8; + length_remaining -=8; } /*extract frame duration , 4 bytes*/ if (length_remaining >= 4) { - align_offset = ALIGN_OFFSET(offset, 4); - offset += align_offset; - vw_pktdur = tvb_get_letohl(tvb, offset); + vw_pktdur = tvb_get_letohl(tvb, offset); if (tree) { if (vw_times_tree != NULL) { - proto_item *duration_ti; if (vw_endt >= vw_startt) { - duration_ti = proto_tree_add_uint_format(vw_times_tree, hf_ixveriwave_vw_pktdur, - tvb, offset-16, 16, vw_pktdur, - "Frame duration: %u nsec", vw_pktdur); - /* Add to root summary */ - proto_item_append_text(vw_times_ti, " (Frame duration=%u nsecs)", vw_pktdur); + if (version == ETHERNET_PORT) { + proto_item_append_text(vw_times_ti, " (Frame duration=%u nsecs)", vw_pktdur); + proto_tree_add_uint_format(vw_times_tree, hf_ixveriwave_vw_pktdur, + tvb, offset-16, 16, vw_pktdur, + "Frame duration: %u nsec", vw_pktdur); + } + else { + proto_item_append_text(vw_times_ti, " (Frame duration=%u usecs)", vw_pktdur); + proto_tree_add_uint_format(vw_times_tree, hf_ixveriwave_vw_pktdur, + tvb, offset-16, 16, vw_pktdur, + "Frame duration: %u usec", vw_pktdur); + } } else { - duration_ti = proto_tree_add_uint_format(vw_times_tree, hf_ixveriwave_vw_pktdur, - tvb, offset, 0, vw_pktdur, - "Frame duration: N/A"); + proto_tree_add_uint_format(vw_times_tree, hf_ixveriwave_vw_pktdur, + tvb, offset, 0, vw_pktdur, + "Frame duration: N/A"); /* Add to root summary */ proto_item_append_text(vw_times_ti, " (Frame duration=N/A)"); } - - PROTO_ITEM_SET_GENERATED(duration_ti); } } - offset += 4; + offset +=4; } if (vw_times_ti) { @@ -523,8 +493,8 @@ dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } else { - p_ifg_info->ifg = 0; - p_ifg_info->previous_end_time = 0; + p_ifg_info->ifg = 0; + p_ifg_info->previous_end_time = 0; } /* Store current data into the static structure */ @@ -538,14 +508,8 @@ dissect_ixveriwave(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) p_add_proto_data(pinfo->fd, proto_ixveriwave, 0, p_ifg_info); } - if (tree) { - ti = proto_tree_add_uint(common_tree, hf_ixveriwave_vw_ifg, - tvb, offset, 0, p_ifg_info->ifg); - PROTO_ITEM_SET_GENERATED(ti); - } - /* Grab the rest of the frame. */ - next_tvb = tvb_new_subset_remaining(tvb, length); + next_tvb = tvb_new_subset(tvb, length, -1, -1); /* dissect the ethernet or wlan header next */ if (version == ETHERNET_PORT) @@ -564,32 +528,40 @@ static void ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *tap_tree) { proto_tree *vweft, *vw_errorFlags_tree = NULL, *vwift,*vw_infoFlags_tree = NULL; - int align_offset, offset; + int offset; tvbuff_t *next_tvb; guint length, length_remaining; guint16 vw_flags, vw_info; guint16 vw_l4id; guint32 vw_error; gint32 vwf_txf, vwf_fcserr; + ifg_info *p_ifg_info; + proto_item *ti; vwf_txf = 0; offset = 0; + /* First add the IFG information */ + p_ifg_info = (struct ifg_info *) p_get_proto_data(pinfo->fd, proto_ixveriwave, 0); + if (tree) { + ti = proto_tree_add_uint(tap_tree, hf_ixveriwave_vw_ifg, + tvb, offset, 0, p_ifg_info->ifg); + PROTO_ITEM_SET_GENERATED(ti); + } + + length = tvb_get_letohs(tvb, offset); length_remaining = length; - offset += 2; + offset += 2; length_remaining -= 2; /* extract flags (currently use only TX/RX and FCS error flag) */ if (length >= 2) { - align_offset = ALIGN_OFFSET(offset, 2); - offset += align_offset; - length_remaining -= align_offset; - vw_flags = tvb_get_letohs(tvb, offset); - vwf_txf = ((vw_flags & ETHERNETTAP_VWF_TXF) == 0) ? 0 : 1; - vwf_fcserr = ((vw_flags & ETHERNETTAP_VWF_FCSERR) == 0) ? 0 : 1; + vw_flags = tvb_get_letohs(tvb, offset); + vwf_txf = ((vw_flags & ETHERNETTAP_VWF_TXF) == 0) ? 0 : 1; + vwf_fcserr = ((vw_flags & ETHERNETTAP_VWF_FCSERR) == 0) ? 0 : 1; if (tap_tree) { proto_tree_add_uint(tap_tree, hf_ixveriwave_vwf_txf, @@ -598,7 +570,7 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t tvb, 0, 0, vwf_fcserr); } - offset += 2; + offset += 2; length_remaining -= 2; } @@ -609,25 +581,25 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t if (tap_tree) { vwift = proto_tree_add_uint(tap_tree, hf_ixveriwave_vw_info, - tvb, offset, 2, vw_info); + tvb, offset, 2, vw_info); vw_infoFlags_tree = proto_item_add_subtree(vwift, ett_ethernettap_info); if (vwf_txf == 0) { /* then it's an rx case */ proto_tree_add_item(vw_infoFlags_tree, hf_ixveriwave_vw_info_rx_1_bit8, - tvb, offset, 2, ENC_LITTLE_ENDIAN); + tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, hf_ixveriwave_vw_info_rx_1_bit9, - tvb, offset, 2, ENC_LITTLE_ENDIAN); + tvb, offset, 2, ENC_LITTLE_ENDIAN); } else { /* it's a tx case */ proto_tree_add_uint_format(vw_infoFlags_tree, hf_ixveriwave_vw_info_retryCount, - tvb, offset, 2, vw_info, - "Retry count: %u ", vw_info); + tvb, offset, 2, vw_info, + "Retry count: %u ", vw_info); } } /*end of if tree */ - offset += 2; - length_remaining -= 2; + offset +=2; + length_remaining -=2; } /*extract error , 4bytes*/ @@ -636,7 +608,7 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t if (tap_tree) { vweft = proto_tree_add_uint(tap_tree, hf_ixveriwave_vw_error, - tvb, offset, 4, vw_error); + tvb, offset, 4, vw_error); vw_errorFlags_tree = proto_item_add_subtree(vweft, ett_ethernettap_error); if (vwf_txf == 0) { @@ -676,8 +648,8 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t } } /*end of if (tree) */ - offset += 4; - length_remaining -= 4; + offset +=4; + length_remaining -=4; } /*extract l4id , 4bytes*/ if (length_remaining >= 4) { @@ -686,8 +658,8 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t proto_tree_add_uint(tap_tree, hf_ixveriwave_vw_l4id, tvb, offset, 4, vw_l4id); } - offset += 4; - length_remaining -= 4; + offset +=4; + length_remaining -=4; } /*extract pad, 4bytes*/ @@ -696,7 +668,7 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t } /* Grab the rest of the frame. */ - next_tvb = tvb_new_subset_remaining(tvb, length); + next_tvb = tvb_new_subset(tvb, length, -1, -1); /* dissect the ethernet header next */ call_dissector(ethernet_handle, next_tvb, pinfo, tree); @@ -705,31 +677,43 @@ ethernettap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t static void wlantap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *tap_tree) { - proto_tree *ft, *flags_tree = NULL; -/* proto_item *hdr_fcs_ti = NULL; */ + proto_tree *ft, *flags_tree = NULL; + proto_item *hdr_fcs_ti = NULL; int align_offset, offset; -/* guint32 calc_fcs; */ + guint32 calc_fcs; tvbuff_t *next_tvb; guint length; - guint32 rate; gint8 dbm; - guint8 rflags = 0; + guint8 rflags = 0; + guint8 mcs_index; + float phyRate; proto_tree *vweft, *vw_errorFlags_tree = NULL, *vwift,*vw_infoFlags_tree = NULL; guint16 vw_flags, vw_info, vw_ht_length, vw_rflags; guint32 vw_errors; - gint8 tx_power; - float ht_rate; - offset = 0; + ifg_info *p_ifg_info; + proto_item *ti; + + /* First add the IFG information, need to grab the info bit field here */ + vw_info = tvb_get_letohs(tvb, 20); + p_ifg_info = (struct ifg_info *) p_get_proto_data(pinfo->fd, proto_ixveriwave, 0); + if (tree) { + if ((vw_info & 0x0400) && !(vw_info & 0x0800)) /* If the packet is part of an A-MPDU but not the first MPDU */ + ti = proto_tree_add_uint(tap_tree, hf_ixveriwave_vw_ifg, tvb, 18, 0, 0); + else + ti = proto_tree_add_uint(tap_tree, hf_ixveriwave_vw_ifg, tvb, 18, 0, p_ifg_info->ifg); + PROTO_ITEM_SET_GENERATED(ti); + } + + offset = 0; length = tvb_get_letohs(tvb, offset); - offset += 2; + offset += 2; vw_rflags = tvb_get_letohs(tvb, offset); if (tree) { - ft = proto_tree_add_uint(tap_tree, hf_radiotap_flags, - tvb, offset, 2, vw_rflags); + ft = proto_tree_add_uint(tap_tree, hf_radiotap_flags, tvb, offset, 2, vw_rflags); flags_tree = proto_item_add_subtree(ft, ett_radiotap_flags); proto_tree_add_boolean(flags_tree, hf_radiotap_flags_cfp, tvb, offset, 2, vw_rflags); @@ -745,65 +729,90 @@ wlantap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree tvb, offset, 2, vw_rflags); if ( vw_rflags & IEEE80211_RADIOTAP_F_HT ) { proto_tree_add_boolean(flags_tree, hf_radiotap_flags_ht, - tvb, offset, 2, vw_rflags); + tvb, offset, 2, vw_rflags); proto_tree_add_boolean(flags_tree, hf_radiotap_flags_40mhz, - tvb, offset, 2, vw_rflags); + tvb, offset, 2, vw_rflags); proto_tree_add_boolean(flags_tree, hf_radiotap_flags_shortgi, - tvb, offset, 2, vw_rflags); + tvb, offset, 2, vw_rflags); + } + if ( vw_rflags & IEEE80211_RADIOTAP_F_VHT ) { + proto_tree_add_boolean(flags_tree, hf_radiotap_flags_vht, + tvb, offset, 2, vw_rflags); + proto_tree_add_boolean(flags_tree, hf_radiotap_flags_shortgi, + tvb, offset, 2, vw_rflags); + proto_tree_add_boolean(flags_tree, hf_radiotap_flags_40mhz, + tvb, offset, 2, vw_rflags); + proto_tree_add_boolean(flags_tree, hf_radiotap_flags_80mhz, + tvb, offset, 2, vw_rflags); } } - offset += 2; + offset +=2; /* Need to add in 2 more bytes to the offset to account for the channel flags */ - offset += 2; + offset +=2; + phyRate = (float)tvb_get_letohs(tvb, offset) / 10; + offset +=2; + offset++; + mcs_index = tvb_get_guint8(tvb, offset); + offset++; + offset++; - rate = tvb_get_guint8(tvb, offset); - if (vw_rflags & IEEE80211_RADIOTAP_F_HT) { - ht_rate = getHTrate( rate, rflags ); - col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%.1f", - ht_rate); + if ((vw_rflags & IEEE80211_RADIOTAP_F_HT) || (vw_rflags & IEEE80211_RADIOTAP_F_VHT) ) { if (tree) { + proto_tree_add_item(tap_tree, hf_radiotap_mcsindex, + tvb, offset - 2, 1, ENC_BIG_ENDIAN); + + proto_tree_add_item(tap_tree, hf_radiotap_nss, + tvb, offset - 1, 1, ENC_BIG_ENDIAN); + proto_tree_add_uint_format(tap_tree, hf_radiotap_datarate, - tvb, offset, 1, tvb_get_guint8(tvb, offset), - "Data rate: %.1f (MCS %d)", ht_rate, rate & IEEE80211_PLCP_RATE_MASK); + tvb, offset - 5, 2, tvb_get_letohs(tvb, offset-5), + "Data rate: %.1f (MCS %d)", phyRate, mcs_index); } } else { - col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%d.%d", - (rate & IEEE80211_PLCP_RATE_MASK)/ 2, rate & 1 ? 5 : 0); if (tree) { - proto_tree_add_uint_format(tap_tree, hf_radiotap_datarate, - tvb, offset, 1, tvb_get_guint8(tvb, offset), - "Data rate: %d.%d Mb/s", (rate & IEEE80211_PLCP_RATE_MASK)/ 2, - (rate & IEEE80211_PLCP_RATE_MASK) & 1 ? 5 : 0); + proto_tree_add_uint_format(tap_tree, hf_radiotap_datarate, + tvb, offset - 5, 2, tvb_get_letohs(tvb, offset-5), + "Data rate: %.1f Mb/s", phyRate); } } - offset++; + col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%.1f", phyRate); dbm = (gint8) tvb_get_guint8(tvb, offset); - offset++; - tx_power = (gint8)tvb_get_guint8(tvb, offset); - if (dbm != 100) - { - col_add_fstr(pinfo->cinfo, COL_RSSI, "%d dBm", dbm); - if (tree) { - proto_tree_add_int_format(tap_tree, - hf_radiotap_dbm_antsignal, - tvb, offset, 1, dbm, - "RX SSI signal: %d dBm", dbm); - } + col_add_fstr(pinfo->cinfo, COL_RSSI, "%d dBm", dbm); + if (tree) { + proto_tree_add_int_format(tap_tree, + hf_radiotap_dbm_antsignal, + tvb, offset, 1, dbm, + "Signal Power: %d dBm", dbm); } - else if (tx_power != 100) - { - col_add_fstr(pinfo->cinfo, COL_RSSI, "%d dBm", tx_power); - if (tree) { - proto_tree_add_int_format(tap_tree, - hf_radiotap_txpower, - tvb, offset, 1, tx_power, - "Transmit power (TX): %d ", tx_power); - } + + offset++; + dbm = (gint8) tvb_get_guint8(tvb, offset); + if (tree && dbm != 100) { + proto_tree_add_int_format(tap_tree, + hf_radiotap_dbm_antb, + tvb, offset, 1, dbm, + "Signal Power for Antenna B: %d dBm", dbm); } - offset += 2; + offset++; + dbm = (gint8) tvb_get_guint8(tvb, offset); + if (tree && dbm != 100) { + proto_tree_add_int_format(tap_tree, + hf_radiotap_dbm_antc, + tvb, offset, 1, dbm, + "Signal Power for Antenna C: %d dBm", dbm); + } + offset++; + dbm = (gint8) tvb_get_guint8(tvb, offset); + if (tree && dbm != 100) { + proto_tree_add_int_format(tap_tree, + hf_radiotap_dbm_antd, + tvb, offset, 1, dbm, + "Signal Power for Antenna D: %d dBm", dbm); + } + offset+=2; vw_flags = tvb_get_letohs(tvb, offset); @@ -818,124 +827,117 @@ wlantap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree tvb, offset, 2, (vw_flags & VW_RADIOTAPF_RETRERR) != 0); proto_tree_add_uint(tap_tree, hf_radiotap_vwf_enctype, tvb, offset, 2, (vw_flags & VW_RADIOTAPF_ENCMSK) >> - VW_RADIOTAPF_ENCSHIFT); + VW_RADIOTAPF_ENCSHIFT); } - offset += 2; + offset +=2; - align_offset = ALIGN_OFFSET(offset, 2); - offset += align_offset; + align_offset = ALIGN_OFFSET(offset, 2); + offset += align_offset; vw_ht_length = tvb_get_letohs(tvb, offset); if ((tree) && (vw_ht_length != 0)) { proto_tree_add_uint_format(tap_tree, hf_radiotap_vw_ht_length, - tvb, offset, 2, - vw_ht_length, - "HT length: %u (includes the sum of the pieces of the aggregate and their respective Start_Spacing" - " + Delimiter + MPDU + Padding)", + tvb, offset, 2, vw_ht_length, "HT length: %u (includes the sum of the pieces of the aggregate and their respective Start_Spacing + Delimiter + MPDU + Padding)", vw_ht_length); } - offset += 2; + offset +=2; - align_offset = ALIGN_OFFSET(offset, 2); - offset += align_offset; + align_offset = ALIGN_OFFSET(offset, 2); + offset += align_offset; - vw_info = tvb_get_letohs(tvb, offset); + /* vw_info grabbed in the beginning of the dissector */ if (tree) { vwift = proto_tree_add_uint(tap_tree, hf_radiotap_vw_info, - tvb, offset, 2, vw_info); + tvb, offset, 2, vw_info); vw_infoFlags_tree = proto_item_add_subtree(vwift, ett_radiotap_info); - if (tx_power == 0) { /* then it's an rx case */ + if (!(vw_flags & VW_RADIOTAPF_TXF)) { /* then it's an rx case */ /*FPGA_VER_vVW510021 version decodes */ proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_rx_2_bit8, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_rx_2_bit8, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_rx_2_bit9, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_rx_2_bit9, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, hf_radiotap_vw_info_rx_2_bit10, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, hf_radiotap_vw_info_rx_2_bit11, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_rx_2_bit12, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_rx_2_bit12, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_rx_2_bit13, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_rx_2_bit13, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_rx_2_bit14, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_rx_2_bit14, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_rx_2_bit15, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_rx_2_bit15, tvb, offset, 2, ENC_LITTLE_ENDIAN); } else { /* it's a tx case */ /* FPGA_VER_vVW510021 and VW_FPGA_VER_vVW510006 tx info decodes same*/ proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_tx_bit10, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_tx_bit10, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_tx_bit11, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_tx_bit11, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_tx_bit12, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_tx_bit12, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_tx_bit13, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_tx_bit13, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_tx_bit14, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_tx_bit14, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_infoFlags_tree, - hf_radiotap_vw_info_tx_bit15, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_info_tx_bit15, tvb, offset, 2, ENC_LITTLE_ENDIAN); } } - offset += 2; - - align_offset = ALIGN_OFFSET(offset, 4); - offset += align_offset; + offset +=2; vw_errors = tvb_get_letohl(tvb, offset); if (tree) { vweft = proto_tree_add_uint(tap_tree, hf_radiotap_vw_errors, - tvb, offset, 4, vw_errors); - vw_errorFlags_tree = proto_item_add_subtree(vweft, - ett_radiotap_errors); + tvb, offset, 4, vw_errors); + vw_errorFlags_tree = proto_item_add_subtree(vweft, ett_radiotap_errors); /* build the individual subtrees for the various types of error flags */ /* NOTE: as the upper 16 bits aren't used at the moment, we pretend that */ /* the error flags field is only 16 bits (instead of 32) to save space */ - if (tx_power == 0) { + if (!(vw_flags & VW_RADIOTAPF_TXF)) { /* then it's an rx case */ /*FPGA_VER_vVW510021 version decodes */ proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit0, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit0, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit1, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit1, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit2, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit2, tvb, offset, 2, ENC_LITTLE_ENDIAN); /* veriwave removed 8-2007, don't display reserved bit*/ proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit4, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit4, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit5, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit5, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit6, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit6, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit7, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit7, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit8, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit8, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit10, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit10, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_rx_2_bit11, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_rx_2_bit11, tvb, offset, 2, ENC_LITTLE_ENDIAN); } else { /* it's a tx case */ /* FPGA_VER_vVW510021 and VW_FPGA_VER_vVW510006 tx error decodes same*/ proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_tx_bit1, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_tx_bit1, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(vw_errorFlags_tree, - hf_radiotap_vw_errors_tx_bit5, tvb, offset, 2, ENC_LITTLE_ENDIAN); + hf_radiotap_vw_errors_tx_bit5, tvb, offset, 2, ENC_LITTLE_ENDIAN); } } @@ -947,13 +949,10 @@ wlantap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree pinfo->pseudo_header->ieee_802_11.fcs_len = 0; /* Grab the rest of the frame. */ - next_tvb = tvb_new_subset_remaining(tvb, length); + next_tvb = tvb_new_subset(tvb, length, -1, -1); -#if 0 /* XXX: 'hdr_fcs_ti' is never set so the following code will never be executed ? */ /* If we had an in-header FCS, check it. */ if (hdr_fcs_ti) { - /* XXX: Also: 'sent fcs' always 0 ? */ - /* 'hf_radiotap_fcs_bad' has no entry in hf[] */ /* It would be very strange for the header to have an FCS for the * frame *and* the frame to have the FCS at the end, but it's possible, so * take that into account by using the FCS length recorded in pinfo. */ @@ -962,10 +961,10 @@ wlantap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree if (tvb_length(next_tvb) > (unsigned int) pinfo->pseudo_header->ieee_802_11.fcs_len) { guint32 sent_fcs = 0; calc_fcs = crc32_802_tvb(next_tvb, - tvb_length(next_tvb) - pinfo->pseudo_header->ieee_802_11.fcs_len); + tvb_length(next_tvb) - pinfo->pseudo_header->ieee_802_11.fcs_len); /* By virtue of hdr_fcs_ti being set, we know that 'tree' is set, - * so there's no need to check it here. */ + * so there's no need to check it here. */ if (calc_fcs == sent_fcs) { proto_item_append_text(hdr_fcs_ti, " [correct]"); } @@ -977,38 +976,14 @@ wlantap_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree } else { proto_item_append_text(hdr_fcs_ti, - " [cannot verify - not enough data]"); + " [cannot verify - not enough data]"); } } -#endif /* dissect the 802.11 header next */ call_dissector((rflags & IEEE80211_RADIOTAP_F_DATAPAD) ? - ieee80211_datapad_handle : ieee80211_handle, - next_tvb, pinfo, tree); -} - -static float getHTrate( guint8 rate, guint8 rflags ) -{ - int mcs_index, ndbps; - float symbol_tx_time, bitrate; - - /* Guard interval is the most significant bit. Short GI if the bit is set */ - if ( rate & 0x80) - symbol_tx_time = (float)3.6; - else - symbol_tx_time = (float)4.0; - - mcs_index = rate & IEEE80211_PLCP_RATE_MASK; - - if ( rflags & IEEE80211_RADIOTAP_F_40MHZ ) - ndbps = canonical_ndbps_40[ mcs_index - 8*(int)(mcs_index/8) ]; - else - ndbps = canonical_ndbps_20[ mcs_index - 8*(int)(mcs_index/8) ]; - - bitrate = ( ndbps * (((int)(mcs_index/8) + 1) )) / symbol_tx_time; - - return bitrate; + ieee80211_datapad_handle : ieee80211_handle, + next_tvb, pinfo, tree); } void proto_register_ixveriwave(void) @@ -1033,9 +1008,9 @@ void proto_register_ixveriwave(void) /* Added value_string for decrypt error flag */ static const value_string decrypterr_type[] = { - { 0, "Decrypt Succeeded" }, - { 1, "Decrypt Failed" }, - { 0, NULL }, + { 0, "Decrypt Succeeded" }, + { 1, "Decrypt Failed" }, + { 0, NULL }, }; /* Added value_string for excess retry error flag */ @@ -1055,161 +1030,155 @@ void proto_register_ixveriwave(void) }; static hf_register_info hf[] = { - { &hf_ixveriwave_frame_length, - { "Actual frame length", "ixveriwave.frame_length", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_frame_length, + { "Actual frame length", "ixveriwave.frame_length", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_msdu_length, - { "MSDU length", "ixveriwave.msdu_length", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_msdu_length, + { "MSDU length", "ixveriwave.msdu_length", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_vcid, - { "Client ID", "ixveriwave.clientid", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_vcid, + { "Client ID", "ixveriwave.clientid", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_flowid, - { "Flow ID", "ixveriwave.flowid", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_flowid, + { "Flow ID", "ixveriwave.flowid", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_seqnum, - { "Sequence number", "ixveriwave.seqnum", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_seqnum, + { "Sequence number", "ixveriwave.seqnum", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_mslatency, - { "Msec latency", "ixveriwave.mslatency", - FT_FLOAT, 0, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_mslatency, + { "Msec latency", "ixveriwave.mslatency", + FT_FLOAT, 0, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_latency, - { "Latency", "ixveriwave.latency", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_latency, + { "Latency", "ixveriwave.latency", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave, - { "Signature (32 LSBs)", "ixveriwave.sig_ts", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave, + { "Signature (32 LSBs)", "ixveriwave.sig_ts", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_startt, - { "Starting frame timestamp", "ixveriwave.startt", - FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_startt, + { "Starting frame timestamp", "ixveriwave.startt", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_endt, - { "Ending frame timestamp", "ixveriwave.endt", - FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_endt, + { "Ending frame timestamp", "ixveriwave.endt", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_pktdur, - { "Packet duration", "ixveriwave.pktdur", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_pktdur, + { "Packet duration", "ixveriwave.pktdur", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_ifg, - { "Inter-frame gap (usecs)", "ixveriwave.ifg", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_ifg, + { "Inter-frame gap (usecs)", "ixveriwave.ifg", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vwf_txf, - { "Frame direction", "ixveriwave.vwflags.txframe", - FT_UINT32, BASE_DEC, VALS(tx_rx_type), 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vwf_txf, + { "Frame direction", "ixveriwave.vwflags.txframe", + FT_UINT32, BASE_DEC, VALS(tx_rx_type), 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vwf_fcserr, - { "MAC FCS check", "ixveriwave.vwflags.fcserr", - FT_UINT32, BASE_DEC, VALS(fcserr_type), 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vwf_fcserr, + { "MAC FCS check", "ixveriwave.vwflags.fcserr", + FT_UINT32, BASE_DEC, VALS(fcserr_type), 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_info, - { "Info field", "ixveriwave.info", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_info, + { "Info field", "ixveriwave.info", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_ixveriwave_vw_info_retryCount, - { "Info field retry count", "ixveriwave.info.retrycount", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_ixveriwave_vw_info_retryCount, + { "Info field retry count", "ixveriwave.info", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, /* tx info decodes for VW510024 and 510012 */ /* we don't need to enumerate through these, basically for both, - info is the retry count. for 510024, the 15th bit indicates if - the frame was impressed on the enet tx media with one or more octets having tx_en - framing signal deasserted. this is caused by software setting the drain all register bit. +info is the retry count. for 510024, the 15th bit indicates if +the frame was impressed on the enet tx media with one or more octets having tx_en +framing signal deasserted. this is caused by software setting the drain all register bit. */ -#if 0 - { &hf_ixveriwave_vw_info_tx_bit15, - { "Info bit 15-frame was impressed on the ent tx media with one or more octets having tx_en framing signal deasserted.", "ixveriwave.info.bit15", - FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } }, -#endif - - /* rx info decodes for fpga ver VW510024 */ - /*all are reserved*/ - - /* rx info decodes for fpga ver VW510012 */ - { &hf_ixveriwave_vw_info_rx_1_bit8, - { "Go no flow", "ixveriwave.info.bit8", - FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, - { &hf_ixveriwave_vw_info_rx_1_bit9, - { "Go with flow", "ixveriwave.info.bit9", - FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } }, - - { &hf_ixveriwave_vw_error, - { "Errors", "ixveriwave.error", - FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - /* tx error decodes for VW510024 and previous versions */ - - { &hf_ixveriwave_vw_error_tx_bit1, - { "Packet FCS error", "ixveriwave.error.bit1", - FT_BOOLEAN, 12, NULL, 0x0002, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_tx_bit5, - { "IP checksum error", "ixveriwave.error.bit5", - FT_BOOLEAN, 12, NULL, 0x0020, NULL, HFILL } }, - /*bit 6 is actually reserved in 500012, but i thought it would be okay to leave it here*/ - { &hf_ixveriwave_vw_error_tx_bit9, - { "Underflow error", "ixveriwave.error.bit9", - FT_BOOLEAN, 12, NULL, 0x0200, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_tx_bit10, - { "Late collision error", "ixveriwave.error.bit10", - FT_BOOLEAN, 12, NULL, 0x0400, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_tx_bit11, - { "Excessive collisions error", "ixveriwave.error.bit11", - FT_BOOLEAN, 12, NULL, 0x0800, NULL, HFILL } }, - /*all other bits are reserved */ - - /* rx error decodes for fpga ver VW510012 and VW510024 */ - { &hf_ixveriwave_vw_error_rx_1_bit0, - { "Alignment error", "ixveriwave.error.bit0", - FT_BOOLEAN, 12, NULL, 0x0001, "error bit 0", HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit1, - { "Packet FCS error", "ixveriwave.error.bit1", - FT_BOOLEAN, 12, NULL, 0x0002, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit2, - { "Bad magic byte signature.", "ixveriwave.error.bit2", - FT_BOOLEAN, 12, NULL, 0x0004, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit3, - { "Bad payload checksum.", "ixveriwave.error.bit3", - FT_BOOLEAN, 12, NULL, 0x0008, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit4, - { "Frame too long error", "ixveriwave.error.bit4", - FT_BOOLEAN, 12, NULL, 0x0010, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit5, - { "IP checksum error", "ixveriwave.error.bit5", - FT_BOOLEAN, 12, NULL, 0x0020, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit6, - { "TCP/ICMP/IGMP/UDP checksum error", "ixveriwave.error.bit6", - FT_BOOLEAN, 12, NULL, 0x0040, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit7, - { "ID mismatch(for fpga510012)", "ixveriwave.error.bit7", - FT_BOOLEAN, 12, NULL, 0x0080, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit8, - { "Length error", "ixveriwave.error.bit8", - FT_BOOLEAN, 12, NULL, 0x0100, NULL, HFILL } }, - { &hf_ixveriwave_vw_error_rx_1_bit9, - { "Underflow", "ixveriwave.error.bit9", - FT_BOOLEAN, 12, NULL, 0x0200, NULL, HFILL } }, - { &hf_radiotap_vw_errors_tx_bit1, - { "Packet FCS error", "ixveriwave.errors.bit1", - FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } }, - { &hf_radiotap_vw_errors_tx_bit5, - { "IP checksum error", "ixveriwave.errors.bit5", - FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } }, - - /* All other enumerations are reserved.*/ - - { &hf_ixveriwave_vw_l4id, - { "Layer 4 ID", "ixveriwave.layer4id", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - - /* Presense flags */ + /* rx info decodes for fpga ver VW510024 */ + /*all are reserved*/ + + /* rx info decodes for fpga ver VW510012 */ + { &hf_ixveriwave_vw_info_rx_1_bit8, + { "Go no flow", "ixveriwave.info.bit8", + FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, + { &hf_ixveriwave_vw_info_rx_1_bit9, + { "Go with flow", "ixveriwave.info.bit9", + FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } }, + + { &hf_ixveriwave_vw_error, + { "Errors", "ixveriwave.error", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + /* tx error decodes for VW510024 and previous versions */ + + { &hf_ixveriwave_vw_error_tx_bit1, + { "Packet FCS error", "ixveriwave.error.bit1", + FT_BOOLEAN, 12, NULL, 0x0002, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_tx_bit5, + { "IP checksum error", "ixveriwave.error.bit5", + FT_BOOLEAN, 12, NULL, 0x0020, NULL, HFILL } }, + /*bit 6 is actually reserved in 500012, but i thought it would be okay to leave it here*/ + { &hf_ixveriwave_vw_error_tx_bit9, + { "Underflow error", "ixveriwave.error.bit9", + FT_BOOLEAN, 12, NULL, 0x0200, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_tx_bit10, + { "Late collision error", "ixveriwave.error.bit10", + FT_BOOLEAN, 12, NULL, 0x0400, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_tx_bit11, + { "Excessive collisions error", "ixveriwave.error.bit11", + FT_BOOLEAN, 12, NULL, 0x0800, NULL, HFILL } }, + /*all other bits are reserved */ + + /* rx error decodes for fpga ver VW510012 and VW510024 */ + { &hf_ixveriwave_vw_error_rx_1_bit0, + { "Alignment error", "ixveriwave.error.bit0", + FT_BOOLEAN, 12, NULL, 0x0001, "error bit 0", HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit1, + { "Packet FCS error", "ixveriwave.error.bit1", + FT_BOOLEAN, 12, NULL, 0x0002, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit2, + { "Bad magic byte signature.", "ixveriwave.error.bit2", + FT_BOOLEAN, 12, NULL, 0x0004, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit3, + { "Bad payload checksum.", "ixveriwave.error.bit3", + FT_BOOLEAN, 12, NULL, 0x0008, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit4, + { "Frame too long error", "ixveriwave.error.bit4", + FT_BOOLEAN, 12, NULL, 0x0010, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit5, + { "IP checksum error", "ixveriwave.error.bit5", + FT_BOOLEAN, 12, NULL, 0x0020, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit6, + { "TCP/ICMP/IGMP/UDP checksum error", "ixveriwave.error.bit6", + FT_BOOLEAN, 12, NULL, 0x0040, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit7, + { "ID mismatch(for fpga510012)", "ixveriwave.error.bit7", + FT_BOOLEAN, 12, NULL, 0x0080, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit8, + { "Length error", "ixveriwave.error.bit8", + FT_BOOLEAN, 12, NULL, 0x0100, NULL, HFILL } }, + { &hf_ixveriwave_vw_error_rx_1_bit9, + { "Underflow", "ixveriwave.error.bit9", + FT_BOOLEAN, 12, NULL, 0x0200, NULL, HFILL } }, + { &hf_radiotap_vw_errors_tx_bit1, + { "Packet FCS error", "ixveriwave.errors.bit1", + FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } }, + { &hf_radiotap_vw_errors_tx_bit5, + { "IP checksum error", "ixveriwave.errors.bit5", + FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } }, + + /* All other enumerations are reserved.*/ + + { &hf_ixveriwave_vw_l4id, + { "Layer 4 ID", "ixveriwave.layer4id", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + /* Presense flags */ #define RADIOTAP_MASK_VW_FPGA_VERSION (1 << VW_RADIOTAP_FPGA_VERSION) #define RADIOTAP_MASK_VW_MCID (1 << VW_RADIOTAP_MCID) #define RADIOTAP_MASK_VW_ERRORS (1 << VW_RADIOTAP_ERRORS) @@ -1224,272 +1193,236 @@ void proto_register_ixveriwave(void) #define RADIOTAP_MASK_VW_ENDT (1 << VW_RADIOTAP_ENDT) #define RADIOTAP_MASK_VW_PKTDUR (1 << VW_RADIOTAP_PKTDUR) #define RADIOTAP_MASK_VW_IFG (1 << VW_RADIOTAP_IFG) - /* end veriwave addition*/ - - { &hf_radiotap_datarate, - { "Data rate", "ixveriwave.datarate", - FT_UINT32, BASE_DEC, NULL, 0x0, - "Speed this frame was sent/received at", HFILL } }, - - /* Boolean 'present.flags' flags */ - { &hf_radiotap_flags, - { "Flags", "ixveriwave.flags", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - - { &hf_radiotap_flags_cfp, - { "CFP", "ixveriwave.flags.cfp", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_CFP, - "Sent/Received during CFP", HFILL } }, - - { &hf_radiotap_flags_preamble, - { "Preamble", "ixveriwave.flags.preamble", - FT_BOOLEAN, 12, TFS(&preamble_type), IEEE80211_RADIOTAP_F_SHORTPRE, - "Sent/Received with short preamble", HFILL } }, - - { &hf_radiotap_flags_wep, - { "WEP", "ixveriwave.flags.wep", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_WEP, - "Sent/Received with WEP encryption", HFILL } }, - - { &hf_radiotap_flags_frag, - { "Fragmentation", "ixveriwave.flags.frag", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_FRAG, - "Sent/Received with fragmentation", HFILL } }, - - { &hf_radiotap_flags_fcs, - { "FCS at end", "ixveriwave.flags.fcs", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_FCS, - "Frame includes FCS at end", HFILL } }, - - { &hf_radiotap_flags_datapad, - { "Data Pad", "ixveriwave.flags.datapad", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_DATAPAD, - "Frame has padding between 802.11 header and payload", HFILL } }, - - { &hf_radiotap_flags_ht, - { "HT frame", "ixveriwave.flags.ht", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_HT, NULL, HFILL } }, - - { &hf_radiotap_flags_40mhz, - { "40 MHz channel bandwidth", "ixveriwave.flags.40mhz", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_40MHZ, NULL, HFILL } }, - - { &hf_radiotap_flags_shortgi, - { "Short guard interval", "ixveriwave.flags.shortgi", - FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_SHORTGI, NULL, HFILL } }, - - { &hf_radiotap_dbm_antsignal, - { "SSI Signal (dBm)", "ixveriwave.dbm_antsignal", - FT_INT32, BASE_DEC, NULL, 0x0, - "RF signal power at the antenna from a fixed, arbitrary value in decibels from one milliwatt", HFILL } }, - - { &hf_radiotap_txpower, - { "Transmit power", "ixveriwave.txpower", - FT_INT32, BASE_DEC, NULL, 0x0, - "Transmit power in decibels per one milliwatt (dBm)", HFILL } }, - - /* Boolean 'present' flags */ - /* VeriWave-specific flags */ - { &hf_radiotap_vwf_txf, - { "Frame direction", "ixveriwave.vwflags.txframe", - FT_UINT32, BASE_DEC, VALS(tx_rx_type), 0x0, NULL, HFILL } }, - - { &hf_radiotap_vwf_fcserr, - { "MAC FCS check", "ixveriwave.vwflags.fcserr", - FT_UINT32, BASE_DEC, VALS(fcserr_type), 0x0, NULL, HFILL } }, - - { &hf_radiotap_vwf_dcrerr, - { "Decryption error", "ixveriwave.vwflags.decrypterr", - FT_UINT32, BASE_DEC, VALS(decrypterr_type), 0x0, NULL, HFILL } }, - - { &hf_radiotap_vwf_retrerr, - { "TX retry limit", "ixveriwave.vwflags.retryerr", - FT_UINT32, BASE_DEC, VALS(retryerr_type), 0x0, NULL, HFILL } }, - - { &hf_radiotap_vwf_enctype, - { "Encryption type", "ixveriwave.vwflags.encrypt", - FT_UINT32, BASE_DEC, VALS(encrypt_type), 0x0, NULL, HFILL } }, - - /* start VeriWave-specific radiotap header elements 6-2007 */ - { &hf_radiotap_vw_ht_length, - { "Total IP length (incl all pieces of an aggregate)", "ixveriwave.ht_length", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - - { &hf_radiotap_vw_errors, - { "Errors", "ixveriwave.errors", - FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - -#if 0 - /* rx error decodes for fpga ver VW510006 */ - { &hf_radiotap_vw_errors_rx_1_bit0, - { "L1 error", "ixveriwave.errors.bit0", - FT_BOOLEAN, 16, NULL, 0x0001, "error bit 0", HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit1, - { "Packet FCS error", "ixveriwave.errors.bit1", - FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit2, - { "Bad magic byte signature.", "ixveriwave.errors.bit2", - FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit3, - { "Bad payload checksum.", "ixveriwave.errors.bit3", - FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit4, - { "Duplicate MPDU", "ixveriwave.errors.bit4", - FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit5, - { "IP checksum error", "ixveriwave.errors.bit5", - FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit6, - { "TCP/ICMP/IGMP/UDP checksum error", "ixveriwave.errors.bit6", - FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit7, - { "Reserved", "ixveriwave.errors.bit7", - FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit8, - { "RX WEP IVC / TKIP/CCMP MIC miscompare", "ixveriwave.errors.bit8", - FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit9, - { "RX TKIP / CCMP TSC SEQERR", "ixveriwave.errors.bit9", - FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit10, - { "RX crypto short", "ixveriwave.errors.bit10", - FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit11, - { "RX EXTIV fault A", "ixveriwave.errors.bit11", - FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit12, - { "RX EXTIV fault B", "ixveriwave.errors.bit12", - FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit13, - { "RX protected fault A", "ixveriwave.errors.bit13", - FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit14, - { "RX protected fault B", "ixveriwave.errors.bit14", - FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_1_bit15, - { "Reserved", "ixveriwave.errors.bit15", - FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } }, -#endif - /* All other enumerations are reserved.*/ - - /* rx error decodes for fpga ver VW510021 */ - { &hf_radiotap_vw_errors_rx_2_bit0, - { "CRC16 or parity error", "ixveriwave.errors.bit0", - FT_BOOLEAN, 16, NULL, 0x0001, "error bit 0", HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit1, - { "Non-supported rate or service field", "ixveriwave.errors.bit1", - FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit2, - { "Short frame error. Frame is shorter than length.", "ixveriwave.errors.bit2", - FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit4, - { "FCS_Error", "ixveriwave.errors.bit4", - FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit5, - { "L2 de-aggregation error", "ixveriwave.errors.bit5", - FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit6, - { "Duplicate MPDU", "ixveriwave.errors.bit6", - FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit7, - { "Bad_Sig: Bad flow magic number (includes bad flow crc16)", "ixveriwave.errors.bit7", - FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit8, - { "Bad flow payload checksum", "ixveriwave.errors.bit8", - FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit10, - { "Bad IP checksum error", "ixveriwave.errors.bit10", - FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, - - { &hf_radiotap_vw_errors_rx_2_bit11, - { "L4(TCP/ICMP/IGMP/UDP) checksum error", "ixveriwave.errors.bit11", - FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, - - { &hf_radiotap_vw_info, - { "Info field", "ixveriwave.info", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - - /* tx info decodes for VW510021 and previous versions */ - { &hf_radiotap_vw_info_tx_bit10, - { "MPDU of A-MPDU", "ixveriwave.info.bit10", - FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, - - { &hf_radiotap_vw_info_tx_bit11, - { "First MPDU of A-MPDU", "ixveriwave.info.bit11", - FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, - - { &hf_radiotap_vw_info_tx_bit12, - { "Last MPDU of A-MPDU", "ixveriwave.info.bit12", - FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL } }, - - { &hf_radiotap_vw_info_tx_bit13, - { "MSDU of A-MSDU", "ixveriwave.info.bit13", - FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL } }, - - { &hf_radiotap_vw_info_tx_bit14, - { "First MSDU of A-MSDU", "ixveriwave.info.bit14", - FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL } }, - - { &hf_radiotap_vw_info_tx_bit15, - { "Last MSDU of A-MSDU", "ixveriwave.info.bit15", - FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } }, - /*v510006 uses bits */ - - /* rx info decodes for fpga ver VW510021 */ - { &hf_radiotap_vw_info_rx_2_bit8, - { "ACK withheld from frame", "ixveriwave.info.bit8", - FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit9, - { "Sent CTS to self before data", "ixveriwave.info.bit9", - FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit10, - { "MPDU of an A-MPDU", "ixveriwave.info.bit10", - FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit11, - { "First MPDU of A-MPDU", "ixveriwave.info.bit11", - FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit12, - { "Last MPDU of A-MPDU", "ixveriwave.info.bit12", - FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit13, - { "MSDU of A-MSDU", "ixveriwave.info.bit13", - FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit14, - { "First MSDU of A-MSDU", "ixveriwave.info.bit14", - FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL } }, - - { &hf_radiotap_vw_info_rx_2_bit15, - { "Last MSDU of A-MSDU", "ixveriwave.info.bit15", - FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } }, + /* end veriwave addition*/ + + { &hf_radiotap_datarate, + { "Data rate", "ixveriwave.datarate", + FT_UINT32, BASE_DEC, NULL, 0x0, + "Speed this frame was sent/received at", HFILL } }, + + { &hf_radiotap_mcsindex, + { "MCS index", "ixveriwave.mcs", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } }, + + { &hf_radiotap_nss, + { "Number of spatial streams", "ixveriwave.nss", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } }, + + /* Boolean 'present.flags' flags */ + { &hf_radiotap_flags, + { "Flags", "ixveriwave.flags", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_radiotap_flags_cfp, + { "CFP", "ixveriwave.flags.cfp", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_CFP, + "Sent/Received during CFP", HFILL } }, + + { &hf_radiotap_flags_preamble, + { "Preamble", "ixveriwave.flags.preamble", + FT_BOOLEAN, 12, TFS(&preamble_type), IEEE80211_RADIOTAP_F_SHORTPRE, + "Sent/Received with short preamble", HFILL } }, + + { &hf_radiotap_flags_wep, + { "WEP", "ixveriwave.flags.wep", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_WEP, + "Sent/Received with WEP encryption", HFILL } }, + + { &hf_radiotap_flags_frag, + { "Fragmentation", "ixveriwave.flags.frag", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_FRAG, + "Sent/Received with fragmentation", HFILL } }, + + { &hf_radiotap_flags_fcs, + { "FCS at end", "ixveriwave.flags.fcs", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_FCS, + "Frame includes FCS at end", HFILL } }, + + { &hf_radiotap_flags_datapad, + { "Data Pad", "ixveriwave.flags.datapad", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_DATAPAD, + "Frame has padding between 802.11 header and payload", HFILL } }, + + { &hf_radiotap_flags_ht, + { "HT frame", "ixveriwave.flags.ht", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_HT, NULL, HFILL } }, + + { &hf_radiotap_flags_vht, + { "VHT frame", "ixveriwave.flags.vht", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_VHT, NULL, HFILL } }, + + { &hf_radiotap_flags_40mhz, + { "40 MHz channel bandwidth", "ixveriwave.flags.40mhz", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_40MHZ, NULL, HFILL } }, + + { &hf_radiotap_flags_80mhz, + { "80 MHz channel bandwidth", "ixveriwave.flags.80mhz", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_80MHZ, NULL, HFILL } }, + + { &hf_radiotap_flags_shortgi, + { "Short guard interval", "ixveriwave.flags.shortgi", + FT_BOOLEAN, 12, NULL, IEEE80211_RADIOTAP_F_SHORTGI, NULL, HFILL } }, + + { &hf_radiotap_dbm_antsignal, + { "SSI Signal (dBm)", "ixveriwave.dbm_antsignal", + FT_INT32, BASE_DEC, NULL, 0x0, + "RF signal power at the antenna from a fixed, arbitrary value in decibels from one milliwatt", HFILL } }, + + { &hf_radiotap_dbm_antb, + { "SSI Signal (dBm) from antenna b", "ixveriwave.dbm_antb", + FT_INT32, BASE_DEC, NULL, 0x0, + "RF signal power at the antenna from a fixed, arbitrary value in decibels from one milliwatt", HFILL } }, + + { &hf_radiotap_dbm_antc, + { "SSI Signal (dBm) from antenna c", "ixveriwave.dbm_antc", + FT_INT32, BASE_DEC, NULL, 0x0, + "RF signal power at the antenna from a fixed, arbitrary value in decibels from one milliwatt", HFILL } }, + + { &hf_radiotap_dbm_antd, + { "SSI Signal (dBm) from antenna d", "ixveriwave.dbm_antd", + FT_INT32, BASE_DEC, NULL, 0x0, + "RF signal power at the antenna from a fixed, arbitrary value in decibels from one milliwatt", HFILL } }, + + { &hf_radiotap_fcs_bad, + { "FCS error", "ixveriwave.fcs_error", + FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + /* Boolean 'present' flags */ + /* VeriWave-specific flags */ + { &hf_radiotap_vwf_txf, + { "Frame direction", "ixveriwave.vwflags.txframe", + FT_UINT32, BASE_DEC, VALS(tx_rx_type), 0x0, NULL, HFILL } }, + + { &hf_radiotap_vwf_fcserr, + { "MAC FCS check", "ixveriwave.vwflags.fcserr", + FT_UINT32, BASE_DEC, VALS(fcserr_type), 0x0, NULL, HFILL } }, + + { &hf_radiotap_vwf_dcrerr, + { "Decryption error", "ixveriwave.vwflags.decrypterr", + FT_UINT32, BASE_DEC, VALS(decrypterr_type), 0x0, NULL, HFILL } }, + + { &hf_radiotap_vwf_retrerr, + { "TX retry limit", "ixveriwave.vwflags.retryerr", + FT_UINT32, BASE_DEC, VALS(retryerr_type), 0x0, NULL, HFILL } }, + + { &hf_radiotap_vwf_enctype, + { "Encryption type", "ixveriwave.vwflags.encrypt", + FT_UINT32, BASE_DEC, VALS(encrypt_type), 0x0, NULL, HFILL } }, + + /* start VeriWave-specific radiotap header elements 6-2007 */ + { &hf_radiotap_vw_ht_length, + { "Total IP length (incl all pieces of an aggregate)", "ixveriwave.ht_length", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_radiotap_vw_errors, + { "Errors", "ixveriwave.errors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + /* rx error decodes for fpga ver VW510021 */ + { &hf_radiotap_vw_errors_rx_2_bit0, + { "CRC16 or parity error", "ixveriwave.errors.bit0", + FT_BOOLEAN, 16, NULL, 0x0001, "error bit 0", HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit1, + { "Non-supported rate or service field", "ixveriwave.errors.bit1", + FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit2, + { "Short frame error. Frame is shorter than length.", "ixveriwave.errors.bit2", + FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit4, + { "FCS_Error", "ixveriwave.errors.bit4", + FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit5, + { "L2 de-aggregation error", "ixveriwave.errors.bit5", + FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit6, + { "Duplicate MPDU", "ixveriwave.errors.bit6", + FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit7, + { "Bad_Sig: Bad flow magic number (includes bad flow crc16)", "ixveriwave.errors.bit7", + FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit8, + { "Bad flow payload checksum", "ixveriwave.errors.bit8", + FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit10, + { "Bad IP checksum error", "ixveriwave.errors.bit10", + FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, + + { &hf_radiotap_vw_errors_rx_2_bit11, + { "L4(TCP/ICMP/IGMP/UDP) checksum error", "ixveriwave.errors.bit11", + FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, + + { &hf_radiotap_vw_info, + { "Info field", "ixveriwave.info", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + /* tx info decodes for VW510021 and previous versions */ + { &hf_radiotap_vw_info_tx_bit10, + { "MPDU of A-MPDU", "ixveriwave.info.bit10", + FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, + + { &hf_radiotap_vw_info_tx_bit11, + { "First MPDU of A-MPDU", "ixveriwave.info.bit11", + FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, + + { &hf_radiotap_vw_info_tx_bit12, + { "Last MPDU of A-MPDU", "ixveriwave.info.bit12", + FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL } }, + + { &hf_radiotap_vw_info_tx_bit13, + { "MSDU of A-MSDU", "ixveriwave.info.bit13", + FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL } }, + + { &hf_radiotap_vw_info_tx_bit14, + { "First MSDU of A-MSDU", "ixveriwave.info.bit14", + FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL } }, + + { &hf_radiotap_vw_info_tx_bit15, + { "Last MSDU of A-MSDU", "ixveriwave.info.bit15", + FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } }, + /*v510006 uses bits */ + + /* rx info decodes for fpga ver VW510021 */ + { &hf_radiotap_vw_info_rx_2_bit8, + { "ACK withheld from frame", "ixveriwave.info.bit8", + FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit9, + { "Sent CTS to self before data", "ixveriwave.info.bit9", + FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit10, + { "MPDU of an A-MPDU", "ixveriwave.info.bit10", + FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit11, + { "First MPDU of A-MPDU", "ixveriwave.info.bit11", + FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit12, + { "Last MPDU of A-MPDU", "ixveriwave.info.bit12", + FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit13, + { "MSDU of A-MSDU", "ixveriwave.info.bit13", + FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit14, + { "First MSDU of A-MSDU", "ixveriwave.info.bit14", + FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL } }, + + { &hf_radiotap_vw_info_rx_2_bit15, + { "Last MSDU of A-MSDU", "ixveriwave.info.bit15", + FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } }, }; static gint *ett[] = { @@ -1519,6 +1452,7 @@ void proto_reg_handoff_ixveriwave(void) ieee80211_handle = find_dissector("wlan"); ieee80211_datapad_handle = find_dissector("wlan_datapad"); + ixveriwave_handle = create_dissector_handle(dissect_ixveriwave, proto_ixveriwave); dissector_add_uint("wtap_encap", WTAP_ENCAP_IXVERIWAVE, ixveriwave_handle); } |