Ethereal-dev: Re: [Ethereal-dev] [PATCH] SNA Update
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Jochen Friedrich <jochen+ethereal@xxxxxxxx>
Date: Sun, 2 Mar 2003 21:11:23 +0100 (CET)
Hi Guy, > I checked for "tvb_remaining_length(tvb, llc_header_len)" instead - > checking "tvb_offset_exists(tvb, llc_header_len + 1)" requires that > there be at least *two* bytes starting at "llc_header_len" (the one at > "llc_header_len" and the one at "llc_header_len + 1"), but one > should be sufficient. > > The same should perhaps be done in the SNA dissector: Right. This fixes this and corrects XID type 3 dissecting (2 fields had been added to the wrong tree and some bitfields have been missing). Thanks, --jochen
Index: packet-sna.c =================================================================== RCS file: /cvsroot/ethereal/packet-sna.c,v retrieving revision 1.44 diff -u -r1.44 packet-sna.c --- packet-sna.c 13 Feb 2003 00:47:42 -0000 1.44 +++ packet-sna.c 2 Mar 2003 21:35:48 -0000 @@ -226,8 +226,19 @@ static int hf_sna_xid_3_pbn = -1; static int hf_sna_xid_3_pacing = -1; static int hf_sna_xid_3_11 = -1; +static int hf_sna_xid_3_tgshare = -1; +static int hf_sna_xid_3_dedsvc = -1; static int hf_sna_xid_3_12 = -1; +static int hf_sna_xid_3_negcsup = -1; +static int hf_sna_xid_3_negcomp = -1; static int hf_sna_xid_3_15 = -1; +static int hf_sna_xid_3_partg = -1; +static int hf_sna_xid_3_dlur = -1; +static int hf_sna_xid_3_dlus = -1; +static int hf_sna_xid_3_exbn = -1; +static int hf_sna_xid_3_genodai = -1; +static int hf_sna_xid_3_branch = -1; +static int hf_sna_xid_3_brnn = -1; static int hf_sna_xid_3_tg = -1; static int hf_sna_xid_3_dlc = -1; static int hf_sna_xid_3_dlen = -1; @@ -555,6 +566,14 @@ { 0x0, NULL } }; +static const value_string sna_xid_3_branch_vals[] = { + { 0x00, "Sender does not support branch extender" }, + { 0x01, "TG is branch uplink" }, + { 0x02, "TG is branch downlink" }, + { 0x03, "TG is neither uplink nor downlink" }, + { 0x0, NULL } +}; + static const value_string sna_xid_type_vals[] = { { 0x01, "T1 node" }, { 0x02, "T2.0 or T2.1 node" }, @@ -831,7 +850,7 @@ offset = 8; - while (tvb_offset_exists(tvb, offset+1)) { + while (tvb_offset_exists(tvb, offset)) { len = tvb_get_guint8(tvb, offset+0); if (len) { dissect_control(tvb_new_subset(tvb, offset, len, -1), @@ -842,6 +861,7 @@ pad-len, "Padding"); offset += pad; } else { + /* Avoid endless loop */ return; } } @@ -877,7 +897,7 @@ tvb, 8, 4, FALSE); proto_tree_add_text(tree, tvb, 12, 8, "Reserved"); - if (tvb_offset_exists(tvb, offset+1)) + if (tvb_offset_exists(tvb, offset)) call_dissector(data_handle, tvb_new_subset(tvb, 4, -1, -1), pinfo, tree); } @@ -899,7 +919,7 @@ return; proto_tree_add_item(tree, hf_sna_nlp_opti_0f_bits, tvb, 2, 2, FALSE); - if (tvb_offset_exists(tvb, 5)) + if (tvb_offset_exists(tvb, 4)) call_dissector(data_handle, tvb_new_subset(tvb, 4, -1, -1), pinfo, tree); } @@ -912,7 +932,7 @@ proto_tree_add_text(tree, tvb, 2, 2, "Reserved"); proto_tree_add_item(tree, hf_sna_nlp_opti_10_tcid, tvb, 4, 8, FALSE); - if (tvb_offset_exists(tvb, 13)) + if (tvb_offset_exists(tvb, 12)) call_dissector(data_handle, tvb_new_subset(tvb, 12, -1, -1), pinfo, tree); } @@ -1092,11 +1112,11 @@ proto_tree_add_item(tree, hf_sna_nlp_opti_22_field4, tvb, 16, 4, FALSE); - if (tvb_offset_exists(tvb, 21)) + if (tvb_offset_exists(tvb, 20)) call_dissector(data_handle, tvb_new_subset(tvb, 20, -1, -1), pinfo, tree); } else { - if (tvb_offset_exists(tvb, 13)) + if (tvb_offset_exists(tvb, 12)) call_dissector(data_handle, tvb_new_subset(tvb, 12, -1, -1), pinfo, tree); } @@ -1114,7 +1134,7 @@ offset = 0; - while (tvb_offset_exists(tvb, offset+1)) { + while (tvb_offset_exists(tvb, offset)) { len = tvb_get_guint8(tvb, offset); type = tvb_get_guint8(tvb, offset+1); @@ -1263,7 +1283,7 @@ tvb, index, 1, nhdr_x); index ++; - if (tvb_offset_exists(tvb, index+1)) + if (tvb_offset_exists(tvb, index)) call_dissector(data_handle, tvb_new_subset(tvb, index, -1, -1), pinfo, parent_tree); @@ -1361,14 +1381,14 @@ if (((thdr_8 & 0x20) == 0) && thdr_dlf) { if (check_col(pinfo->cinfo, COL_INFO)) col_add_str(pinfo->cinfo, COL_INFO, "HPR Fragment"); - if (tvb_offset_exists(tvb, index+1)) { + if (tvb_offset_exists(tvb, index)) { call_dissector(data_handle, tvb_new_subset(tvb, index, -1, -1), pinfo, parent_tree); } return; } - if (tvb_offset_exists(tvb, index+1)) { + if (tvb_offset_exists(tvb, index)) { /* Transmission Header Format Identifier */ fid = hi_nibble(tvb_get_guint8(tvb, index)); if (fid == 5) /* Only FID5 allowed for HPR */ @@ -1417,7 +1437,7 @@ offset = dlen; - while (tvb_offset_exists(tvb, offset+1)) { + while (tvb_offset_exists(tvb, offset)) { dlen = tvb_get_guint8(tvb, offset+1); dissect_control(tvb_new_subset(tvb, offset, dlen+2, -1), tree, 0, KL); @@ -1439,54 +1459,60 @@ val = tvb_get_ntohs(tvb, 2); - sub_ti = proto_tree_add_item(tree, hf_sna_xid_3_8, tvb, - 2, 2, FALSE); + sub_ti = proto_tree_add_uint(tree, hf_sna_xid_3_8, tvb, + 2, 2, val); sub_tree = proto_item_add_subtree(sub_ti, ett_sna_xid_3_8); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_init_self, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_init_self, tvb, 2, 2, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_stand_bind, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_stand_bind, tvb, 2, 2, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_gener_bind, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_gener_bind, tvb, 2, 2, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_recve_bind, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_recve_bind, tvb, 2, 2, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_actpu, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_nwnode, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_cp, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_cpcp, tvb, 2, 1, val); - proto_tree_add_uint(sub_tree, hf_sna_xid_3_state, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_nonact, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_cpchange, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_actpu, tvb, 2, 2, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_nwnode, tvb, 2, 2, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_cp, tvb, 2, 2, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_cpcp, tvb, 2, 2, val); + proto_tree_add_uint(sub_tree, hf_sna_xid_3_state, tvb, 2, 2, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_nonact, tvb, 2, 2, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_cpchange, tvb, 2, 2, val); val = tvb_get_guint8(tvb, 4); - sub_ti = proto_tree_add_item(tree, hf_sna_xid_3_10, tvb, - 4, 1, FALSE); + sub_ti = proto_tree_add_uint(tree, hf_sna_xid_3_10, tvb, + 4, 1, val); sub_tree = proto_item_add_subtree(sub_ti, ett_sna_xid_3_10); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_asend_bind, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_asend_bind, tvb, 4, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_arecv_bind, tvb, 2, 1, + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_arecv_bind, tvb, 4, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_quiesce, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_pucap, tvb, 2, 1, val); - proto_tree_add_boolean(sub_tree, hf_sna_xid_3_pbn, tvb, 2, 1, val); - proto_tree_add_uint(sub_tree, hf_sna_xid_3_pacing, tvb, 2, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_quiesce, tvb, 4, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_pucap, tvb, 4, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_pbn, tvb, 4, 1, val); + proto_tree_add_uint(sub_tree, hf_sna_xid_3_pacing, tvb, 4, 1, val); val = tvb_get_guint8(tvb, 5); - sub_ti = proto_tree_add_item(tree, hf_sna_xid_3_11, tvb, - 5, 1, FALSE); + sub_ti = proto_tree_add_uint(tree, hf_sna_xid_3_11, tvb, + 5, 1, val); sub_tree = proto_item_add_subtree(sub_ti, ett_sna_xid_3_11); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_tgshare, tvb, 5, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_dedsvc, tvb, 5, 1, val); + val = tvb_get_guint8(tvb, 6); sub_ti = proto_tree_add_item(tree, hf_sna_xid_3_12, tvb, 6, 1, FALSE); sub_tree = proto_item_add_subtree(sub_ti, ett_sna_xid_3_12); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_negcsup, tvb, 6, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_negcomp, tvb, 6, 1, val); + proto_tree_add_text(tree, tvb, 7, 2, "Reserved"); val = tvb_get_guint8(tvb, 9); @@ -1495,18 +1521,26 @@ 9, 1, FALSE); sub_tree = proto_item_add_subtree(sub_ti, ett_sna_xid_3_15); - proto_tree_add_item(sub_tree, hf_sna_xid_3_tg, tvb, 10, 1, FALSE); - proto_tree_add_item(sub_tree, hf_sna_xid_3_dlc, tvb, 11, 1, FALSE); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_partg, tvb, 9, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_dlur, tvb, 9, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_dlus, tvb, 9, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_exbn, tvb, 9, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_genodai, tvb, 9, 1, val); + proto_tree_add_uint(sub_tree, hf_sna_xid_3_branch, tvb, 9, 1, val); + proto_tree_add_boolean(sub_tree, hf_sna_xid_3_brnn, tvb, 9, 1, val); + + proto_tree_add_item(tree, hf_sna_xid_3_tg, tvb, 10, 1, FALSE); + proto_tree_add_item(tree, hf_sna_xid_3_dlc, tvb, 11, 1, FALSE); dlen = tvb_get_guint8(tvb, 12); - proto_tree_add_uint(sub_tree, hf_sna_xid_3_dlen, tvb, 12, 1, dlen); + proto_tree_add_uint(tree, hf_sna_xid_3_dlen, tvb, 12, 1, dlen); /* FIXME: DLC Dependent Data Go Here */ offset = 12 + dlen; - while (tvb_offset_exists(tvb, offset+1)) { + while (tvb_offset_exists(tvb, offset)) { dlen = tvb_get_guint8(tvb, offset+1); dissect_control(tvb_new_subset(tvb, offset, dlen+2, -1), tree, 0, KL); @@ -1582,7 +1616,7 @@ if (format == 0) len = 6; - if (tvb_offset_exists(tvb, len+1)) + if (tvb_offset_exists(tvb, len)) call_dissector(data_handle, tvb_new_subset(tvb, len, -1, -1), pinfo, parent_tree); } @@ -2211,7 +2245,7 @@ rh_offset += RH_LEN; - if (tvb_offset_exists(rh_tvb, rh_offset+1)) { + if (tvb_offset_exists(rh_tvb, rh_offset)) { /* Short-circuit ? */ if (continue_dissecting == rh_only) { if (tree) @@ -2346,7 +2380,7 @@ offset = 4; - while (tvb_offset_exists(tvb, offset+1)) { + while (tvb_offset_exists(tvb, offset)) { if (parse == LT) { len = tvb_get_guint8(tvb, offset+0); } else { @@ -2519,7 +2553,7 @@ } offset += length; } - if (tvb_offset_exists(tvb, offset+1)) + if (tvb_offset_exists(tvb, offset)) call_dissector(data_handle, tvb_new_subset(tvb, offset, -1, -1), pinfo, parent_tree); }; @@ -3361,13 +3395,68 @@ { "XID Type 3 Byte 11", "sna.xid.type3.11", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }}, + { &hf_sna_xid_3_tgshare, + { "TG Sharing Prohibited Indicator", + "sna.xid.type3.tgshare", FT_BOOLEAN, 8, NULL, 0x40, + "", HFILL }}, + + { &hf_sna_xid_3_dedsvc, + { "Dedicated SVC Idicator", + "sna.xid.type3.dedsvc", FT_BOOLEAN, 8, NULL, 0x20, + "", HFILL }}, + { &hf_sna_xid_3_12, { "XID Type 3 Byte 12", "sna.xid.type3.12", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }}, + { &hf_sna_xid_3_negcsup, + { "Negotiation Complete Supported", + "sna.xid.type3.negcsup", FT_BOOLEAN, 8, NULL, 0x80, + "", HFILL }}, + + { &hf_sna_xid_3_negcomp, + { "Negotiation Complete", + "sna.xid.type3.negcomp", FT_BOOLEAN, 8, NULL, 0x40, + "", HFILL }}, + { &hf_sna_xid_3_15, { "XID Type 3 Byte 15", "sna.xid.type3.15", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }}, + + { &hf_sna_xid_3_partg, + { "Parallel TG Support", + "sna.xid.type3.partg", FT_BOOLEAN, 8, NULL, 0x80, + "", HFILL }}, + + { &hf_sna_xid_3_dlur, + { "Dependent LU Requester Indicator", + "sna.xid.type3.dlur", FT_BOOLEAN, 8, NULL, 0x40, + "", HFILL }}, + + { &hf_sna_xid_3_dlus, + { "DLUS Served LU Registration Indicator", + "sna.xid.type3.dlus", FT_BOOLEAN, 8, NULL, 0x20, + "", HFILL }}, + + { &hf_sna_xid_3_exbn, + { "Extended HPR Border Node", + "sna.xid.type3.exbn", FT_BOOLEAN, 8, NULL, 0x10, + "", HFILL }}, + + { &hf_sna_xid_3_genodai, + { "Generalized ODAI Usage Option", + "sna.xid.type3.genodai", FT_BOOLEAN, 8, NULL, 0x08, + "", HFILL }}, + + { &hf_sna_xid_3_branch, + { "Branch Indicator", "sna.xid.type3.branch", + FT_UINT8, BASE_HEX, VALS(sna_xid_3_branch_vals), + 0x06, "", HFILL }}, + + { &hf_sna_xid_3_brnn, + { "Option Set 1123 Indicator", + "sna.xid.type3.brnn", FT_BOOLEAN, 8, NULL, 0x01, + "", HFILL }}, { &hf_sna_xid_3_tg, { "XID TG", "sna.xid.type3.tg", FT_UINT8, BASE_HEX, NULL, 0x0,
- Follow-Ups:
- Re: [Ethereal-dev] [PATCH] SNA Update
- From: Guy Harris
- Re: [Ethereal-dev] [PATCH] SNA Update
- Prev by Date: Re: [Ethereal-dev] "make distcheck" failure
- Next by Date: Re: [Ethereal-dev] [PATCH] SNA Update
- Previous by thread: Re: [Ethereal-dev] New dissector: HP rboot
- Next by thread: Re: [Ethereal-dev] [PATCH] SNA Update
- Index(es):