aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-isis-lsp.c
diff options
context:
space:
mode:
authorAnish Bhatt <anish@chelsio.com>2015-02-09 18:39:27 -0800
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2015-02-12 12:49:07 +0000
commit34acb73df1fe38c3b2a1ac4e9e7df74bacc3140c (patch)
treef49ec74f4d3a8defea43b0be3f59e36da889cc44 /epan/dissectors/packet-isis-lsp.c
parent60cc8b4fd8a8584bace71cb9cd2b59f9d450a0ce (diff)
[IS-IS-LSP] Add support for Prefix-SID subTLV
Bug: 10679 Change-Id: I4f2627aa22c64593258121a7e70b3f341e025d2e Reviewed-on: https://code.wireshark.org/review/7048 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-isis-lsp.c')
-rw-r--r--epan/dissectors/packet-isis-lsp.c147
1 files changed, 123 insertions, 24 deletions
diff --git a/epan/dissectors/packet-isis-lsp.c b/epan/dissectors/packet-isis-lsp.c
index b08c45daee..8a6e8089ed 100644
--- a/epan/dissectors/packet-isis-lsp.c
+++ b/epan/dissectors/packet-isis-lsp.c
@@ -170,9 +170,9 @@ static int hf_isis_lsp_adj_sid_local_flag = -1;
static int hf_isis_lsp_adj_sid_set_flag = -1;
static int hf_isis_lsp_adj_sid_weight = -1;
static int hf_isis_lsp_adj_sid_system_id = -1;
-static int hf_isis_lsp_adj_sid_sli_label = -1;
-static int hf_isis_lsp_adj_sid_sli_index = -1;
-static int hf_isis_lsp_adj_sid_sli_ipv6 = -1;
+static int hf_isis_lsp_sid_sli_label = -1;
+static int hf_isis_lsp_sid_sli_index = -1;
+static int hf_isis_lsp_sid_sli_ipv6 = -1;
static int hf_isis_lsp_spb_sr_bit = -1;
static int hf_isis_lsp_spb_spvid = -1;
/* Generated from convert_proto_tree_add_text.pl */
@@ -245,6 +245,16 @@ static int hf_isis_lsp_ext_is_reachability_len = -1;
static int hf_isis_lsp_ext_is_reachability_value = -1;
static int hf_isis_lsp_default_metric = -1;
static int hf_isis_lsp_ext_ip_reachability_distribution = -1;
+static int hf_isis_lsp_ext_ip_reachability_subclvs_len = -1;
+static int hf_isis_lsp_ext_ip_reachability_code = -1;
+static int hf_isis_lsp_ext_ip_reachability_len = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_flags = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_re_adv_flag = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_node_sid_flag = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_nophp_flag = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_expl_null_flag = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_value_flag = -1;
+static int hf_isis_lsp_ext_ip_reachability_prefix_local_flag = -1;
static int hf_isis_lsp_maximum_link_bandwidth = -1;
static int hf_isis_lsp_rt_capable_nickname_tree_root_priority = -1;
static int hf_isis_lsp_eis_neighbors_delay_metric = -1;
@@ -342,6 +352,7 @@ static gint ett_isis_lsp_clv_ext_ip_reachability = -1; /* CLV 135 */
static gint ett_isis_lsp_part_of_clv_ext_ip_reachability = -1;
static gint ett_isis_lsp_clv_ipv6_reachability = -1; /* CLV 236 */
static gint ett_isis_lsp_part_of_clv_ipv6_reachability = -1;
+static gint ett_isis_lsp_prefix_sid_flags = -1;
static gint ett_isis_lsp_clv_mt = -1;
static gint ett_isis_lsp_clv_mt_is = -1;
static gint ett_isis_lsp_part_of_clv_mt_is = -1;
@@ -390,6 +401,16 @@ static const int * adj_sid_flags[] = {
NULL,
};
+static const int * prefix_sid_flags[] = {
+ &hf_isis_lsp_ext_ip_reachability_prefix_re_adv_flag,
+ &hf_isis_lsp_ext_ip_reachability_prefix_node_sid_flag,
+ &hf_isis_lsp_ext_ip_reachability_prefix_nophp_flag,
+ &hf_isis_lsp_ext_ip_reachability_prefix_expl_null_flag,
+ &hf_isis_lsp_ext_ip_reachability_prefix_value_flag,
+ &hf_isis_lsp_ext_ip_reachability_prefix_local_flag,
+ NULL,
+};
+
static const true_false_string tfs_up_down = { "Up", "Down" };
static const true_false_string tfs_notsupported_supported = { "Not Supported", "Supported" };
static const true_false_string tfs_internal_external = { "Internal", "External" };
@@ -439,6 +460,13 @@ static const value_string isis_lsp_ext_is_reachability_code_vals[] = {
{ 0, NULL }
};
+static const value_string isis_lsp_ext_ip_reachability_code_vals[] = {
+ { 1, "32-bit Administrative Tag" },
+ { 2, "64-bit Administrative Tag" },
+ { 3, "Prefix-SID" },
+ { 0, NULL }
+};
+
/*
* Name: dissect_lsp_mt_id()
*
@@ -611,6 +639,7 @@ dissect_lsp_ip_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *t
static void
dissect_ipreach_subclv(tvbuff_t *tvb, proto_tree *tree, int offset, int clv_code, int clv_len)
{
+ guint8 flags;
switch (clv_code) {
case 1:
@@ -627,12 +656,25 @@ dissect_ipreach_subclv(tvbuff_t *tvb, proto_tree *tree, int offset, int clv_code
clv_len-=8;
}
break;
+ case 3:
+ flags = tvb_get_guint8(tvb, offset);
+ proto_tree_add_bitmask(tree, tvb, offset, hf_isis_lsp_ext_ip_reachability_prefix_flags,
+ ett_isis_lsp_prefix_sid_flags, prefix_sid_flags, ENC_BIG_ENDIAN);
+ offset++;
- default :
- proto_tree_add_text (tree, tvb, offset, clv_len+2,
- "Unknown Sub-TLV: code %u, length %u",
- clv_code, clv_len );
- break;
+ proto_tree_add_item(tree, hf_isis_lsp_clv_sr_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ if ((flags & 0xC) == 0xC) {
+ proto_tree_add_item(tree, hf_isis_lsp_sid_sli_label, tvb, offset, 3, ENC_BIG_ENDIAN);
+ offset += 3;
+ } else if (!(flags & 0xC)) {
+ proto_tree_add_item(tree, hf_isis_lsp_sid_sli_index, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset +=4;
+ }
+ break;
+ default :
+ break;
}
}
@@ -665,7 +707,8 @@ dissect_lsp_ext_ip_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tre
int offset, int id_length _U_, int length)
{
proto_tree *subtree = NULL;
- proto_tree *subtree2 = NULL;
+ proto_tree *subclv_tree = NULL;
+ proto_item *ti_subclvs = NULL;
guint8 ctrl_info;
guint bit_length;
int byte_length;
@@ -701,25 +744,30 @@ dissect_lsp_ext_ip_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tre
len = 5 + byte_length;
if ((ctrl_info & 0x40) != 0) {
subclvs_len = tvb_get_guint8(tvb, offset+len);
- subtree2 = proto_tree_add_subtree_format(subtree, tvb, offset+len, subclvs_len+1,
- ett_isis_lsp_clv_ip_reach_subclv, NULL,
- "sub-TLVs present, total length: %u bytes", subclvs_len);
+ proto_tree_add_item(subtree, hf_isis_lsp_ext_ip_reachability_subclvs_len, tvb, offset+len, 1, ENC_BIG_ENDIAN);
i =0;
while (i < subclvs_len) {
clv_code = tvb_get_guint8(tvb, offset+len+1); /* skip the total subtlv len indicator */
clv_len = tvb_get_guint8(tvb, offset+len+2);
+ subclv_tree = proto_tree_add_subtree(subtree, tvb, offset+len+1, clv_len + 2,
+ ett_isis_lsp_clv_ip_reach_subclv,
+ &ti_subclvs, "subTLV");
+ proto_tree_add_item(subclv_tree, hf_isis_lsp_ext_ip_reachability_code,
+ tvb, offset+len+1, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subclv_tree, hf_isis_lsp_ext_ip_reachability_len, tvb, offset+len+2, 1, ENC_BIG_ENDIAN);
+ proto_item_append_text(ti_subclvs, ": %s (c=%u, l=%u)", val_to_str(clv_code, isis_lsp_ext_ip_reachability_code_vals, "Unknown"), clv_code, clv_len);
/*
* we pass on now the raw data to the ipreach_subtlv dissector
* therefore we need to skip 3 bytes
* (total subtlv len, subtlv type, subtlv len)
*/
- dissect_ipreach_subclv(tvb, subtree2, offset+len+3, clv_code, clv_len);
+ dissect_ipreach_subclv(tvb, subclv_tree, offset+len+3, clv_code, clv_len);
i += clv_len + 2;
}
len += 1 + subclvs_len;
} else {
- proto_tree_add_text (subtree, tvb, offset+4, len, "no sub-TLVs present");
+ proto_tree_add_uint_format(subtree, hf_isis_lsp_ext_ip_reachability_subclvs_len, tvb, offset, len, 0, "no sub-TLVs present");
}
offset += len;
@@ -2326,19 +2374,19 @@ dissect_subclv_adj_sid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
if (!((flags & 0x30) == 0x30))
proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_malformed_subtlv, tvb,
local_offset, sublen, "V & L flags must be set");
- proto_tree_add_item(tree, hf_isis_lsp_adj_sid_sli_label, tvb, offset, sli_len, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_isis_lsp_sid_sli_label, tvb, offset, sli_len, ENC_BIG_ENDIAN);
break;
case 4:
if (flags & 0x30)
proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_malformed_subtlv, tvb,
local_offset, sublen, "V & L flags must be unset");
- proto_tree_add_item(tree, hf_isis_lsp_adj_sid_sli_index, tvb, offset, sli_len, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_isis_lsp_sid_sli_index, tvb, offset, sli_len, ENC_BIG_ENDIAN);
break;
case 16:
if (!(flags & 0x20))
proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_malformed_subtlv, tvb,
local_offset, sublen, "V flag must be set");
- ti = proto_tree_add_item(tree, hf_isis_lsp_adj_sid_sli_ipv6, tvb, offset, sli_len, ENC_NA);
+ ti = proto_tree_add_item(tree, hf_isis_lsp_sid_sli_ipv6, tvb, offset, sli_len, ENC_NA);
/* L flag set */
if (flags & 0x10)
proto_item_append_text(ti, "Globally unique");
@@ -3432,20 +3480,20 @@ proto_register_isis_lsp(void)
NULL, HFILL }
},
- { &hf_isis_lsp_adj_sid_sli_label,
- { "SID/Label/Index", "isis.lsp.adj_sid.sli_label",
+ { &hf_isis_lsp_sid_sli_label,
+ { "SID/Label/Index", "isis.lsp.sid.sli_label",
FT_UINT24, BASE_DEC, NULL, 0xFFFFF,
NULL, HFILL }
},
- { &hf_isis_lsp_adj_sid_sli_index,
- { "SID/Label/Index", "isis.lsp.adj_sid.sli_index",
- FT_UINT64, BASE_HEX, NULL, 0x0,
+ { &hf_isis_lsp_sid_sli_index,
+ { "SID/Label/Index", "isis.lsp.sid.sli_index",
+ FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_isis_lsp_adj_sid_sli_ipv6,
- { "SID/Label/Index", "isis.lsp.adj_sid.sli_ipv6",
+ { &hf_isis_lsp_sid_sli_ipv6,
+ { "SID/Label/Index", "isis.lsp.sid.sli_ipv6",
FT_IPv6, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
@@ -3498,6 +3546,56 @@ proto_register_isis_lsp(void)
FT_UINT8, BASE_DEC, NULL, 0x3F,
NULL, HFILL }
},
+ { &hf_isis_lsp_ext_ip_reachability_subclvs_len,
+ { "SubCLV Length", "isis.lsp.ext_ip_reachability.subclvs_length",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_code,
+ { "Code", "isis.lsp.ext_ip_reachability.code",
+ FT_UINT8, BASE_DEC, VALS(isis_lsp_ext_ip_reachability_code_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_len,
+ { "Length", "isis.lsp.ext_ip_reachability.length",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_flags,
+ { "Flags", "isis.lsp.ext_ip_reachability.prefix_sid.flags",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_re_adv_flag,
+ { "Re-advertisement", "isis.lsp.ext_ip_reachability.prefix_sid.flags.r",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_node_sid_flag,
+ { "Node-SID", "isis.lsp.ext_ip_reachability.prefix_sid.flags.n",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x40,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_nophp_flag,
+ { "no-PHP", "isis.lsp.ext_ip_reachability.prefix_sid.flags.p",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x20,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_expl_null_flag,
+ { "Explicit-Null", "isis.lsp.ext_ip_reachability.prefix_sid.flags.e",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x10,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_value_flag,
+ { "Value", "isis.lsp.ext_ip_reachability.prefix_sid.flags.v",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x8,
+ NULL, HFILL }
+ },
+ { &hf_isis_lsp_ext_ip_reachability_prefix_local_flag,
+ { "Local", "isis.lsp.ext_ip_reachability.prefix_sid.flags.l",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x4,
+ NULL, HFILL }
+ },
{ &hf_isis_lsp_32_bit_administrative_tag,
{ "32-Bit Administrative tag", "isis.lsp.32_bit_administrative_tag",
FT_UINT32, BASE_HEX_DEC, NULL, 0x0,
@@ -4152,6 +4250,7 @@ proto_register_isis_lsp(void)
&ett_isis_lsp_clv_ip_reach_subclv,
&ett_isis_lsp_clv_ext_ip_reachability, /* CLV 135 */
&ett_isis_lsp_part_of_clv_ext_ip_reachability,
+ &ett_isis_lsp_prefix_sid_flags,
&ett_isis_lsp_clv_ipv6_reachability, /* CLV 236 */
&ett_isis_lsp_part_of_clv_ipv6_reachability,
&ett_isis_lsp_clv_mt,