aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2016-10-22 15:25:27 +0200
committerMichael Mann <mmann78@netscape.net>2016-10-25 22:45:23 +0000
commit2eb823fed721d768bc8484f83e068c61728873cf (patch)
tree366013814826d46fc567b6d3e2c9cb28ad21b5c6
parent00e21988690863fd3396845c4421a8879982a43a (diff)
l2tp: Dissect multiple Ericsson Transport Config Groups
... and put each group into a separate subtree. Also, put each item of a TEI to SC map into its own subtree. Change-Id: Id4cdaa883fa3eacdd53284b284bce5e67c97fcfb Reviewed-on: https://code.wireshark.org/review/18462 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
-rw-r--r--epan/dissectors/packet-l2tp.c65
1 files changed, 36 insertions, 29 deletions
diff --git a/epan/dissectors/packet-l2tp.c b/epan/dissectors/packet-l2tp.c
index 84ab019951..d4a1853e37 100644
--- a/epan/dissectors/packet-l2tp.c
+++ b/epan/dissectors/packet-l2tp.c
@@ -1736,31 +1736,46 @@ static int dissect_l2tp_broadband_avps(tvbuff_t *tvb, packet_info *pinfo _U_, pr
*/
/* Dissect a single variable-length Ericsson Transport Configuration Group */
-static int dissect_l2tp_ericsson_transp_cfg(tvbuff_t *tvb, proto_tree *tree)
+static int dissect_l2tp_ericsson_transp_cfg(tvbuff_t *tvb, proto_tree *parent_tree)
{
int offset = 0;
- guint32 num_sapis, i;
-
- proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_group_id, tvb, offset++, 1, ENC_NA);
- proto_tree_add_item_ret_uint(tree, hf_l2tp_ericsson_tcg_num_sapis, tvb, offset++, 1, ENC_NA, &num_sapis);
- for (i = 0; i < num_sapis; i++) {
- proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_sapi, tvb, offset++, 1, ENC_NA);
+ guint32 i, num_sapis;
+ proto_tree *tree;
+
+ while (tvb_reported_length_remaining(tvb, offset) >= 8) {
+ tree = proto_tree_add_subtree_format(parent_tree, tvb, 0, -1, ett_l2tp_ericsson_tcg,
+ NULL, "Transport Config Bundling Group");
+ proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_group_id, tvb, offset++, 1, ENC_NA);
+ proto_tree_add_item_ret_uint(tree, hf_l2tp_ericsson_tcg_num_sapis, tvb, offset++, 1, ENC_NA, &num_sapis);
+ for (i = 0; i < num_sapis; i++) {
+ proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_sapi, tvb, offset++, 1, ENC_NA);
+ }
+ proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_ip, tvb, offset, 4, ENC_NA);
+ offset += 4;
+ proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_dscp, tvb, offset++, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_crc32_enable, tvb, offset++, 1, ENC_NA);
+ /* Three more unknown bytes at the end of the group, like 05 01 2C */
+ offset += 3;
}
- proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_ip, tvb, offset, 4, ENC_NA);
- offset += 4;
- proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_dscp, tvb, offset++, 1, ENC_NA);
- proto_tree_add_item(tree, hf_l2tp_ericsson_tcg_crc32_enable, tvb, offset++, 1, ENC_NA);
return offset;
}
/* Dissect a single 3-byte Ericsson TEI-to-SC Map */
-static int dissect_l2tp_ericsson_tei_sc_map(tvbuff_t *tvb, proto_tree *tree)
+static int dissect_l2tp_ericsson_tei_sc_map(tvbuff_t *tvb, proto_tree *parent_tree)
{
- proto_tree_add_item(tree, hf_l2tp_ericsson_map_tei_low, tvb, 0, 1, ENC_NA);
- proto_tree_add_item(tree, hf_l2tp_ericsson_map_tei_high, tvb, 1, 1, ENC_NA);
- proto_tree_add_item(tree, hf_l2tp_ericsson_map_sc, tvb, 2, 1, ENC_NA);
- return 3;
+ int i = 0, offset = 0;
+ proto_tree *tree;
+
+ while (tvb_reported_length_remaining(tvb, offset) >= 3) {
+ tree = proto_tree_add_subtree_format(parent_tree, tvb, offset++, 3, ett_l2tp_ericsson_map,
+ NULL, "Transport Config Bundling Group %u", i);
+ proto_tree_add_item(tree, hf_l2tp_ericsson_map_tei_low, tvb, offset++, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_l2tp_ericsson_map_tei_high, tvb, offset++, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_l2tp_ericsson_map_sc, tvb, offset++, 1, ENC_NA);
+ i++;
+ }
+ return offset;
}
static int dissect_l2tp_ericsson_avps(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 ccid)
@@ -1771,8 +1786,7 @@ static int dissect_l2tp_ericsson_avps(tvbuff_t *tvb, packet_info *pinfo _U_, pro
guint16 avp_len;
guint16 ver_len_hidden;
guint32 msg_type;
- guint32 num_maps, i;
- proto_tree *l2tp_avp_tree, *l2tp_avp_tree_sub;
+ proto_tree *l2tp_avp_tree;
tvbuff_t *tcg_tvb;
ver_len_hidden = tvb_get_ntohs(tvb, offset);
@@ -1834,19 +1848,12 @@ static int dissect_l2tp_ericsson_avps(tvbuff_t *tvb, packet_info *pinfo _U_, pro
proto_tree_add_item(l2tp_avp_tree, hf_l2tp_ericsson_tc_num_groups, tvb, offset+2, 1, ENC_NA);
/* FIXME: iterate over multiple groups */
tcg_tvb = tvb_new_subset_length(tvb, offset+3, avp_len-3);
- l2tp_avp_tree_sub = proto_tree_add_subtree_format(l2tp_avp_tree, tvb, 0, -1, ett_l2tp_ericsson_tcg,
- NULL, "Transport Config Bundling Group");
- dissect_l2tp_ericsson_transp_cfg(tcg_tvb, l2tp_avp_tree_sub);
+ dissect_l2tp_ericsson_transp_cfg(tcg_tvb, l2tp_avp_tree);
break;
case ERICSSNN_TEI_TO_SC_MAP:
- proto_tree_add_item_ret_uint(l2tp_avp_tree, hf_l2tp_ericsson_tc_num_maps, tvb, offset++, 1, ENC_NA, &num_maps);
- /* iterate over multiple groups */
- for (i = 0; i < num_maps; i++) {
- tcg_tvb = tvb_new_subset_length(tvb, offset, 3);
- l2tp_avp_tree_sub = proto_tree_add_subtree_format(l2tp_avp_tree, tvb, 0, -1, ett_l2tp_ericsson_map,
- NULL, "Transport Config Bundling Group %u", i);
- offset += dissect_l2tp_ericsson_tei_sc_map(tcg_tvb, l2tp_avp_tree_sub);
- }
+ proto_tree_add_item(l2tp_avp_tree, hf_l2tp_ericsson_tc_num_maps, tvb, offset++, 1, ENC_NA);
+ tcg_tvb = tvb_new_subset_length(tvb, offset, avp_len);
+ offset += dissect_l2tp_ericsson_tei_sc_map(tcg_tvb, l2tp_avp_tree);
break;
default: