diff options
author | Christophe GUERBER <christophe.guerber@gmail.com> | 2018-12-30 15:07:41 +0100 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2018-12-31 09:20:47 +0000 |
commit | 63106bcf60dfcd1b6a95c7d4720e01a60c5d898b (patch) | |
tree | f689bdc0dd03714518c9f9be0915c1c55dbe4b25 /epan | |
parent | 7b0eee5bc53b445851f52180f3657209e50422ea (diff) |
Accept v1 of GeoNetworking and improve item tree
Accept version value 1 for geonetworking, dissect last 4 bytes of SHB
and traffic class as per EN 302 636-4.
Change-Id: I254e48f888aae063d2f4b5178c2e0eadc839f8ea
Reviewed-on: https://code.wireshark.org/review/31245
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-geonw.c | 93 |
1 files changed, 77 insertions, 16 deletions
diff --git a/epan/dissectors/packet-geonw.c b/epan/dissectors/packet-geonw.c index ada3dee2d1..045cfcb314 100644 --- a/epan/dissectors/packet-geonw.c +++ b/epan/dissectors/packet-geonw.c @@ -124,6 +124,10 @@ void proto_register_geonw(void); #define HTST_LS_REQUEST (HT_LS|HST_REQUEST) #define HTST_LS_REPLY (HT_LS|HST_REPLY) +#define HT_GET(ht) ((ht)&HT_MASK) +#define HST_GET(ht) ((ht)&HST_MASK) +#define IS_HT_KNOWN(ht) ((ht) <= 0x61) && (ht >= 0x10) && (HST_GET(ht) < 3) && ((HST_GET(ht) == 0) || ((HT_GET(ht) > 0x30) && ((HST_GET(ht) == 1) || ((HST_GET(ht) == 2) && (HT_GET(ht) < 0x43))))) + #define BH_LEN 4 #define BH_NH_COMMON_HDR 1 #define BH_NH_SECURED_PKT 2 @@ -242,6 +246,12 @@ static int hf_geonw_resp_to = -1; static int hf_geonw_no_resp = -1; static int hf_geonw_resptime = -1; +static int hf_geonw_dccmco = -1; +static int hf_geonw_dccmco_cbr_l_0_hop = -1; +static int hf_geonw_dccmco_cbr_l_1_hop = -1; +static int hf_geonw_dccmco_output_power = -1; +static int hf_geonw_dccmco_reserved = -1; + static gint ett_geonw = -1; static gint ett_geonw_bh = -1; static gint ett_geonw_bh_lt = -1; @@ -254,6 +264,7 @@ static gint ett_geonw_de = -1; static gint ett_geonw_de_add = -1; static gint ett_geonw_lsrq_add = -1; static gint ett_geonw_analysis = -1; +static gint ett_geonw_dccmco = -1; static gint ett_btpa = -1; static gint ett_btpb = -1; @@ -2128,6 +2139,7 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U guint32 tmp_val; gint offset = 0; proto_item *ti; + proto_item *top_item; gint hdr_len = 0; guint32 payload_len = 0; int reserved; @@ -2176,8 +2188,8 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U hdr_len = -1; } } - ti = proto_tree_add_item(tree, proto_geonw, tvb, 0, hdr_len, ENC_NA); - proto_tree *geonw_tree = proto_item_add_subtree(ti, ett_geonw); + top_item = proto_tree_add_item(tree, proto_geonw, tvb, 0, hdr_len, ENC_NA); + proto_tree *geonw_tree = proto_item_add_subtree(top_item, ett_geonw); // Basic Header subtree ti = proto_tree_add_item(geonw_tree, hf_geonw_bh, tvb, 0, 4, ENC_NA); @@ -2185,10 +2197,10 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U ti = proto_tree_add_item_ret_uint(geonw_bh_tree, hf_geonw_bh_version, tvb, offset, 1, ENC_BIG_ENDIAN, &tmp_val); geonwh->gnw_ver = tmp_val; - // Shall be 0 - if (tmp_val) { + // Shall be 0 or 1 + if (tmp_val > 1) { col_add_fstr(pinfo->cinfo, COL_INFO, - "Bogus GeoNetworking version (%u, must be 0)", tmp_val); + "Bogus GeoNetworking version (%u, must be less than 2)", tmp_val); expert_add_info_format(pinfo, ti, &ei_geonw_version_err, "Bogus GeoNetworking version"); return tvb_captured_length(tvb); } @@ -2300,9 +2312,9 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U } else { /* - * Now that we know that the total length of this IP datagram isn't + * Now that we know that the total length of this GNW datagram isn't * obviously bogus, adjust the length of this tvbuff to include only - * the IP datagram. + * the GNW datagram. */ set_actual_length(tvb, hdr_len + payload_len); } @@ -2330,6 +2342,13 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U } offset += 1; + // Stop here if header_type unknown + if (!IS_HT_KNOWN(header_type)) { + // XXX Update top level tree item + proto_item_set_end(top_item, tvb, offset); + return tvb_reported_length(tvb); + } + geonwh->gnw_sn = SN_MAX+1; proto_tree *geonw_sh_tree; @@ -2412,7 +2431,7 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U // XXX Is it possible to "follow" a station when updating its GN_ADDR? - if(geonw_analyze_seq && !(pinfo->fd->visited)) { + if(geonw_analyze_seq && (geonwh->gnw_ver==0) && !(pinfo->fd->visited)) { // Duplication detection uses SN and TST or only TST (see Annex A of ETSI EN 302 636-4-1) // We rely on address type and hashtable as this shall be done on a per station basis (i.e. not over a conversation) // We do not try to consider GN_ADDR updates (due to duplicate address detection or anonymous setting) @@ -2573,9 +2592,19 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U break; case HTST_TSB_SINGLE: // Reserved 32 bits - ti = proto_tree_add_item_ret_uint(geonw_sh_tree, hf_geonw_shb_reserved, tvb, offset, 4, ENC_BIG_ENDIAN, &reserved); + // See usage in 636-4 subpart 2 for ITS-5G + reserved = tvb_get_guint32(tvb, offset, ENC_BIG_ENDIAN); if (reserved) { - expert_add_info(pinfo, ti, &ei_geonw_nz_reserved); + ti = proto_tree_add_item(geonw_sh_tree, hf_geonw_dccmco, tvb, offset, 4, ENC_NA); + proto_tree *dccmco = proto_item_add_subtree(ti, ett_geonw_dccmco); + proto_tree_add_item(dccmco, hf_geonw_dccmco_cbr_l_0_hop, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(dccmco, hf_geonw_dccmco_cbr_l_1_hop, tvb, offset+1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(dccmco, hf_geonw_dccmco_output_power, tvb, offset+2, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(dccmco, hf_geonw_dccmco_reserved, tvb, offset+2, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(dccmco, hf_geonw_shb_reserved, tvb, offset+3, 1, ENC_BIG_ENDIAN); + } + else { + proto_tree_add_item(geonw_sh_tree, hf_geonw_shb_reserved, tvb, offset, 4, ENC_BIG_ENDIAN); } offset += 4; break; @@ -2658,6 +2687,7 @@ dissect_geonw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U //case HTST_BEACON: //case HTST_TSB_MULT: } + proto_item_set_end(top_item, tvb, offset); tap_queue_packet(geonw_tap, pinfo, geonwh); @@ -2914,6 +2944,14 @@ proto_register_geonw(void) { 0, NULL} }; + static const value_string traffic_classes_its_g5_names[] = { + { 0, "ITS-G5 Access Category Voice" }, + { 1, "ITS-G5 Access Category Video" }, + { 2, "ITS-G5 Access Category Best effort" }, + { 3, "ITS-G5 Access Category Background" }, + { 0, NULL } + }; + static const value_string itss_type_names[] = { { 0, "Unknown" }, { 1, "Pedestrian" }, @@ -3005,8 +3043,8 @@ proto_register_geonw(void) NULL, HFILL }}, { &hf_geonw_ch_tc_id, - { "Mobility", "geonw.ch.tc.id", - FT_UINT8, BASE_DEC, NULL, 0x3F, + { "Traffic class ID", "geonw.ch.tc.id", + FT_UINT8, BASE_DEC, VALS(traffic_classes_its_g5_names), 0x3F, NULL, HFILL }}, { &hf_geonw_ch_flags, @@ -3108,6 +3146,32 @@ proto_register_geonw(void) FT_UINT16, BASE_CUSTOM, CF_FUNC(display_heading), 0x00, NULL, HFILL }}, + // Decentralized Congestion Control - Multi Channel Operation + { &hf_geonw_dccmco, + { "Decentralized Congestion Control - Multi Channel Operation", "geonw.dccmco", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL }}, + + { &hf_geonw_dccmco_cbr_l_0_hop, + { "Local channel busy ratio", "geonw.cbr_l0hop", + FT_UINT8, BASE_DEC, NULL, 0x80, + NULL, HFILL }}, + + { &hf_geonw_dccmco_cbr_l_1_hop, + { "Max neighbouring CBR", "geonw.cbr_l1hop", + FT_UINT8, BASE_DEC, NULL, 0x80, + NULL, HFILL }}, + + { &hf_geonw_dccmco_output_power, + { "Output power", "geonw.outpower", + FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0xf8, + NULL, HFILL }}, + + { &hf_geonw_dccmco_reserved, + { "Reserved", "geonw.dccmco.reserved", + FT_UINT8, BASE_DEC, NULL, 0x07, + NULL, HFILL }}, + // Short Position { &hf_geonw_de_pv, { "Destination position", "geonw.dst_pos", @@ -3398,10 +3462,6 @@ proto_register_geonw(void) { "Hashed ID 8", "geonw.sec.hashedid8", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - //{ &hf_sgeonw_intx, - //{ "IntX", "geonw.sec.intx", FT_BYTES, BASE_NONE, NULL, 0x0, - //NULL, HFILL }}, - { &hf_sgeonw_encryption_parameter_nonce, { "Nonce", "geonw.sec.nonce", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, @@ -3475,6 +3535,7 @@ proto_register_geonw(void) &ett_geonw_de_add, &ett_geonw_lsrq_add, &ett_geonw_analysis, + &ett_geonw_dccmco, &ett_geonw_sec, // Secured packet &ett_sgeonw_hdr, // Parts (header, payload or trailer) subtree |