aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2001-05-14 18:40:17 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2001-05-14 18:40:17 +0000
commit0c095a61166bab5a5a04e64cf432ad0422d9d150 (patch)
tree533a825b7fdfc509ef398f186f84adb049b9717d
parent62dd07a3251efaf8b7226f1749874d98f6cda721 (diff)
Various ISIS improvements (ISIS IPv6 routing TLV dissection, ISIS
traffic engineering TLV dissection, IS neighbor and IP reachability TLVs given their own subtree types), from Jean-Christian Pennetier. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@3413 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r--AUTHORS7
-rw-r--r--doc/ethereal.pod.template1
-rw-r--r--packet-isis-clv.c45
-rw-r--r--packet-isis-clv.h4
-rw-r--r--packet-isis-hello.c54
-rw-r--r--packet-isis-hello.h5
-rw-r--r--packet-isis-lsp.c470
-rw-r--r--packet-isis-lsp.h10
8 files changed, 589 insertions, 7 deletions
diff --git a/AUTHORS b/AUTHORS
index 8a00c21a49..6b71bca8db 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -618,6 +618,13 @@ Juan Toledo <toledo@users.sourceforge.net> {
Passive FTP support
}
+Jean-Christian Pennetier <jeanchristian.pennetier@rd.francetelecom.fr> {
+ ISIS IPv6 routing TLV dissection
+ ISIS traffic engineering TLV dissection
+ IS neighbor and IP reachability TLVs given their own subtree
+ types
+}
+
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to
give his permission to use his version of snprintf.c.
diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template
index 49715c792a..afffb7246e 100644
--- a/doc/ethereal.pod.template
+++ b/doc/ethereal.pod.template
@@ -1102,6 +1102,7 @@ B<http://www.ethereal.com>.
Michael Rozhavsky <mike@tochna.technion.ac.il>
Scott Renfro <scott@renfro.org>
Juan Toledo <toledo@users.sourceforge.net>
+ Jean-Christian Pennetier <jeanchristian.pennetier@rd.francetelecom.fr>
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to give his
permission to use his version of snprintf.c.
diff --git a/packet-isis-clv.c b/packet-isis-clv.c
index 71ce3153d5..8b5253a043 100644
--- a/packet-isis-clv.c
+++ b/packet-isis-clv.c
@@ -1,7 +1,7 @@
/* packet-isis-clv.c
* Common CLV decode routines.
*
- * $Id: packet-isis-clv.c,v 1.10 2001/04/16 10:04:30 guy Exp $
+ * $Id: packet-isis-clv.c,v 1.11 2001/05/14 18:40:15 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@@ -263,6 +263,49 @@ isis_dissect_ip_int_clv(const u_char *pd, int offset,
}
}
+/*
+ * Name: isis_dissect_ipv6_int_clv()
+ *
+ * Description:
+ * Take apart the CLV that lists all the IPv6 interfaces. The
+ * meaning of which is slightly different for the different base packet
+ * types, but the display is not different. What we have is n ip
+ * addresses, plain and simple.
+ *
+ * Input:
+ * u_char * : packet data
+ * int : offset into packet data where we are.
+ * guint : length of clv we are decoding
+ * frame_data * : frame data (complete frame)
+ * proto_tree * : protocol display tree to fill out. May be NULL
+ * gint : tree id to use for proto tree.
+ *
+ * Output:
+ * void, but we will add to proto tree if !NULL.
+ */
+void
+isis_dissect_ipv6_int_clv(const u_char *pd, int offset,
+ guint length, frame_data *fd, proto_tree *tree, gint tree_id ) {
+ guint8 addr [16];
+
+ if ( length <= 0 ) {
+ return;
+ }
+
+ while ( length > 0 ) {
+ if ( length < 16 ) {
+ isis_dissect_unknown(offset, length, tree, fd,
+ "Short IPv6 interface address (%d vs 16)",length );
+ return;
+ }
+ memcpy(addr, &pd[offset], sizeof(addr));
+ if ( tree ) {
+ proto_tree_add_ipv6(tree, tree_id, NullTVB, offset, 16, addr);
+ }
+ offset += 16;
+ length -= 16;
+ }
+}
/*
* Name: isis_dissect_te_router_id_clv()
diff --git a/packet-isis-clv.h b/packet-isis-clv.h
index e9f1a6adc1..b03a89ef5e 100644
--- a/packet-isis-clv.h
+++ b/packet-isis-clv.h
@@ -1,7 +1,7 @@
/* packet-isis-clv.h
* Declares for common clv decoding functions.
*
- * $Id: packet-isis-clv.h,v 1.4 2001/04/16 10:04:30 guy Exp $
+ * $Id: packet-isis-clv.h,v 1.5 2001/05/14 18:40:15 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@@ -54,6 +54,8 @@ extern void isis_dissect_authentication_clv(const u_char *pd, int offset,
guint length, frame_data *fd, proto_tree *tree, char *meaning);
extern void isis_dissect_ip_int_clv(const u_char *pd, int offset,
guint length, frame_data *fd, proto_tree *tree, gint tree_id );
+extern void isis_dissect_ipv6_int_clv(const u_char *pd, int offset,
+ guint length, frame_data *fd, proto_tree *tree, gint tree_id );
extern void isis_dissect_nlpid_clv(const u_char *pd, int offset,
guint length, frame_data *fd, proto_tree *tree );
extern void isis_dissect_hostname_clv(const u_char *pd, int offset,
diff --git a/packet-isis-hello.c b/packet-isis-hello.c
index bad5793564..14670067e5 100644
--- a/packet-isis-hello.c
+++ b/packet-isis-hello.c
@@ -1,7 +1,7 @@
/* packet-isis-hello.c
* Routines for decoding isis hello packets and their CLVs
*
- * $Id: packet-isis-hello.c,v 1.13 2001/04/16 10:04:30 guy Exp $
+ * $Id: packet-isis-hello.c,v 1.14 2001/05/14 18:40:15 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@@ -53,6 +53,7 @@ static int hf_isis_hello_priority_reserved = -1;
static int hf_isis_hello_lan_id = -1;
static int hf_isis_hello_local_circuit_id = -1;
static int hf_isis_hello_clv_ipv4_int_addr = -1;
+static int hf_isis_hello_clv_ipv6_int_addr = -1;
static gint ett_isis_hello = -1;
static gint ett_isis_hello_clv_area_addr = -1;
@@ -62,6 +63,7 @@ static gint ett_isis_hello_clv_unknown = -1;
static gint ett_isis_hello_clv_nlpid = -1;
static gint ett_isis_hello_clv_auth = -1;
static gint ett_isis_hello_clv_ipv4_int_addr = -1;
+static gint ett_isis_hello_clv_ipv6_int_addr = -1;
static const value_string isis_hello_circuit_type_vals[] = {
{ ISIS_HELLO_TYPE_RESERVED, "Reserved 0 (discard PDU)"},
@@ -83,6 +85,8 @@ static void dissect_hello_nlpid_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_hello_ip_int_addr_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
+static void dissect_hello_ipv6_int_addr_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_hello_auth_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
@@ -118,6 +122,12 @@ static const isis_clv_handle_t clv_l1_hello_opts[] = {
dissect_hello_ip_int_addr_clv
},
{
+ ISIS_CLV_L1H_IPv6_INTERFACE_ADDR,
+ "IPv6 Interface address(es)",
+ &ett_isis_hello_clv_ipv6_int_addr,
+ dissect_hello_ipv6_int_addr_clv
+ },
+ {
ISIS_CLV_L1H_AUTHENTICATION_NS,
"Authentication(non spec)",
&ett_isis_hello_clv_auth,
@@ -169,6 +179,12 @@ static const isis_clv_handle_t clv_l2_hello_opts[] = {
dissect_hello_ip_int_addr_clv
},
{
+ ISIS_CLV_L2H_IPv6_INTERFACE_ADDR,
+ "IPv6 Interface address(es)",
+ &ett_isis_hello_clv_ipv6_int_addr,
+ dissect_hello_ipv6_int_addr_clv
+ },
+ {
ISIS_CLV_L2H_AUTHENTICATION_NS,
"Authentication(non spec)",
&ett_isis_hello_clv_auth,
@@ -214,6 +230,12 @@ static const isis_clv_handle_t clv_ptp_hello_opts[] = {
dissect_hello_ip_int_addr_clv
},
{
+ ISIS_CLV_PTP_IPv6_INTERFACE_ADDR,
+ "IPv6 Interface address(es)",
+ &ett_isis_hello_clv_ipv6_int_addr,
+ dissect_hello_ipv6_int_addr_clv
+ },
+ {
ISIS_CLV_PTP_AUTHENTICATION_NS,
"Authentication(non spec)",
&ett_isis_hello_clv_auth,
@@ -283,6 +305,31 @@ dissect_hello_ip_int_addr_clv(const u_char *pd, int offset,
}
/*
+ * Name: dissect_hello_ipv6_int_addr_clv()
+ *
+ * Description:
+ * Decode for a hello packets ipv6 interface addr clv. Calls into the
+ * clv common one.
+ *
+ * Input:
+ * u_char * : packet data
+ * int : current offset into packet data
+ * guint : length of this clv
+ * int : length of IDs in packet.
+ * frame_data * : frame data
+ * proto_tree * : proto tree to build on (may be null)
+ *
+ * Output:
+ * void, will modify proto_tree if not null.
+ */
+static void
+dissect_hello_ipv6_int_addr_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree) {
+ isis_dissect_ipv6_int_clv(pd, offset, length, fd, tree,
+ hf_isis_hello_clv_ipv6_int_addr );
+}
+
+/*
* Name: dissect_hello_auth_clv()
*
* Description:
@@ -578,6 +625,10 @@ proto_register_isis_hello(void) {
{ "IPv4 interface address ", "isis_hello.clv_ipv4_int_addr",
FT_IPv4, BASE_NONE, NULL, 0x0, "" }},
+ { &hf_isis_hello_clv_ipv6_int_addr,
+ { "IPv6 interface address ", "isis_hello.clv_ipv6_int_addr",
+ FT_IPv6, BASE_NONE, NULL, 0x0, "" }},
+
};
static gint *ett[] = {
&ett_isis_hello,
@@ -588,6 +639,7 @@ proto_register_isis_hello(void) {
&ett_isis_hello_clv_nlpid,
&ett_isis_hello_clv_auth,
&ett_isis_hello_clv_ipv4_int_addr,
+ &ett_isis_hello_clv_ipv6_int_addr
};
proto_isis_hello = proto_register_protocol("ISIS HELLO",
diff --git a/packet-isis-hello.h b/packet-isis-hello.h
index d1cfd2999b..4e9c67054a 100644
--- a/packet-isis-hello.h
+++ b/packet-isis-hello.h
@@ -1,7 +1,7 @@
/* packet-isis-hello.h
* Declares for hello handling inside isis.
*
- * $Id: packet-isis-hello.h,v 1.2 2000/06/19 08:33:48 guy Exp $
+ * $Id: packet-isis-hello.h,v 1.3 2001/05/14 18:40:15 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@@ -50,6 +50,7 @@
#define ISIS_CLV_L1H_PADDING 8
#define ISIS_CLV_L1H_NLPID 129
#define ISIS_CLV_L1H_IP_INTERFACE_ADDR 132
+#define ISIS_CLV_L1H_IPv6_INTERFACE_ADDR 232
/*
* Note, the spec say 133, but everyone seems to use 10. Any clue on why
* this is would be appreciated!
@@ -65,6 +66,7 @@
#define ISIS_CLV_L2H_PADDING 8
#define ISIS_CLV_L2H_NLPID 129
#define ISIS_CLV_L2H_IP_INTERFACE_ADDR 132
+#define ISIS_CLV_L2H_IPv6_INTERFACE_ADDR 232
/*
* Note, the spec say 133, but everyone seems to use 10. Any clue on why
* this is would be appreciated!
@@ -79,6 +81,7 @@
#define ISIS_CLV_PTP_PADDING 8
#define ISIS_CLV_PTP_NLPID 129
#define ISIS_CLV_PTP_IP_INTERFACE_ADDR 132
+#define ISIS_CLV_PTP_IPv6_INTERFACE_ADDR 232
/*
* Note, the spec say 133, but everyone seems to use 10. Any clue on why
* this is would be appreciated!
diff --git a/packet-isis-lsp.c b/packet-isis-lsp.c
index 2cabd5979a..1f0d87cb23 100644
--- a/packet-isis-lsp.c
+++ b/packet-isis-lsp.c
@@ -1,7 +1,7 @@
/* packet-isis-lsp.c
* Routines for decoding isis lsp packets and their CLVs
*
- * $Id: packet-isis-lsp.c,v 1.12 2001/04/16 10:04:30 guy Exp $
+ * $Id: packet-isis-lsp.c,v 1.13 2001/05/14 18:40:15 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@@ -44,6 +44,7 @@
#include "packet.h"
#include "packet-osi.h"
+#include "packet-ipv6.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
#include "packet-isis-lsp.h"
@@ -56,11 +57,16 @@ static int hf_isis_lsp_remaining_life = -1;
static int hf_isis_lsp_sequence_number = -1;
static int hf_isis_lsp_checksum = -1;
static int hf_isis_lsp_clv_ipv4_int_addr = -1;
+static int hf_isis_lsp_clv_ipv6_int_addr = -1;
static int hf_isis_lsp_clv_te_router_id = -1;
static gint ett_isis_lsp = -1;
static gint ett_isis_lsp_clv_area_addr = -1;
static gint ett_isis_lsp_clv_is_neighbors = -1;
+static gint ett_isis_lsp_clv_ext_is_reachability = -1; /* CLV 22 */
+ static gint ett_isis_lsp_part_of_clv_ext_is_reachability = -1;
+ static gint ett_isis_lsp_subclv_admin_group = -1;
+ static gint ett_isis_lsp_subclv_unrsv_bw = -1;
static gint ett_isis_lsp_clv_unknown = -1;
static gint ett_isis_lsp_clv_partition_dis = -1;
static gint ett_isis_lsp_clv_prefix_neighbors = -1;
@@ -69,7 +75,12 @@ static gint ett_isis_lsp_clv_hostname = -1;
static gint ett_isis_lsp_clv_te_router_id = -1;
static gint ett_isis_lsp_clv_auth = -1;
static gint ett_isis_lsp_clv_ipv4_int_addr = -1;
+static gint ett_isis_lsp_clv_ipv6_int_addr = -1; /* CLV 232 */
static gint ett_isis_lsp_clv_ip_reachability = -1;
+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 const char *isis_lsp_attached_bits[] = {
"error", "expense", "delay", "default" };
@@ -92,12 +103,18 @@ static void dissect_lsp_l1_es_neighbors_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_l2_is_neighbors_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
+static void dissect_lsp_ext_is_reachability_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_partition_dis_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_prefix_neighbors_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_ip_reachability_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
+static void dissect_lsp_ext_ip_reachability_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree);
+static void dissect_lsp_ipv6_reachability_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_nlpid_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_hostname_clv(const u_char *pd, int offset,
@@ -106,6 +123,8 @@ static void dissect_lsp_te_router_id_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_ip_int_addr_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
+static void dissect_lsp_ipv6_int_addr_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_l1_auth_clv(const u_char *pd, int offset,
guint length, int id_length, frame_data *fd, proto_tree *tree);
static void dissect_lsp_l2_auth_clv(const u_char *pd, int offset,
@@ -131,12 +150,30 @@ static const isis_clv_handle_t clv_l1_lsp_opts[] = {
dissect_lsp_l1_es_neighbors_clv
},
{
+ ISIS_CLV_L1_LSP_EXT_IS_REACHABLE,
+ "Extended IS reachability",
+ &ett_isis_lsp_clv_ext_is_reachability,
+ dissect_lsp_ext_is_reachability_clv
+ },
+ {
ISIS_CLV_L1_LSP_IP_INT_REACHABLE,
"IP Internal reachability",
&ett_isis_lsp_clv_ip_reachability,
dissect_lsp_ip_reachability_clv
},
{
+ ISIS_CLV_L1_LSP_EXT_IP_REACHABLE,
+ "Extended IP Reachability",
+ &ett_isis_lsp_clv_ext_ip_reachability,
+ dissect_lsp_ext_ip_reachability_clv
+ },
+ {
+ ISIS_CLV_L1_LSP_IPv6_REACHABLE,
+ "IPv6 reachability",
+ &ett_isis_lsp_clv_ipv6_reachability,
+ dissect_lsp_ipv6_reachability_clv
+ },
+ {
ISIS_CLV_L1_LSP_NLPID,
"Protocols supported",
&ett_isis_lsp_clv_nlpid,
@@ -161,6 +198,12 @@ static const isis_clv_handle_t clv_l1_lsp_opts[] = {
dissect_lsp_ip_int_addr_clv
},
{
+ ISIS_CLV_L1_LSP_IPv6_INTERFACE_ADDR,
+ "IPv6 Interface address(es)",
+ &ett_isis_lsp_clv_ipv6_int_addr,
+ dissect_lsp_ipv6_int_addr_clv
+ },
+ {
ISIS_CLV_L1_LSP_AUTHENTICATION_NS,
"Authentication(non-spec)",
&ett_isis_lsp_clv_auth,
@@ -194,6 +237,12 @@ static const isis_clv_handle_t clv_l2_lsp_opts[] = {
dissect_lsp_l2_is_neighbors_clv
},
{
+ ISIS_CLV_L2_LSP_EXT_IS_REACHABLE,
+ "Extended IS reachability",
+ &ett_isis_lsp_clv_ext_is_reachability,
+ dissect_lsp_ext_is_reachability_clv
+ },
+ {
ISIS_CLV_L2_LSP_PARTITION_DIS,
"Parition Designated Level 2 IS",
&ett_isis_lsp_clv_partition_dis,
@@ -236,12 +285,30 @@ static const isis_clv_handle_t clv_l2_lsp_opts[] = {
dissect_lsp_ip_reachability_clv
},
{
+ ISIS_CLV_L2_LSP_EXT_IP_REACHABLE,
+ "Extended IP Reachability",
+ &ett_isis_lsp_clv_ext_ip_reachability,
+ dissect_lsp_ext_ip_reachability_clv
+ },
+ {
+ ISIS_CLV_L2_LSP_IPv6_REACHABLE,
+ "IPv6 reachability",
+ &ett_isis_lsp_clv_ipv6_reachability,
+ dissect_lsp_ipv6_reachability_clv
+ },
+ {
ISIS_CLV_L2_LSP_IP_INTERFACE_ADDR,
"IP Interface address(es)",
&ett_isis_lsp_clv_ipv4_int_addr,
dissect_lsp_ip_int_addr_clv
},
{
+ ISIS_CLV_L2_LSP_IPv6_INTERFACE_ADDR,
+ "IPv6 Interface address(es)",
+ &ett_isis_lsp_clv_ipv6_int_addr,
+ dissect_lsp_ipv6_int_addr_clv
+ },
+ {
ISIS_CLV_L2_LSP_AUTHENTICATION_NS,
"Authentication(non spec)",
&ett_isis_lsp_clv_auth,
@@ -308,7 +375,7 @@ dissect_metric(proto_tree *tree, int offset, guint8 value,
/*
- * Name: dissect_lsp_ip_reachabillityclv()
+ * Name: dissect_lsp_ip_reachabillity_clv()
*
* Description:
* Decode an IP reachability CLV. This can be either internal or
@@ -365,6 +432,140 @@ dissect_lsp_ip_reachability_clv(const u_char *pd, int offset,
length -= 12;
}
}
+
+/*
+ * Name: dissect_lsp_ext_ip_reachability_clv()
+ *
+ * Description: Decode an Extended IP Reachability CLV - code 135.
+ *
+ * The extended IP reachability TLV is an extended version
+ * of the IP reachability TLVs (codes 128 and 130). It encodes
+ * the metric as a 32-bit unsigned interger and allows to add
+ * sub-CLV(s).
+ *
+ * Input:
+ * u_char * : packet data
+ * int : current offset into packet data
+ * guint : length of this clv
+ * int : length of IDs in packet.
+ * frame_data * : frame data
+ * proto_tree * : proto tree to build on (may be null)
+ *
+ * Output:
+ * void, will modify proto_tree if not null.
+ */
+static void
+dissect_lsp_ext_ip_reachability_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree) {
+ proto_item *pi = NULL;
+ proto_tree *subtree = NULL;
+ guint8 ctrl_info;
+ guint8 bit_length, byte_length;
+ guint8 prefix [4];
+ guint8 len;
+
+ if (!tree) return;
+
+ while (length > 0) {
+ memset (prefix, 0, 4);
+ ctrl_info = pd[offset+4];
+ bit_length = ctrl_info & 0x3f;
+ byte_length = (bit_length + 7) / 8;
+ memcpy (prefix, &pd[offset+5], byte_length);
+ pi = proto_tree_add_text (tree, NullTVB, offset, 0,
+ "IPv4 prefix: %s /%d",
+ ip_to_str (prefix),
+ bit_length );
+ subtree = proto_item_add_subtree (pi,
+ ett_isis_lsp_part_of_clv_ext_ip_reachability);
+
+ proto_tree_add_text (subtree, NullTVB, offset, 4,
+ "Metric: %d", pntohl (&pd[offset]) );
+
+ proto_tree_add_text (subtree, NullTVB, offset+4, 1,
+ "Distribution: %s",
+ ((ctrl_info & 0x80) == 0) ? "up" : "down" );
+
+ proto_tree_add_text (subtree, NullTVB, offset+4, 1,
+ "Sub_CLV(s): %s",
+ ((ctrl_info & 0x40) == 0) ? "no" : "yes" );
+
+ len = 5 + byte_length;
+ if ((ctrl_info & 0x40) != 0)
+ len += 1 + pd[offset+len] ;
+ proto_item_set_len (pi, len);
+ offset += len;
+ length -= len;
+ }
+}
+
+/*
+ * Name: dissect_lsp_ipv6_reachability_clv()
+ *
+ * Description: Decode an IPv6 reachability CLV - code 236.
+ *
+ * Input:
+ * u_char * : packet data
+ * int : current offset into packet data
+ * guint : length of this clv
+ * int : length of IDs in packet.
+ * frame_data * : frame data
+ * proto_tree * : proto tree to build on (may be null)
+ *
+ * Output:
+ * void, will modify proto_tree if not null.
+ */
+static void
+dissect_lsp_ipv6_reachability_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree) {
+ proto_item *ti;
+ proto_tree *ntree = NULL;
+ guint8 bit_length, byte_length;
+ struct e_in6_addr prefix;
+ guint8 ctrl_info;
+ guint32 metric;
+ guint8 len;
+
+ if (!tree) return;
+
+ memset (prefix.s6_addr, 0, 16);
+
+ while (length > 0) {
+ bit_length = pd[offset+5];
+ byte_length = (bit_length + 7) / 8;
+ memcpy (prefix.s6_addr, &pd[offset+6], byte_length);
+ ti = proto_tree_add_text (tree, NullTVB, offset, 0,
+ "IP prefix: %s /%d",
+ ip6_to_str (&prefix),
+ bit_length );
+ ntree = proto_item_add_subtree (ti, ett_isis_lsp_part_of_clv_ipv6_reachability);
+
+ metric = pntohl (&pd[offset]);
+ proto_tree_add_text (ntree, NullTVB, offset, 4,
+ "Metric: %d", metric);
+
+ ctrl_info = pd[offset+4];
+ proto_tree_add_text (ntree, NullTVB, offset+4, 1,
+ "Distribution: %s, %s",
+ ((ctrl_info & 0x80) == 0) ? "up" : "down",
+ ((ctrl_info & 0x40) == 0) ? "internal" : "external" );
+
+ proto_tree_add_text (ntree, NullTVB, offset+4, 1,
+ "Reserved bits: 0x%x",
+ (ctrl_info & 0x1f) );
+ proto_tree_add_text (ntree, NullTVB, offset+4, 1,
+ "Sub_CLV(s): %s",
+ ((ctrl_info & 0x20) == 0) ? "no" : "yes" );
+
+ len = 6 + byte_length;
+ if ((ctrl_info & 0x20) != 0)
+ len += 1 + pd[offset+len] ;
+ proto_item_set_len (ti, len);
+ offset += len;
+ length -= len;
+ }
+}
+
/*
* Name: dissect_lsp_nlpid_clv()
*
@@ -468,6 +669,31 @@ dissect_lsp_ip_int_addr_clv(const u_char *pd, int offset,
}
/*
+ * Name: dissect_lsp_ipv6_int_addr_clv()
+ *
+ * Description: Decode an IPv6 interface addr CLV - code 232.
+ *
+ * Calls into the clv common one.
+ *
+ * Input:
+ * u_char * : packet data
+ * int : current offset into packet data
+ * guint : length of this clv
+ * int : length of IDs in packet.
+ * frame_data * : frame data
+ * proto_tree * : proto tree to build on (may be null)
+ *
+ * Output:
+ * void, will modify proto_tree if not null.
+ */
+static void
+dissect_lsp_ipv6_int_addr_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree) {
+ isis_dissect_ipv6_int_clv(pd, offset, length, fd, tree,
+ hf_isis_lsp_clv_ipv6_int_addr );
+}
+
+/*
* Name: dissect_lsp_L1_auth_clv()
*
* Description:
@@ -711,6 +937,233 @@ dissect_lsp_l2_is_neighbors_clv(const u_char *pd, int offset,
}
/*
+ * Name: dissect_subclv_admin_group ()
+ *
+ * Description: Called by function dissect_lsp_ext_is_reachability_clv().
+ *
+ * This function is called by dissect_lsp_ext_is_reachability_clv()
+ * for dissect the administrive group sub-CLV (code 3).
+ *
+ * Input:
+ * u_char * : packet data
+ * int : offset into packet data where we are (beginning of the sub_clv value).
+ * proto_tree * : protocol display tree to fill out.
+ *
+ * Output:
+ * void
+ */
+static void
+dissect_subclv_admin_group (const u_char *pd, int offset, proto_tree *tree) {
+ proto_item *ti;
+ proto_tree *ntree;
+ guint32 clv_value;
+ guint32 mask;
+ int i;
+
+ ti = proto_tree_add_text (tree, NullTVB, offset-2, 6, "Administrative group(s):");
+ ntree = proto_item_add_subtree (ti, ett_isis_lsp_subclv_admin_group);
+
+ clv_value = pntohl (&pd[offset]);
+ mask = 1;
+ for (i = 0 ; i < 32 ; i++) {
+ if ( (clv_value & mask) != 0 ) {
+ proto_tree_add_text (ntree, NullTVB, offset, 4, "group %d", i);
+ }
+ mask <<= 1;
+ }
+}
+
+/*
+ * Name: dissect_subclv_max_bw ()
+ *
+ * Description: Called by function dissect_lsp_ext_is_reachability_clv().
+ *
+ * This function is called by dissect_lsp_ext_is_reachability_clv()
+ * for dissect the maximum link bandwidth sub-CLV (code 9).
+ *
+ * Input:
+ * u_char * : packet data
+ * int : offset into packet data where we are (beginning of the sub_clv value).
+ * proto_tree * : protocol display tree to fill out.
+ *
+ * Output:
+ * void
+ */
+static void
+dissect_subclv_max_bw (const u_char *pd, int offset, proto_tree *tree) {
+ guint32 ui;
+ gfloat bw;
+
+ ui = pntohl (&pd[offset]);
+ memcpy (&bw, &ui, 4);
+ proto_tree_add_text (tree, NullTVB, offset-2, 6,
+ "Maximum link bandwidth : %f bytes/second", bw );
+}
+
+/*
+ * Name: dissect_subclv_rsv_bw ()
+ *
+ * Description: Called by function dissect_lsp_ext_is_reachability_clv().
+ *
+ * This function is called by dissect_lsp_ext_is_reachability_clv()
+ * for dissect the reservable link bandwidth sub-CLV (code 10).
+ *
+ * Input:
+ * u_char * : packet data
+ * int : offset into packet data where we are (beginning of the sub_clv value).
+ * proto_tree * : protocol display tree to fill out.
+ *
+ * Output:
+ * void
+ */
+static void
+dissect_subclv_rsv_bw (const u_char *pd, int offset, proto_tree *tree) {
+ guint32 ui;
+ gfloat bw;
+
+ ui = pntohl (&pd[offset]);
+ memcpy (&bw, &ui, 4);
+ proto_tree_add_text (tree, NullTVB, offset-2, 6,
+ "Reservable link bandwidth: %f bytes/second", bw );
+}
+
+/*
+ * Name: dissect_subclv_unrsv_bw ()
+ *
+ * Description: Called by function dissect_lsp_ext_is_reachability_clv().
+ *
+ * This function is called by dissect_lsp_ext_is_reachability_clv()
+ * for dissect the unreserved bandwidth sub-CLV (code 11).
+ *
+ * Input:
+ * u_char * : packet data
+ * int : offset into packet data where we are (beginning of the sub_clv value).
+ * proto_tree * : protocol display tree to fill out.
+ *
+ * Output:
+ * void
+ */
+static void
+dissect_subclv_unrsv_bw (const u_char *pd, int offset, proto_tree *tree) {
+ proto_item *ti;
+ proto_tree *ntree;
+ guint32 ui;
+ gfloat bw;
+ int i;
+
+ ti = proto_tree_add_text (tree, NullTVB, offset-2, 34, "Unreserved bandwidth:");
+ ntree = proto_item_add_subtree (ti, ett_isis_lsp_subclv_unrsv_bw);
+
+ for (i = 0 ; i < 8 ; i++) {
+ ui = pntohl (&pd[offset]);
+ memcpy (&bw, &ui, 4);
+ proto_tree_add_text (ntree, NullTVB, offset+4*i, 4,
+ "priority level %d: %f bytes/second", i, bw );
+ }
+}
+
+/*
+ * Name: dissect_lsp_ext_is_reachability_clv()
+ *
+ * Description: Decode a Extended IS Reachability CLV - code 22
+ *
+ * The extended IS reachability TLV is an extended version
+ * of the IS reachability TLV (code 2). It encodes the metric
+ * as a 24-bit unsigned interger and allows to add sub-CLV(s).
+ *
+ * Input:
+ * u_char * : packet data
+ * int : offset into packet data where we are.
+ * guint : length of clv we are decoding
+ * int : length of IDs in packet.
+ * frame_data * : frame data (complete frame)
+ * proto_tree * : protocol display tree to fill out. May be NULL
+ *
+ * Output:
+ * void, but we will add to proto tree if !NULL.
+ */
+static void
+dissect_lsp_ext_is_reachability_clv(const u_char *pd, int offset,
+ guint length, int id_length, frame_data *fd, proto_tree *tree) {
+ proto_item *ti;
+ proto_tree *ntree = NULL;
+ guint8 subclvs_len;
+ guint8 len, i;
+ guint8 clv_code, clv_len;
+
+ if (!tree) return;
+
+ while (length > 0) {
+ ti = proto_tree_add_text (tree, NullTVB, offset, 0,
+ "IS neighbor: %s",
+ print_system_id (&pd[offset], 7) );
+ ntree = proto_item_add_subtree (ti,
+ ett_isis_lsp_part_of_clv_ext_is_reachability );
+
+ proto_tree_add_text (ntree, NullTVB, offset+7, 3,
+ "Metric: %d", pntoh24 (&pd[offset+7]) );
+
+ subclvs_len = pd[offset+10];
+ if (subclvs_len == 0) {
+ proto_tree_add_text (ntree, NullTVB, offset+10, 1, "No sub-CLV");
+ }
+ else {
+ i = 0;
+ while (i < subclvs_len) {
+ clv_code = pd[offset+11+i];
+ clv_len = pd[offset+12+i];
+ switch (clv_code) {
+ case 3 :
+ dissect_subclv_admin_group (pd, offset+13+i, ntree);
+ break;
+ case 6 :
+ proto_tree_add_text (ntree, NullTVB, offset+11+i, 6,
+ "IPv4 interface address: %s", ip_to_str (&pd[offset+13+i]) );
+ break;
+ case 8 :
+ proto_tree_add_text (ntree, NullTVB, offset+11+i, 6,
+ "IPv4 neighbor address: %s", ip_to_str (&pd[offset+13+i]) );
+ break;
+ case 9 :
+ dissect_subclv_max_bw (pd, offset+13+i, ntree);
+ break;
+ case 10:
+ dissect_subclv_rsv_bw (pd, offset+13+i, ntree);
+ break;
+ case 11:
+ dissect_subclv_unrsv_bw (pd, offset+13+i, ntree);
+ break;
+ case 18:
+ proto_tree_add_text (ntree, NullTVB, offset+11+i, 5,
+ "Traffic engineering default metric: %d",
+ pntoh24 (&pd[offset+13+i]) );
+ break;
+ case 250:
+ case 251:
+ case 252:
+ case 253:
+ case 254:
+ proto_tree_add_text (ntree, NullTVB, offset+11+i, clv_len+2,
+ "Unknown Cisco specific extensions: code %d, length %d",
+ clv_code, clv_len );
+ break;
+ default :
+ proto_tree_add_text (ntree, NullTVB, offset+11+i, clv_len+2,
+ "Unknown sub-CLV: code %d, length %d", clv_code, clv_len );
+ break;
+ }
+ i += clv_len + 2;
+ }
+ }
+
+ len = 11 + subclvs_len;
+ proto_item_set_len (ti, len);
+ offset += len;
+ length -= len;
+ }
+}
+
+/*
* Name: dissect_lsp_partition_dis_clv()
*
* Description:
@@ -1024,6 +1477,10 @@ proto_register_isis_lsp(void) {
{ "IPv4 interface address: ", "isis_lsp.clv_ipv4_int_addr", FT_IPv4,
BASE_NONE, NULL, 0x0, "" }},
+ { &hf_isis_lsp_clv_ipv6_int_addr,
+ { "IPv6 interface address", "isis_lsp.clv_ipv6_int_addr", FT_IPv6,
+ BASE_NONE, NULL, 0x0, "" }},
+
{ &hf_isis_lsp_clv_te_router_id,
{ "Traffic Engineering Router ID: ", "isis_lsp.clv_te_router_id", FT_IPv4,
BASE_NONE, NULL, 0x0, "" }},
@@ -1032,6 +1489,10 @@ proto_register_isis_lsp(void) {
&ett_isis_lsp,
&ett_isis_lsp_clv_area_addr,
&ett_isis_lsp_clv_is_neighbors,
+ &ett_isis_lsp_clv_ext_is_reachability, /* CLV 22 */
+ &ett_isis_lsp_part_of_clv_ext_is_reachability,
+ &ett_isis_lsp_subclv_admin_group,
+ &ett_isis_lsp_subclv_unrsv_bw,
&ett_isis_lsp_clv_unknown,
&ett_isis_lsp_clv_partition_dis,
&ett_isis_lsp_clv_prefix_neighbors,
@@ -1039,8 +1500,13 @@ proto_register_isis_lsp(void) {
&ett_isis_lsp_clv_nlpid,
&ett_isis_lsp_clv_hostname,
&ett_isis_lsp_clv_ipv4_int_addr,
+ &ett_isis_lsp_clv_ipv6_int_addr, /* CLV 232 */
&ett_isis_lsp_clv_te_router_id,
&ett_isis_lsp_clv_ip_reachability,
+ &ett_isis_lsp_clv_ext_ip_reachability, /* CLV 135 */
+ &ett_isis_lsp_part_of_clv_ext_ip_reachability,
+ &ett_isis_lsp_clv_ipv6_reachability, /* CLV 236 */
+ &ett_isis_lsp_part_of_clv_ipv6_reachability,
};
proto_isis_lsp = proto_register_protocol(PROTO_STRING_LSP,
diff --git a/packet-isis-lsp.h b/packet-isis-lsp.h
index 343ed86ade..865d568fab 100644
--- a/packet-isis-lsp.h
+++ b/packet-isis-lsp.h
@@ -1,7 +1,7 @@
/* packet-isis-lsp.h
* Defines and such for LSP and their CLV decodes
*
- * $Id: packet-isis-lsp.h,v 1.4 2001/04/16 10:04:30 guy Exp $
+ * $Id: packet-isis-lsp.h,v 1.5 2001/05/14 18:40:15 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@@ -59,11 +59,15 @@
#define ISIS_CLV_L1_LSP_AREA_ADDRESS 1
#define ISIS_CLV_L1_LSP_IS_NEIGHBORS 2
#define ISIS_CLV_L1_LSP_ES_NEIGHBORS 3
+#define ISIS_CLV_L1_LSP_EXT_IS_REACHABLE 22
#define ISIS_CLV_L1_LSP_IP_INT_REACHABLE 128
#define ISIS_CLV_L1_LSP_NLPID 129
#define ISIS_CLV_L1_LSP_IP_INTERFACE_ADDR 132
#define ISIS_CLV_L1_LSP_TE_ROUTER_ID 134
+#define ISIS_CLV_L1_LSP_EXT_IP_REACHABLE 135
#define ISIS_CLV_L1_LSP_HOSTNAME 137
+#define ISIS_CLV_L1_LSP_IPv6_INTERFACE_ADDR 232
+#define ISIS_CLV_L1_LSP_IPv6_REACHABLE 236
/*
* Note, the spec say 133, but everyone seems to use 10. Any clue on why
* this is would be appreciated!
@@ -78,13 +82,17 @@
#define ISIS_CLV_L2_LSP_IS_NEIGHBORS 2
#define ISIS_CLV_L2_LSP_PARTITION_DIS 4
#define ISIS_CLV_L2_LSP_PREFIX_NEIGHBORS 5
+#define ISIS_CLV_L2_LSP_EXT_IS_REACHABLE 22
#define ISIS_CLV_L2_LSP_IP_INT_REACHABLE 128
#define ISIS_CLV_L2_LSP_NLPID 129
#define ISIS_CLV_L2_LSP_IP_EXT_REACHABLE 130
#define ISIS_CLV_L2_LSP_IDRP_INFO 131
#define ISIS_CLV_L2_LSP_IP_INTERFACE_ADDR 132
#define ISIS_CLV_L2_LSP_TE_ROUTER_ID 134
+#define ISIS_CLV_L2_LSP_EXT_IP_REACHABLE 135
#define ISIS_CLV_L2_LSP_HOSTNAME 137
+#define ISIS_CLV_L2_LSP_IPv6_INTERFACE_ADDR 232
+#define ISIS_CLV_L2_LSP_IPv6_REACHABLE 236
/*
* Note, the spec say 133, but everyone seems to use 10. Any clue on why
* this is would be appreciated!