diff options
-rw-r--r-- | AUTHORS | 7 | ||||
-rw-r--r-- | doc/ethereal.pod.template | 1 | ||||
-rw-r--r-- | packet-isis-clv.c | 45 | ||||
-rw-r--r-- | packet-isis-clv.h | 4 | ||||
-rw-r--r-- | packet-isis-hello.c | 54 | ||||
-rw-r--r-- | packet-isis-hello.h | 5 | ||||
-rw-r--r-- | packet-isis-lsp.c | 470 | ||||
-rw-r--r-- | packet-isis-lsp.h | 10 |
8 files changed, 589 insertions, 7 deletions
@@ -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! |