diff options
-rw-r--r-- | epan/dissectors/packet-isis-clv.c | 674 | ||||
-rw-r--r-- | epan/dissectors/packet-isis-hello.c | 1130 | ||||
-rw-r--r-- | epan/dissectors/packet-isis-lsp.c | 3822 | ||||
-rw-r--r-- | epan/dissectors/packet-isis-snp.c | 618 | ||||
-rw-r--r-- | epan/dissectors/packet-isis.c | 174 | ||||
-rw-r--r-- | epan/dissectors/packet-isis.h | 6 |
6 files changed, 3261 insertions, 3163 deletions
diff --git a/epan/dissectors/packet-isis-clv.c b/epan/dissectors/packet-isis-clv.c index a701048b5e..6608cbfc14 100644 --- a/epan/dissectors/packet-isis-clv.c +++ b/epan/dissectors/packet-isis-clv.c @@ -37,70 +37,70 @@ * Name: isis_dissect_area_address_clv() * * Description: - * Take an area address CLV and display it pieces. An area address - * CLV is n, x byte hex strings. + * Take an area address CLV and display it pieces. An area address + * CLV is n, x byte hex strings. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of clv we are decoding * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ void isis_dissect_area_address_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t *tvb, expert_field* expert, int offset, int length) { - int arealen,area_idx; - - while ( length > 0 ) { - arealen = tvb_get_guint8(tvb, offset); - length--; - if (length<=0) { - proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, - "short address (no length for payload)"); - return; - } - if ( arealen > length) { - proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, - "short address, packet says %d, we have %d left", - arealen, length ); - return; - } - - if ( tree ) { - proto_item *ti; - - /* - * Throw an exception rather than putting in a - * partial address. - */ - tvb_ensure_bytes_exist ( tvb, offset, arealen + 1 ); - - ti = proto_tree_add_text ( tree, tvb, offset, arealen + 1, - "Area address (%d): ", arealen ); - - /* - * Lets turn the area address into "standard" - * xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx format string. - * this is a private routine as the print_nsap_net in - * epan/osi_utils.c is incomplete and we need only - * a subset - actually some nice placing of dots .... - */ - for (area_idx = 0; area_idx < arealen; area_idx++) { - proto_item_append_text(ti, "%02x", - tvb_get_guint8(tvb, offset+area_idx+1)); - if (((area_idx & 1) == 0) && - (area_idx + 1 < arealen)) { - proto_item_append_text(ti, "."); - } - } - } - offset += arealen + 1; - length -= arealen; /* length already adjusted for len fld*/ - } + int arealen,area_idx; + + while ( length > 0 ) { + arealen = tvb_get_guint8(tvb, offset); + length--; + if (length<=0) { + proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, + "short address (no length for payload)"); + return; + } + if ( arealen > length) { + proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, + "short address, packet says %d, we have %d left", + arealen, length ); + return; + } + + if ( tree ) { + proto_item *ti; + + /* + * Throw an exception rather than putting in a + * partial address. + */ + tvb_ensure_bytes_exist ( tvb, offset, arealen + 1 ); + + ti = proto_tree_add_text ( tree, tvb, offset, arealen + 1, + "Area address (%d): ", arealen ); + + /* + * Lets turn the area address into "standard" + * xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx format string. + * this is a private routine as the print_nsap_net in + * epan/osi_utils.c is incomplete and we need only + * a subset - actually some nice placing of dots .... + */ + for (area_idx = 0; area_idx < arealen; area_idx++) { + proto_item_append_text(ti, "%02x", + tvb_get_guint8(tvb, offset+area_idx+1)); + if (((area_idx & 1) == 0) && + (area_idx + 1 < arealen)) { + proto_item_append_text(ti, "."); + } + } + } + offset += arealen + 1; + length -= arealen; /* length already adjusted for len fld*/ + } } @@ -108,77 +108,77 @@ isis_dissect_area_address_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t *tv * Name: isis_dissect_authentication_clv() * * Description: - * Take apart the CLV that hold authentication information. This - * is currently 1 octet auth type. + * Take apart the CLV that hold authentication information. This + * is currently 1 octet auth type. * the two defined authentication types - * are 1 for a clear text password and + * are 1 for a clear text password and * 54 for a HMAC-MD5 digest * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of clv we are decoding * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ void isis_dissect_authentication_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t *tvb, expert_field* auth_expert, int offset, int length) { - guchar pw_type; - int auth_unsupported; - proto_item *ti; - - if ( length <= 0 ) { - return; - } - - pw_type = tvb_get_guint8(tvb, offset); - offset += 1; - length--; - auth_unsupported = FALSE; - - switch (pw_type) { - case 1: - ti = proto_tree_add_text ( tree, tvb, offset - 1, length + 1, - "clear text (1), password (length %d) = ", length); - if ( length > 0 ) { - proto_item_append_text(ti, "%s", - tvb_format_text(tvb, offset, length)); + guchar pw_type; + int auth_unsupported; + proto_item *ti; + + if ( length <= 0 ) { + return; + } + + pw_type = tvb_get_guint8(tvb, offset); + offset += 1; + length--; + auth_unsupported = FALSE; + + switch (pw_type) { + case 1: + ti = proto_tree_add_text ( tree, tvb, offset - 1, length + 1, + "clear text (1), password (length %d) = ", length); + if ( length > 0 ) { + proto_item_append_text(ti, "%s", + tvb_format_text(tvb, offset, length)); } else { - proto_item_append_text(ti, "no clear-text password found!!!"); - } - break; - case 54: - ti = proto_tree_add_text ( tree, tvb, offset - 1, length + 1, - "hmac-md5 (54), password (length %d) = ", length); - - if ( length == 16 ) { - proto_item_append_text(ti, "0x%02x", tvb_get_guint8(tvb, offset)); - offset += 1; - length--; - while (length > 0) { - proto_item_append_text(ti, "%02x", tvb_get_guint8(tvb, offset)); - offset += 1; - length--; - } - } else { - proto_item_append_text(ti, - "illegal hmac-md5 digest format (must be 16 bytes)"); - } - break; - default: - proto_tree_add_text ( tree, tvb, offset - 1, length + 1, - "type 0x%02x (0x%02x): ", pw_type, length ); - auth_unsupported=TRUE; - break; - } - - if ( auth_unsupported ) { - proto_tree_add_expert(tree, pinfo, auth_expert, tvb, offset, -1); - } + proto_item_append_text(ti, "no clear-text password found!!!"); + } + break; + case 54: + ti = proto_tree_add_text ( tree, tvb, offset - 1, length + 1, + "hmac-md5 (54), password (length %d) = ", length); + + if ( length == 16 ) { + proto_item_append_text(ti, "0x%02x", tvb_get_guint8(tvb, offset)); + offset += 1; + length--; + while (length > 0) { + proto_item_append_text(ti, "%02x", tvb_get_guint8(tvb, offset)); + offset += 1; + length--; + } + } else { + proto_item_append_text(ti, + "illegal hmac-md5 digest format (must be 16 bytes)"); + } + break; + default: + proto_tree_add_text ( tree, tvb, offset - 1, length + 1, + "type 0x%02x (0x%02x): ", pw_type, length ); + auth_unsupported=TRUE; + break; + } + + if ( auth_unsupported ) { + proto_tree_add_expert(tree, pinfo, auth_expert, tvb, offset, -1); + } } /* @@ -201,7 +201,7 @@ isis_dissect_authentication_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t * void isis_dissect_ip_authentication_clv(tvbuff_t *tvb, proto_tree *tree, int offset, - int length) + int length) { if ( !tree ) return; /* nothing to do! */ @@ -234,7 +234,7 @@ isis_dissect_ip_authentication_clv(tvbuff_t *tvb, proto_tree *tree, int offset, void isis_dissect_hostname_clv(tvbuff_t *tvb, proto_tree *tree, int offset, - int length, int tree_id) + int length, int tree_id) { if ( !tree ) return; /* nothing to do! */ @@ -242,9 +242,9 @@ isis_dissect_hostname_clv(tvbuff_t *tvb, proto_tree *tree, int offset, proto_tree_add_text ( tree, tvb, offset, length, "Hostname: --none--" ); } else { - const char* value = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_ASCII); + const char* value = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_ASCII); proto_tree_add_string_format ( tree, tree_id, - tvb, offset, length, + tvb, offset, length, value, "Hostname: %.*s", length, value); } } @@ -254,54 +254,54 @@ isis_dissect_hostname_clv(tvbuff_t *tvb, proto_tree *tree, int offset, void isis_dissect_mt_clv(tvbuff_t *tvb, proto_tree *tree, int offset, int length, - int tree_id) + int tree_id) { - guint16 mt_block; - const char *mt_desc; - - while (length>0) { - /* length can only be a multiple of 2, otherwise there is - something broken -> so decode down until length is 1 */ - if (length!=1) { - /* fetch two bytes */ - mt_block=tvb_get_ntohs(tvb, offset); - - /* mask out the lower 12 bits */ - switch(mt_block&0x0fff) { - case 0: - mt_desc="IPv4 unicast"; - break; - case 1: - mt_desc="In-Band Management"; - break; - case 2: - mt_desc="IPv6 unicast"; - break; - case 3: - mt_desc="Multicast"; - break; - case 4095: - mt_desc="Development, Experimental or Proprietary"; - break; - default: - mt_desc="Reserved for IETF Consensus"; - break; - } - proto_tree_add_uint_format ( tree, tree_id, tvb, offset, 2, - mt_block, - "%s Topology (0x%03x), %ssubTLVs present%s", - mt_desc, - mt_block&0xfff, - (mt_block&0x8000) ? "" : "no ", - (mt_block&0x4000) ? ", ATT bit set" : "" ); - } else { - proto_tree_add_text ( tree, tvb, offset, 1, - "malformed MT-ID"); - break; - } - length -= 2; - offset += 2; - } + guint16 mt_block; + const char *mt_desc; + + while (length>0) { + /* length can only be a multiple of 2, otherwise there is + something broken -> so decode down until length is 1 */ + if (length!=1) { + /* fetch two bytes */ + mt_block=tvb_get_ntohs(tvb, offset); + + /* mask out the lower 12 bits */ + switch(mt_block&0x0fff) { + case 0: + mt_desc="IPv4 unicast"; + break; + case 1: + mt_desc="In-Band Management"; + break; + case 2: + mt_desc="IPv6 unicast"; + break; + case 3: + mt_desc="Multicast"; + break; + case 4095: + mt_desc="Development, Experimental or Proprietary"; + break; + default: + mt_desc="Reserved for IETF Consensus"; + break; + } + proto_tree_add_uint_format ( tree, tree_id, tvb, offset, 2, + mt_block, + "%s Topology (0x%03x), %ssubTLVs present%s", + mt_desc, + mt_block&0xfff, + (mt_block&0x8000) ? "" : "no ", + (mt_block&0x4000) ? ", ATT bit set" : "" ); + } else { + proto_tree_add_text ( tree, tvb, offset, 1, + "malformed MT-ID"); + break; + } + length -= 2; + offset += 2; + } } @@ -309,86 +309,86 @@ isis_dissect_mt_clv(tvbuff_t *tvb, proto_tree *tree, int offset, int length, * Name: isis_dissect_ip_int_clv() * * Description: - * Take apart the CLV that lists all the IP 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. + * Take apart the CLV that lists all the IP 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: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of clv we are decoding - * int : tree id to use for proto tree. + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of clv we are decoding + * int : tree id to use for proto tree. * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ void isis_dissect_ip_int_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t *tvb, expert_field* expert, int offset, int length, int tree_id) { - if ( length <= 0 ) { - return; - } - - while ( length > 0 ) { - if ( length < 4 ) { - proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, - "Short IP interface address (%d vs 4)",length ); - return; - } - - if ( tree ) { - proto_tree_add_item(tree, tree_id, tvb, offset, 4, ENC_BIG_ENDIAN); - } - offset += 4; - length -= 4; - } + if ( length <= 0 ) { + return; + } + + while ( length > 0 ) { + if ( length < 4 ) { + proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, + "Short IP interface address (%d vs 4)",length ); + return; + } + + if ( tree ) { + proto_tree_add_item(tree, tree_id, tvb, offset, 4, ENC_BIG_ENDIAN); + } + offset += 4; + length -= 4; + } } /* * 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. + * 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: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of clv we are decoding - * int : tree id to use for proto tree. + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of clv we are decoding + * int : tree id to use for proto tree. * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ void isis_dissect_ipv6_int_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t *tvb, expert_field* expert, int offset, int length, int tree_id) { - guint8 addr [16]; - - if ( length <= 0 ) { - return; - } - - while ( length > 0 ) { - if ( length < 16 ) { - proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, - "Short IPv6 interface address (%d vs 16)",length ); - return; - } - tvb_memcpy(tvb, addr, offset, sizeof(addr)); - if ( tree ) { - proto_tree_add_ipv6(tree, tree_id, tvb, offset, 16, addr); - } - offset += 16; - length -= 16; - } + guint8 addr [16]; + + if ( length <= 0 ) { + return; + } + + while ( length > 0 ) { + if ( length < 16 ) { + proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, + "Short IPv6 interface address (%d vs 16)",length ); + return; + } + tvb_memcpy(tvb, addr, offset, sizeof(addr)); + if ( tree ) { + proto_tree_add_ipv6(tree, tree_id, tvb, offset, 16, addr); + } + offset += 16; + length -= 16; + } } @@ -414,155 +414,155 @@ void isis_dissect_te_router_id_clv(proto_tree *tree, packet_info* pinfo, tvbuff_t *tvb, expert_field* expert, int offset, int length, int tree_id) { - if ( length <= 0 ) { - return; - } + if ( length <= 0 ) { + return; + } - if ( length != 4 ) { - proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, - "malformed Traffic Engineering Router ID (%d vs 4)",length ); - return; - } + if ( length != 4 ) { + proto_tree_add_expert_format(tree, pinfo, expert, tvb, offset, -1, + "malformed Traffic Engineering Router ID (%d vs 4)",length ); + return; + } - proto_tree_add_item(tree, tree_id, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, tree_id, tvb, offset, 4, ENC_BIG_ENDIAN); } /* * Name: isis_dissect_nlpid_clv() * * Description: - * Take apart a NLPID packet and display it. The NLPID (for intergrated - * ISIS, contains n network layer protocol IDs that the box supports. - * We max out at 256 entries. + * Take apart a NLPID packet and display it. The NLPID (for intergrated + * ISIS, contains n network layer protocol IDs that the box supports. + * We max out at 256 entries. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of clv we are decoding * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ #define TRUNCATED_TEXT " [truncated]" void isis_dissect_nlpid_clv(tvbuff_t *tvb, proto_tree *tree, int offset, int length) { - gboolean first; - proto_item *ti; - - if ( !tree ) return; /* nothing to do! */ - - /* - * Throw an exception rather than putting in a - * partial address. - */ - tvb_ensure_bytes_exist ( tvb, offset, length ); - - if (length <= 0) { - proto_tree_add_text (tree, tvb, offset, length, - "NLPID(s): --none--"); - } else { - first = TRUE; - ti = proto_tree_add_text (tree, tvb, offset, length, - "NLPID(s): "); - while (length-- > 0 ) { - if (!first) { - proto_item_append_text(ti, ", "); - } - proto_item_append_text(ti, "%s (0x%02x)", - /* NLPID_IEEE_8021AQ conflicts with NLPID_SNDCF. - * In this context, we want the former. - */ - (tvb_get_guint8(tvb, offset) == NLPID_IEEE_8021AQ - ? "IEEE 802.1aq (SPB)" - : val_to_str_const(tvb_get_guint8(tvb, offset), nlpid_vals, "Unknown")), - tvb_get_guint8(tvb, offset)); - offset++; - first = FALSE; - } - } + gboolean first; + proto_item *ti; + + if ( !tree ) return; /* nothing to do! */ + + /* + * Throw an exception rather than putting in a + * partial address. + */ + tvb_ensure_bytes_exist ( tvb, offset, length ); + + if (length <= 0) { + proto_tree_add_text (tree, tvb, offset, length, + "NLPID(s): --none--"); + } else { + first = TRUE; + ti = proto_tree_add_text (tree, tvb, offset, length, + "NLPID(s): "); + while (length-- > 0 ) { + if (!first) { + proto_item_append_text(ti, ", "); + } + proto_item_append_text(ti, "%s (0x%02x)", + /* NLPID_IEEE_8021AQ conflicts with NLPID_SNDCF. + * In this context, we want the former. + */ + (tvb_get_guint8(tvb, offset) == NLPID_IEEE_8021AQ + ? "IEEE 802.1aq (SPB)" + : val_to_str_const(tvb_get_guint8(tvb, offset), nlpid_vals, "Unknown")), + tvb_get_guint8(tvb, offset)); + offset++; + first = FALSE; + } + } } /* * Name: isis_dissect_clvs() * * Description: - * Dispatch routine to shred all the CLVs in a packet. We just - * walk through the clv entries in the packet. For each one, we - * search the passed in valid clv's for this protocol (opts) for - * a matching code. If found, we add to the display tree and - * then call the dissector. If it is not, we just post an - * "unknown" clv entry using the passed in unknown clv tree id. + * Dispatch routine to shred all the CLVs in a packet. We just + * walk through the clv entries in the packet. For each one, we + * search the passed in valid clv's for this protocol (opts) for + * a matching code. If found, we add to the display tree and + * then call the dissector. If it is not, we just post an + * "unknown" clv entry using the passed in unknown clv tree id. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * isis_clv_handle_t * : NULL dissector terminated array of codes - * and handlers (along with tree text and tree id's). - * int : length of CLV area. - * int : length of IDs in packet. - * int : unknown clv tree id + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * isis_clv_handle_t * : NULL dissector terminated array of codes + * and handlers (along with tree text and tree id's). + * int : length of CLV area. + * int : length of IDs in packet. + * int : unknown clv tree id * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ void isis_dissect_clvs(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - const isis_clv_handle_t *opts, expert_field* expert_short_len, int len, int id_length, - int unknown_tree_id _U_) + const isis_clv_handle_t *opts, expert_field* expert_short_len, int len, int id_length, + int unknown_tree_id _U_) { - guint8 code; - guint8 length; - int q; - proto_tree *clv_tree; - - while ( len > 0 ) { - code = tvb_get_guint8(tvb, offset); - offset += 1; - len -= 1; - if (len == 0) - break; - - length = tvb_get_guint8(tvb, offset); - offset += 1; - len -= 1; - if (len == 0) - break; - - if ( len < length ) { - proto_tree_add_expert_format(tree, pinfo, expert_short_len, tvb, offset, -1, - "Short CLV header (%d vs %d)", - length, len ); - return; - } - q = 0; - while ((opts[q].dissect != NULL )&&( opts[q].optcode != code )){ - q++; - } - if ( opts[q].dissect ) { - /* adjust by 2 for code/len octets */ - clv_tree = proto_tree_add_subtree_format(tree, tvb, offset - 2, - length + 2, *opts[q].tree_id, NULL, "%s (%u)", - opts[q].tree_text, length ); - opts[q].dissect(tvb, pinfo, clv_tree, offset, - id_length, length); - } else { + guint8 code; + guint8 length; + int q; + proto_tree *clv_tree; + + while ( len > 0 ) { + code = tvb_get_guint8(tvb, offset); + offset += 1; + len -= 1; + if (len == 0) + break; + + length = tvb_get_guint8(tvb, offset); + offset += 1; + len -= 1; + if (len == 0) + break; + + if ( len < length ) { + proto_tree_add_expert_format(tree, pinfo, expert_short_len, tvb, offset, -1, + "Short CLV header (%d vs %d)", + length, len ); + return; + } + q = 0; + while ((opts[q].dissect != NULL )&&( opts[q].optcode != code )){ + q++; + } + if ( opts[q].dissect ) { + /* adjust by 2 for code/len octets */ + clv_tree = proto_tree_add_subtree_format(tree, tvb, offset - 2, + length + 2, *opts[q].tree_id, NULL, "%s (%u)", + opts[q].tree_text, length ); + opts[q].dissect(tvb, pinfo, clv_tree, offset, + id_length, length); + } else { #if 0 /* XXX: Left as commented out in case info about "unknown code" is ever to be displayed under a sub-tree */ - clv_tree = proto_tree_add_subtree_format(tree, tvb, offset - 2, - length + 2, unknown_tree_id, NULL, "Unknown code %u (%u)", - code, length); + clv_tree = proto_tree_add_subtree_format(tree, tvb, offset - 2, + length + 2, unknown_tree_id, NULL, "Unknown code %u (%u)", + code, length); #else - if (tree) { - proto_tree_add_text(tree, tvb, offset - 2, - length + 2, "Unknown code %u (%u)", - code, length); - } + if (tree) { + proto_tree_add_text(tree, tvb, offset - 2, + length + 2, "Unknown code %u (%u)", + code, length); + } #endif - } - offset += length; - len -= length; - } + } + offset += length; + len -= length; + } } diff --git a/epan/dissectors/packet-isis-hello.c b/epan/dissectors/packet-isis-hello.c index 7bdb8183a2..9b06bf069e 100644 --- a/epan/dissectors/packet-isis-hello.c +++ b/epan/dissectors/packet-isis-hello.c @@ -36,15 +36,15 @@ /* * Declarations for L1/L2 hello base header. */ -#define ISIS_HELLO_CTYPE_MASK 0x03 -#define ISIS_HELLO_CT_RESERVED_MASK 0xfc -#define ISIS_HELLO_PRIORITY_MASK 0x7f -#define ISIS_HELLO_P_RESERVED_MASK 0x80 +#define ISIS_HELLO_CTYPE_MASK 0x03 +#define ISIS_HELLO_CT_RESERVED_MASK 0xfc +#define ISIS_HELLO_PRIORITY_MASK 0x7f +#define ISIS_HELLO_P_RESERVED_MASK 0x80 -#define ISIS_HELLO_TYPE_RESERVED 0 -#define ISIS_HELLO_TYPE_LEVEL_1 1 -#define ISIS_HELLO_TYPE_LEVEL_2 2 -#define ISIS_HELLO_TYPE_LEVEL_12 3 +#define ISIS_HELLO_TYPE_RESERVED 0 +#define ISIS_HELLO_TYPE_LEVEL_1 1 +#define ISIS_HELLO_TYPE_LEVEL_2 2 +#define ISIS_HELLO_TYPE_LEVEL_12 3 /* * misc. bittest macros @@ -132,11 +132,11 @@ static expert_field ei_isis_hello_subtlv = EI_INIT; static expert_field ei_isis_hello_authentication = EI_INIT; static const value_string isis_hello_circuit_type_vals[] = { - { ISIS_HELLO_TYPE_RESERVED, "Reserved 0 (discard PDU)"}, - { ISIS_HELLO_TYPE_LEVEL_1, "Level 1 only"}, - { ISIS_HELLO_TYPE_LEVEL_2, "Level 2 only"}, - { ISIS_HELLO_TYPE_LEVEL_12, "Level 1 and 2"}, - { 0, NULL} }; + { ISIS_HELLO_TYPE_RESERVED, "Reserved 0 (discard PDU)"}, + { ISIS_HELLO_TYPE_LEVEL_1, "Level 1 only"}, + { ISIS_HELLO_TYPE_LEVEL_2, "Level 2 only"}, + { ISIS_HELLO_TYPE_LEVEL_12, "Level 1 and 2"}, + { 0, NULL} }; static void @@ -309,136 +309,136 @@ dissect_hello_mt_port_cap_clv(tvbuff_t *tvb, packet_info* pinfo, * Name: dissect_hello_restart_clv() * * Description: - * Decode for a restart clv - only found in IIHs + * Decode for a restart clv - only found in IIHs * hence no call in the common clv dissector * */ static void dissect_hello_restart_clv(tvbuff_t *tvb, packet_info* pinfo _U_, - proto_tree *tree, int offset, int id_length, int length) + proto_tree *tree, int offset, int id_length, int length) { - int restart_options=0; - proto_tree *flags_tree; - proto_item *restart_flags_item; - proto_item *hold_time_item; - const char *sep; - - if (length >= 1) { - restart_options = tvb_get_guint8(tvb, offset); - restart_flags_item = proto_tree_add_uint ( tree, hf_isis_hello_clv_restart_flags, - tvb, offset, 1, restart_options); - flags_tree = proto_item_add_subtree(restart_flags_item, ett_isis_hello_clv_restart_flags); - proto_tree_add_boolean (flags_tree, hf_isis_hello_clv_restart_flags_sa, - tvb, offset, 1, restart_options ); - proto_tree_add_boolean (flags_tree, hf_isis_hello_clv_restart_flags_ra, - tvb, offset, 1, restart_options ); - proto_tree_add_boolean (flags_tree, hf_isis_hello_clv_restart_flags_rr, - tvb, offset, 1, restart_options ); - - /* Append an indication of which flags are set in the restart - * options - */ - sep = initial_sep; - APPEND_BOOLEAN_FLAG(ISIS_MASK_RESTART_SA(restart_options), restart_flags_item, "%sSA"); - APPEND_BOOLEAN_FLAG(ISIS_MASK_RESTART_RA(restart_options), restart_flags_item, "%sRA"); - APPEND_BOOLEAN_FLAG(ISIS_MASK_RESTART_RR(restart_options), restart_flags_item, "%sRR"); - if (sep != initial_sep) - { - proto_item_append_text (restart_flags_item, ")"); - } - - } - - /* The Remaining Time field should only be present if the RA flag is - * set - */ - if (length >= 3 && ISIS_MASK_RESTART_RA(restart_options)) { - hold_time_item = proto_tree_add_item( tree, hf_isis_hello_clv_restart_remain_time, - tvb, offset+1, 2, ENC_BIG_ENDIAN ); - proto_item_append_text( hold_time_item, "s" ); - } - - /* The Restarting Neighbor ID should only be present if the RA flag is - * set. - */ - if (length >= 3 + id_length && ISIS_MASK_RESTART_RA(restart_options)) { - proto_tree_add_item( tree, hf_isis_hello_clv_restart_neighbor, tvb, offset+3, id_length, ENC_NA); - } + int restart_options=0; + proto_tree *flags_tree; + proto_item *restart_flags_item; + proto_item *hold_time_item; + const char *sep; + + if (length >= 1) { + restart_options = tvb_get_guint8(tvb, offset); + restart_flags_item = proto_tree_add_uint ( tree, hf_isis_hello_clv_restart_flags, + tvb, offset, 1, restart_options); + flags_tree = proto_item_add_subtree(restart_flags_item, ett_isis_hello_clv_restart_flags); + proto_tree_add_boolean (flags_tree, hf_isis_hello_clv_restart_flags_sa, + tvb, offset, 1, restart_options ); + proto_tree_add_boolean (flags_tree, hf_isis_hello_clv_restart_flags_ra, + tvb, offset, 1, restart_options ); + proto_tree_add_boolean (flags_tree, hf_isis_hello_clv_restart_flags_rr, + tvb, offset, 1, restart_options ); + + /* Append an indication of which flags are set in the restart + * options + */ + sep = initial_sep; + APPEND_BOOLEAN_FLAG(ISIS_MASK_RESTART_SA(restart_options), restart_flags_item, "%sSA"); + APPEND_BOOLEAN_FLAG(ISIS_MASK_RESTART_RA(restart_options), restart_flags_item, "%sRA"); + APPEND_BOOLEAN_FLAG(ISIS_MASK_RESTART_RR(restart_options), restart_flags_item, "%sRR"); + if (sep != initial_sep) + { + proto_item_append_text (restart_flags_item, ")"); + } + + } + + /* The Remaining Time field should only be present if the RA flag is + * set + */ + if (length >= 3 && ISIS_MASK_RESTART_RA(restart_options)) { + hold_time_item = proto_tree_add_item( tree, hf_isis_hello_clv_restart_remain_time, + tvb, offset+1, 2, ENC_BIG_ENDIAN ); + proto_item_append_text( hold_time_item, "s" ); + } + + /* The Restarting Neighbor ID should only be present if the RA flag is + * set. + */ + if (length >= 3 + id_length && ISIS_MASK_RESTART_RA(restart_options)) { + proto_tree_add_item( tree, hf_isis_hello_clv_restart_neighbor, tvb, offset+3, id_length, ENC_NA); + } } /* * Name: dissect_hello_nlpid_clv() * * Description: - * Decode for a hello packets NLPID clv. Calls into the - * clv common one. + * Decode for a hello packets NLPID clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_nlpid_clv(tvbuff_t *tvb, packet_info* pinfo _U_, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_nlpid_clv(tvb, tree, offset, length); + isis_dissect_nlpid_clv(tvb, tree, offset, length); } /* * Name: dissect_hello_mt_clv() * * Description: - * Decode for a hello packets Multi Topology clv. Calls into the - * clv common one. + * Decode for a hello packets Multi Topology clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_mt_clv(tvbuff_t *tvb, packet_info* pinfo _U_, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_mt_clv(tvb, tree, offset, length, - hf_isis_hello_clv_mt ); + isis_dissect_mt_clv(tvb, tree, offset, length, + hf_isis_hello_clv_mt ); } /* * Name: dissect_hello_ip_int_addr_clv() * * Description: - * Decode for a hello packets ip interface addr clv. Calls into the - * clv common one. + * Decode for a hello packets ip interface addr clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_ip_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_ip_int_clv(tree, pinfo, tvb, &ei_isis_hello_short_packet, + isis_dissect_ip_int_clv(tree, pinfo, tvb, &ei_isis_hello_short_packet, offset, length, hf_isis_hello_clv_ipv4_int_addr ); } @@ -446,24 +446,24 @@ dissect_hello_ip_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, * Name: dissect_hello_ipv6_int_addr_clv() * * Description: - * Decode for a hello packets ipv6 interface addr clv. Calls into the - * clv common one. + * Decode for a hello packets ipv6 interface addr clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_ipv6_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_ipv6_int_clv(tree, pinfo, tvb, &ei_isis_hello_short_packet, + isis_dissect_ipv6_int_clv(tree, pinfo, tvb, &ei_isis_hello_short_packet, offset, length, hf_isis_hello_clv_ipv6_int_addr ); } @@ -471,48 +471,48 @@ dissect_hello_ipv6_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, * Name: dissect_hello_authentication_clv() * * Description: - * Decode for a hello packets authenticaion clv. + * Decode for a hello packets authenticaion clv. * Calls into the CLV common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_authentication_clv(tvbuff_t *tvb, packet_info* pinfo, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_authentication_clv(tree, pinfo, tvb, &ei_isis_hello_authentication, offset, length); + isis_dissect_authentication_clv(tree, pinfo, tvb, &ei_isis_hello_authentication, offset, length); } /* * Name: dissect_hello_ip_authentication_clv() * * Description: - * Decode for a hello packets IP authenticaion clv. + * Decode for a hello packets IP authenticaion clv. * Calls into the CLV common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_ip_authentication_clv(tvbuff_t *tvb, packet_info* pinfo _U_, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_ip_authentication_clv(tvb, tree, offset, length); + isis_dissect_ip_authentication_clv(tvb, tree, offset, length); } /* @@ -585,24 +585,24 @@ dissect_hello_checksum_clv(tvbuff_t *tvb, packet_info* pinfo, * Name: dissect_hello_area_address_clv() * * Description: - * Decode for a hello packets area address clv. + * Decode for a hello packets area address clv. * Calls into the CLV common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_hello_area_address_clv(tvbuff_t *tvb, packet_info* pinfo _U_, - proto_tree *tree, int offset, int id_length _U_, int length) + proto_tree *tree, int offset, int id_length _U_, int length) { - isis_dissect_area_address_clv(tree, pinfo, tvb, &ei_isis_hello_short_packet, offset, length); + isis_dissect_area_address_clv(tree, pinfo, tvb, &ei_isis_hello_short_packet, offset, length); } static const value_string adj_state_vals[] = { @@ -614,7 +614,7 @@ static const value_string adj_state_vals[] = { static void dissect_hello_ptp_adj_clv(tvbuff_t *tvb, packet_info* pinfo, - proto_tree *tree, int offset, int id_length, int length) + proto_tree *tree, int offset, int id_length, int length) { switch(length) { @@ -646,487 +646,487 @@ dissect_hello_ptp_adj_clv(tvbuff_t *tvb, packet_info* pinfo, * Name: isis_dissect_is_neighbors_clv() * * Description: - * Take apart a IS neighbor packet. A neighbor is n 6 byte packets. - * (they tend to be an 802.3 MAC address, but it's not required). + * Take apart a IS neighbor packet. A neighbor is n 6 byte packets. + * (they tend to be an 802.3 MAC address, but it's not required). * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ static void dissect_hello_is_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - while ( length > 0 ) { - if (length<6) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_hello_short_packet, tvb, offset, -1, - "short is neighbor (%d vs 6)", length ); - return; - } - /* - * Lets turn the area address into "standard" 0000.0000.etc - * format string. - */ - proto_tree_add_item(tree, hf_isis_hello_is_neighbor, tvb, offset, 6, ENC_NA); - offset += 6; - length -= 6; - } + while ( length > 0 ) { + if (length<6) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_hello_short_packet, tvb, offset, -1, + "short is neighbor (%d vs 6)", length ); + return; + } + /* + * Lets turn the area address into "standard" 0000.0000.etc + * format string. + */ + proto_tree_add_item(tree, hf_isis_hello_is_neighbor, tvb, offset, 6, ENC_NA); + offset += 6; + length -= 6; + } } /* * Name: dissect_hello_padding_clv() * * Description: - * Decode for a hello packet's padding clv. Padding does nothing, - * so we just return. + * Decode for a hello packet's padding clv. Padding does nothing, + * so we just return. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void + * void */ static void dissect_hello_padding_clv(tvbuff_t *tvb _U_, packet_info* pinfo _U_, proto_tree *tree _U_, int offset _U_, - int id_length _U_, int length _U_) + int id_length _U_, int length _U_) { - /* nothing to do here! */ + /* nothing to do here! */ } static const isis_clv_handle_t clv_l1_hello_opts[] = { - { - ISIS_CLV_AREA_ADDRESS, - "Area address(es)", - &ett_isis_hello_clv_area_addr, - dissect_hello_area_address_clv - }, - { - ISIS_CLV_IS_NEIGHBORS, - "IS Neighbor(s)", - &ett_isis_hello_clv_is_neighbors, - dissect_hello_is_neighbors_clv - }, - { - ISIS_CLV_PADDING, - "Padding", - &ett_isis_hello_clv_padding, - dissect_hello_padding_clv - }, - { - ISIS_CLV_PROTOCOLS_SUPPORTED, - "Protocols Supported", - &ett_isis_hello_clv_nlpid, - dissect_hello_nlpid_clv - }, - { - ISIS_CLV_IP_ADDR, - "IP Interface address(es)", - &ett_isis_hello_clv_ipv4_int_addr, - dissect_hello_ip_int_addr_clv - }, - { - ISIS_CLV_IP6_ADDR, - "IPv6 Interface address(es)", - &ett_isis_hello_clv_ipv6_int_addr, - dissect_hello_ipv6_int_addr_clv - }, - { - ISIS_CLV_RESTART, - "Restart Signaling", - &ett_isis_hello_clv_restart, - dissect_hello_restart_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_hello_clv_authentication, - dissect_hello_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_hello_clv_ip_authentication, - dissect_hello_ip_authentication_clv - }, - { - ISIS_CLV_MT_SUPPORTED, - "Multi Topology", - &ett_isis_hello_clv_mt, - dissect_hello_mt_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_hello_clv_checksum, - dissect_hello_checksum_clv - }, - { - 0, - "", - NULL, - NULL - } + { + ISIS_CLV_AREA_ADDRESS, + "Area address(es)", + &ett_isis_hello_clv_area_addr, + dissect_hello_area_address_clv + }, + { + ISIS_CLV_IS_NEIGHBORS, + "IS Neighbor(s)", + &ett_isis_hello_clv_is_neighbors, + dissect_hello_is_neighbors_clv + }, + { + ISIS_CLV_PADDING, + "Padding", + &ett_isis_hello_clv_padding, + dissect_hello_padding_clv + }, + { + ISIS_CLV_PROTOCOLS_SUPPORTED, + "Protocols Supported", + &ett_isis_hello_clv_nlpid, + dissect_hello_nlpid_clv + }, + { + ISIS_CLV_IP_ADDR, + "IP Interface address(es)", + &ett_isis_hello_clv_ipv4_int_addr, + dissect_hello_ip_int_addr_clv + }, + { + ISIS_CLV_IP6_ADDR, + "IPv6 Interface address(es)", + &ett_isis_hello_clv_ipv6_int_addr, + dissect_hello_ipv6_int_addr_clv + }, + { + ISIS_CLV_RESTART, + "Restart Signaling", + &ett_isis_hello_clv_restart, + dissect_hello_restart_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_hello_clv_authentication, + dissect_hello_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_hello_clv_ip_authentication, + dissect_hello_ip_authentication_clv + }, + { + ISIS_CLV_MT_SUPPORTED, + "Multi Topology", + &ett_isis_hello_clv_mt, + dissect_hello_mt_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_hello_clv_checksum, + dissect_hello_checksum_clv + }, + { + 0, + "", + NULL, + NULL + } }; static const isis_clv_handle_t clv_l2_hello_opts[] = { - { - ISIS_CLV_AREA_ADDRESS, - "Area address(es)", - &ett_isis_hello_clv_area_addr, - dissect_hello_area_address_clv - }, - { - ISIS_CLV_IS_NEIGHBORS, - "IS Neighbor(s)", - &ett_isis_hello_clv_is_neighbors, - dissect_hello_is_neighbors_clv - }, - { - ISIS_CLV_PADDING, - "Padding", - &ett_isis_hello_clv_padding, - dissect_hello_padding_clv - }, - { - ISIS_CLV_PROTOCOLS_SUPPORTED, - "Protocols Supported", - &ett_isis_hello_clv_nlpid, - dissect_hello_nlpid_clv - }, - { - ISIS_CLV_IP_ADDR, - "IP Interface address(es)", - &ett_isis_hello_clv_ipv4_int_addr, - dissect_hello_ip_int_addr_clv - }, - { - ISIS_CLV_IP6_ADDR, - "IPv6 Interface address(es)", - &ett_isis_hello_clv_ipv6_int_addr, - dissect_hello_ipv6_int_addr_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_hello_clv_authentication, - dissect_hello_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_hello_clv_ip_authentication, - dissect_hello_ip_authentication_clv - }, - { - ISIS_CLV_RESTART, - "Restart Signaling", - &ett_isis_hello_clv_restart, - dissect_hello_restart_clv - }, - { - ISIS_CLV_MT_SUPPORTED, - "Multi Topology", - &ett_isis_hello_clv_mt, - dissect_hello_mt_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_hello_clv_checksum, - dissect_hello_checksum_clv - }, - { - 0, - "", - NULL, - NULL - } + { + ISIS_CLV_AREA_ADDRESS, + "Area address(es)", + &ett_isis_hello_clv_area_addr, + dissect_hello_area_address_clv + }, + { + ISIS_CLV_IS_NEIGHBORS, + "IS Neighbor(s)", + &ett_isis_hello_clv_is_neighbors, + dissect_hello_is_neighbors_clv + }, + { + ISIS_CLV_PADDING, + "Padding", + &ett_isis_hello_clv_padding, + dissect_hello_padding_clv + }, + { + ISIS_CLV_PROTOCOLS_SUPPORTED, + "Protocols Supported", + &ett_isis_hello_clv_nlpid, + dissect_hello_nlpid_clv + }, + { + ISIS_CLV_IP_ADDR, + "IP Interface address(es)", + &ett_isis_hello_clv_ipv4_int_addr, + dissect_hello_ip_int_addr_clv + }, + { + ISIS_CLV_IP6_ADDR, + "IPv6 Interface address(es)", + &ett_isis_hello_clv_ipv6_int_addr, + dissect_hello_ipv6_int_addr_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_hello_clv_authentication, + dissect_hello_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_hello_clv_ip_authentication, + dissect_hello_ip_authentication_clv + }, + { + ISIS_CLV_RESTART, + "Restart Signaling", + &ett_isis_hello_clv_restart, + dissect_hello_restart_clv + }, + { + ISIS_CLV_MT_SUPPORTED, + "Multi Topology", + &ett_isis_hello_clv_mt, + dissect_hello_mt_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_hello_clv_checksum, + dissect_hello_checksum_clv + }, + { + 0, + "", + NULL, + NULL + } }; static const isis_clv_handle_t clv_ptp_hello_opts[] = { - { - ISIS_CLV_AREA_ADDRESS, - "Area address(es)", - &ett_isis_hello_clv_area_addr, - dissect_hello_area_address_clv - }, - { - ISIS_CLV_PADDING, - "Padding", - &ett_isis_hello_clv_padding, - dissect_hello_padding_clv - }, - { - ISIS_CLV_PROTOCOLS_SUPPORTED, - "Protocols Supported", - &ett_isis_hello_clv_nlpid, - dissect_hello_nlpid_clv - }, - { - ISIS_CLV_IP_ADDR, - "IP Interface address(es)", - &ett_isis_hello_clv_ipv4_int_addr, - dissect_hello_ip_int_addr_clv - }, - { - ISIS_CLV_IP6_ADDR, - "IPv6 Interface address(es)", - &ett_isis_hello_clv_ipv6_int_addr, - dissect_hello_ipv6_int_addr_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_hello_clv_authentication, - dissect_hello_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_hello_clv_ip_authentication, - dissect_hello_ip_authentication_clv - }, - { - ISIS_CLV_MT_PORT_CAP, - "MT Port Capability", - &ett_isis_hello_clv_mt_port_cap, - dissect_hello_mt_port_cap_clv - }, - { - ISIS_CLV_RESTART, - "Restart Option", - &ett_isis_hello_clv_restart, - dissect_hello_restart_clv - }, - { - ISIS_CLV_PTP_ADJ_STATE, - "Point-to-point Adjacency State", - &ett_isis_hello_clv_ptp_adj, - dissect_hello_ptp_adj_clv - }, - { - ISIS_CLV_MT_SUPPORTED, - "Multi Topology", - &ett_isis_hello_clv_mt, - dissect_hello_mt_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_hello_clv_checksum, - dissect_hello_checksum_clv - }, - { - 0, - "", - NULL, - NULL - } + { + ISIS_CLV_AREA_ADDRESS, + "Area address(es)", + &ett_isis_hello_clv_area_addr, + dissect_hello_area_address_clv + }, + { + ISIS_CLV_PADDING, + "Padding", + &ett_isis_hello_clv_padding, + dissect_hello_padding_clv + }, + { + ISIS_CLV_PROTOCOLS_SUPPORTED, + "Protocols Supported", + &ett_isis_hello_clv_nlpid, + dissect_hello_nlpid_clv + }, + { + ISIS_CLV_IP_ADDR, + "IP Interface address(es)", + &ett_isis_hello_clv_ipv4_int_addr, + dissect_hello_ip_int_addr_clv + }, + { + ISIS_CLV_IP6_ADDR, + "IPv6 Interface address(es)", + &ett_isis_hello_clv_ipv6_int_addr, + dissect_hello_ipv6_int_addr_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_hello_clv_authentication, + dissect_hello_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_hello_clv_ip_authentication, + dissect_hello_ip_authentication_clv + }, + { + ISIS_CLV_MT_PORT_CAP, + "MT Port Capability", + &ett_isis_hello_clv_mt_port_cap, + dissect_hello_mt_port_cap_clv + }, + { + ISIS_CLV_RESTART, + "Restart Option", + &ett_isis_hello_clv_restart, + dissect_hello_restart_clv + }, + { + ISIS_CLV_PTP_ADJ_STATE, + "Point-to-point Adjacency State", + &ett_isis_hello_clv_ptp_adj, + dissect_hello_ptp_adj_clv + }, + { + ISIS_CLV_MT_SUPPORTED, + "Multi Topology", + &ett_isis_hello_clv_mt, + dissect_hello_mt_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_hello_clv_checksum, + dissect_hello_checksum_clv + }, + { + 0, + "", + NULL, + NULL + } }; /* * Name: isis_dissect_isis_hello() * * Description: - * This procedure rips apart the various types of ISIS hellos. L1H and - * L2H's are identical for the most part, while the PTP hello has - * a shorter header. + * This procedure rips apart the various types of ISIS hellos. L1H and + * L2H's are identical for the most part, while the PTP hello has + * a shorter header. */ static void dissect_isis_hello(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, - const isis_clv_handle_t *opts, int header_length, int id_length) + const isis_clv_handle_t *opts, int header_length, int id_length) { - proto_item *ti; - proto_tree *hello_tree; - int pdu_length; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS HELLO"); - - ti = proto_tree_add_item(tree, proto_isis_hello, tvb, offset, -1, ENC_NA); - hello_tree = proto_item_add_subtree(ti, ett_isis_hello); - - proto_tree_add_item(hello_tree, hf_isis_hello_circuit, tvb, offset, 1, ENC_NA); - proto_tree_add_item(hello_tree, hf_isis_hello_circuit_reserved, tvb, offset, 1, ENC_NA); - offset += 1; - - proto_tree_add_item(hello_tree, hf_isis_hello_source_id, tvb, offset, id_length, ENC_NA); - col_append_fstr(pinfo->cinfo, COL_INFO, ", System-ID: %s", tvb_print_system_id( tvb, offset, id_length )); - - offset += id_length; - - proto_tree_add_item(hello_tree, hf_isis_hello_holding_timer, tvb, - offset, 2, ENC_BIG_ENDIAN); - offset += 2; - - pdu_length = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint(hello_tree, hf_isis_hello_pdu_length, tvb, - offset, 2, pdu_length); - offset += 2; - - if (opts == clv_ptp_hello_opts) { - proto_tree_add_item(hello_tree, hf_isis_hello_local_circuit_id, tvb, - offset, 1, ENC_BIG_ENDIAN ); - offset += 1; - } else { - proto_tree_add_item(hello_tree, hf_isis_hello_priority, tvb, offset, 1, ENC_NA); - proto_tree_add_item(hello_tree, hf_isis_hello_priority_reserved, tvb, offset, 1, ENC_NA); - offset += 1; - - proto_tree_add_item(hello_tree, hf_isis_hello_lan_id, tvb, offset, id_length + 1, ENC_NA); - offset += id_length + 1; - } - - pdu_length -= header_length; - if (pdu_length < 0) { - expert_add_info_format(pinfo, ti, &ei_isis_hello_long_packet, - "Packet header length %d went beyond packet", header_length ); - return; - } - /* - * Now, we need to decode our CLVs. We need to pass in - * our list of valid ones! - */ - isis_dissect_clvs(tvb, pinfo, hello_tree, offset, - opts, &ei_isis_hello_short_packet, pdu_length, id_length, - ett_isis_hello_clv_unknown); + proto_item *ti; + proto_tree *hello_tree; + int pdu_length; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS HELLO"); + + ti = proto_tree_add_item(tree, proto_isis_hello, tvb, offset, -1, ENC_NA); + hello_tree = proto_item_add_subtree(ti, ett_isis_hello); + + proto_tree_add_item(hello_tree, hf_isis_hello_circuit, tvb, offset, 1, ENC_NA); + proto_tree_add_item(hello_tree, hf_isis_hello_circuit_reserved, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(hello_tree, hf_isis_hello_source_id, tvb, offset, id_length, ENC_NA); + col_append_fstr(pinfo->cinfo, COL_INFO, ", System-ID: %s", tvb_print_system_id( tvb, offset, id_length )); + + offset += id_length; + + proto_tree_add_item(hello_tree, hf_isis_hello_holding_timer, tvb, + offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + pdu_length = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint(hello_tree, hf_isis_hello_pdu_length, tvb, + offset, 2, pdu_length); + offset += 2; + + if (opts == clv_ptp_hello_opts) { + proto_tree_add_item(hello_tree, hf_isis_hello_local_circuit_id, tvb, + offset, 1, ENC_BIG_ENDIAN ); + offset += 1; + } else { + proto_tree_add_item(hello_tree, hf_isis_hello_priority, tvb, offset, 1, ENC_NA); + proto_tree_add_item(hello_tree, hf_isis_hello_priority_reserved, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(hello_tree, hf_isis_hello_lan_id, tvb, offset, id_length + 1, ENC_NA); + offset += id_length + 1; + } + + pdu_length -= header_length; + if (pdu_length < 0) { + expert_add_info_format(pinfo, ti, &ei_isis_hello_long_packet, + "Packet header length %d went beyond packet", header_length ); + return; + } + /* + * Now, we need to decode our CLVs. We need to pass in + * our list of valid ones! + */ + isis_dissect_clvs(tvb, pinfo, hello_tree, offset, + opts, &ei_isis_hello_short_packet, pdu_length, id_length, + ett_isis_hello_clv_unknown); } static int dissect_isis_l1_hello(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_hello(tvb, pinfo, tree, 0, - clv_l1_hello_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_hello(tvb, pinfo, tree, 0, + clv_l1_hello_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } static int dissect_isis_l2_hello(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_hello(tvb, pinfo, tree, 0, - clv_l2_hello_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_hello(tvb, pinfo, tree, 0, + clv_l2_hello_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } static int dissect_isis_ptp_hello(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_hello(tvb, pinfo, tree, 0, - clv_ptp_hello_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_hello(tvb, pinfo, tree, 0, + clv_ptp_hello_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } /* * Name: isis_register_hello() * * Description: - * Register our protocol sub-sets with protocol manager. + * Register our protocol sub-sets with protocol manager. * * Input: - * int : protocol index for the ISIS protocol + * int : protocol index for the ISIS protocol * * Output: - * void + * void */ void proto_register_isis_hello(void) { - static hf_register_info hf[] = { - { &hf_isis_hello_circuit, - { "Circuit type", "isis.hello.circuit_type", - FT_UINT8, BASE_HEX, VALS(isis_hello_circuit_type_vals), ISIS_HELLO_CTYPE_MASK, NULL, HFILL }}, + static hf_register_info hf[] = { + { &hf_isis_hello_circuit, + { "Circuit type", "isis.hello.circuit_type", + FT_UINT8, BASE_HEX, VALS(isis_hello_circuit_type_vals), ISIS_HELLO_CTYPE_MASK, NULL, HFILL }}, - { &hf_isis_hello_circuit_reserved, - { "Reserved", "isis.hello.reserved", - FT_UINT8, BASE_HEX, NULL, ISIS_HELLO_CT_RESERVED_MASK, NULL, HFILL }}, + { &hf_isis_hello_circuit_reserved, + { "Reserved", "isis.hello.reserved", + FT_UINT8, BASE_HEX, NULL, ISIS_HELLO_CT_RESERVED_MASK, NULL, HFILL }}, - { &hf_isis_hello_source_id, - { "SystemID {Sender of PDU}", "isis.hello.source_id", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_source_id, + { "SystemID {Sender of PDU}", "isis.hello.source_id", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_holding_timer, - { "Holding timer", "isis.hello.holding_timer", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_holding_timer, + { "Holding timer", "isis.hello.holding_timer", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_pdu_length, - { "PDU length", "isis.hello.pdu_length", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_pdu_length, + { "PDU length", "isis.hello.pdu_length", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_priority, - { "Priority", "isis.hello.priority", - FT_UINT8, BASE_DEC, NULL, ISIS_HELLO_PRIORITY_MASK, NULL, HFILL }}, + { &hf_isis_hello_priority, + { "Priority", "isis.hello.priority", + FT_UINT8, BASE_DEC, NULL, ISIS_HELLO_PRIORITY_MASK, NULL, HFILL }}, - { &hf_isis_hello_priority_reserved, - { "Reserved", "isis.hello.reserved", - FT_UINT8, BASE_DEC, NULL, ISIS_HELLO_P_RESERVED_MASK, NULL, HFILL }}, + { &hf_isis_hello_priority_reserved, + { "Reserved", "isis.hello.reserved", + FT_UINT8, BASE_DEC, NULL, ISIS_HELLO_P_RESERVED_MASK, NULL, HFILL }}, - { &hf_isis_hello_lan_id, - { "SystemID {Designated IS}", "isis.hello.lan_id", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_lan_id, + { "SystemID {Designated IS}", "isis.hello.lan_id", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_local_circuit_id, - { "Local circuit ID", "isis.hello.local_circuit_id", - FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_local_circuit_id, + { "Local circuit ID", "isis.hello.local_circuit_id", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_clv_ipv4_int_addr, - { "IPv4 interface address", "isis.hello.clv_ipv4_int_addr", - FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_clv_ipv4_int_addr, + { "IPv4 interface address", "isis.hello.clv_ipv4_int_addr", + FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_clv_ipv6_int_addr, - { "IPv6 interface address", "isis.hello.clv_ipv6_int_addr", - FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_clv_ipv6_int_addr, + { "IPv6 interface address", "isis.hello.clv_ipv6_int_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }}, #if 0 - { &hf_isis_hello_clv_ptp_adj, - { "Point-to-point Adjacency", "isis.hello.clv_ptp_adj", - FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_clv_ptp_adj, + { "Point-to-point Adjacency", "isis.hello.clv_ptp_adj", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, #endif - { &hf_isis_hello_clv_mt, - { "MT-ID", "isis.hello.clv_mt", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_clv_mt, + { "MT-ID", "isis.hello.clv_mt", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_clv_restart_flags, - { "Restart Signaling Flags", "isis.hello.clv_restart_flags", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_hello_clv_restart_flags, + { "Restart Signaling Flags", "isis.hello.clv_restart_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_hello_clv_restart_flags_rr, - { "Restart Request", "isis.hello.clv_restart_flags.rr", - FT_BOOLEAN, 8, TFS(&tfs_true_false), ISIS_RESTART_RR, - "When set, the router is beginning a graceful restart", HFILL }}, + { &hf_isis_hello_clv_restart_flags_rr, + { "Restart Request", "isis.hello.clv_restart_flags.rr", + FT_BOOLEAN, 8, TFS(&tfs_true_false), ISIS_RESTART_RR, + "When set, the router is beginning a graceful restart", HFILL }}, - { &hf_isis_hello_clv_restart_flags_ra, - { "Restart Acknowledgment", "isis.hello.clv_restart_flags.ra", - FT_BOOLEAN, 8, TFS(&tfs_true_false), ISIS_RESTART_RA, - "When set, the router is willing to enter helper mode", HFILL }}, + { &hf_isis_hello_clv_restart_flags_ra, + { "Restart Acknowledgment", "isis.hello.clv_restart_flags.ra", + FT_BOOLEAN, 8, TFS(&tfs_true_false), ISIS_RESTART_RA, + "When set, the router is willing to enter helper mode", HFILL }}, - { &hf_isis_hello_clv_restart_flags_sa, - { "Suppress Adjacency", "isis.hello.clv_restart_flags.sa", - FT_BOOLEAN, 8, TFS(&tfs_true_false), ISIS_RESTART_SA, - "When set, the router is starting as opposed to restarting", HFILL }}, + { &hf_isis_hello_clv_restart_flags_sa, + { "Suppress Adjacency", "isis.hello.clv_restart_flags.sa", + FT_BOOLEAN, 8, TFS(&tfs_true_false), ISIS_RESTART_SA, + "When set, the router is starting as opposed to restarting", HFILL }}, - { &hf_isis_hello_clv_restart_remain_time, - { "Remaining holding time", "isis.hello.clv_restart.remain_time", - FT_UINT16, BASE_DEC, NULL, 0x0, - "How long the helper router will maintain the existing adjacency", HFILL }}, + { &hf_isis_hello_clv_restart_remain_time, + { "Remaining holding time", "isis.hello.clv_restart.remain_time", + FT_UINT16, BASE_DEC, NULL, 0x0, + "How long the helper router will maintain the existing adjacency", HFILL }}, - { &hf_isis_hello_clv_restart_neighbor, - { "Restarting Neighbor ID", "isis.hello.clv_restart.neighbor", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, - "The System ID of the restarting neighbor", HFILL }}, + { &hf_isis_hello_clv_restart_neighbor, + { "Restarting Neighbor ID", "isis.hello.clv_restart.neighbor", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, + "The System ID of the restarting neighbor", HFILL }}, /* Generated from convert_proto_tree_add_text.pl */ { &hf_isis_hello_mcid, { "MCID", "isis.hello.mcid", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, @@ -1139,53 +1139,53 @@ proto_register_isis_hello(void) { &hf_isis_hello_neighbor_systemid, { "Neighbor SystemID", "isis.hello.neighbor_systemid", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_isis_hello_neighbor_extended_local_circuit_id, { "Neighbor Extended Local circuit ID", "isis.hello.neighbor_extended_local_circuit_id", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_isis_hello_is_neighbor, { "IS Neighbor", "isis.hello.is_neighbor", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - }; - - static gint *ett[] = { - &ett_isis_hello, - &ett_isis_hello_clv_area_addr, - &ett_isis_hello_clv_is_neighbors, - &ett_isis_hello_clv_padding, - &ett_isis_hello_clv_unknown, - &ett_isis_hello_clv_nlpid, - &ett_isis_hello_clv_authentication, - &ett_isis_hello_clv_ip_authentication, - &ett_isis_hello_clv_ipv4_int_addr, - &ett_isis_hello_clv_ipv6_int_addr, - &ett_isis_hello_clv_ptp_adj, - &ett_isis_hello_clv_mt, - &ett_isis_hello_clv_restart, - &ett_isis_hello_clv_restart_flags, - &ett_isis_hello_clv_mt_port_cap, - &ett_isis_hello_clv_mt_port_cap_spb_mcid, - &ett_isis_hello_clv_mt_port_cap_spb_aux_mcid, - &ett_isis_hello_clv_mt_port_cap_spb_digest, - &ett_isis_hello_clv_mt_port_cap_spb_bvid_tuples, - &ett_isis_hello_clv_checksum - }; - - static ei_register_info ei[] = { - { &ei_isis_hello_short_packet, { "isis.hello.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, - { &ei_isis_hello_long_packet, { "isis.hello.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, - { &ei_isis_hello_subtlv, { "isis.hello.subtlv.unknown", PI_PROTOCOL, PI_WARN, "Unknown SubTLV", EXPFILL }}, - { &ei_isis_hello_authentication, { "isis.hello.authentication.unknown", PI_PROTOCOL, PI_WARN, "Unknown authentication type", EXPFILL }}, - }; - - expert_module_t* expert_isis_hello; - - /* Register the protocol name and description */ - proto_isis_hello = proto_register_protocol("ISIS HELLO", "ISIS HELLO", "isis.hello"); - - proto_register_field_array(proto_isis_hello, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_isis_hello = expert_register_protocol(proto_isis_hello); - expert_register_field_array(expert_isis_hello, ei, array_length(ei)); + }; + + static gint *ett[] = { + &ett_isis_hello, + &ett_isis_hello_clv_area_addr, + &ett_isis_hello_clv_is_neighbors, + &ett_isis_hello_clv_padding, + &ett_isis_hello_clv_unknown, + &ett_isis_hello_clv_nlpid, + &ett_isis_hello_clv_authentication, + &ett_isis_hello_clv_ip_authentication, + &ett_isis_hello_clv_ipv4_int_addr, + &ett_isis_hello_clv_ipv6_int_addr, + &ett_isis_hello_clv_ptp_adj, + &ett_isis_hello_clv_mt, + &ett_isis_hello_clv_restart, + &ett_isis_hello_clv_restart_flags, + &ett_isis_hello_clv_mt_port_cap, + &ett_isis_hello_clv_mt_port_cap_spb_mcid, + &ett_isis_hello_clv_mt_port_cap_spb_aux_mcid, + &ett_isis_hello_clv_mt_port_cap_spb_digest, + &ett_isis_hello_clv_mt_port_cap_spb_bvid_tuples, + &ett_isis_hello_clv_checksum + }; + + static ei_register_info ei[] = { + { &ei_isis_hello_short_packet, { "isis.hello.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, + { &ei_isis_hello_long_packet, { "isis.hello.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, + { &ei_isis_hello_subtlv, { "isis.hello.subtlv.unknown", PI_PROTOCOL, PI_WARN, "Unknown SubTLV", EXPFILL }}, + { &ei_isis_hello_authentication, { "isis.hello.authentication.unknown", PI_PROTOCOL, PI_WARN, "Unknown authentication type", EXPFILL }}, + }; + + expert_module_t* expert_isis_hello; + + /* Register the protocol name and description */ + proto_isis_hello = proto_register_protocol("ISIS HELLO", "ISIS HELLO", "isis.hello"); + + proto_register_field_array(proto_isis_hello, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_isis_hello = expert_register_protocol(proto_isis_hello); + expert_register_field_array(expert_isis_hello, ei, array_length(ei)); } void proto_reg_handoff_isis_hello(void) { - dissector_add_uint("isis.type", ISIS_TYPE_L1_HELLO, new_create_dissector_handle(dissect_isis_l1_hello, proto_isis_hello)); - dissector_add_uint("isis.type", ISIS_TYPE_L2_HELLO, new_create_dissector_handle(dissect_isis_l2_hello, proto_isis_hello)); - dissector_add_uint("isis.type", ISIS_TYPE_PTP_HELLO, new_create_dissector_handle(dissect_isis_ptp_hello, proto_isis_hello)); + dissector_add_uint("isis.type", ISIS_TYPE_L1_HELLO, new_create_dissector_handle(dissect_isis_l1_hello, proto_isis_hello)); + dissector_add_uint("isis.type", ISIS_TYPE_L2_HELLO, new_create_dissector_handle(dissect_isis_l2_hello, proto_isis_hello)); + dissector_add_uint("isis.type", ISIS_TYPE_PTP_HELLO, new_create_dissector_handle(dissect_isis_ptp_hello, proto_isis_hello)); } diff --git a/epan/dissectors/packet-isis-lsp.c b/epan/dissectors/packet-isis-lsp.c index d3c0d94f90..efd47bbe93 100644 --- a/epan/dissectors/packet-isis-lsp.c +++ b/epan/dissectors/packet-isis-lsp.c @@ -65,14 +65,14 @@ #define ISIS_LSP_IS_TYPE_MASK 0x03 #define ISIS_LSP_IS_TYPE(info) ((info) & ISIS_LSP_IS_TYPE_MASK) -#define ISIS_LSP_MT_MSHIP_RES_MASK 0xF000 -#define ISIS_LSP_MT_MSHIP_ID_MASK 0x0FFF +#define ISIS_LSP_MT_MSHIP_RES_MASK 0xF000 +#define ISIS_LSP_MT_MSHIP_ID_MASK 0x0FFF -#define ISIS_LSP_TYPE_UNUSED0 0 -#define ISIS_LSP_TYPE_LEVEL_1 1 -#define ISIS_LSP_TYPE_UNUSED2 2 -#define ISIS_LSP_TYPE_LEVEL_2 3 +#define ISIS_LSP_TYPE_UNUSED0 0 +#define ISIS_LSP_TYPE_LEVEL_1 1 +#define ISIS_LSP_TYPE_UNUSED2 2 +#define ISIS_LSP_TYPE_LEVEL_2 3 #define ISIS_LSP_ATTACHED_NONE 0 #define ISIS_LSP_ATTACHED_DEFAULT 1 @@ -81,11 +81,11 @@ #define ISIS_LSP_ATTACHED_ERROR 8 -#define ISIS_LSP_CLV_METRIC_SUPPORTED(x) ((x)&0x80) +#define ISIS_LSP_CLV_METRIC_SUPPORTED(x) ((x)&0x80) #define ISIS_LSP_CLV_METRIC_IE(x) ((x)&0x40) -#define ISIS_LSP_CLV_METRIC_RESERVED(x) ((x)&0x40) +#define ISIS_LSP_CLV_METRIC_RESERVED(x) ((x)&0x40) #define ISIS_LSP_CLV_METRIC_UPDOWN(x) ((x)&0x80) -#define ISIS_LSP_CLV_METRIC_VALUE(x) ((x)&0x3f) +#define ISIS_LSP_CLV_METRIC_VALUE(x) ((x)&0x3f) /* Sub-TLVs under Router Capability TLV As per RFC 6326 section 2.3 */ @@ -278,11 +278,11 @@ static expert_field ei_isis_lsp_subtlv = EI_INIT; static expert_field ei_isis_lsp_authentication = EI_INIT; static const value_string isis_lsp_istype_vals[] = { - { ISIS_LSP_TYPE_UNUSED0, "Unused 0x0 (invalid)"}, - { ISIS_LSP_TYPE_LEVEL_1, "Level 1"}, - { ISIS_LSP_TYPE_UNUSED2, "Unused 0x2 (invalid)"}, - { ISIS_LSP_TYPE_LEVEL_2, "Level 2"}, - { 0, NULL } }; + { ISIS_LSP_TYPE_UNUSED0, "Unused 0x0 (invalid)"}, + { ISIS_LSP_TYPE_LEVEL_1, "Level 1"}, + { ISIS_LSP_TYPE_UNUSED2, "Unused 0x2 (invalid)"}, + { ISIS_LSP_TYPE_LEVEL_2, "Level 2"}, + { 0, NULL } }; static const true_false_string tfs_up_down = { "Up", "Down" }; static const true_false_string tfs_notsupported_supported = { "Not Supported", "Supported" }; @@ -292,63 +292,63 @@ static const true_false_string tfs_external_internal = { "External", "Internal" static void fp_get_hmac_addr (guint64 hmac, guint16 *swid, guint16 *sswid, guint16 *lid) { - if (!swid || !sswid || !lid) { - return; - } + if (!swid || !sswid || !lid) { + return; + } - *swid = (guint16) ((hmac & FP_HMAC_SWID_MASK) >> 32); - *sswid = (guint16) ((hmac & FP_HMAC_SSWID_MASK) >> 16); - *lid = (guint16) (hmac & FP_HMAC_LID_MASK); + *swid = (guint16) ((hmac & FP_HMAC_SWID_MASK) >> 32); + *sswid = (guint16) ((hmac & FP_HMAC_SSWID_MASK) >> 16); + *lid = (guint16) (hmac & FP_HMAC_LID_MASK); } /* * Name: dissect_lsp_mt_id() * * Description: - * dissect and display the multi-topology ID value + * dissect and display the multi-topology ID value * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. CAN'T BE NULL - * int : offset into packet data where we are. + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. CAN'T BE NULL + * int : offset into packet data where we are. * * Output: - * void, but we will add to proto tree. + * void, but we will add to proto tree. */ static void dissect_lsp_mt_id(tvbuff_t *tvb, proto_tree *tree, int offset) { - int mt_block, mt_id; - const char *mt_desc=""; - - /* fetch two bytes */ - mt_block = tvb_get_ntohs(tvb, offset); - - proto_tree_add_item(tree, hf_isis_lsp_mt_id_reserved, tvb, offset, 2, ENC_NA); - - mt_id = mt_block & ISIS_LSP_MT_MSHIP_ID_MASK; - /*mask out the lower 12 bits */ - switch(mt_id) { - case 0: - mt_desc="'standard' topology"; - break; - case 1: - mt_desc="IPv4 In-Band Management purposes"; - break; - case 2: - mt_desc="IPv6 routing topology"; - break; - case 3: - mt_desc="IPv4 multicast routing topology"; - break; - case 4: - mt_desc="IPv6 multicast routing topology"; - break; - default: - mt_desc=((mt_block & 0x0fff) < 3996) ? "Reserved for IETF Consensus" : "Development, Experimental and Proprietary features"; - } - - proto_tree_add_uint_format( tree, hf_isis_lsp_mt_id, tvb, offset, 2, - mt_id, "%s (%d)", mt_desc, mt_id); + int mt_block, mt_id; + const char *mt_desc=""; + + /* fetch two bytes */ + mt_block = tvb_get_ntohs(tvb, offset); + + proto_tree_add_item(tree, hf_isis_lsp_mt_id_reserved, tvb, offset, 2, ENC_NA); + + mt_id = mt_block & ISIS_LSP_MT_MSHIP_ID_MASK; + /*mask out the lower 12 bits */ + switch(mt_id) { + case 0: + mt_desc="'standard' topology"; + break; + case 1: + mt_desc="IPv4 In-Band Management purposes"; + break; + case 2: + mt_desc="IPv6 routing topology"; + break; + case 3: + mt_desc="IPv4 multicast routing topology"; + break; + case 4: + mt_desc="IPv6 multicast routing topology"; + break; + default: + mt_desc=((mt_block & 0x0fff) < 3996) ? "Reserved for IETF Consensus" : "Development, Experimental and Proprietary features"; + } + + proto_tree_add_uint_format( tree, hf_isis_lsp_mt_id, tvb, offset, 2, + mt_id, "%s (%d)", mt_desc, mt_id); } @@ -356,131 +356,131 @@ dissect_lsp_mt_id(tvbuff_t *tvb, proto_tree *tree, int offset) * Name: dissect_metric() * * Description: - * Display a metric prefix portion. ISIS has the concept of multple - * metric per prefix (default, delay, expense, and error). This - * routine assists other dissectors by adding a single one of - * these to the display tree.. - * - * The 8th(msbit) bit in the metric octet is the "supported" bit. The - * "default" support is required, so we support a "force_supported" - * flag that tells us that it MUST be zero (zero==supported, - * so it really should be a "not supported" in the boolean sense) - * and to display a protocol failure accordingly. Notably, - * Cisco IOS 12(6) blows this! - * The 7th bit must be zero (reserved). + * Display a metric prefix portion. ISIS has the concept of multple + * metric per prefix (default, delay, expense, and error). This + * routine assists other dissectors by adding a single one of + * these to the display tree.. + * + * The 8th(msbit) bit in the metric octet is the "supported" bit. The + * "default" support is required, so we support a "force_supported" + * flag that tells us that it MUST be zero (zero==supported, + * so it really should be a "not supported" in the boolean sense) + * and to display a protocol failure accordingly. Notably, + * Cisco IOS 12(6) blows this! + * The 7th bit must be zero (reserved). * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * guint8 : value of the metric. - * char * : string giving type of the metric. - * int : force supported. True is the supported bit MUST be zero. + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * guint8 : value of the metric. + * char * : string giving type of the metric. + * int : force supported. True is the supported bit MUST be zero. * * Output: - * void, but we will add to proto tree if !NULL. + * void, but we will add to proto tree if !NULL. */ static void -dissect_metric(tvbuff_t *tvb, proto_tree *tree, int offset, guint8 value, - const char *pstr, int force_supported ) +dissect_metric(tvbuff_t *tvb, proto_tree *tree, int offset, guint8 value, + const char *pstr, int force_supported ) { - int s; + int s; - if ( !tree ) return; + if ( !tree ) return; - s = ISIS_LSP_CLV_METRIC_SUPPORTED(value); - proto_tree_add_text(tree, tvb, offset, 1, - "%s Metric: %s%s %s%d:%d", pstr, - s ? "Not supported" : "Supported", - (s && force_supported) ? "(but is required to be)":"", - ISIS_LSP_CLV_METRIC_RESERVED(value) ? "(reserved bit != 0)":"", - ISIS_LSP_CLV_METRIC_VALUE(value), value ); + s = ISIS_LSP_CLV_METRIC_SUPPORTED(value); + proto_tree_add_text(tree, tvb, offset, 1, + "%s Metric: %s%s %s%d:%d", pstr, + s ? "Not supported" : "Supported", + (s && force_supported) ? "(but is required to be)":"", + ISIS_LSP_CLV_METRIC_RESERVED(value) ? "(reserved bit != 0)":"", + ISIS_LSP_CLV_METRIC_VALUE(value), value ); } /* * Name: dissect_lsp_ip_reachability_clv() * * Description: - * Decode an IP reachability CLV. This can be either internal or - * external (the clv format does not change and which type we are - * displaying is put there by the dispatcher). All of these - * are a metric block followed by an IP addr and mask. + * Decode an IP reachability CLV. This can be either internal or + * external (the clv format does not change and which type we are + * displaying is put there by the dispatcher). All of these + * are a metric block followed by an IP addr and mask. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_lsp_ip_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - proto_item *ti; - proto_tree *ntree = NULL; - guint32 src, mask, bitmask; - int prefix_len; - gboolean found_mask = FALSE; - - while ( length > 0 ) { - if (length<12) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "short IP reachability (%d vs 12)", length ); - return; - } - /* - * Gotta build a sub-tree for all our pieces - */ - if ( tree ) { - src = tvb_get_ipv4(tvb, offset+4); - mask = tvb_get_ntohl(tvb, offset+8); - - /* find out if the mask matches one of 33 possible prefix lengths */ - bitmask = 0xffffffff; - for(prefix_len = 32; prefix_len >= 0; prefix_len--) { - if (bitmask==mask) { - found_mask = TRUE; - break; - } - bitmask = bitmask << 1; - } - - /* If we have a discontiguous netmask, dump the mask, otherwise print the prefix_len */ - /* XXX - We should probably have some sort of netmask_to_str() routine in to_str.c that does this. */ - - if(found_mask) { - ti = proto_tree_add_ipv4_format_value( tree, hf_isis_lsp_ip_reachability_ipv4_prefix, tvb, offset, 12, - src, "%s/%d", ip_to_str((guint8*)&src), prefix_len ); - } else { - ti = proto_tree_add_ipv4_format_value( tree, hf_isis_lsp_ip_reachability_ipv4_prefix, tvb, offset, 12, - src, "%s mask %s", ip_to_str((guint8*)&src), tvb_ip_to_str(tvb, offset+8)); - }; - - ntree = proto_item_add_subtree(ti, ett_isis_lsp_clv_ip_reachability); - - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_default_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_default_metric_ie, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_distribution, tvb, offset, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_delay_metric, tvb, offset+1, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_delay_metric_support, tvb, offset+1, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_delay_metric_ie, tvb, offset+1, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_expense_metric, tvb, offset+2, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_expense_metric_support, tvb, offset+2, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_expense_metric_ie, tvb, offset+2, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_error_metric, tvb, offset+3, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_error_metric_support, tvb, offset+3, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_error_metric_ie, tvb, offset+3, 1, ENC_NA); - } - offset += 12; - length -= 12; - } + proto_item *ti; + proto_tree *ntree = NULL; + guint32 src, mask, bitmask; + int prefix_len; + gboolean found_mask = FALSE; + + while ( length > 0 ) { + if (length<12) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "short IP reachability (%d vs 12)", length ); + return; + } + /* + * Gotta build a sub-tree for all our pieces + */ + if ( tree ) { + src = tvb_get_ipv4(tvb, offset+4); + mask = tvb_get_ntohl(tvb, offset+8); + + /* find out if the mask matches one of 33 possible prefix lengths */ + bitmask = 0xffffffff; + for(prefix_len = 32; prefix_len >= 0; prefix_len--) { + if (bitmask==mask) { + found_mask = TRUE; + break; + } + bitmask = bitmask << 1; + } + + /* If we have a discontiguous netmask, dump the mask, otherwise print the prefix_len */ + /* XXX - We should probably have some sort of netmask_to_str() routine in to_str.c that does this. */ + + if(found_mask) { + ti = proto_tree_add_ipv4_format_value( tree, hf_isis_lsp_ip_reachability_ipv4_prefix, tvb, offset, 12, + src, "%s/%d", ip_to_str((guint8*)&src), prefix_len ); + } else { + ti = proto_tree_add_ipv4_format_value( tree, hf_isis_lsp_ip_reachability_ipv4_prefix, tvb, offset, 12, + src, "%s mask %s", ip_to_str((guint8*)&src), tvb_ip_to_str(tvb, offset+8)); + }; + + ntree = proto_item_add_subtree(ti, ett_isis_lsp_clv_ip_reachability); + + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_default_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_default_metric_ie, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_distribution, tvb, offset, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_delay_metric, tvb, offset+1, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_delay_metric_support, tvb, offset+1, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_delay_metric_ie, tvb, offset+1, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_expense_metric, tvb, offset+2, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_expense_metric_support, tvb, offset+2, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_expense_metric_ie, tvb, offset+2, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_error_metric, tvb, offset+3, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_error_metric_support, tvb, offset+3, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_ip_reachability_error_metric_ie, tvb, offset+3, 1, ENC_NA); + } + offset += 12; + length -= 12; + } } /* @@ -501,28 +501,28 @@ static void dissect_ipreach_subclv(tvbuff_t *tvb, proto_tree *tree, int offset, int clv_code, int clv_len) { - switch (clv_code) { - case 1: - while (clv_len >= 4) { - proto_tree_add_item(tree, hf_isis_lsp_32_bit_administrative_tag, tvb, offset, 4, ENC_BIG_ENDIAN); - offset+=4; - clv_len-=4; - } - break; - case 2: - while (clv_len >= 8) { - proto_tree_add_item(tree, hf_isis_lsp_64_bit_administrative_tag, tvb, offset, 8, ENC_BIG_ENDIAN); - offset+=8; - clv_len-=8; - } - break; - - default : - proto_tree_add_text (tree, tvb, offset, clv_len+2, - "Unknown sub-TLV: code %u, length %u", - clv_code, clv_len ); - break; - } + switch (clv_code) { + case 1: + while (clv_len >= 4) { + proto_tree_add_item(tree, hf_isis_lsp_32_bit_administrative_tag, tvb, offset, 4, ENC_BIG_ENDIAN); + offset+=4; + clv_len-=4; + } + break; + case 2: + while (clv_len >= 8) { + proto_tree_add_item(tree, hf_isis_lsp_64_bit_administrative_tag, tvb, offset, 8, ENC_BIG_ENDIAN); + offset+=8; + clv_len-=8; + } + break; + + default : + proto_tree_add_text (tree, tvb, offset, clv_len+2, + "Unknown sub-TLV: code %u, length %u", + clv_code, clv_len ); + break; + } } @@ -551,69 +551,69 @@ dissect_ipreach_subclv(tvbuff_t *tvb, proto_tree *tree, int offset, int clv_code */ static void dissect_lsp_ext_ip_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, - int offset, int id_length _U_, int length) + int offset, int id_length _U_, int length) { - proto_tree *subtree = NULL; - proto_tree *subtree2 = NULL; - guint8 ctrl_info; - guint bit_length; - int byte_length; - guint8 prefix [4]; - guint len,i; - guint subclvs_len; - guint clv_code, clv_len; - - if (!tree) return; - - while (length > 0) { - ctrl_info = tvb_get_guint8(tvb, offset+4); - bit_length = ctrl_info & 0x3f; - byte_length = ipv4_addr_and_mask(tvb, offset+5, prefix, bit_length); - if (byte_length == -1) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "IPv4 prefix has an invalid length: %d bits", bit_length ); - return; - } - subclvs_len = 0; - if ((ctrl_info & 0x40) != 0) - subclvs_len = 1+tvb_get_guint8(tvb, offset+5+byte_length); - - /* open up a new tree per prefix */ - subtree = proto_tree_add_subtree(tree, tvb, offset, 5+byte_length+subclvs_len, + proto_tree *subtree = NULL; + proto_tree *subtree2 = NULL; + guint8 ctrl_info; + guint bit_length; + int byte_length; + guint8 prefix [4]; + guint len,i; + guint subclvs_len; + guint clv_code, clv_len; + + if (!tree) return; + + while (length > 0) { + ctrl_info = tvb_get_guint8(tvb, offset+4); + bit_length = ctrl_info & 0x3f; + byte_length = ipv4_addr_and_mask(tvb, offset+5, prefix, bit_length); + if (byte_length == -1) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "IPv4 prefix has an invalid length: %d bits", bit_length ); + return; + } + subclvs_len = 0; + if ((ctrl_info & 0x40) != 0) + subclvs_len = 1+tvb_get_guint8(tvb, offset+5+byte_length); + + /* open up a new tree per prefix */ + subtree = proto_tree_add_subtree(tree, tvb, offset, 5+byte_length+subclvs_len, ett_isis_lsp_part_of_clv_ext_ip_reachability, NULL, "Ext. IP Reachability"); - proto_tree_add_ipv4_format_value(subtree, hf_isis_lsp_ext_ip_reachability_ipv4_prefix, tvb, offset+5, byte_length, + proto_tree_add_ipv4_format_value(subtree, hf_isis_lsp_ext_ip_reachability_ipv4_prefix, tvb, offset+5, byte_length, tvb_get_ntohl(tvb, offset+5), "%s/%u", ip_to_str (prefix), bit_length); - proto_tree_add_item(subtree, hf_isis_lsp_ext_ip_reachability_metric, tvb, offset, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_isis_lsp_ext_ip_reachability_distribution, tvb, offset+4, 1, ENC_NA); + proto_tree_add_item(subtree, hf_isis_lsp_ext_ip_reachability_metric, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_isis_lsp_ext_ip_reachability_distribution, tvb, offset+4, 1, ENC_NA); - 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, + 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); - 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); - - /* - * 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); - i += clv_len + 2; - } - len += 1 + subclvs_len; - } else { - proto_tree_add_text (subtree, tvb, offset+4, len, "no sub-TLVs present"); - } - - offset += len; - length -= len; - } + 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); + + /* + * 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); + i += clv_len + 2; + } + len += 1 + subclvs_len; + } else { + proto_tree_add_text (subtree, tvb, offset+4, len, "no sub-TLVs present"); + } + + offset += len; + length -= len; + } } /* @@ -638,109 +638,109 @@ dissect_lsp_ext_ip_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tre static void dissect_isis_grp_address_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, - int tree_id,int length) + int tree_id,int length) { - gint len; - gint source_num; - gint k=1; - guint16 mt_block; - guint64 hmac_src; - guint16 swid = 0; - guint16 sswid = 0; - guint16 lid = 0; - - proto_tree *rt_tree=NULL; - - while (length>0) { - /* fetch two bytes */ - mt_block=tvb_get_ntohs(tvb, offset); - /* Mask out the lower 8 bits */ - switch((mt_block&0xff00)>>8) { - - - case GRP_MAC_ADDRESS: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (mt_block&0x00ff)+2, + gint len; + gint source_num; + gint k=1; + guint16 mt_block; + guint64 hmac_src; + guint16 swid = 0; + guint16 sswid = 0; + guint16 lid = 0; + + proto_tree *rt_tree=NULL; + + while (length>0) { + /* fetch two bytes */ + mt_block=tvb_get_ntohs(tvb, offset); + /* Mask out the lower 8 bits */ + switch((mt_block&0xff00)>>8) { + + + case GRP_MAC_ADDRESS: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (mt_block&0x00ff)+2, ett_isis_lsp_clv_grp_address_IPv4_prefx, NULL, "GROUP MAC ADDRESS SUB TLV"); - length--; - offset++; + length--; + offset++; - len=tvb_get_guint8(tvb, offset);/* 1 byte fetched displays the length*/ - proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_length, tvb, offset, 1, ENC_NA); + len=tvb_get_guint8(tvb, offset);/* 1 byte fetched displays the length*/ + proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_length, tvb, offset, 1, ENC_NA); - if(len < 5) { - length -= len; - offset += len; - break; - } + if(len < 5) { + length -= len; + offset += len; + break; + } - length--; - offset++; + length--; + offset++; - proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_topology_id, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_topology_id, tvb, offset, 2, ENC_BIG_ENDIAN); - length -= 2; - offset += 2; - len -= 2; + length -= 2; + offset += 2; + len -= 2; - proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_vlan_id, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_vlan_id, tvb, offset, 2, ENC_BIG_ENDIAN); - length -= 2; - offset += 2; - len -= 2; + length -= 2; + offset += 2; + len -= 2; - proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_number_of_records, tvb, offset, 1, ENC_NA); + proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_number_of_records, tvb, offset, 1, ENC_NA); - length--; - offset++; - len--; + length--; + offset++; + len--; - while(len > 0) { + while(len > 0) { - source_num=tvb_get_guint8(tvb, offset); - proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_number_of_sources, tvb, offset, 1, ENC_NA); + source_num=tvb_get_guint8(tvb, offset); + proto_tree_add_item(rt_tree, hf_isis_lsp_grp_address_number_of_sources, tvb, offset, 1, ENC_NA); - length--; - offset++; - len--; + length--; + offset++; + len--; - hmac_src=tvb_get_ntoh48(tvb, offset);/* Fetch the data in the next two bytes for display*/ + hmac_src=tvb_get_ntoh48(tvb, offset);/* Fetch the data in the next two bytes for display*/ - fp_get_hmac_addr (hmac_src, &swid, &sswid, &lid); - proto_tree_add_bytes_format_value(rt_tree, hf_isis_lsp_grp_address_group_address, tvb, offset, 6, + fp_get_hmac_addr (hmac_src, &swid, &sswid, &lid); + proto_tree_add_bytes_format_value(rt_tree, hf_isis_lsp_grp_address_group_address, tvb, offset, 6, tvb_get_ptr(tvb, offset, 6), "%04x.%04x.%04x", swid, sswid, lid ); - length -= 6; - offset += 6; - len -= 6; + length -= 6; + offset += 6; + len -= 6; - while((len > 0) && (source_num > 0)) { - hmac_src = tvb_get_ntoh48 (tvb, offset); - fp_get_hmac_addr (hmac_src, &swid, &sswid, &lid); - proto_tree_add_bytes_format(rt_tree, hf_isis_lsp_grp_address_source_address, tvb, offset, 6, + while((len > 0) && (source_num > 0)) { + hmac_src = tvb_get_ntoh48 (tvb, offset); + fp_get_hmac_addr (hmac_src, &swid, &sswid, &lid); + proto_tree_add_bytes_format(rt_tree, hf_isis_lsp_grp_address_source_address, tvb, offset, 6, tvb_get_ptr(tvb, offset, 6), "Source Address (%d):%04x.%04x.%04x", k, swid, sswid, lid); - k++; - length -= 6; - offset += 6; - len -= 6; - source_num--; - } - } - - break; - - - default: - proto_tree_add_uint_format ( tree, tree_id, tvb, offset,(mt_block&0x00ff)+2, - mt_block, "INVALID SUB TLV"); - offset++; - length -= (2+tvb_get_guint8(tvb, offset)); - offset += (1+tvb_get_guint8(tvb, offset)); - break; - } - } + k++; + length -= 6; + offset += 6; + len -= 6; + source_num--; + } + } + + break; + + + default: + proto_tree_add_uint_format ( tree, tree_id, tvb, offset,(mt_block&0x00ff)+2, + mt_block, "INVALID SUB TLV"); + offset++; + length -= (2+tvb_get_guint8(tvb, offset)); + offset += (1+tvb_get_guint8(tvb, offset)); + break; + } + } } /* @@ -770,243 +770,243 @@ static void dissect_isis_rt_capable_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, int id_length _U_, int length) { - gint len; - guint16 rt_block; - proto_tree *rt_tree; + gint len; + guint16 rt_block; + proto_tree *rt_tree; - gint root_id = 1; /* To display the root id */ - gint sec_vlan_id = 1; /* To display the seconadary VLAN id */ - length = length - 5; /* Ignoring the 5 reserved bytes */ - offset = offset + 5; + gint root_id = 1; /* To display the root id */ + gint sec_vlan_id = 1; /* To display the seconadary VLAN id */ + length = length - 5; /* Ignoring the 5 reserved bytes */ + offset = offset + 5; - while (length>1) { - /* fetch two bytes */ - rt_block = tvb_get_ntohs(tvb, offset); + while (length>1) { + /* fetch two bytes */ + rt_block = tvb_get_ntohs(tvb, offset); - /* Mask out the lower 8 bits */ - switch ((rt_block&0xff00)>>8) { + /* Mask out the lower 8 bits */ + switch ((rt_block&0xff00)>>8) { - case TRILL_VERSION: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + case TRILL_VERSION: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "TRILL version sub tlv"); - length--; - offset++; + length--; + offset++; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trill_length, tvb, offset, 1, ENC_NA); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trill_maximum_version, tvb, offset+1, 1, ENC_NA); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trill_length, tvb, offset, 1, ENC_NA); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trill_maximum_version, tvb, offset+1, 1, ENC_NA); - length -= 2; - offset += 2; + length -= 2; + offset += 2; - break; + break; - case TREES: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + case TREES: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "Trees sub tlv"); - length--; - offset++; + length--; + offset++; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_length, tvb, offset, 1, ENC_NA); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_length, tvb, offset, 1, ENC_NA); - length--; - offset++; + length--; + offset++; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_nof_trees_to_compute, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_nof_trees_to_compute, tvb, offset, 2, ENC_BIG_ENDIAN); - length -= 2; - offset += 2; + length -= 2; + offset += 2; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_maximum_nof_trees_to_compute, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_maximum_nof_trees_to_compute, tvb, offset, 2, ENC_BIG_ENDIAN); - length -= 2; - offset += 2; + length -= 2; + offset += 2; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_nof_trees_to_use, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_trees_nof_trees_to_use, tvb, offset, 2, ENC_BIG_ENDIAN); - length -= 2; - offset += 2; - break; + length -= 2; + offset += 2; + break; - case TREE_IDENTIFIER: - rt_tree=proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + case TREE_IDENTIFIER: + rt_tree=proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "Tree root identifier sub tlv"); - length--; - offset++; + length--; + offset++; - len = tvb_get_guint8(tvb, offset); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_root_id_length, tvb, offset, 1, ENC_NA); + len = tvb_get_guint8(tvb, offset); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_root_id_length, tvb, offset, 1, ENC_NA); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_root_id_starting_tree_no, tvb, offset+1, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_root_id_starting_tree_no, tvb, offset+1, 2, ENC_BIG_ENDIAN); - len -= 2; - length -= 2; - offset += 2; + len -= 2; + length -= 2; + offset += 2; - while (len>1) { - rt_block = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format(rt_tree, hf_isis_lsp_rt_capable_tree_root_id_nickname, tvb, offset, 2, + while (len>1) { + rt_block = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint_format(rt_tree, hf_isis_lsp_rt_capable_tree_root_id_nickname, tvb, offset, 2, rt_block, "Nickname(%dth root): %d", root_id, rt_block); - root_id++; - len -= 2; - length -= 2; - offset += 2; - } - break; - - case NICKNAME: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + root_id++; + len -= 2; + length -= 2; + offset += 2; + } + break; + + case NICKNAME: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "The nickname sub tlv"); - length--; - offset++; - len = tvb_get_guint8(tvb, offset); - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_length, tvb, offset, 1, ENC_NA); - length--; - offset++; - - while (len>0) { - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_nickname_priority, tvb, offset, 1, ENC_NA); - length--; - offset++; - len--; - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_tree_root_priority, tvb, offset, 2, ENC_BIG_ENDIAN); - len -= 2; - length -= 2; - offset += 2; - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_nickname, tvb, offset, 2, ENC_BIG_ENDIAN); - length = length-2; - offset = offset+2; - len = len-2; - } - break; - - case INTERESTED_VLANS: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + length--; + offset++; + len = tvb_get_guint8(tvb, offset); + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_length, tvb, offset, 1, ENC_NA); + length--; + offset++; + + while (len>0) { + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_nickname_priority, tvb, offset, 1, ENC_NA); + length--; + offset++; + len--; + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_tree_root_priority, tvb, offset, 2, ENC_BIG_ENDIAN); + len -= 2; + length -= 2; + offset += 2; + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_nickname_nickname, tvb, offset, 2, ENC_BIG_ENDIAN); + length = length-2; + offset = offset+2; + len = len-2; + } + break; + + case INTERESTED_VLANS: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "Interested VLAN and spanning tree root sub tlv"); - length--; - offset++; - - len = tvb_get_guint8(tvb, offset); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_length, tvb, offset, 1, ENC_NA); - length--; - offset++; - len--; - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_nickname, tvb, offset, 2, ENC_BIG_ENDIAN); - len -= 2; - length -= 2; - offset += 2; - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv4, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv6, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_vlan_start_id, tvb, offset, 2, ENC_BIG_ENDIAN); - len -= 2; - length -= 2; - offset += 2; - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_vlan_end_id, tvb, offset, 2, ENC_BIG_ENDIAN); - len -= 2; - length -= 2; - offset += 2; - - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_afs_lost_counter, tvb, offset, 4, ENC_BIG_ENDIAN); - length -= 4; - offset += 4; - len -= 4; - - while (len>0) { - proto_tree_add_item(rt_tree, hf_isis_lsp_root_id, tvb, offset, 6, ENC_BIG_ENDIAN); - - length -= 6; - offset += 6; - len -= 6; - } - break; - - case TREES_USED_IDENTIFIER: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + length--; + offset++; + + len = tvb_get_guint8(tvb, offset); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_length, tvb, offset, 1, ENC_NA); + length--; + offset++; + len--; + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_nickname, tvb, offset, 2, ENC_BIG_ENDIAN); + len -= 2; + length -= 2; + offset += 2; + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv4, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv6, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_vlan_start_id, tvb, offset, 2, ENC_BIG_ENDIAN); + len -= 2; + length -= 2; + offset += 2; + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_vlan_end_id, tvb, offset, 2, ENC_BIG_ENDIAN); + len -= 2; + length -= 2; + offset += 2; + + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_interested_vlans_afs_lost_counter, tvb, offset, 4, ENC_BIG_ENDIAN); + length -= 4; + offset += 4; + len -= 4; + + while (len>0) { + proto_tree_add_item(rt_tree, hf_isis_lsp_root_id, tvb, offset, 6, ENC_BIG_ENDIAN); + + length -= 6; + offset += 6; + len -= 6; + } + break; + + case TREES_USED_IDENTIFIER: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "Trees used identifier sub tlv"); - length--; - offset++; + length--; + offset++; - len = tvb_get_guint8(tvb, offset); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_used_id_length, tvb, offset, 1, ENC_NA); + len = tvb_get_guint8(tvb, offset); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_used_id_length, tvb, offset, 1, ENC_NA); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_used_id_starting_tree_no, tvb, offset+1, 2, ENC_BIG_ENDIAN); - len -= 2; - length += 2; - offset += 3; - root_id = 1; + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_tree_used_id_starting_tree_no, tvb, offset+1, 2, ENC_BIG_ENDIAN); + len -= 2; + length += 2; + offset += 3; + root_id = 1; - while (len>0) { - rt_block = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format(rt_tree, hf_isis_lsp_rt_capable_tree_used_id_nickname, tvb, offset,2, + while (len>0) { + rt_block = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint_format(rt_tree, hf_isis_lsp_rt_capable_tree_used_id_nickname, tvb, offset,2, rt_block, "Nickname(%dth root): %d", root_id, rt_block); - root_id++; + root_id++; - len -= 2; - offset += 2; - length -= 2; - } - break; + len -= 2; + offset += 2; + length -= 2; + } + break; - case VLAN_GROUP: - rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, + case VLAN_GROUP: + rt_tree = proto_tree_add_subtree(tree, tvb, offset, (rt_block&0x00ff)+2, ett_isis_lsp_clv_rt_capable_IPv4_prefx, NULL, "The VLAN group sub tlv"); - length--; - offset++; + length--; + offset++; - len = tvb_get_guint8(tvb, offset); - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_vlan_group_length, tvb, offset, 1, ENC_NA); + len = tvb_get_guint8(tvb, offset); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_vlan_group_length, tvb, offset, 1, ENC_NA); - len--; - length--; - offset++; + len--; + length--; + offset++; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_vlan_group_primary_vlan_id, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_vlan_group_primary_vlan_id, tvb, offset, 2, ENC_BIG_ENDIAN); - len -= 2; - offset += 2; - length -= 2; + len -= 2; + offset += 2; + length -= 2; - proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_vlan_group_secondary_vlan_id, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(rt_tree, hf_isis_lsp_rt_capable_vlan_group_secondary_vlan_id, tvb, offset, 2, ENC_BIG_ENDIAN); - len -= 2; - offset += 2; - length -= 2; - sec_vlan_id = 1; + len -= 2; + offset += 2; + length -= 2; + sec_vlan_id = 1; - while (len>0) { - rt_block = tvb_get_ntohs(tvb, offset); + while (len>0) { + rt_block = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format(rt_tree, hf_isis_lsp_rt_capable_vlan_group_nth_secondary_vlan_id, tvb, offset, 2, + proto_tree_add_uint_format(rt_tree, hf_isis_lsp_rt_capable_vlan_group_nth_secondary_vlan_id, tvb, offset, 2, rt_block, "%dth secondary vlan id: %x", sec_vlan_id, rt_block); - length -= 2; - offset += 2; - sec_vlan_id++; - len -= 2; - } - break; - - default: - proto_tree_add_text(tree, tvb, offset, (rt_block&0x00ff)+2, "INVALID sub tlv"); - - offset++; - length -= (2+tvb_get_guint8(tvb, offset)); - offset += (1+tvb_get_guint8(tvb, offset)); - break; - } - } + length -= 2; + offset += 2; + sec_vlan_id++; + len -= 2; + } + break; + + default: + proto_tree_add_text(tree, tvb, offset, (rt_block&0x00ff)+2, "INVALID sub tlv"); + + offset++; + length -= (2+tvb_get_guint8(tvb, offset)); + offset += (1+tvb_get_guint8(tvb, offset)); + break; + } + } } @@ -1031,116 +1031,116 @@ dissect_isis_rt_capable_clv(tvbuff_t *tvb, packet_info* pinfo _U_, */ static void dissect_lsp_ipv6_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - proto_tree *subtree = NULL; - proto_tree *subtree2 = NULL; - guint8 ctrl_info; - guint bit_length; - int byte_length; - struct e_in6_addr prefix; - guint len,i; - guint subclvs_len; - guint clv_code, clv_len; - - if (!tree) return; - - while (length > 0) { - ctrl_info = tvb_get_guint8(tvb, offset+4); - bit_length = tvb_get_guint8(tvb, offset+5); - byte_length = ipv6_addr_and_mask(tvb, offset+6, &prefix, bit_length); - if (byte_length == -1) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "IPv6 prefix has an invalid length: %d bits", bit_length ); - return; - } - subclvs_len = 0; - if ((ctrl_info & 0x20) != 0) - subclvs_len = 1+tvb_get_guint8(tvb, offset+6+byte_length); - - subtree = proto_tree_add_subtree(tree, tvb, offset, 6+byte_length+subclvs_len, + proto_tree *subtree = NULL; + proto_tree *subtree2 = NULL; + guint8 ctrl_info; + guint bit_length; + int byte_length; + struct e_in6_addr prefix; + guint len,i; + guint subclvs_len; + guint clv_code, clv_len; + + if (!tree) return; + + while (length > 0) { + ctrl_info = tvb_get_guint8(tvb, offset+4); + bit_length = tvb_get_guint8(tvb, offset+5); + byte_length = ipv6_addr_and_mask(tvb, offset+6, &prefix, bit_length); + if (byte_length == -1) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "IPv6 prefix has an invalid length: %d bits", bit_length ); + return; + } + subclvs_len = 0; + if ((ctrl_info & 0x20) != 0) + subclvs_len = 1+tvb_get_guint8(tvb, offset+6+byte_length); + + subtree = proto_tree_add_subtree(tree, tvb, offset, 6+byte_length+subclvs_len, ett_isis_lsp_part_of_clv_ipv6_reachability, NULL, "IPv6 Reachability"); - proto_tree_add_ipv6_format_value(subtree, hf_isis_lsp_ipv6_reachability_ipv6_prefix, tvb, offset+6, byte_length, + proto_tree_add_ipv6_format_value(subtree, hf_isis_lsp_ipv6_reachability_ipv6_prefix, tvb, offset+6, byte_length, (guint8*)&prefix, "IPv6 prefix: %s/%u", ip6_to_str (&prefix), bit_length); - proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_metric, tvb, offset, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_distribution, tvb, offset+4, 1, ENC_NA); - proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_distribution_internal, tvb, offset+4, 1, ENC_NA); + proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_metric, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_distribution, tvb, offset+4, 1, ENC_NA); + proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_distribution_internal, tvb, offset+4, 1, ENC_NA); - if ((ctrl_info & 0x1f) != 0) { - proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_reserved_bits, tvb, offset+4, 1, ENC_NA); - } + if ((ctrl_info & 0x1f) != 0) { + proto_tree_add_item(subtree, hf_isis_lsp_ipv6_reachability_reserved_bits, tvb, offset+4, 1, ENC_NA); + } - len = 6 + byte_length; - if ((ctrl_info & 0x20) != 0) { - subclvs_len = tvb_get_guint8(tvb, offset+len); - subtree2 = proto_tree_add_subtree_format(subtree, tvb, offset+len, subclvs_len+1, + len = 6 + byte_length; + if ((ctrl_info & 0x20) != 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); - - 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); - dissect_ipreach_subclv(tvb, subtree2, 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"); - } - offset += len; - length -= len; - } + subclvs_len); + + 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); + dissect_ipreach_subclv(tvb, subtree2, 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"); + } + offset += len; + length -= len; + } } /* * Name: dissect_lsp_nlpid_clv() * * Description: - * Decode for a lsp packets NLPID clv. Calls into the - * clv common one. + * Decode for a lsp packets NLPID clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_lsp_nlpid_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_nlpid_clv(tvb, tree, offset, length); + isis_dissect_nlpid_clv(tvb, tree, offset, length); } /* * Name: dissect_lsp_mt_clv() * * Description: - code 229 - * Decode for a lsp packets Multi Topology clv. Calls into the - * clv common one. + * Decode for a lsp packets Multi Topology clv. Calls into the + * clv common one. * * Input: * tvbuff_t * : tvbuffer for packet data * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * guint : length of this clv - * int : length of IDs in packet. + * int : current offset into packet data + * guint : length of this clv + * int : length of IDs in packet. * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_lsp_mt_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_mt_clv(tvb, tree, offset, length, hf_isis_lsp_clv_mt ); + isis_dissect_mt_clv(tvb, tree, offset, length, hf_isis_lsp_clv_mt ); } /* @@ -1162,10 +1162,10 @@ dissect_lsp_mt_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int */ static void dissect_lsp_hostname_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_hostname_clv(tvb, tree, offset, length, - hf_isis_lsp_hostname); + isis_dissect_hostname_clv(tvb, tree, offset, length, + hf_isis_lsp_hostname); } @@ -1188,10 +1188,10 @@ dissect_lsp_hostname_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree */ static void dissect_lsp_te_router_id_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_te_router_id_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length, - hf_isis_lsp_clv_te_router_id ); + isis_dissect_te_router_id_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length, + hf_isis_lsp_clv_te_router_id ); } @@ -1199,25 +1199,25 @@ dissect_lsp_te_router_id_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree * Name: dissect_lsp_ip_int_addr_clv() * * Description: - * Decode for a lsp packets ip interface addr clv. Calls into the - * clv common one. + * Decode for a lsp packets ip interface addr clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_lsp_ip_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_ip_int_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length, - hf_isis_lsp_clv_ipv4_int_addr ); + isis_dissect_ip_int_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length, + hf_isis_lsp_clv_ipv4_int_addr ); } /* @@ -1239,231 +1239,231 @@ dissect_lsp_ip_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, */ static void dissect_lsp_ipv6_int_addr_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_ipv6_int_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length, - hf_isis_lsp_clv_ipv6_int_addr ); + isis_dissect_ipv6_int_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length, + hf_isis_lsp_clv_ipv6_int_addr ); } static void dissect_isis_lsp_clv_mt_cap_spb_instance(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int subtype, int sublen) { - const int CIST_ROOT_ID_LEN = 8; /* CIST Root Identifier */ - const int CIST_EXT_ROOT_PATH_COST_LEN = 4; /* CIST External Root Path Cost */ - const int BRIDGE_PRI_LEN = 2; /* Bridge Priority */ - const int V_SPSOURCEID_LEN = 4; /* v | SPSourceID */ - const int NUM_TREES_LEN = 1; /* num of trees */ - - const int CIST_ROOT_ID_OFFSET = 0; - const int CIST_EXT_ROOT_PATH_COST_OFFSET = CIST_ROOT_ID_OFFSET + CIST_ROOT_ID_LEN; - const int BRIDGE_PRI_OFFSET = CIST_EXT_ROOT_PATH_COST_OFFSET + CIST_EXT_ROOT_PATH_COST_LEN; - const int V_SPSOURCEID_OFFSET = BRIDGE_PRI_OFFSET + BRIDGE_PRI_LEN; - const int NUM_TREES_OFFSET = V_SPSOURCEID_OFFSET + V_SPSOURCEID_LEN; - const int FIXED_LEN = NUM_TREES_OFFSET + NUM_TREES_LEN; - const int VLAN_ID_TUPLE_LEN = 8; - - if (sublen < FIXED_LEN) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short SPB Digest subTLV (%d vs %d)", sublen, FIXED_LEN); - return; - } - else { - proto_tree *subtree, *ti; - int subofs = offset; - const guint8 *cist_root_identifier = tvb_get_ptr (tvb, subofs + CIST_ROOT_ID_OFFSET, CIST_ROOT_ID_LEN); - guint8 num_trees = tvb_get_guint8(tvb, subofs + NUM_TREES_OFFSET); - - /*************************/ - subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_clv_mt_cap_spb_instance, NULL, - "SPB Instance: Type: 0x%02x, Length: %d", subtype, sublen); - - /*************************/ - proto_tree_add_bytes_format_value( subtree, hf_isis_lsp_mt_cap_spb_instance_cist_root_identifier, tvb, subofs + CIST_ROOT_ID_OFFSET, CIST_ROOT_ID_LEN, - cist_root_identifier, "%08x-%08x-%08x-%08x-%08x-%08x-%08x-%08x", - cist_root_identifier[0], cist_root_identifier[1], cist_root_identifier[2], - cist_root_identifier[3], cist_root_identifier[4], cist_root_identifier[5], - cist_root_identifier[6], cist_root_identifier[7]); - proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_cist_external_root_path_cost, tvb, subofs + CIST_EXT_ROOT_PATH_COST_OFFSET, CIST_EXT_ROOT_PATH_COST_LEN, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_bridge_priority, tvb, subofs + BRIDGE_PRI_OFFSET, BRIDGE_PRI_LEN, ENC_BIG_ENDIAN); - - proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_v, tvb, subofs + V_SPSOURCEID_OFFSET, V_SPSOURCEID_LEN, ENC_BIG_ENDIAN); - - proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spsourceid, tvb, subofs + V_SPSOURCEID_OFFSET, V_SPSOURCEID_LEN, ENC_BIG_ENDIAN); - ti = proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_number_of_trees, tvb, subofs + NUM_TREES_OFFSET, NUM_TREES_LEN, ENC_BIG_ENDIAN); - if (num_trees == 0) - proto_item_append_text(ti, " Invalid subTLV: zero trees"); - - subofs += FIXED_LEN; - sublen -= FIXED_LEN; - - /*************************/ - if (sublen != (num_trees * VLAN_ID_TUPLE_LEN)) { - proto_tree_add_text( subtree, tvb, subofs, 0, - "SubTLV length doesn't match number of trees"); - return; - } - while (sublen > 0 && num_trees > 0) { - if (sublen < VLAN_ID_TUPLE_LEN) { - proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short VLAN_ID entry (%d vs %d)", sublen, VLAN_ID_TUPLE_LEN); - return; - } - else { - const guint8 flags = tvb_get_guint8(tvb, subofs); - const guint8 *ect_id = tvb_get_ptr(tvb, subofs + 1, 4); - const guint8 *bvid_spvid = tvb_get_ptr(tvb, subofs + 1 + 4, 3); - const guint16 bvid = (0xff0 & (((guint16)bvid_spvid[0]) << 4)) | (0x0f & (bvid_spvid[1] >> 4)); - const guint16 spvid = (0xf00 & (((guint16)bvid_spvid[1]) << 8)) | (0xff & (bvid_spvid[2])); - proto_tree_add_text( subtree, tvb, subofs, VLAN_ID_TUPLE_LEN, - " U: %u, M: %u, A: %u, ECT: %02x-%02x-%02x-%02x, BVID: 0x%03x (%d),%s SPVID: 0x%03x (%d)", - (flags >> 7) & 1, - (flags >> 6) & 1, - (flags >> 5) & 1, - ect_id[0], ect_id[1], ect_id[2], ect_id[3], - bvid, bvid, - ( bvid < 10 ? " " - : bvid < 100 ? " " - : bvid < 1000 ? " " - : ""), - spvid, spvid); - subofs += VLAN_ID_TUPLE_LEN; - sublen -= VLAN_ID_TUPLE_LEN; - --num_trees; - } - } - if (num_trees) { - proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short subTLV (%d vs %d)", sublen, num_trees * VLAN_ID_TUPLE_LEN); - return; - } - } + const int CIST_ROOT_ID_LEN = 8; /* CIST Root Identifier */ + const int CIST_EXT_ROOT_PATH_COST_LEN = 4; /* CIST External Root Path Cost */ + const int BRIDGE_PRI_LEN = 2; /* Bridge Priority */ + const int V_SPSOURCEID_LEN = 4; /* v | SPSourceID */ + const int NUM_TREES_LEN = 1; /* num of trees */ + + const int CIST_ROOT_ID_OFFSET = 0; + const int CIST_EXT_ROOT_PATH_COST_OFFSET = CIST_ROOT_ID_OFFSET + CIST_ROOT_ID_LEN; + const int BRIDGE_PRI_OFFSET = CIST_EXT_ROOT_PATH_COST_OFFSET + CIST_EXT_ROOT_PATH_COST_LEN; + const int V_SPSOURCEID_OFFSET = BRIDGE_PRI_OFFSET + BRIDGE_PRI_LEN; + const int NUM_TREES_OFFSET = V_SPSOURCEID_OFFSET + V_SPSOURCEID_LEN; + const int FIXED_LEN = NUM_TREES_OFFSET + NUM_TREES_LEN; + const int VLAN_ID_TUPLE_LEN = 8; + + if (sublen < FIXED_LEN) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short SPB Digest subTLV (%d vs %d)", sublen, FIXED_LEN); + return; + } + else { + proto_tree *subtree, *ti; + int subofs = offset; + const guint8 *cist_root_identifier = tvb_get_ptr (tvb, subofs + CIST_ROOT_ID_OFFSET, CIST_ROOT_ID_LEN); + guint8 num_trees = tvb_get_guint8(tvb, subofs + NUM_TREES_OFFSET); + + /*************************/ + subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_clv_mt_cap_spb_instance, NULL, + "SPB Instance: Type: 0x%02x, Length: %d", subtype, sublen); + + /*************************/ + proto_tree_add_bytes_format_value( subtree, hf_isis_lsp_mt_cap_spb_instance_cist_root_identifier, tvb, subofs + CIST_ROOT_ID_OFFSET, CIST_ROOT_ID_LEN, + cist_root_identifier, "%08x-%08x-%08x-%08x-%08x-%08x-%08x-%08x", + cist_root_identifier[0], cist_root_identifier[1], cist_root_identifier[2], + cist_root_identifier[3], cist_root_identifier[4], cist_root_identifier[5], + cist_root_identifier[6], cist_root_identifier[7]); + proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_cist_external_root_path_cost, tvb, subofs + CIST_EXT_ROOT_PATH_COST_OFFSET, CIST_EXT_ROOT_PATH_COST_LEN, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_bridge_priority, tvb, subofs + BRIDGE_PRI_OFFSET, BRIDGE_PRI_LEN, ENC_BIG_ENDIAN); + + proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_v, tvb, subofs + V_SPSOURCEID_OFFSET, V_SPSOURCEID_LEN, ENC_BIG_ENDIAN); + + proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spsourceid, tvb, subofs + V_SPSOURCEID_OFFSET, V_SPSOURCEID_LEN, ENC_BIG_ENDIAN); + ti = proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spb_instance_number_of_trees, tvb, subofs + NUM_TREES_OFFSET, NUM_TREES_LEN, ENC_BIG_ENDIAN); + if (num_trees == 0) + proto_item_append_text(ti, " Invalid subTLV: zero trees"); + + subofs += FIXED_LEN; + sublen -= FIXED_LEN; + + /*************************/ + if (sublen != (num_trees * VLAN_ID_TUPLE_LEN)) { + proto_tree_add_text( subtree, tvb, subofs, 0, + "SubTLV length doesn't match number of trees"); + return; + } + while (sublen > 0 && num_trees > 0) { + if (sublen < VLAN_ID_TUPLE_LEN) { + proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short VLAN_ID entry (%d vs %d)", sublen, VLAN_ID_TUPLE_LEN); + return; + } + else { + const guint8 flags = tvb_get_guint8(tvb, subofs); + const guint8 *ect_id = tvb_get_ptr(tvb, subofs + 1, 4); + const guint8 *bvid_spvid = tvb_get_ptr(tvb, subofs + 1 + 4, 3); + const guint16 bvid = (0xff0 & (((guint16)bvid_spvid[0]) << 4)) | (0x0f & (bvid_spvid[1] >> 4)); + const guint16 spvid = (0xf00 & (((guint16)bvid_spvid[1]) << 8)) | (0xff & (bvid_spvid[2])); + proto_tree_add_text( subtree, tvb, subofs, VLAN_ID_TUPLE_LEN, + " U: %u, M: %u, A: %u, ECT: %02x-%02x-%02x-%02x, BVID: 0x%03x (%d),%s SPVID: 0x%03x (%d)", + (flags >> 7) & 1, + (flags >> 6) & 1, + (flags >> 5) & 1, + ect_id[0], ect_id[1], ect_id[2], ect_id[3], + bvid, bvid, + ( bvid < 10 ? " " + : bvid < 100 ? " " + : bvid < 1000 ? " " + : ""), + spvid, spvid); + subofs += VLAN_ID_TUPLE_LEN; + sublen -= VLAN_ID_TUPLE_LEN; + --num_trees; + } + } + if (num_trees) { + proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short subTLV (%d vs %d)", sublen, num_trees * VLAN_ID_TUPLE_LEN); + return; + } + } } static void dissect_isis_lsp_clv_mt_cap_spb_oalg(tvbuff_t *tvb, - proto_tree *tree, int offset, int subtype, int sublen) + proto_tree *tree, int offset, int subtype, int sublen) { - proto_tree_add_text( tree, tvb, offset, -1, - "MT-Cap SPB Opaque Algorithm: Type: 0x%02x, Length: %d", subtype, sublen); + proto_tree_add_text( tree, tvb, offset, -1, + "MT-Cap SPB Opaque Algorithm: Type: 0x%02x, Length: %d", subtype, sublen); } static void dissect_isis_lsp_clv_mt_cap_spbm_service_identifier(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree, int offset, int subtype, int sublen) + proto_tree *tree, int offset, int subtype, int sublen) { - const int BMAC_LEN = 6; /* B-MAC Address */ - const int BVID_LEN = 2; /* Base-VID */ - - const int BMAC_OFFSET = 0; - const int BVID_OFFSET = BMAC_OFFSET + BMAC_LEN; - const int FIXED_LEN = BVID_OFFSET + BVID_LEN; - - const int ISID_LEN = 4; - - if (sublen < FIXED_LEN) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short SPBM Service Identifier and Unicast Address subTLV (%d vs %d)", sublen, FIXED_LEN); - return; - } - else { - proto_tree *subtree; - int subofs = offset; - - /*************************/ - subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_clv_mt_cap_spbm_service_identifier, NULL, - "SPB Service ID and Unicast Address: Type: 0x%02x, Length: %d", subtype, sublen); - - /*************************/ - proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spbm_service_identifier_b_mac, tvb, subofs + BMAC_OFFSET, BMAC_LEN, ENC_NA); - proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spbm_service_identifier_base_vid, tvb, subofs + BVID_OFFSET, BVID_LEN, ENC_BIG_ENDIAN); - - subofs += FIXED_LEN; - sublen -= FIXED_LEN; - - /*************************/ - while (sublen > 0) { - if (sublen < ISID_LEN) { - proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short ISID entry (%d vs %d)", sublen, ISID_LEN); - return; - } - else { - const guint32 isid = tvb_get_ntohl(tvb, subofs); - proto_tree_add_text( subtree, tvb, subofs, ISID_LEN, - " T: %u, R: %u, ISID: 0x%06x (%d)", - (isid >> 31) & 1, - (isid >> 30) & 1, - isid & 0x00ffffff, - isid & 0x00ffffff); - subofs += ISID_LEN; - sublen -= ISID_LEN; - } - } - } + const int BMAC_LEN = 6; /* B-MAC Address */ + const int BVID_LEN = 2; /* Base-VID */ + + const int BMAC_OFFSET = 0; + const int BVID_OFFSET = BMAC_OFFSET + BMAC_LEN; + const int FIXED_LEN = BVID_OFFSET + BVID_LEN; + + const int ISID_LEN = 4; + + if (sublen < FIXED_LEN) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short SPBM Service Identifier and Unicast Address subTLV (%d vs %d)", sublen, FIXED_LEN); + return; + } + else { + proto_tree *subtree; + int subofs = offset; + + /*************************/ + subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_clv_mt_cap_spbm_service_identifier, NULL, + "SPB Service ID and Unicast Address: Type: 0x%02x, Length: %d", subtype, sublen); + + /*************************/ + proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spbm_service_identifier_b_mac, tvb, subofs + BMAC_OFFSET, BMAC_LEN, ENC_NA); + proto_tree_add_item(subtree, hf_isis_lsp_mt_cap_spbm_service_identifier_base_vid, tvb, subofs + BVID_OFFSET, BVID_LEN, ENC_BIG_ENDIAN); + + subofs += FIXED_LEN; + sublen -= FIXED_LEN; + + /*************************/ + while (sublen > 0) { + if (sublen < ISID_LEN) { + proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short ISID entry (%d vs %d)", sublen, ISID_LEN); + return; + } + else { + const guint32 isid = tvb_get_ntohl(tvb, subofs); + proto_tree_add_text( subtree, tvb, subofs, ISID_LEN, + " T: %u, R: %u, ISID: 0x%06x (%d)", + (isid >> 31) & 1, + (isid >> 30) & 1, + isid & 0x00ffffff, + isid & 0x00ffffff); + subofs += ISID_LEN; + sublen -= ISID_LEN; + } + } + } } static void dissect_isis_lsp_clv_mt_cap_spbv_mac_address(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree, int offset, int subtype, int sublen) + proto_tree *tree, int offset, int subtype, int sublen) { - guint16 fixed_data; - guint16 spvid; - guint8 sr_bit; - const int GMAC_LEN = 6; /* GMAC Address */ - const int SPVID_LEN = 2; /* SPVID */ - const int MAC_TUPLE_LEN = 7; - - const int SPVID_OFFSET = 0; - const int FIXED_LEN = SPVID_OFFSET + SPVID_LEN; - - if (sublen < FIXED_LEN) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short SPBV Mac Address subTLV (%d vs %d)", sublen, FIXED_LEN); - return; - } - else { - proto_tree *subtree; - int subofs = offset; - fixed_data = tvb_get_ntohs(tvb, subofs); - spvid = (fixed_data & 0x0FFF); - sr_bit = (fixed_data & 0x3000) >> 12; - - /*************************/ - subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_clv_mt_cap_spbv_mac_address, NULL, - "SPBV Mac Address: Type: 0x%02x, Length: %d", subtype, sublen); - - /*************************/ - proto_tree_add_uint(subtree, hf_isis_lsp_spb_sr_bit, - tvb, subofs, 1, sr_bit); - proto_tree_add_uint(subtree, hf_isis_lsp_spb_spvid, - tvb, subofs, 2, spvid); - - subofs += FIXED_LEN; - sublen -= FIXED_LEN; - - /*************************/ - while (sublen > 0) { - if (sublen < MAC_TUPLE_LEN) { - proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short MAC Address entry (%d vs %d)", sublen, MAC_TUPLE_LEN); - return; - } - else { - const guint32 tr_bit = tvb_get_guint8(tvb, subofs); - const guint8 *gmac = tvb_get_ptr(tvb, subofs + 1, GMAC_LEN); - proto_tree_add_text( subtree, tvb, subofs, MAC_TUPLE_LEN, - " T: %u, R: %u, MAC: %02x-%02x-%02x-%02x-%02x-%02x", - (tr_bit >> 7) & 1, - (tr_bit >> 6) & 1, - gmac[0], - gmac[1], - gmac[2], - gmac[3], - gmac[4], - gmac[5]); - subofs += MAC_TUPLE_LEN; - sublen -= MAC_TUPLE_LEN; - } - } - } + guint16 fixed_data; + guint16 spvid; + guint8 sr_bit; + const int GMAC_LEN = 6; /* GMAC Address */ + const int SPVID_LEN = 2; /* SPVID */ + const int MAC_TUPLE_LEN = 7; + + const int SPVID_OFFSET = 0; + const int FIXED_LEN = SPVID_OFFSET + SPVID_LEN; + + if (sublen < FIXED_LEN) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short SPBV Mac Address subTLV (%d vs %d)", sublen, FIXED_LEN); + return; + } + else { + proto_tree *subtree; + int subofs = offset; + fixed_data = tvb_get_ntohs(tvb, subofs); + spvid = (fixed_data & 0x0FFF); + sr_bit = (fixed_data & 0x3000) >> 12; + + /*************************/ + subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_clv_mt_cap_spbv_mac_address, NULL, + "SPBV Mac Address: Type: 0x%02x, Length: %d", subtype, sublen); + + /*************************/ + proto_tree_add_uint(subtree, hf_isis_lsp_spb_sr_bit, + tvb, subofs, 1, sr_bit); + proto_tree_add_uint(subtree, hf_isis_lsp_spb_spvid, + tvb, subofs, 2, spvid); + + subofs += FIXED_LEN; + sublen -= FIXED_LEN; + + /*************************/ + while (sublen > 0) { + if (sublen < MAC_TUPLE_LEN) { + proto_tree_add_expert_format(subtree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short MAC Address entry (%d vs %d)", sublen, MAC_TUPLE_LEN); + return; + } + else { + const guint32 tr_bit = tvb_get_guint8(tvb, subofs); + const guint8 *gmac = tvb_get_ptr(tvb, subofs + 1, GMAC_LEN); + proto_tree_add_text( subtree, tvb, subofs, MAC_TUPLE_LEN, + " T: %u, R: %u, MAC: %02x-%02x-%02x-%02x-%02x-%02x", + (tr_bit >> 7) & 1, + (tr_bit >> 6) & 1, + gmac[0], + gmac[1], + gmac[2], + gmac[3], + gmac[4], + gmac[5]); + subofs += MAC_TUPLE_LEN; + sublen -= MAC_TUPLE_LEN; + } + } + } } /* * Name: dissect_lsp_clv_mt_cap() @@ -1484,279 +1484,279 @@ static void dissect_isis_lsp_clv_mt_cap(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, int id_length _U_, int length) { - if (length >= 2) { - /* mtid */ - proto_tree_add_item( tree, hf_isis_lsp_mt_cap_mtid, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_isis_lsp_mt_cap_overload, tvb, offset, 2, ENC_BIG_ENDIAN); - length -= 2; - offset += 2; - while (length >= 2) { - guint8 subtype = tvb_get_guint8(tvb, offset); - guint8 subtlvlen = tvb_get_guint8(tvb, offset+1); - length -= 2; - offset += 2; - if (subtlvlen > length) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short type 0x%02x TLV (%d vs %d)", subtype, subtlvlen, length); - return; - } - if (subtype == 0x01) { /* SPB Instance */ - dissect_isis_lsp_clv_mt_cap_spb_instance(tvb, pinfo, tree, offset, subtype, subtlvlen); - } - else if (subtype == 0x02) { /* OALG */ - dissect_isis_lsp_clv_mt_cap_spb_oalg(tvb, tree, offset, subtype, subtlvlen); - } - else if (subtype == 0x03) { /* SPBM Service Identifier */ - dissect_isis_lsp_clv_mt_cap_spbm_service_identifier(tvb, pinfo, tree, offset, subtype, subtlvlen); - } - else if (subtype == 0x04) { /* SPBV Mac Address */ - dissect_isis_lsp_clv_mt_cap_spbv_mac_address(tvb, pinfo, tree, offset, subtype, subtlvlen); - } - else { - proto_tree_add_expert_format( tree, pinfo, &ei_isis_lsp_subtlv, tvb, offset, -1, - "Unknown SubTlv: Type: 0x%02x, Length: %d", subtype, subtlvlen); - } - length -= subtlvlen; - offset += subtlvlen; - } - - } + if (length >= 2) { + /* mtid */ + proto_tree_add_item( tree, hf_isis_lsp_mt_cap_mtid, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_isis_lsp_mt_cap_overload, tvb, offset, 2, ENC_BIG_ENDIAN); + length -= 2; + offset += 2; + while (length >= 2) { + guint8 subtype = tvb_get_guint8(tvb, offset); + guint8 subtlvlen = tvb_get_guint8(tvb, offset+1); + length -= 2; + offset += 2; + if (subtlvlen > length) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short type 0x%02x TLV (%d vs %d)", subtype, subtlvlen, length); + return; + } + if (subtype == 0x01) { /* SPB Instance */ + dissect_isis_lsp_clv_mt_cap_spb_instance(tvb, pinfo, tree, offset, subtype, subtlvlen); + } + else if (subtype == 0x02) { /* OALG */ + dissect_isis_lsp_clv_mt_cap_spb_oalg(tvb, tree, offset, subtype, subtlvlen); + } + else if (subtype == 0x03) { /* SPBM Service Identifier */ + dissect_isis_lsp_clv_mt_cap_spbm_service_identifier(tvb, pinfo, tree, offset, subtype, subtlvlen); + } + else if (subtype == 0x04) { /* SPBV Mac Address */ + dissect_isis_lsp_clv_mt_cap_spbv_mac_address(tvb, pinfo, tree, offset, subtype, subtlvlen); + } + else { + proto_tree_add_expert_format( tree, pinfo, &ei_isis_lsp_subtlv, tvb, offset, -1, + "Unknown SubTlv: Type: 0x%02x, Length: %d", subtype, subtlvlen); + } + length -= subtlvlen; + offset += subtlvlen; + } + + } } /* * Name: dissect_lsp_authentication_clv() * * Description: - * Decode for a lsp packets authenticaion clv. Calls into the - * clv common one. + * Decode for a lsp packets authenticaion clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_lsp_authentication_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_authentication_clv(tree, pinfo, tvb, &ei_isis_lsp_authentication, offset, length); + isis_dissect_authentication_clv(tree, pinfo, tvb, &ei_isis_lsp_authentication, offset, length); } /* * Name: dissect_lsp_ip_authentication_clv() * * Description: - * Decode for a lsp packets authenticaion clv. Calls into the - * clv common one. + * Decode for a lsp packets authenticaion clv. Calls into the + * clv common one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : proto tree to build on (may be null) - * int : current offset into packet data - * int : length of IDs in packet. - * int : length of this clv + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : proto tree to build on (may be null) + * int : current offset into packet data + * int : length of IDs in packet. + * int : length of this clv * * Output: - * void, will modify proto_tree if not null. + * void, will modify proto_tree if not null. */ static void dissect_lsp_ip_authentication_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_ip_authentication_clv(tvb, tree, offset, length); + isis_dissect_ip_authentication_clv(tvb, tree, offset, length); } /* * Name: dissect_lsp_area_address_clv() * * Description: - * Decode for a lsp packet's area address clv. Call into clv common - * one. + * Decode for a lsp packet's area address clv. Call into clv common + * one. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_area_address_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_area_address_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length); + isis_dissect_area_address_clv(tree, pinfo, tvb, &ei_isis_lsp_short_packet, offset, length); } /* * Name: dissect_lsp_eis_neighbors_clv_inner() * * Description: - * Real work horse for showing neighbors. This means we decode the - * first octet as either virtual/!virtual (if show_virtual param is - * set), or as a must == 0 reserved value. + * Real work horse for showing neighbors. This means we decode the + * first octet as either virtual/!virtual (if show_virtual param is + * set), or as a must == 0 reserved value. * - * Once past that, we decode n neighbor elements. Each neighbor - * is comprised of a metric block (is dissect_metric) and the - * addresses. + * Once past that, we decode n neighbor elements. Each neighbor + * is comprised of a metric block (is dissect_metric) and the + * addresses. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding - * int : set to decode first octet as virtual vs reserved == 0 - * int : set to indicate EIS instead of IS (6 octet per addr instead of 7) + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding + * int : set to decode first octet as virtual vs reserved == 0 + * int : set to indicate EIS instead of IS (6 octet per addr instead of 7) * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_eis_neighbors_clv_inner(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - int offset, int length, int id_length, int show_virtual, int is_eis) + int offset, int length, int id_length, int show_virtual, int is_eis) { - proto_item *ti; - proto_tree *ntree = NULL; - int tlen; - - if (!is_eis) { - id_length++; /* IDs are one octet longer in IS neighbours */ - if ( tree ) { - if ( show_virtual ) { - /* virtual path flag */ - proto_tree_add_text ( tree, tvb, offset, 1, - tvb_get_guint8(tvb, offset) ? "IsVirtual" : "IsNotVirtual" ); - } else { - proto_tree_add_item(tree, hf_isis_lsp_eis_neighbors_reserved, tvb, offset, 1, ENC_NA); - } - } - offset++; - length--; - } - tlen = 4 + id_length; - - while ( length > 0 ) { - if (length<tlen) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "short E/IS reachability (%d vs %d)", length, tlen ); - return; - } - /* - * Gotta build a sub-tree for all our pieces - */ - if ( tree ) { - if ( is_eis ) { - ntree = proto_tree_add_subtree(tree, tvb, offset, tlen, ett_isis_lsp_clv_is_neighbors, &ti, "ES Neighbor"); - } else { - ntree = proto_tree_add_subtree(tree, tvb, offset, tlen, ett_isis_lsp_clv_is_neighbors, &ti, "IS Neighbor"); - } - - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_default_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_default_metric_ie, tvb, offset, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_delay_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_delay_metric_supported, tvb, offset, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_delay_metric_ie, tvb, offset+1, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_expense_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_expense_metric_supported, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_expense_metric_ie, tvb, offset+2, 1, ENC_NA); - - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_error_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_error_metric_supported, tvb, offset, 1, ENC_NA); - proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_error_metric_ie, tvb, offset+3, 1, ENC_NA); - proto_tree_add_item(ntree, is_eis ? hf_isis_lsp_eis_neighbors_es_neighbor_id : hf_isis_lsp_eis_neighbors_is_neighbor_id, - tvb, offset+4, id_length, ENC_NA); - proto_item_append_text(ti, ": %s", tvb_print_system_id(tvb, offset+4, id_length)); - } - offset += tlen; - length -= tlen; - } + proto_item *ti; + proto_tree *ntree = NULL; + int tlen; + + if (!is_eis) { + id_length++; /* IDs are one octet longer in IS neighbours */ + if ( tree ) { + if ( show_virtual ) { + /* virtual path flag */ + proto_tree_add_text ( tree, tvb, offset, 1, + tvb_get_guint8(tvb, offset) ? "IsVirtual" : "IsNotVirtual" ); + } else { + proto_tree_add_item(tree, hf_isis_lsp_eis_neighbors_reserved, tvb, offset, 1, ENC_NA); + } + } + offset++; + length--; + } + tlen = 4 + id_length; + + while ( length > 0 ) { + if (length<tlen) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "short E/IS reachability (%d vs %d)", length, tlen ); + return; + } + /* + * Gotta build a sub-tree for all our pieces + */ + if ( tree ) { + if ( is_eis ) { + ntree = proto_tree_add_subtree(tree, tvb, offset, tlen, ett_isis_lsp_clv_is_neighbors, &ti, "ES Neighbor"); + } else { + ntree = proto_tree_add_subtree(tree, tvb, offset, tlen, ett_isis_lsp_clv_is_neighbors, &ti, "IS Neighbor"); + } + + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_default_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_default_metric_ie, tvb, offset, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_delay_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_delay_metric_supported, tvb, offset, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_delay_metric_ie, tvb, offset+1, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_expense_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_expense_metric_supported, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_expense_metric_ie, tvb, offset+2, 1, ENC_NA); + + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_error_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_error_metric_supported, tvb, offset, 1, ENC_NA); + proto_tree_add_item(ntree, hf_isis_lsp_eis_neighbors_error_metric_ie, tvb, offset+3, 1, ENC_NA); + proto_tree_add_item(ntree, is_eis ? hf_isis_lsp_eis_neighbors_es_neighbor_id : hf_isis_lsp_eis_neighbors_is_neighbor_id, + tvb, offset+4, id_length, ENC_NA); + proto_item_append_text(ti, ": %s", tvb_print_system_id(tvb, offset+4, id_length)); + } + offset += tlen; + length -= tlen; + } } /* * Name: dissect_lsp_l1_is_neighbors_clv() * * Description: - * Dispatch a l1 intermediate system neighbor by calling - * the inner function with show virtual set to TRUE and is es set to FALSE. + * Dispatch a l1 intermediate system neighbor by calling + * the inner function with show virtual set to TRUE and is es set to FALSE. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_l1_is_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length, int length) + int id_length, int length) { - dissect_lsp_eis_neighbors_clv_inner(tvb, pinfo, tree, offset, - length, id_length, TRUE, FALSE); + dissect_lsp_eis_neighbors_clv_inner(tvb, pinfo, tree, offset, + length, id_length, TRUE, FALSE); } /* * Name: dissect_lsp_l1_es_neighbors_clv() * * Description: - * Dispatch a l1 end or intermediate system neighbor by calling - * the inner function with show virtual set to TRUE and es set to TRUE. + * Dispatch a l1 end or intermediate system neighbor by calling + * the inner function with show virtual set to TRUE and es set to TRUE. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_l1_es_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length, int length) + int id_length, int length) { - dissect_lsp_eis_neighbors_clv_inner(tvb, pinfo, tree, offset, - length, id_length, TRUE, TRUE); + dissect_lsp_eis_neighbors_clv_inner(tvb, pinfo, tree, offset, + length, id_length, TRUE, TRUE); } /* * Name: dissect_lsp_l2_is_neighbors_clv() * * Description: - * Dispatch a l2 intermediate system neighbor by calling - * the inner function with show virtual set to FALSE, and is es set - * to FALSE + * Dispatch a l2 intermediate system neighbor by calling + * the inner function with show virtual set to FALSE, and is es set + * to FALSE * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_l2_is_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length, int length) + int id_length, int length) { - dissect_lsp_eis_neighbors_clv_inner(tvb, pinfo, tree, offset, - length, id_length, FALSE, FALSE); + dissect_lsp_eis_neighbors_clv_inner(tvb, pinfo, tree, offset, + length, id_length, FALSE, FALSE); } @@ -1778,22 +1778,22 @@ dissect_lsp_l2_is_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *t */ static void dissect_subclv_admin_group (tvbuff_t *tvb, proto_tree *tree, int offset) { - proto_tree *ntree; - guint32 clv_value; - guint32 mask; - int i; + proto_tree *ntree; + guint32 clv_value; + guint32 mask; + int i; - ntree = proto_tree_add_subtree(tree, tvb, offset-2, 6, + ntree = proto_tree_add_subtree(tree, tvb, offset-2, 6, ett_isis_lsp_subclv_admin_group, NULL, "Administrative group(s):"); - clv_value = tvb_get_ntohl(tvb, offset); - mask = 1; - for (i = 0 ; i < 32 ; i++) { - if ( (clv_value & mask) != 0 ) { - proto_tree_add_text (ntree, tvb, offset, 4, "group %d", i); - } - mask <<= 1; - } + clv_value = tvb_get_ntohl(tvb, offset); + mask = 1; + for (i = 0 ; i < 32 ; i++) { + if ( (clv_value & mask) != 0 ) { + proto_tree_add_text (ntree, tvb, offset, 4, "group %d", i); + } + mask <<= 1; + } } /* @@ -1815,11 +1815,11 @@ dissect_subclv_admin_group (tvbuff_t *tvb, proto_tree *tree, int offset) { static void dissect_subclv_max_bw(tvbuff_t *tvb, proto_tree *tree, int offset) { - gfloat bw; + gfloat bw; - bw = tvb_get_ntohieee_float(tvb, offset)*8/1000000; - proto_tree_add_float_format_value(tree, hf_isis_lsp_maximum_link_bandwidth, tvb, offset-2, 6, - bw, "%.2f Mbps", bw); + bw = tvb_get_ntohieee_float(tvb, offset)*8/1000000; + proto_tree_add_float_format_value(tree, hf_isis_lsp_maximum_link_bandwidth, tvb, offset-2, 6, + bw, "%.2f Mbps", bw); } /* @@ -1841,11 +1841,11 @@ dissect_subclv_max_bw(tvbuff_t *tvb, proto_tree *tree, int offset) static void dissect_subclv_rsv_bw(tvbuff_t *tvb, proto_tree *tree, int offset) { - gfloat bw; + gfloat bw; - bw = tvb_get_ntohieee_float(tvb, offset)*8/1000000; - proto_tree_add_float_format_value (tree, hf_isis_lsp_reservable_link_bandwidth, tvb, offset-2, 6, - bw, "%.2f Mbps", bw ); + bw = tvb_get_ntohieee_float(tvb, offset)*8/1000000; + proto_tree_add_float_format_value (tree, hf_isis_lsp_reservable_link_bandwidth, tvb, offset-2, 6, + bw, "%.2f Mbps", bw ); } /* @@ -1867,18 +1867,18 @@ dissect_subclv_rsv_bw(tvbuff_t *tvb, proto_tree *tree, int offset) static void dissect_subclv_unrsv_bw(tvbuff_t *tvb, proto_tree *tree, int offset) { - proto_tree *ntree; - gfloat bw; - int i; + proto_tree *ntree; + gfloat bw; + int i; - ntree = proto_tree_add_subtree(tree, tvb, offset-2, 34, + ntree = proto_tree_add_subtree(tree, tvb, offset-2, 34, ett_isis_lsp_subclv_unrsv_bw, NULL, "Unreserved bandwidth:"); - for (i = 0 ; i < 8 ; i++) { - bw = tvb_get_ntohieee_float(tvb, offset+4*i)*8/1000000; - proto_tree_add_float_format(ntree, hf_isis_lsp_unrsv_bw_priority_level, tvb, offset+4*i, 4, - bw, "priority level %d: %.2f Mbps", i, bw ); - } + for (i = 0 ; i < 8 ; i++) { + bw = tvb_get_ntohieee_float(tvb, offset+4*i)*8/1000000; + proto_tree_add_float_format(ntree, hf_isis_lsp_unrsv_bw_priority_level, tvb, offset+4*i, 4, + bw, "priority level %d: %.2f Mbps", i, bw ); + } } /* @@ -1904,26 +1904,26 @@ static void dissect_subclv_spb_link_metric(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int subtype, int sublen) { - const int SUBLEN = 6; - - if (sublen != SUBLEN) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short SPB Link Metric sub-TLV (%d vs %d)", sublen, SUBLEN); - return; - } - else { - proto_tree *subtree; - subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_subclv_spb_link_metric, NULL, - "SPB Link Metric: Type: 0x%02x (%d), Length: %d", subtype, subtype, sublen); - - proto_tree_add_item(subtree, hf_isis_lsp_spb_link_metric, - tvb, offset, 3, ENC_BIG_ENDIAN); - - proto_tree_add_item(subtree, hf_isis_lsp_spb_port_count, - tvb, offset+3, 1, ENC_BIG_ENDIAN); - - proto_tree_add_item(subtree, hf_isis_lsp_spb_port_id, - tvb, offset+4, 2, ENC_BIG_ENDIAN); + const int SUBLEN = 6; + + if (sublen != SUBLEN) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short SPB Link Metric sub-TLV (%d vs %d)", sublen, SUBLEN); + return; + } + else { + proto_tree *subtree; + subtree = proto_tree_add_subtree_format( tree, tvb, offset-2, sublen+2, ett_isis_lsp_subclv_spb_link_metric, NULL, + "SPB Link Metric: Type: 0x%02x (%d), Length: %d", subtype, subtype, sublen); + + proto_tree_add_item(subtree, hf_isis_lsp_spb_link_metric, + tvb, offset, 3, ENC_BIG_ENDIAN); + + proto_tree_add_item(subtree, hf_isis_lsp_spb_port_count, + tvb, offset+3, 1, ENC_BIG_ENDIAN); + + proto_tree_add_item(subtree, hf_isis_lsp_spb_port_id, + tvb, offset+4, 2, ENC_BIG_ENDIAN); } } @@ -1951,85 +1951,85 @@ dissect_subclv_spb_link_metric(tvbuff_t *tvb, packet_info *pinfo, */ static void dissect_lsp_ext_is_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, - int offset, int id_length _U_, int length) + int offset, int id_length _U_, int length) { - proto_item *ti; - proto_tree *ntree = NULL; - guint subclvs_len; - guint len, i; - guint clv_code, clv_len; - - while (length > 0) { - ntree = proto_tree_add_subtree(tree, tvb, offset, -1, + proto_item *ti; + proto_tree *ntree = NULL; + guint subclvs_len; + guint len, i; + guint clv_code, clv_len; + + while (length > 0) { + ntree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_isis_lsp_part_of_clv_ext_is_reachability, &ti, "IS Neighbor"); - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_is_neighbor_id, tvb, offset, 7, ENC_NA); - proto_item_append_text(ti, ": %s", tvb_print_system_id(tvb, offset, 7)); - - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_metric, tvb, offset+7, 3, ENC_BIG_ENDIAN); - - subclvs_len = tvb_get_guint8(tvb, offset+10); - if (subclvs_len == 0) { - proto_tree_add_text (ntree, tvb, offset+10, 1, "no sub-TLVs present"); - } - else { - i = 0; - while (i < subclvs_len) { - clv_code = tvb_get_guint8(tvb, offset+11+i); - clv_len = tvb_get_guint8(tvb, offset+12+i); - switch (clv_code) { - case 3 : - dissect_subclv_admin_group(tvb, ntree, offset+13+i); - break; - case 4 : - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_link_local_identifier, tvb, offset+13+i, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_link_remote_identifier, tvb, offset+17+i, 4, ENC_BIG_ENDIAN); - break; - case 6 : - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_ipv4_interface_address, tvb, offset+11+i, 6, ENC_BIG_ENDIAN); - break; - case 8 : - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_ipv4_neighbor_address, tvb, offset+11+i, 6, ENC_BIG_ENDIAN); - break; - case 9 : - dissect_subclv_max_bw (tvb, ntree, offset+13+i); - break; - case 10: - dissect_subclv_rsv_bw (tvb, ntree, offset+13+i); - break; - case 11: - dissect_subclv_unrsv_bw (tvb, ntree, offset+13+i); - break; - case 18: - proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_traffic_engineering_default_metric, tvb, offset+11+i, 5, ENC_BIG_ENDIAN); - break; - case 29: - dissect_subclv_spb_link_metric(tvb, pinfo, ntree, - offset+13+i, clv_code, clv_len); - break; - case 250: - case 251: - case 252: - case 253: - case 254: - proto_tree_add_text (ntree, tvb, 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, tvb, 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; - } + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_is_neighbor_id, tvb, offset, 7, ENC_NA); + proto_item_append_text(ti, ": %s", tvb_print_system_id(tvb, offset, 7)); + + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_metric, tvb, offset+7, 3, ENC_BIG_ENDIAN); + + subclvs_len = tvb_get_guint8(tvb, offset+10); + if (subclvs_len == 0) { + proto_tree_add_text (ntree, tvb, offset+10, 1, "no sub-TLVs present"); + } + else { + i = 0; + while (i < subclvs_len) { + clv_code = tvb_get_guint8(tvb, offset+11+i); + clv_len = tvb_get_guint8(tvb, offset+12+i); + switch (clv_code) { + case 3 : + dissect_subclv_admin_group(tvb, ntree, offset+13+i); + break; + case 4 : + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_link_local_identifier, tvb, offset+13+i, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_link_remote_identifier, tvb, offset+17+i, 4, ENC_BIG_ENDIAN); + break; + case 6 : + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_ipv4_interface_address, tvb, offset+11+i, 6, ENC_BIG_ENDIAN); + break; + case 8 : + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_ipv4_neighbor_address, tvb, offset+11+i, 6, ENC_BIG_ENDIAN); + break; + case 9 : + dissect_subclv_max_bw (tvb, ntree, offset+13+i); + break; + case 10: + dissect_subclv_rsv_bw (tvb, ntree, offset+13+i); + break; + case 11: + dissect_subclv_unrsv_bw (tvb, ntree, offset+13+i); + break; + case 18: + proto_tree_add_item(ntree, hf_isis_lsp_ext_is_reachability_traffic_engineering_default_metric, tvb, offset+11+i, 5, ENC_BIG_ENDIAN); + break; + case 29: + dissect_subclv_spb_link_metric(tvb, pinfo, ntree, + offset+13+i, clv_code, clv_len); + break; + case 250: + case 251: + case 252: + case 253: + case 254: + proto_tree_add_text (ntree, tvb, 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, tvb, 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; + } } /* @@ -2052,13 +2052,13 @@ static void dissect_lsp_mt_reachable_IPv4_prefx_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, int id_length _U_, int length) { - if (length < 2) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "short lsp multi-topology reachable IPv4 prefixes(%d vs %d)", length, 2 ); - return; - } - dissect_lsp_mt_id(tvb, tree, offset); - dissect_lsp_ext_ip_reachability_clv(tvb, pinfo, tree, offset+2, 0, length-2); + if (length < 2) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "short lsp multi-topology reachable IPv4 prefixes(%d vs %d)", length, 2 ); + return; + } + dissect_lsp_mt_id(tvb, tree, offset); + dissect_lsp_ext_ip_reachability_clv(tvb, pinfo, tree, offset+2, 0, length-2); } /* @@ -2081,13 +2081,13 @@ static void dissect_lsp_mt_reachable_IPv6_prefx_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, int id_length _U_, int length) { - if (length < 2) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "short lsp multi-topology reachable IPv6 prefixes(%d vs %d)", length, 2 ); - return; - } - dissect_lsp_mt_id(tvb, tree, offset); - dissect_lsp_ipv6_reachability_clv(tvb, pinfo, tree, offset+2, 0, length-2); + if (length < 2) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "short lsp multi-topology reachable IPv6 prefixes(%d vs %d)", length, 2 ); + return; + } + dissect_lsp_mt_id(tvb, tree, offset); + dissect_lsp_ipv6_reachability_clv(tvb, pinfo, tree, offset+2, 0, length-2); } @@ -2110,839 +2110,937 @@ dissect_lsp_mt_reachable_IPv6_prefx_clv(tvbuff_t *tvb, packet_info* pinfo, static void dissect_lsp_mt_is_reachability_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - if (length < 2) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "short lsp reachability(%d vs %d)", length, 2 ); - return; - } - - /* - * the MT ID value dissection is used in other LSPs so we push it - * in a function - */ - dissect_lsp_mt_id(tvb, tree, offset); - /* - * fix here. No need to parse TLV 22 (with bugs) while it is - * already done correctly!! - */ - dissect_lsp_ext_is_reachability_clv(tvb, pinfo, tree, offset+2, 0, length-2); + if (length < 2) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "short lsp reachability(%d vs %d)", length, 2 ); + return; + } + + /* + * the MT ID value dissection is used in other LSPs so we push it + * in a function + */ + dissect_lsp_mt_id(tvb, tree, offset); + /* + * fix here. No need to parse TLV 22 (with bugs) while it is + * already done correctly!! + */ + dissect_lsp_ext_is_reachability_clv(tvb, pinfo, tree, offset+2, 0, length-2); } /* * Name: dissect_lsp_partition_dis_clv() * * Description: - * This CLV is used to indicate which system is the designated - * IS for partition repair. This means just putting out the - * "id_length"-octet IS. + * This CLV is used to indicate which system is the designated + * IS for partition repair. This means just putting out the + * "id_length"-octet IS. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_partition_dis_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length, int length) + int id_length, int length) { - if ( length < id_length ) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "short lsp partition DIS(%d vs %d)", length, id_length ); - return; - } - /* - * Gotta build a sub-tree for all our pieces - */ - proto_tree_add_item( tree, hf_isis_lsp_partition_designated_l2_is, tvb, offset, id_length, ENC_NA); - - length -= id_length; - offset += id_length; - if ( length > 0 ) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, - "Long lsp partition DIS, %d left over", length ); - return; - } + if ( length < id_length ) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "short lsp partition DIS(%d vs %d)", length, id_length ); + return; + } + /* + * Gotta build a sub-tree for all our pieces + */ + proto_tree_add_item( tree, hf_isis_lsp_partition_designated_l2_is, tvb, offset, id_length, ENC_NA); + + length -= id_length; + offset += id_length; + if ( length > 0 ) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, + "Long lsp partition DIS, %d left over", length ); + return; + } } /* * Name: dissect_lsp_prefix_neighbors_clv() * * Description: - * The prefix CLV describes what other (OSI) networks we can reach - * and what their cost is. It is built from a metric block - * (see dissect_metric) followed by n addresses. + * The prefix CLV describes what other (OSI) networks we can reach + * and what their cost is. It is built from a metric block + * (see dissect_metric) followed by n addresses. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to fill out. May be NULL - * int : offset into packet data where we are. - * int : length of IDs in packet. - * int : length of clv we are decoding + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to fill out. May be NULL + * int : offset into packet data where we are. + * int : length of IDs in packet. + * int : length of clv we are decoding * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_lsp_prefix_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - char *sbuf; - int mylen; - - if ( length < 4 ) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Short lsp prefix neighbors (%d vs 4)", length ); - return; - } - if ( tree ) { - dissect_metric (tvb, tree, offset, - tvb_get_guint8(tvb, offset), "Default", TRUE ); - dissect_metric (tvb, tree, offset+1, - tvb_get_guint8(tvb, offset+1), "Delay", FALSE ); - dissect_metric (tvb, tree, offset+2, - tvb_get_guint8(tvb, offset+2), "Expense", FALSE ); - dissect_metric (tvb, tree, offset+3, - tvb_get_guint8(tvb, offset+3), "Error", FALSE ); - } - offset += 4; - length -= 4; - while ( length > 0 ) { - mylen = tvb_get_guint8(tvb, offset); - length--; - if (length<=0) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, - "Zero payload space after length in prefix neighbor" ); - return; - } - if ( mylen > length) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, - "Integral length of prefix neighbor too long (%d vs %d)", mylen, length ); - return; - } - - /* - * Lets turn the area address into "standard" 0000.0000.etc - * format string. - */ - sbuf = print_area( tvb_get_ptr(tvb, offset+1, mylen), mylen ); - /* and spit it out */ - if ( tree ) { - proto_tree_add_text ( tree, tvb, offset, mylen + 1, - "Area address (%d): %s", mylen, sbuf ); - } - offset += mylen + 1; - length -= mylen; /* length already adjusted for len fld*/ - } + char *sbuf; + int mylen; + + if ( length < 4 ) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Short lsp prefix neighbors (%d vs 4)", length ); + return; + } + if ( tree ) { + dissect_metric (tvb, tree, offset, + tvb_get_guint8(tvb, offset), "Default", TRUE ); + dissect_metric (tvb, tree, offset+1, + tvb_get_guint8(tvb, offset+1), "Delay", FALSE ); + dissect_metric (tvb, tree, offset+2, + tvb_get_guint8(tvb, offset+2), "Expense", FALSE ); + dissect_metric (tvb, tree, offset+3, + tvb_get_guint8(tvb, offset+3), "Error", FALSE ); + } + offset += 4; + length -= 4; + while ( length > 0 ) { + mylen = tvb_get_guint8(tvb, offset); + length--; + if (length<=0) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_short_packet, tvb, offset, -1, + "Zero payload space after length in prefix neighbor" ); + return; + } + if ( mylen > length) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, + "Integral length of prefix neighbor too long (%d vs %d)", mylen, length ); + return; + } + + /* + * Lets turn the area address into "standard" 0000.0000.etc + * format string. + */ + sbuf = print_area( tvb_get_ptr(tvb, offset+1, mylen), mylen ); + /* and spit it out */ + if ( tree ) { + proto_tree_add_text ( tree, tvb, offset, mylen + 1, + "Area address (%d): %s", mylen, sbuf ); + } + offset += mylen + 1; + length -= mylen; /* length already adjusted for len fld*/ + } } static void isis_lsp_checkum_additional_info(tvbuff_t * tvb, packet_info * pinfo, proto_item * it_cksum, int offset, gboolean is_cksum_correct) { - proto_tree * checksum_tree; - proto_item * item; - - checksum_tree = proto_item_add_subtree(it_cksum, ett_isis_lsp_cksum); - item = proto_tree_add_boolean(checksum_tree, hf_isis_lsp_checksum_good, tvb, - offset, 2, is_cksum_correct); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_isis_lsp_checksum_bad, tvb, - offset, 2, !is_cksum_correct); - PROTO_ITEM_SET_GENERATED(item); - if (!is_cksum_correct) { - expert_add_info(pinfo, item, &ie_isis_lsp_checksum_bad); - col_append_str(pinfo->cinfo, COL_INFO, " [ISIS CHECKSUM INCORRECT]"); - } + proto_tree * checksum_tree; + proto_item * item; + + checksum_tree = proto_item_add_subtree(it_cksum, ett_isis_lsp_cksum); + item = proto_tree_add_boolean(checksum_tree, hf_isis_lsp_checksum_good, tvb, + offset, 2, is_cksum_correct); + PROTO_ITEM_SET_GENERATED(item); + item = proto_tree_add_boolean(checksum_tree, hf_isis_lsp_checksum_bad, tvb, + offset, 2, !is_cksum_correct); + PROTO_ITEM_SET_GENERATED(item); + if (!is_cksum_correct) { + expert_add_info(pinfo, item, &ie_isis_lsp_checksum_bad); + col_append_str(pinfo->cinfo, COL_INFO, " [ISIS CHECKSUM INCORRECT]"); + } } static const isis_clv_handle_t clv_l1_lsp_opts[] = { - { - ISIS_CLV_AREA_ADDRESS, - "Area address(es)", - &ett_isis_lsp_clv_area_addr, - dissect_lsp_area_address_clv - }, - { - ISIS_CLV_IS_REACH, - "IS Reachability", - &ett_isis_lsp_clv_is_neighbors, - dissect_lsp_l1_is_neighbors_clv - }, - { - ISIS_CLV_ES_NEIGHBORS, - "ES Neighbor(s)", - &ett_isis_lsp_clv_is_neighbors, - dissect_lsp_l1_es_neighbors_clv - }, - { - ISIS_CLV_EXTD_IS_REACH, - "Extended IS reachability", - &ett_isis_lsp_clv_ext_is_reachability, - dissect_lsp_ext_is_reachability_clv - }, - { - ISIS_CLV_INT_IP_REACH, - "IP Internal reachability", - &ett_isis_lsp_clv_ip_reachability, - dissect_lsp_ip_reachability_clv - }, - { - ISIS_CLV_EXT_IP_REACH, - "IP External reachability", - &ett_isis_lsp_clv_ip_reachability, - dissect_lsp_ip_reachability_clv - }, - { - ISIS_CLV_EXTD_IP_REACH, - "Extended IP Reachability", - &ett_isis_lsp_clv_ext_ip_reachability, - dissect_lsp_ext_ip_reachability_clv - }, - { - ISIS_CLV_IP6_REACH, - "IPv6 reachability", - &ett_isis_lsp_clv_ipv6_reachability, - dissect_lsp_ipv6_reachability_clv - }, - { - ISIS_CLV_PROTOCOLS_SUPPORTED, - "Protocols supported", - &ett_isis_lsp_clv_nlpid, - dissect_lsp_nlpid_clv - }, - { - ISIS_CLV_HOSTNAME, - "Hostname", - &ett_isis_lsp_clv_hostname, - dissect_lsp_hostname_clv - }, - { - ISIS_CLV_TE_ROUTER_ID, - "Traffic Engineering Router ID", - &ett_isis_lsp_clv_te_router_id, - dissect_lsp_te_router_id_clv - }, - { - ISIS_CLV_IP_ADDR, - "IP Interface address(es)", - &ett_isis_lsp_clv_ipv4_int_addr, - dissect_lsp_ip_int_addr_clv - }, - { - ISIS_CLV_IP6_ADDR, - "IPv6 Interface address(es)", - &ett_isis_lsp_clv_ipv6_int_addr, - dissect_lsp_ipv6_int_addr_clv - }, - { - ISIS_CLV_MT_CAP, - "MT-Capability", - &ett_isis_lsp_clv_mt_cap, - dissect_isis_lsp_clv_mt_cap - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_lsp_clv_authentication, - dissect_lsp_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_lsp_clv_ip_authentication, - dissect_lsp_ip_authentication_clv - }, - { - ISIS_CLV_MT_SUPPORTED, - "Multi Topology supported", - &ett_isis_lsp_clv_mt, - dissect_lsp_mt_clv - }, - { - ISIS_CLV_MT_IS_REACH, - "Multi Topology IS Reachability", - &ett_isis_lsp_clv_mt_is, - dissect_lsp_mt_is_reachability_clv - }, - { - ISIS_CLV_MT_IP_REACH, - "Multi Topology Reachable IPv4 Prefixes", - &ett_isis_lsp_clv_mt_reachable_IPv4_prefx, - dissect_lsp_mt_reachable_IPv4_prefx_clv - }, - { - ISIS_CLV_MT_IP6_REACH, - "Multi Topology Reachable IPv6 Prefixes", - &ett_isis_lsp_clv_mt_reachable_IPv6_prefx, - dissect_lsp_mt_reachable_IPv6_prefx_clv - }, - { - ISIS_CLV_RT_CAPABLE, - "Router Capability", - &ett_isis_lsp_clv_rt_capable_IPv4_prefx, - dissect_isis_rt_capable_clv - }, - { - ISIS_GRP_ADDR, - "GROUP ADDRESS TLV", - &ett_isis_lsp_clv_grp_address_IPv4_prefx, - dissect_isis_grp_address_clv - }, - { - 0, - "", - NULL, - NULL - } + { + ISIS_CLV_AREA_ADDRESS, + "Area address(es)", + &ett_isis_lsp_clv_area_addr, + dissect_lsp_area_address_clv + }, + { + ISIS_CLV_IS_REACH, + "IS Reachability", + &ett_isis_lsp_clv_is_neighbors, + dissect_lsp_l1_is_neighbors_clv + }, + { + ISIS_CLV_ES_NEIGHBORS, + "ES Neighbor(s)", + &ett_isis_lsp_clv_is_neighbors, + dissect_lsp_l1_es_neighbors_clv + }, + { + ISIS_CLV_EXTD_IS_REACH, + "Extended IS reachability", + &ett_isis_lsp_clv_ext_is_reachability, + dissect_lsp_ext_is_reachability_clv + }, + { + ISIS_CLV_INT_IP_REACH, + "IP Internal reachability", + &ett_isis_lsp_clv_ip_reachability, + dissect_lsp_ip_reachability_clv + }, + { + ISIS_CLV_EXT_IP_REACH, + "IP External reachability", + &ett_isis_lsp_clv_ip_reachability, + dissect_lsp_ip_reachability_clv + }, + { + ISIS_CLV_EXTD_IP_REACH, + "Extended IP Reachability", + &ett_isis_lsp_clv_ext_ip_reachability, + dissect_lsp_ext_ip_reachability_clv + }, + { + ISIS_CLV_IP6_REACH, + "IPv6 reachability", + &ett_isis_lsp_clv_ipv6_reachability, + dissect_lsp_ipv6_reachability_clv + }, + { + ISIS_CLV_PROTOCOLS_SUPPORTED, + "Protocols supported", + &ett_isis_lsp_clv_nlpid, + dissect_lsp_nlpid_clv + }, + { + ISIS_CLV_HOSTNAME, + "Hostname", + &ett_isis_lsp_clv_hostname, + dissect_lsp_hostname_clv + }, + { + ISIS_CLV_TE_ROUTER_ID, + "Traffic Engineering Router ID", + &ett_isis_lsp_clv_te_router_id, + dissect_lsp_te_router_id_clv + }, + { + ISIS_CLV_IP_ADDR, + "IP Interface address(es)", + &ett_isis_lsp_clv_ipv4_int_addr, + dissect_lsp_ip_int_addr_clv + }, + { + ISIS_CLV_IP6_ADDR, + "IPv6 Interface address(es)", + &ett_isis_lsp_clv_ipv6_int_addr, + dissect_lsp_ipv6_int_addr_clv + }, + { + ISIS_CLV_MT_CAP, + "MT-Capability", + &ett_isis_lsp_clv_mt_cap, + dissect_isis_lsp_clv_mt_cap + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_lsp_clv_authentication, + dissect_lsp_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_lsp_clv_ip_authentication, + dissect_lsp_ip_authentication_clv + }, + { + ISIS_CLV_MT_SUPPORTED, + "Multi Topology supported", + &ett_isis_lsp_clv_mt, + dissect_lsp_mt_clv + }, + { + ISIS_CLV_MT_IS_REACH, + "Multi Topology IS Reachability", + &ett_isis_lsp_clv_mt_is, + dissect_lsp_mt_is_reachability_clv + }, + { + ISIS_CLV_MT_IP_REACH, + "Multi Topology Reachable IPv4 Prefixes", + &ett_isis_lsp_clv_mt_reachable_IPv4_prefx, + dissect_lsp_mt_reachable_IPv4_prefx_clv + }, + { + ISIS_CLV_MT_IP6_REACH, + "Multi Topology Reachable IPv6 Prefixes", + &ett_isis_lsp_clv_mt_reachable_IPv6_prefx, + dissect_lsp_mt_reachable_IPv6_prefx_clv + }, + { + ISIS_CLV_RT_CAPABLE, + "Router Capability", + &ett_isis_lsp_clv_rt_capable_IPv4_prefx, + dissect_isis_rt_capable_clv + }, + { + ISIS_GRP_ADDR, + "GROUP ADDRESS TLV", + &ett_isis_lsp_clv_grp_address_IPv4_prefx, + dissect_isis_grp_address_clv + }, + { + 0, + "", + NULL, + NULL + } }; static const isis_clv_handle_t clv_l2_lsp_opts[] = { - { - ISIS_CLV_AREA_ADDRESS, - "Area address(es)", - &ett_isis_lsp_clv_area_addr, - dissect_lsp_area_address_clv - }, - { - ISIS_CLV_IS_REACH, - "IS Reachability", - &ett_isis_lsp_clv_is_neighbors, - dissect_lsp_l2_is_neighbors_clv - }, - { - ISIS_CLV_EXTD_IS_REACH, - "Extended IS reachability", - &ett_isis_lsp_clv_ext_is_reachability, - dissect_lsp_ext_is_reachability_clv - }, - { - ISIS_CLV_PARTITION_DIS, - "Partition Designated Level 2 IS", - &ett_isis_lsp_clv_partition_dis, - dissect_lsp_partition_dis_clv - }, - { - ISIS_CLV_PREFIX_NEIGHBORS, - "Prefix neighbors", - &ett_isis_lsp_clv_prefix_neighbors, - dissect_lsp_prefix_neighbors_clv - }, - { - ISIS_CLV_INT_IP_REACH, - "IP Internal reachability", - &ett_isis_lsp_clv_ip_reachability, - dissect_lsp_ip_reachability_clv - }, - { - ISIS_CLV_EXT_IP_REACH, - "IP External reachability", - &ett_isis_lsp_clv_ip_reachability, - dissect_lsp_ip_reachability_clv - }, - { - ISIS_CLV_PROTOCOLS_SUPPORTED, - "Protocols supported", - &ett_isis_lsp_clv_nlpid, - dissect_lsp_nlpid_clv - }, - { - ISIS_CLV_HOSTNAME, - "Hostname", - &ett_isis_lsp_clv_hostname, - dissect_lsp_hostname_clv - }, - { - ISIS_CLV_TE_ROUTER_ID, - "Traffic Engineering Router ID", - &ett_isis_lsp_clv_te_router_id, - dissect_lsp_te_router_id_clv - }, - { - ISIS_CLV_EXTD_IP_REACH, - "Extended IP Reachability", - &ett_isis_lsp_clv_ext_ip_reachability, - dissect_lsp_ext_ip_reachability_clv - }, - { - ISIS_CLV_IP6_REACH, - "IPv6 reachability", - &ett_isis_lsp_clv_ipv6_reachability, - dissect_lsp_ipv6_reachability_clv - }, - { - ISIS_CLV_IP_ADDR, - "IP Interface address(es)", - &ett_isis_lsp_clv_ipv4_int_addr, - dissect_lsp_ip_int_addr_clv - }, - { - ISIS_CLV_IP6_ADDR, - "IPv6 Interface address(es)", - &ett_isis_lsp_clv_ipv6_int_addr, - dissect_lsp_ipv6_int_addr_clv - }, - { - ISIS_CLV_MT_CAP, - "MT-Capability", - &ett_isis_lsp_clv_mt_cap, - dissect_isis_lsp_clv_mt_cap - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_lsp_clv_authentication, - dissect_lsp_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_lsp_clv_ip_authentication, - dissect_lsp_ip_authentication_clv - }, - { - ISIS_CLV_MT_SUPPORTED, - "Multi Topology", - &ett_isis_lsp_clv_mt, - dissect_lsp_mt_clv - }, - { - ISIS_CLV_MT_IS_REACH, - "Multi Topology IS Reachability", - &ett_isis_lsp_clv_mt_is, - dissect_lsp_mt_is_reachability_clv - }, - { - ISIS_CLV_MT_IP_REACH, - "Multi Topology Reachable IPv4 Prefixes", - &ett_isis_lsp_clv_mt_reachable_IPv4_prefx, - dissect_lsp_mt_reachable_IPv4_prefx_clv - }, - { - ISIS_CLV_MT_IP6_REACH, - "Multi Topology Reachable IPv6 Prefixes", - &ett_isis_lsp_clv_mt_reachable_IPv6_prefx, - dissect_lsp_mt_reachable_IPv6_prefx_clv - }, - { - 0, - "", - NULL, - NULL - } + { + ISIS_CLV_AREA_ADDRESS, + "Area address(es)", + &ett_isis_lsp_clv_area_addr, + dissect_lsp_area_address_clv + }, + { + ISIS_CLV_IS_REACH, + "IS Reachability", + &ett_isis_lsp_clv_is_neighbors, + dissect_lsp_l2_is_neighbors_clv + }, + { + ISIS_CLV_EXTD_IS_REACH, + "Extended IS reachability", + &ett_isis_lsp_clv_ext_is_reachability, + dissect_lsp_ext_is_reachability_clv + }, + { + ISIS_CLV_PARTITION_DIS, + "Partition Designated Level 2 IS", + &ett_isis_lsp_clv_partition_dis, + dissect_lsp_partition_dis_clv + }, + { + ISIS_CLV_PREFIX_NEIGHBORS, + "Prefix neighbors", + &ett_isis_lsp_clv_prefix_neighbors, + dissect_lsp_prefix_neighbors_clv + }, + { + ISIS_CLV_INT_IP_REACH, + "IP Internal reachability", + &ett_isis_lsp_clv_ip_reachability, + dissect_lsp_ip_reachability_clv + }, + { + ISIS_CLV_EXT_IP_REACH, + "IP External reachability", + &ett_isis_lsp_clv_ip_reachability, + dissect_lsp_ip_reachability_clv + }, + { + ISIS_CLV_PROTOCOLS_SUPPORTED, + "Protocols supported", + &ett_isis_lsp_clv_nlpid, + dissect_lsp_nlpid_clv + }, + { + ISIS_CLV_HOSTNAME, + "Hostname", + &ett_isis_lsp_clv_hostname, + dissect_lsp_hostname_clv + }, + { + ISIS_CLV_TE_ROUTER_ID, + "Traffic Engineering Router ID", + &ett_isis_lsp_clv_te_router_id, + dissect_lsp_te_router_id_clv + }, + { + ISIS_CLV_EXTD_IP_REACH, + "Extended IP Reachability", + &ett_isis_lsp_clv_ext_ip_reachability, + dissect_lsp_ext_ip_reachability_clv + }, + { + ISIS_CLV_IP6_REACH, + "IPv6 reachability", + &ett_isis_lsp_clv_ipv6_reachability, + dissect_lsp_ipv6_reachability_clv + }, + { + ISIS_CLV_IP_ADDR, + "IP Interface address(es)", + &ett_isis_lsp_clv_ipv4_int_addr, + dissect_lsp_ip_int_addr_clv + }, + { + ISIS_CLV_IP6_ADDR, + "IPv6 Interface address(es)", + &ett_isis_lsp_clv_ipv6_int_addr, + dissect_lsp_ipv6_int_addr_clv + }, + { + ISIS_CLV_MT_CAP, + "MT-Capability", + &ett_isis_lsp_clv_mt_cap, + dissect_isis_lsp_clv_mt_cap + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_lsp_clv_authentication, + dissect_lsp_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_lsp_clv_ip_authentication, + dissect_lsp_ip_authentication_clv + }, + { + ISIS_CLV_MT_SUPPORTED, + "Multi Topology", + &ett_isis_lsp_clv_mt, + dissect_lsp_mt_clv + }, + { + ISIS_CLV_MT_IS_REACH, + "Multi Topology IS Reachability", + &ett_isis_lsp_clv_mt_is, + dissect_lsp_mt_is_reachability_clv + }, + { + ISIS_CLV_MT_IP_REACH, + "Multi Topology Reachable IPv4 Prefixes", + &ett_isis_lsp_clv_mt_reachable_IPv4_prefx, + dissect_lsp_mt_reachable_IPv4_prefx_clv + }, + { + ISIS_CLV_MT_IP6_REACH, + "Multi Topology Reachable IPv6 Prefixes", + &ett_isis_lsp_clv_mt_reachable_IPv6_prefx, + dissect_lsp_mt_reachable_IPv6_prefx_clv + }, + { + 0, + "", + NULL, + NULL + } }; /* * Name: isis_dissect_isis_lsp() * * Description: - * Print out the LSP part of the main header and then call the CLV - * de-mangler with the right list of valid CLVs. + * Print out the LSP part of the main header and then call the CLV + * de-mangler with the right list of valid CLVs. * * Input: - * tvbuff_t * : tvbuffer for packet data - * proto_tree * : protocol display tree to add to. May be NULL. - * int offset : our offset into packet data. - * int : LSP type, a la packet-isis.h ISIS_TYPE_* values - * int : header length of packet. - * int : length of IDs in packet. + * tvbuff_t * : tvbuffer for packet data + * proto_tree * : protocol display tree to add to. May be NULL. + * int offset : our offset into packet data. + * int : LSP type, a la packet-isis.h ISIS_TYPE_* values + * int : header length of packet. + * int : length of IDs in packet. * * Output: * void, but we will add to proto tree if !NULL. */ static void dissect_isis_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, - const isis_clv_handle_t *opts, int header_length, int id_length) + const isis_clv_handle_t *opts, int header_length, int id_length) { - proto_item *ti, *ta; - proto_tree *lsp_tree, *info_tree, *att_tree; - guint16 pdu_length, lifetime, checksum, cacl_checksum=0; - guint8 lsp_info; - int len, offset_checksum; - proto_item *it_cksum; - char* system_id; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS LSP"); - - ti = proto_tree_add_item(tree, proto_isis_lsp, tvb, offset, -1, ENC_NA); - lsp_tree = proto_item_add_subtree(ti, ett_isis_lsp); - - pdu_length = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint(lsp_tree, hf_isis_lsp_pdu_length, tvb, - offset, 2, pdu_length); - offset += 2; - - proto_tree_add_item(lsp_tree, hf_isis_lsp_remaining_life, - tvb, offset, 2, ENC_BIG_ENDIAN); - - lifetime = tvb_get_ntohs(tvb, offset); - offset += 2; - offset_checksum = offset; - - proto_tree_add_item(lsp_tree, hf_isis_lsp_lsp_id, tvb, offset, id_length + 2, ENC_NA); - system_id = tvb_print_system_id( tvb, offset, id_length+2 ); - col_append_fstr(pinfo->cinfo, COL_INFO, ", LSP-ID: %s", system_id); - - offset += (id_length + 2); - - proto_tree_add_item(lsp_tree, hf_isis_lsp_sequence_number, - tvb, offset, 4, ENC_BIG_ENDIAN); - - col_append_fstr(pinfo->cinfo, COL_INFO, ", Sequence: 0x%08x, Lifetime: %5us", - tvb_get_ntohl(tvb, offset), - tvb_get_ntohs(tvb, offset - (id_length+2+2))); - - offset += 4; - - checksum = lifetime ? tvb_get_ntohs(tvb, offset) : 0; - switch (check_and_get_checksum(tvb, offset_checksum, pdu_length-12, checksum, offset, &cacl_checksum)) { - case NO_CKSUM : - checksum = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, - "0x%04x [unused]", checksum); - break; - case DATA_MISSING : - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, - "Packet length %d went beyond packet", - tvb_length_remaining(tvb, offset_checksum)); - break; - case CKSUM_NOT_OK : - it_cksum = proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, - "0x%04x [incorrect, should be 0x%04x]", - checksum, cacl_checksum); - isis_lsp_checkum_additional_info(tvb, pinfo, it_cksum, offset, FALSE); - break; - case CKSUM_OK : - it_cksum = proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, - "0x%04x [correct]", checksum); - isis_lsp_checkum_additional_info(tvb, pinfo, it_cksum, offset, TRUE); - break; - } - offset += 2; - - if (tree) { - /* - * P | ATT | HIPPITY | IS TYPE description. - */ - lsp_info = tvb_get_guint8(tvb, offset); - info_tree = proto_tree_add_subtree_format(lsp_tree, tvb, offset, 1, ett_isis_lsp_info, NULL, - "Type block(0x%02x): Partition Repair:%d, Attached bits:%d, Overload bit:%d, IS type:%d", - lsp_info, - ISIS_LSP_PARTITION(lsp_info), - ISIS_LSP_ATT(lsp_info), - ISIS_LSP_HIPPITY(lsp_info), - ISIS_LSP_IS_TYPE(lsp_info) - ); - - proto_tree_add_boolean(info_tree, hf_isis_lsp_p, tvb, offset, 1, lsp_info); - ta = proto_tree_add_uint(info_tree, hf_isis_lsp_att, tvb, offset, 1, lsp_info); - att_tree = proto_item_add_subtree(ta, ett_isis_lsp_att); - proto_tree_add_item(att_tree, hf_isis_lsp_error_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(att_tree, hf_isis_lsp_expense_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(att_tree, hf_isis_lsp_delay_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_item(att_tree, hf_isis_lsp_default_metric, tvb, offset, 1, ENC_NA); - proto_tree_add_boolean(info_tree, hf_isis_lsp_hippity, tvb, offset, 1, lsp_info); - proto_tree_add_uint(info_tree, hf_isis_lsp_is_type, tvb, offset, 1, lsp_info); - } - offset += 1; - - len = pdu_length - header_length; - if (len < 0) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, - "packet header length %d went beyond packet", - header_length ); - return; - } - /* - * Now, we need to decode our CLVs. We need to pass in - * our list of valid ones! - */ - isis_dissect_clvs(tvb, pinfo, lsp_tree, offset, - opts, &ei_isis_lsp_short_packet, len, id_length, ett_isis_lsp_clv_unknown ); + proto_item *ti, *ta; + proto_tree *lsp_tree, *info_tree, *att_tree; + guint16 pdu_length, lifetime, checksum, cacl_checksum=0; + guint8 lsp_info; + int len, offset_checksum; + proto_item *it_cksum; + char* system_id; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS LSP"); + + ti = proto_tree_add_item(tree, proto_isis_lsp, tvb, offset, -1, ENC_NA); + lsp_tree = proto_item_add_subtree(ti, ett_isis_lsp); + + pdu_length = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint(lsp_tree, hf_isis_lsp_pdu_length, tvb, + offset, 2, pdu_length); + offset += 2; + + proto_tree_add_item(lsp_tree, hf_isis_lsp_remaining_life, + tvb, offset, 2, ENC_BIG_ENDIAN); + + lifetime = tvb_get_ntohs(tvb, offset); + offset += 2; + offset_checksum = offset; + + proto_tree_add_item(lsp_tree, hf_isis_lsp_lsp_id, tvb, offset, id_length + 2, ENC_NA); + system_id = tvb_print_system_id( tvb, offset, id_length+2 ); + col_append_fstr(pinfo->cinfo, COL_INFO, ", LSP-ID: %s", system_id); + + offset += (id_length + 2); + + proto_tree_add_item(lsp_tree, hf_isis_lsp_sequence_number, + tvb, offset, 4, ENC_BIG_ENDIAN); + + col_append_fstr(pinfo->cinfo, COL_INFO, ", Sequence: 0x%08x, Lifetime: %5us", + tvb_get_ntohl(tvb, offset), + tvb_get_ntohs(tvb, offset - (id_length+2+2))); + + offset += 4; + + checksum = lifetime ? tvb_get_ntohs(tvb, offset) : 0; + switch (check_and_get_checksum(tvb, offset_checksum, pdu_length-12, checksum, offset, &cacl_checksum)) { + case NO_CKSUM : + checksum = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, + "0x%04x [unused]", checksum); + break; + case DATA_MISSING : + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, + "Packet length %d went beyond packet", + tvb_length_remaining(tvb, offset_checksum)); + break; + case CKSUM_NOT_OK : + it_cksum = proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, + "0x%04x [incorrect, should be 0x%04x]", + checksum, cacl_checksum); + isis_lsp_checkum_additional_info(tvb, pinfo, it_cksum, offset, FALSE); + break; + case CKSUM_OK : + it_cksum = proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, + "0x%04x [correct]", checksum); + isis_lsp_checkum_additional_info(tvb, pinfo, it_cksum, offset, TRUE); + break; + } + offset += 2; + + if (tree) { + /* + * P | ATT | HIPPITY | IS TYPE description. + */ + lsp_info = tvb_get_guint8(tvb, offset); + info_tree = proto_tree_add_subtree_format(lsp_tree, tvb, offset, 1, ett_isis_lsp_info, NULL, + "Type block(0x%02x): Partition Repair:%d, Attached bits:%d, Overload bit:%d, IS type:%d", + lsp_info, + ISIS_LSP_PARTITION(lsp_info), + ISIS_LSP_ATT(lsp_info), + ISIS_LSP_HIPPITY(lsp_info), + ISIS_LSP_IS_TYPE(lsp_info) + ); + + proto_tree_add_boolean(info_tree, hf_isis_lsp_p, tvb, offset, 1, lsp_info); + ta = proto_tree_add_uint(info_tree, hf_isis_lsp_att, tvb, offset, 1, lsp_info); + att_tree = proto_item_add_subtree(ta, ett_isis_lsp_att); + proto_tree_add_item(att_tree, hf_isis_lsp_error_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(att_tree, hf_isis_lsp_expense_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(att_tree, hf_isis_lsp_delay_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_item(att_tree, hf_isis_lsp_default_metric, tvb, offset, 1, ENC_NA); + proto_tree_add_boolean(info_tree, hf_isis_lsp_hippity, tvb, offset, 1, lsp_info); + proto_tree_add_uint(info_tree, hf_isis_lsp_is_type, tvb, offset, 1, lsp_info); + } + offset += 1; + + len = pdu_length - header_length; + if (len < 0) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, + "packet header length %d went beyond packet", + header_length ); + return; + } + /* + * Now, we need to decode our CLVs. We need to pass in + * our list of valid ones! + */ + isis_dissect_clvs(tvb, pinfo, lsp_tree, offset, + opts, &ei_isis_lsp_short_packet, len, id_length, ett_isis_lsp_clv_unknown ); } static int dissect_isis_l1_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_lsp(tvb, pinfo, tree, 0, - clv_l1_lsp_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_lsp(tvb, pinfo, tree, 0, + clv_l1_lsp_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } static int dissect_isis_l2_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_lsp(tvb, pinfo, tree, 0, - clv_l2_lsp_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_lsp(tvb, pinfo, tree, 0, + clv_l2_lsp_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } void proto_register_isis_lsp(void) { - static hf_register_info hf[] = { - { &hf_isis_lsp_pdu_length, - { "PDU length", "isis.lsp.pdu_length", FT_UINT16, - BASE_DEC, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_remaining_life, - { "Remaining lifetime", "isis.lsp.remaining_life", FT_UINT16, - BASE_DEC, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_lsp_id, - { "LSP-ID", "isis.lsp.lsp_id", FT_SYSTEM_ID, - BASE_NONE, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_hostname, - { "Hostname", "isis.lsp.hostname", FT_STRING, - BASE_NONE, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_sequence_number, - { "Sequence number", "isis.lsp.sequence_number", - FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_checksum, - { "Checksum", "isis.lsp.checksum",FT_UINT16, - BASE_HEX, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_checksum_good, - { "Good Checksum", "isis.lsp.checksum_good", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Good IS-IS LSP Checksum", HFILL }}, - - { &hf_isis_lsp_checksum_bad, - { "Bad Checksum", "isis.lsp.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Bad IS-IS LSP Checksum", HFILL }}, - - { &hf_isis_lsp_clv_ipv4_int_addr, - { "IPv4 interface address", "isis.lsp.clv_ipv4_int_addr", FT_IPv4, - BASE_NONE, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_clv_ipv6_int_addr, - { "IPv6 interface address", "isis.lsp.clv_ipv6_int_addr", FT_IPv6, - BASE_NONE, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_clv_te_router_id, - { "Traffic Engineering Router ID", "isis.lsp.clv_te_router_id", FT_IPv4, - BASE_NONE, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_clv_mt, - { "MT-ID", "isis.lsp.clv_mt", - FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_p, - { "Partition Repair", "isis.lsp.partition_repair", FT_BOOLEAN, 8, - TFS(&tfs_supported_not_supported), ISIS_LSP_PARTITION_MASK, - "If set, this router supports the optional Partition Repair function", HFILL }}, - - { &hf_isis_lsp_att, - { "Attachment", "isis.lsp.att", FT_UINT8, BASE_DEC, - NULL, ISIS_LSP_ATT_MASK, - NULL, HFILL }}, - - { &hf_isis_lsp_hippity, - { "Overload bit", "isis.lsp.overload", FT_BOOLEAN, 8, - TFS(&tfs_set_notset), ISIS_LSP_HIPPITY_MASK, - "If set, this router will not be used by any decision process to calculate routes", HFILL }}, - - { &hf_isis_lsp_root_id, - { "Root Bridge ID", "isis.lsp.root.id", FT_UINT64, BASE_HEX, - NULL, 0x0, NULL, HFILL }}, - - { &hf_isis_lsp_is_type, - { "Type of Intermediate System", "isis.lsp.is_type", FT_UINT8, BASE_DEC, - VALS(isis_lsp_istype_vals), ISIS_LSP_IS_TYPE_MASK, - NULL, HFILL }}, - - { &hf_isis_lsp_spb_link_metric, - { "SPB Link Metric", "isis.lsp.spb.link_metric", - FT_UINT24, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, - - { &hf_isis_lsp_spb_port_count, - { "Number of Ports", "isis.lsp.spb.port_count", - FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }}, - - { &hf_isis_lsp_spb_port_id, - { "Port Id", "isis.lsp.spb.port_id", - FT_UINT16, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, - - { &hf_isis_lsp_spb_sr_bit, - { "SR Bit", "isis.lsp.spb.sr_bit", - FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }}, - - { &hf_isis_lsp_spb_spvid, - { "SPVID", "isis.lsp.spb.spvid", - FT_UINT16, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, + static hf_register_info hf[] = { + { &hf_isis_lsp_pdu_length, + { "PDU length", "isis.lsp.pdu_length", FT_UINT16, + BASE_DEC, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_remaining_life, + { "Remaining lifetime", "isis.lsp.remaining_life", FT_UINT16, + BASE_DEC, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_lsp_id, + { "LSP-ID", "isis.lsp.lsp_id", FT_SYSTEM_ID, + BASE_NONE, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_hostname, + { "Hostname", "isis.lsp.hostname", FT_STRING, + BASE_NONE, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_sequence_number, + { "Sequence number", "isis.lsp.sequence_number", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_checksum, + { "Checksum", "isis.lsp.checksum",FT_UINT16, + BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_checksum_good, + { "Good Checksum", "isis.lsp.checksum_good", FT_BOOLEAN, BASE_NONE, + NULL, 0x0, "Good IS-IS LSP Checksum", HFILL }}, + + { &hf_isis_lsp_checksum_bad, + { "Bad Checksum", "isis.lsp.checksum_bad", FT_BOOLEAN, BASE_NONE, + NULL, 0x0, "Bad IS-IS LSP Checksum", HFILL }}, + + { &hf_isis_lsp_clv_ipv4_int_addr, + { "IPv4 interface address", "isis.lsp.clv_ipv4_int_addr", FT_IPv4, + BASE_NONE, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_clv_ipv6_int_addr, + { "IPv6 interface address", "isis.lsp.clv_ipv6_int_addr", FT_IPv6, + BASE_NONE, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_clv_te_router_id, + { "Traffic Engineering Router ID", "isis.lsp.clv_te_router_id", FT_IPv4, + BASE_NONE, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_clv_mt, + { "MT-ID", "isis.lsp.clv_mt", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_p, + { "Partition Repair", "isis.lsp.partition_repair", FT_BOOLEAN, 8, + TFS(&tfs_supported_not_supported), ISIS_LSP_PARTITION_MASK, + "If set, this router supports the optional Partition Repair function", HFILL }}, + + { &hf_isis_lsp_att, + { "Attachment", "isis.lsp.att", FT_UINT8, BASE_DEC, + NULL, ISIS_LSP_ATT_MASK, + NULL, HFILL }}, + + { &hf_isis_lsp_hippity, + { "Overload bit", "isis.lsp.overload", FT_BOOLEAN, 8, + TFS(&tfs_set_notset), ISIS_LSP_HIPPITY_MASK, + "If set, this router will not be used by any decision process to calculate routes", HFILL }}, + + { &hf_isis_lsp_root_id, + { "Root Bridge ID", "isis.lsp.root.id", FT_UINT64, BASE_HEX, + NULL, 0x0, NULL, HFILL }}, + + { &hf_isis_lsp_is_type, + { "Type of Intermediate System", "isis.lsp.is_type", FT_UINT8, BASE_DEC, + VALS(isis_lsp_istype_vals), ISIS_LSP_IS_TYPE_MASK, + NULL, HFILL }}, + + { &hf_isis_lsp_spb_link_metric, + { "SPB Link Metric", "isis.lsp.spb.link_metric", + FT_UINT24, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, + + { &hf_isis_lsp_spb_port_count, + { "Number of Ports", "isis.lsp.spb.port_count", + FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }}, + + { &hf_isis_lsp_spb_port_id, + { "Port Id", "isis.lsp.spb.port_id", + FT_UINT16, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, + + { &hf_isis_lsp_spb_sr_bit, + { "SR Bit", "isis.lsp.spb.sr_bit", + FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }}, + + { &hf_isis_lsp_spb_spvid, + { "SPVID", "isis.lsp.spb.spvid", + FT_UINT16, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, /* Generated from convert_proto_tree_add_text.pl */ - { &hf_isis_lsp_mt_id_reserved, { "Reserved", "isis.lsp.reserved", FT_UINT16, BASE_HEX, NULL, ISIS_LSP_MT_MSHIP_RES_MASK, NULL, HFILL }}, - { &hf_isis_lsp_mt_id, { "MT ID", "isis.lsp.mt_id", FT_UINT16, BASE_DEC, NULL, ISIS_LSP_MT_MSHIP_ID_MASK, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_ipv4_prefix, { "IPv4 prefix", "isis.lsp.ip_reachability.ipv4_prefix", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_default_metric, { "Default Metric", "isis.lsp.ip_reachability.default_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_delay_metric, { "Delay Metric", "isis.lsp.ip_reachability.delay_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_expense_metric, { "Expense Metric", "isis.lsp.ip_reachability.expense_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_error_metric, { "Error Metric", "isis.lsp.ip_reachability.error_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, 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, NULL, HFILL }}, - { &hf_isis_lsp_64_bit_administrative_tag, { "64-Bit Administrative tag", "isis.lsp.64_bit_administrative_tag", FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_ip_reachability_ipv4_prefix, { "IPv4 prefix", "isis.lsp.ext_ip_reachability.ipv4_prefix", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_ip_reachability_metric, { "Metric", "isis.lsp.ext_ip_reachability.metric", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_ip_reachability_distribution, { "Distribution", "isis.lsp.ext_ip_reachability.distribution", FT_BOOLEAN, 8, TFS(&tfs_up_down), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_length, { "Length", "isis.lsp.grp_address.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_topology_id, { "Topology ID", "isis.lsp.grp_address.topology_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_vlan_id, { "VLAN ID", "isis.lsp.grp_address.vlan_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_number_of_records, { "Number of records", "isis.lsp.grp_address.number_of_records", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_number_of_sources, { "Number of sources", "isis.lsp.grp_address.number_of_sources", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_group_address, { "Group Address", "isis.lsp.grp_address.group_address", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_grp_address_source_address, { "Source Address", "isis.lsp.grp_address.source_address", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_trill_length, { "Length", "isis.lsp.rt_capable.trill.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_trill_maximum_version, { "Maximum version", "isis.lsp.rt_capable.trill.maximum_version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_trees_length, { "Length", "isis.lsp.rt_capable.trees.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_trees_nof_trees_to_compute, { "Nof. trees to compute", "isis.lsp.rt_capable.trees.nof_trees_to_compute", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_trees_maximum_nof_trees_to_compute, { "Maximum nof. trees to compute", "isis.lsp.rt_capable.trees.maximum_nof_trees_to_compute", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_trees_nof_trees_to_use, { "Nof. trees to use", "isis.lsp.rt_capable.trees.nof_trees_to_use", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_tree_root_id_length, { "Length", "isis.lsp.rt_capable.tree_root_id.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_tree_root_id_starting_tree_no, { "Starting tree no", "isis.lsp.rt_capable.tree_root_id.starting_tree_no", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_tree_root_id_nickname, { "Nickname", "isis.lsp.rt_capable.tree_root_id.nickname", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_nickname_length, { "Length", "isis.lsp.rt_capable.nickname.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_nickname_nickname_priority, { "Nickname priority", "isis.lsp.rt_capable.nickname.nickname_priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_nickname_tree_root_priority, { "Tree root priority", "isis.lsp.rt_capable.nickname.tree_root_priority", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_nickname_nickname, { "Nickname", "isis.lsp.rt_capable.nickname.nickname", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_length, { "Length", "isis.lsp.rt_capable.interested_vlans.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_nickname, { "Nickname", "isis.lsp.rt_capable.interested_vlans.nickname", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv4, { "IPv4 multicast router", "isis.lsp.rt_capable.interested_vlans.multicast_ipv4", FT_BOOLEAN, 16, TFS(&tfs_set_notset), 0x8000, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv6, { "IPv6 multicast router", "isis.lsp.rt_capable.interested_vlans.multicast_ipv6", FT_BOOLEAN, 16, TFS(&tfs_set_notset), 0x4000, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_vlan_start_id, { "Vlan start id", "isis.lsp.rt_capable.interested_vlans.vlan_start_id", FT_UINT16, BASE_HEX, NULL, 0x0fff, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_vlan_end_id, { "Vlan end id", "isis.lsp.rt_capable.interested_vlans.vlan_end_id", FT_UINT16, BASE_HEX, NULL, 0x0fff, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_interested_vlans_afs_lost_counter, { "Appointed forward state lost counter", "isis.lsp.rt_capable.interested_vlans.afs_lost_counter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_tree_used_id_length, { "Length", "isis.lsp.rt_capable.tree_used_id.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_tree_used_id_starting_tree_no, { "Starting tree no", "isis.lsp.rt_capable.tree_used_id.starting_tree_no", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_tree_used_id_nickname, { "Nickname", "isis.lsp.rt_capable.tree_used_id.nickname", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_vlan_group_length, { "Length", "isis.lsp.rt_capable.vlan_group.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_vlan_group_primary_vlan_id, { "Primary vlan id", "isis.lsp.rt_capable.vlan_group.primary_vlan_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_vlan_group_secondary_vlan_id, { "Secondary vlan id", "isis.lsp.rt_capable.vlan_group.secondary_vlan_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, - { &hf_isis_lsp_rt_capable_vlan_group_nth_secondary_vlan_id, { "%dth secondary vlan id", "isis.lsp.rt_capable.vlan_group.nth_secondary_vlan_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ipv6_reachability_ipv6_prefix, { "IPv6 prefix", "isis.lsp.ipv6_reachability.ipv6_prefix", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ipv6_reachability_metric, { "Metric", "isis.lsp.ipv6_reachability.metric", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ipv6_reachability_distribution, { "Distribution", "isis.lsp.ipv6_reachability.distribution", FT_BOOLEAN, 8, TFS(&tfs_up_down), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_ipv6_reachability_distribution_internal, { "Distribution", "isis.lsp.ipv6_reachability.distribution_internal", FT_BOOLEAN, 8, TFS(&tfs_internal_external), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_ipv6_reachability_reserved_bits, { "Reserved bits", "isis.lsp.ipv6_reachability.reserved_bits", FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spb_instance_cist_root_identifier, { "CIST Root Identifier", "isis.lsp.mt_cap_spb_instance.cist_root_identifier", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spb_instance_cist_external_root_path_cost, { "CIST External Root Path Cost", "isis.lsp.mt_cap_spb_instance.cist_external_root_path_cost", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spb_instance_bridge_priority, { "Bridge Priority", "isis.lsp.mt_cap_spb_instance.bridge_priority", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spb_instance_v, { "V", "isis.lsp.mt_cap_spb_instance.v", FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spb_instance_number_of_trees, { "Number of Trees", "isis.lsp.mt_cap_spb_instance.number_of_trees", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spbm_service_identifier_b_mac, { "B-MAC", "isis.lsp.mt_cap_spbm_service_identifier.b_mac", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spbm_service_identifier_base_vid, { "Base-VID", "isis.lsp.mt_cap_spbm_service_identifier.base_vid", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_mtid, { "MTID", "isis.lsp.mt_cap.mtid", FT_UINT16, BASE_HEX, NULL, 0xfff, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_reserved, { "Reserved", "isis.lsp.eis_neighbors_clv_inner.reserved", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_es_neighbor_id, { "ES Neighbor ID", "isis.lsp.eis_neighbors.es_neighbor_id", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_is_neighbor_id, { "IS Neighbor", "isis.lsp.eis_neighbors.is_neighbor", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_default_metric, { "Default Metric", "isis.lsp.eis_neighbors.default_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_delay_metric, { "Delay Metric", "isis.lsp.eis_neighbors.delay_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_expense_metric, { "Expense Metric", "isis.lsp.eis_neighbors.expense_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_error_metric, { "Error Metric", "isis.lsp.eis_neighbors.error_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, - { &hf_isis_lsp_maximum_link_bandwidth, { "Maximum link bandwidth", "isis.lsp.maximum_link_bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_reservable_link_bandwidth, { "Reservable link bandwidth", "isis.lsp.reservable_link_bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_is_neighbor_id, { "IS neighbor ID", "isis.lsp.ext_is_reachability.is_neighbor_id", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_metric, { "Metric", "isis.lsp.ext_is_reachability.metric", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_link_local_identifier, { "Link Local Identifier", "isis.lsp.ext_is_reachability.link_local_identifier", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_link_remote_identifier, { "Link Remote Identifier", "isis.lsp.ext_is_reachability.link_remote_identifier", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_ipv4_interface_address, { "IPv4 interface address", "isis.lsp.ext_is_reachability.ipv4_interface_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_ipv4_neighbor_address, { "IPv4 neighbor address", "isis.lsp.ext_is_reachability.ipv4_neighbor_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ext_is_reachability_traffic_engineering_default_metric, { "Traffic engineering default metric", "isis.lsp.ext_is_reachability.traffic_engineering_default_metric", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_partition_designated_l2_is, { "Partition designated L2 IS", "isis.lsp.partition_designated_l2_is", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_error_metric, { "Error metric", "isis.lsp.error_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x08, NULL, HFILL }}, - { &hf_isis_lsp_expense_metric, { "Expense metric", "isis.lsp.expense_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04, NULL, HFILL }}, - { &hf_isis_lsp_delay_metric, { "Delay metric", "isis.lsp.delay_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02, NULL, HFILL }}, - { &hf_isis_lsp_default_metric, { "Default metric", "isis.lsp.default_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_default_metric_ie, { "Default Metric IE", "isis.lsp.ip_reachability.default_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_delay_metric_support, { "Delay Metric", "isis.lsp.ip_reachability.delay_metric_support", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_expense_metric_support, { "Expense Metric", "isis.lsp.ip_reachability.expense_metric_support", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_error_metric_support, { "Error Metric", "isis.lsp.ip_reachability.error_metric_support", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_spsourceid, { "SPSourceId", "isis.lsp.mt_cap.spsourceid", FT_UINT32, BASE_HEX_DEC, NULL, 0xfffff, NULL, HFILL }}, - { &hf_isis_lsp_mt_cap_overload, { "Overload", "isis.lsp.overload", FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_default_metric_ie, { "Default Metric", "isis.lsp.eis_neighbors.default_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_delay_metric_supported, { "Delay Metric", "isis.lsp.eis_neighbors_delay_metric.supported", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_expense_metric_supported, { "Expense Metric", "isis.lsp.eis_neighbors.expense_metric_supported", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_error_metric_supported, { "Error Metric", "isis.lsp.eis_neighbors.error_metric_supported", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_unrsv_bw_priority_level, { "priority level", "isis.lsp.unrsv_bw.priority_level", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_distribution, { "Distribution", "isis.lsp.ip_reachability.distribution", FT_BOOLEAN, 8, TFS(&tfs_up_down), 0x80, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_delay_metric_ie, { "Delay Metric", "isis.lsp.ip_reachability.delay_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_expense_metric_ie, { "Expense Metric", "isis.lsp.ip_reachability.expense_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_ip_reachability_error_metric_ie, { "Error Metric", "isis.lsp.ip_reachability.error_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_delay_metric_ie, { "Delay Metric", "isis.lsp.eis_neighbors.delay_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_expense_metric_ie, { "Expense Metric", "isis.lsp.eis_neighbors.expense_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - { &hf_isis_lsp_eis_neighbors_error_metric_ie, { "Error Metric", "isis.lsp.eis_neighbors.error_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, - }; - static gint *ett[] = { - &ett_isis_lsp, - &ett_isis_lsp_info, - &ett_isis_lsp_att, - &ett_isis_lsp_cksum, - &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_subclv_spb_link_metric, - &ett_isis_lsp_clv_unknown, - &ett_isis_lsp_clv_partition_dis, - &ett_isis_lsp_clv_prefix_neighbors, - &ett_isis_lsp_clv_authentication, - &ett_isis_lsp_clv_ip_authentication, - &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_mt_cap, - &ett_isis_lsp_clv_mt_cap_spb_instance, - &ett_isis_lsp_clv_mt_cap_spbm_service_identifier, - &ett_isis_lsp_clv_te_router_id, - &ett_isis_lsp_clv_ip_reachability, - &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_clv_ipv6_reachability, /* CLV 236 */ - &ett_isis_lsp_part_of_clv_ipv6_reachability, - &ett_isis_lsp_clv_mt, - &ett_isis_lsp_clv_mt_is, - &ett_isis_lsp_part_of_clv_mt_is, - &ett_isis_lsp_clv_rt_capable_IPv4_prefx, - &ett_isis_lsp_clv_grp_address_IPv4_prefx, /*CLV 142*/ - &ett_isis_lsp_clv_mt_reachable_IPv4_prefx, - &ett_isis_lsp_clv_mt_reachable_IPv6_prefx, - &ett_isis_lsp_clv_mt_cap_spbv_mac_address - }; - - static ei_register_info ei[] = { - { &ie_isis_lsp_checksum_bad, { "isis.lsp.checksum_bad.expert", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }}, - { &ei_isis_lsp_short_packet, { "isis.lsp.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, - { &ei_isis_lsp_long_packet, { "isis.lsp.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, - { &ei_isis_lsp_subtlv, { "isis.lsp.subtlv.unknown", PI_PROTOCOL, PI_WARN, "Unknown SubTLV", EXPFILL }}, - { &ei_isis_lsp_authentication, { "isis.lsp.authentication.unknown", PI_PROTOCOL, PI_WARN, "Unknown authentication type", EXPFILL }}, - }; - - expert_module_t* expert_isis_lsp; - - /* Register the protocol name and description */ - proto_isis_lsp = proto_register_protocol(PROTO_STRING_LSP, "ISIS LSP", "isis.lsp"); - - proto_register_field_array(proto_isis_lsp, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_isis_lsp = expert_register_protocol(proto_isis_lsp); - expert_register_field_array(expert_isis_lsp, ei, array_length(ei)); + { &hf_isis_lsp_mt_id_reserved, + { "Reserved", "isis.lsp.reserved", FT_UINT16, BASE_HEX, NULL, ISIS_LSP_MT_MSHIP_RES_MASK, NULL, HFILL }}, + { &hf_isis_lsp_mt_id, + { "MT ID", "isis.lsp.mt_id", FT_UINT16, BASE_DEC, NULL, ISIS_LSP_MT_MSHIP_ID_MASK, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_ipv4_prefix, + { "IPv4 prefix", "isis.lsp.ip_reachability.ipv4_prefix", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_default_metric, + { "Default Metric", "isis.lsp.ip_reachability.default_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_delay_metric, + { "Delay Metric", "isis.lsp.ip_reachability.delay_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_expense_metric, + { "Expense Metric", "isis.lsp.ip_reachability.expense_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_error_metric, + { "Error Metric", "isis.lsp.ip_reachability.error_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, 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, NULL, HFILL }}, + { &hf_isis_lsp_64_bit_administrative_tag, + { "64-Bit Administrative tag", "isis.lsp.64_bit_administrative_tag", FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_ip_reachability_ipv4_prefix, + { "IPv4 prefix", "isis.lsp.ext_ip_reachability.ipv4_prefix", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_ip_reachability_metric, + { "Metric", "isis.lsp.ext_ip_reachability.metric", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_ip_reachability_distribution, + { "Distribution", "isis.lsp.ext_ip_reachability.distribution", FT_BOOLEAN, 8, TFS(&tfs_up_down), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_length, + { "Length", "isis.lsp.grp_address.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_topology_id, + { "Topology ID", "isis.lsp.grp_address.topology_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_vlan_id, + { "VLAN ID", "isis.lsp.grp_address.vlan_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_number_of_records, + { "Number of records", "isis.lsp.grp_address.number_of_records", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_number_of_sources, + { "Number of sources", "isis.lsp.grp_address.number_of_sources", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_group_address, + { "Group Address", "isis.lsp.grp_address.group_address", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_grp_address_source_address, + { "Source Address", "isis.lsp.grp_address.source_address", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_trill_length, + { "Length", "isis.lsp.rt_capable.trill.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_trill_maximum_version, + { "Maximum version", "isis.lsp.rt_capable.trill.maximum_version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_trees_length, + { "Length", "isis.lsp.rt_capable.trees.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_trees_nof_trees_to_compute, + { "Nof. trees to compute", "isis.lsp.rt_capable.trees.nof_trees_to_compute", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_trees_maximum_nof_trees_to_compute, + { "Maximum nof. trees to compute", "isis.lsp.rt_capable.trees.maximum_nof_trees_to_compute", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_trees_nof_trees_to_use, + { "Nof. trees to use", "isis.lsp.rt_capable.trees.nof_trees_to_use", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_tree_root_id_length, + { "Length", "isis.lsp.rt_capable.tree_root_id.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_tree_root_id_starting_tree_no, + { "Starting tree no", "isis.lsp.rt_capable.tree_root_id.starting_tree_no", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_tree_root_id_nickname, + { "Nickname", "isis.lsp.rt_capable.tree_root_id.nickname", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_nickname_length, + { "Length", "isis.lsp.rt_capable.nickname.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_nickname_nickname_priority, + { "Nickname priority", "isis.lsp.rt_capable.nickname.nickname_priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_nickname_tree_root_priority, + { "Tree root priority", "isis.lsp.rt_capable.nickname.tree_root_priority", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_nickname_nickname, + { "Nickname", "isis.lsp.rt_capable.nickname.nickname", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_length, + { "Length", "isis.lsp.rt_capable.interested_vlans.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_nickname, + { "Nickname", "isis.lsp.rt_capable.interested_vlans.nickname", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv4, + { "IPv4 multicast router", "isis.lsp.rt_capable.interested_vlans.multicast_ipv4", FT_BOOLEAN, 16, TFS(&tfs_set_notset), 0x8000, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_multicast_ipv6, + { "IPv6 multicast router", "isis.lsp.rt_capable.interested_vlans.multicast_ipv6", FT_BOOLEAN, 16, TFS(&tfs_set_notset), 0x4000, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_vlan_start_id, + { "Vlan start id", "isis.lsp.rt_capable.interested_vlans.vlan_start_id", FT_UINT16, BASE_HEX, NULL, 0x0fff, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_vlan_end_id, + { "Vlan end id", "isis.lsp.rt_capable.interested_vlans.vlan_end_id", FT_UINT16, BASE_HEX, NULL, 0x0fff, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_interested_vlans_afs_lost_counter, + { "Appointed forward state lost counter", "isis.lsp.rt_capable.interested_vlans.afs_lost_counter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_tree_used_id_length, + { "Length", "isis.lsp.rt_capable.tree_used_id.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_tree_used_id_starting_tree_no, + { "Starting tree no", "isis.lsp.rt_capable.tree_used_id.starting_tree_no", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_tree_used_id_nickname, + { "Nickname", "isis.lsp.rt_capable.tree_used_id.nickname", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_vlan_group_length, + { "Length", "isis.lsp.rt_capable.vlan_group.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_vlan_group_primary_vlan_id, + { "Primary vlan id", "isis.lsp.rt_capable.vlan_group.primary_vlan_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_vlan_group_secondary_vlan_id, + { "Secondary vlan id", "isis.lsp.rt_capable.vlan_group.secondary_vlan_id", FT_UINT16, BASE_DEC, NULL, 0x0fff, NULL, HFILL }}, + { &hf_isis_lsp_rt_capable_vlan_group_nth_secondary_vlan_id, + { "%dth secondary vlan id", "isis.lsp.rt_capable.vlan_group.nth_secondary_vlan_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ipv6_reachability_ipv6_prefix, + { "IPv6 prefix", "isis.lsp.ipv6_reachability.ipv6_prefix", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ipv6_reachability_metric, + { "Metric", "isis.lsp.ipv6_reachability.metric", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ipv6_reachability_distribution, + { "Distribution", "isis.lsp.ipv6_reachability.distribution", FT_BOOLEAN, 8, TFS(&tfs_up_down), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_ipv6_reachability_distribution_internal, + { "Distribution", "isis.lsp.ipv6_reachability.distribution_internal", FT_BOOLEAN, 8, TFS(&tfs_internal_external), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_ipv6_reachability_reserved_bits, + { "Reserved bits", "isis.lsp.ipv6_reachability.reserved_bits", FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spb_instance_cist_root_identifier, + { "CIST Root Identifier", "isis.lsp.mt_cap_spb_instance.cist_root_identifier", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spb_instance_cist_external_root_path_cost, + { "CIST External Root Path Cost", "isis.lsp.mt_cap_spb_instance.cist_external_root_path_cost", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spb_instance_bridge_priority, + { "Bridge Priority", "isis.lsp.mt_cap_spb_instance.bridge_priority", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spb_instance_v, + { "V", "isis.lsp.mt_cap_spb_instance.v", FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spb_instance_number_of_trees, + { "Number of Trees", "isis.lsp.mt_cap_spb_instance.number_of_trees", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spbm_service_identifier_b_mac, + { "B-MAC", "isis.lsp.mt_cap_spbm_service_identifier.b_mac", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spbm_service_identifier_base_vid, + { "Base-VID", "isis.lsp.mt_cap_spbm_service_identifier.base_vid", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_mtid, + { "MTID", "isis.lsp.mt_cap.mtid", FT_UINT16, BASE_HEX, NULL, 0xfff, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_reserved, + { "Reserved", "isis.lsp.eis_neighbors_clv_inner.reserved", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_es_neighbor_id, + { "ES Neighbor ID", "isis.lsp.eis_neighbors.es_neighbor_id", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_is_neighbor_id, + { "IS Neighbor", "isis.lsp.eis_neighbors.is_neighbor", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_default_metric, + { "Default Metric", "isis.lsp.eis_neighbors.default_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_delay_metric, + { "Delay Metric", "isis.lsp.eis_neighbors.delay_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_expense_metric, + { "Expense Metric", "isis.lsp.eis_neighbors.expense_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_error_metric, + { "Error Metric", "isis.lsp.eis_neighbors.error_metric", FT_UINT8, BASE_DEC, NULL, 0x3F, NULL, HFILL }}, + { &hf_isis_lsp_maximum_link_bandwidth, + { "Maximum link bandwidth", "isis.lsp.maximum_link_bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_reservable_link_bandwidth, + { "Reservable link bandwidth", "isis.lsp.reservable_link_bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_is_neighbor_id, + { "IS neighbor ID", "isis.lsp.ext_is_reachability.is_neighbor_id", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_metric, + { "Metric", "isis.lsp.ext_is_reachability.metric", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_link_local_identifier, + { "Link Local Identifier", "isis.lsp.ext_is_reachability.link_local_identifier", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_link_remote_identifier, + { "Link Remote Identifier", "isis.lsp.ext_is_reachability.link_remote_identifier", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_ipv4_interface_address, + { "IPv4 interface address", "isis.lsp.ext_is_reachability.ipv4_interface_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_ipv4_neighbor_address, + { "IPv4 neighbor address", "isis.lsp.ext_is_reachability.ipv4_neighbor_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ext_is_reachability_traffic_engineering_default_metric, + { "Traffic engineering default metric", "isis.lsp.ext_is_reachability.traffic_engineering_default_metric", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_partition_designated_l2_is, + { "Partition designated L2 IS", "isis.lsp.partition_designated_l2_is", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_error_metric, + { "Error metric", "isis.lsp.error_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x08, NULL, HFILL }}, + { &hf_isis_lsp_expense_metric, + { "Expense metric", "isis.lsp.expense_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04, NULL, HFILL }}, + { &hf_isis_lsp_delay_metric, + { "Delay metric", "isis.lsp.delay_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02, NULL, HFILL }}, + { &hf_isis_lsp_default_metric, + { "Default metric", "isis.lsp.default_metric", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_default_metric_ie, + { "Default Metric IE", "isis.lsp.ip_reachability.default_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_delay_metric_support, + { "Delay Metric", "isis.lsp.ip_reachability.delay_metric_support", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_expense_metric_support, + { "Expense Metric", "isis.lsp.ip_reachability.expense_metric_support", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_error_metric_support, + { "Error Metric", "isis.lsp.ip_reachability.error_metric_support", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_spsourceid, + { "SPSourceId", "isis.lsp.mt_cap.spsourceid", FT_UINT32, BASE_HEX_DEC, NULL, 0xfffff, NULL, HFILL }}, + { &hf_isis_lsp_mt_cap_overload, + { "Overload", "isis.lsp.overload", FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_default_metric_ie, + { "Default Metric", "isis.lsp.eis_neighbors.default_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_delay_metric_supported, + { "Delay Metric", "isis.lsp.eis_neighbors_delay_metric.supported", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_expense_metric_supported, + { "Expense Metric", "isis.lsp.eis_neighbors.expense_metric_supported", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_error_metric_supported, + { "Error Metric", "isis.lsp.eis_neighbors.error_metric_supported", FT_BOOLEAN, 8, TFS(&tfs_notsupported_supported), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_unrsv_bw_priority_level, + { "priority level", "isis.lsp.unrsv_bw.priority_level", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_distribution, + { "Distribution", "isis.lsp.ip_reachability.distribution", FT_BOOLEAN, 8, TFS(&tfs_up_down), 0x80, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_delay_metric_ie, + { "Delay Metric", "isis.lsp.ip_reachability.delay_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_expense_metric_ie, + { "Expense Metric", "isis.lsp.ip_reachability.expense_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_ip_reachability_error_metric_ie, + { "Error Metric", "isis.lsp.ip_reachability.error_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_delay_metric_ie, + { "Delay Metric", "isis.lsp.eis_neighbors.delay_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_expense_metric_ie, + { "Expense Metric", "isis.lsp.eis_neighbors.expense_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + { &hf_isis_lsp_eis_neighbors_error_metric_ie, + { "Error Metric", "isis.lsp.eis_neighbors.error_metric_ie", FT_BOOLEAN, 8, TFS(&tfs_external_internal), 0x40, NULL, HFILL }}, + }; + static gint *ett[] = { + &ett_isis_lsp, + &ett_isis_lsp_info, + &ett_isis_lsp_att, + &ett_isis_lsp_cksum, + &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_subclv_spb_link_metric, + &ett_isis_lsp_clv_unknown, + &ett_isis_lsp_clv_partition_dis, + &ett_isis_lsp_clv_prefix_neighbors, + &ett_isis_lsp_clv_authentication, + &ett_isis_lsp_clv_ip_authentication, + &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_mt_cap, + &ett_isis_lsp_clv_mt_cap_spb_instance, + &ett_isis_lsp_clv_mt_cap_spbm_service_identifier, + &ett_isis_lsp_clv_te_router_id, + &ett_isis_lsp_clv_ip_reachability, + &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_clv_ipv6_reachability, /* CLV 236 */ + &ett_isis_lsp_part_of_clv_ipv6_reachability, + &ett_isis_lsp_clv_mt, + &ett_isis_lsp_clv_mt_is, + &ett_isis_lsp_part_of_clv_mt_is, + &ett_isis_lsp_clv_rt_capable_IPv4_prefx, + &ett_isis_lsp_clv_grp_address_IPv4_prefx, /*CLV 142*/ + &ett_isis_lsp_clv_mt_reachable_IPv4_prefx, + &ett_isis_lsp_clv_mt_reachable_IPv6_prefx, + &ett_isis_lsp_clv_mt_cap_spbv_mac_address + }; + + static ei_register_info ei[] = { + { &ie_isis_lsp_checksum_bad, { "isis.lsp.checksum_bad.expert", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }}, + { &ei_isis_lsp_short_packet, { "isis.lsp.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, + { &ei_isis_lsp_long_packet, { "isis.lsp.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, + { &ei_isis_lsp_subtlv, { "isis.lsp.subtlv.unknown", PI_PROTOCOL, PI_WARN, "Unknown SubTLV", EXPFILL }}, + { &ei_isis_lsp_authentication, { "isis.lsp.authentication.unknown", PI_PROTOCOL, PI_WARN, "Unknown authentication type", EXPFILL }}, + }; + + expert_module_t* expert_isis_lsp; + + /* Register the protocol name and description */ + proto_isis_lsp = proto_register_protocol(PROTO_STRING_LSP, "ISIS LSP", "isis.lsp"); + + proto_register_field_array(proto_isis_lsp, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_isis_lsp = expert_register_protocol(proto_isis_lsp); + expert_register_field_array(expert_isis_lsp, ei, array_length(ei)); } void proto_reg_handoff_isis_lsp(void) { - dissector_add_uint("isis.type", ISIS_TYPE_L1_LSP, new_create_dissector_handle(dissect_isis_l1_lsp, proto_isis_lsp)); - dissector_add_uint("isis.type", ISIS_TYPE_L2_LSP, new_create_dissector_handle(dissect_isis_l2_lsp, proto_isis_lsp)); + dissector_add_uint("isis.type", ISIS_TYPE_L1_LSP, new_create_dissector_handle(dissect_isis_l1_lsp, proto_isis_lsp)); + dissector_add_uint("isis.type", ISIS_TYPE_L2_LSP, new_create_dissector_handle(dissect_isis_l2_lsp, proto_isis_lsp)); } diff --git a/epan/dissectors/packet-isis-snp.c b/epan/dissectors/packet-isis-snp.c index 05ef84840b..5a89d5c88d 100644 --- a/epan/dissectors/packet-isis-snp.c +++ b/epan/dissectors/packet-isis-snp.c @@ -81,16 +81,16 @@ static expert_field ei_isis_psnp_long_packet = EI_INIT; static void dissect_snp_authentication_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_authentication_clv(tree, pinfo, tvb, &ei_isis_csnp_authentication, offset, length); + isis_dissect_authentication_clv(tree, pinfo, tvb, &ei_isis_csnp_authentication, offset, length); } static void dissect_snp_ip_authentication_clv(tvbuff_t *tvb, packet_info* pinfo _U_, proto_tree *tree, int offset, - int id_length _U_, int length) + int id_length _U_, int length) { - isis_dissect_ip_authentication_clv(tvb, tree, offset, length); + isis_dissect_ip_authentication_clv(tvb, tree, offset, length); } /* @@ -128,7 +128,7 @@ dissect_snp_checksum_clv(tvbuff_t *tvb, packet_info* pinfo, { case NO_CKSUM : proto_item_append_text(ti, " [unused]"); - break; + break; case DATA_MISSING : expert_add_info_format(pinfo, ti, &ei_isis_csnp_long_packet, "Packet length %d went beyond packet", tvb_length(tvb)); @@ -146,382 +146,382 @@ dissect_snp_checksum_clv(tvbuff_t *tvb, packet_info* pinfo, * Name: dissect_snp_lsp_entries_clv() * * Description: - * All the snp packets use a common payload format. We have up - * to n entries (based on length), which are made of: - * 2 : remaining life time - * id_length : lsp id - * 4 : sequence number - * 2 : checksum + * All the snp packets use a common payload format. We have up + * to n entries (based on length), which are made of: + * 2 : remaining life time + * id_length : lsp id + * 4 : sequence number + * 2 : checksum */ static void dissect_snp_lsp_entries_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, - int id_length, int length) + int id_length, int length) { - proto_tree *subtree; + proto_tree *subtree; - while ( length > 0 ) { - if ( length < 2+id_length+2+4+2 ) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_csnp_short_packet, tvb, offset, -1, - "Short SNP header entry (%d vs %d)", length, 2+id_length+2+4+2 ); - return; - } + while ( length > 0 ) { + if ( length < 2+id_length+2+4+2 ) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_csnp_short_packet, tvb, offset, -1, + "Short SNP header entry (%d vs %d)", length, 2+id_length+2+4+2 ); + return; + } - subtree = proto_tree_add_subtree(tree, tvb, offset, 2+id_length+2+4+2, + subtree = proto_tree_add_subtree(tree, tvb, offset, 2+id_length+2+4+2, ett_isis_csnp_lsp_entry, NULL, "LSP Entry"); - proto_tree_add_item(tree, hf_isis_csnp_lsp_id, tvb, offset+2, id_length+2, ENC_NA); + proto_tree_add_item(tree, hf_isis_csnp_lsp_id, tvb, offset+2, id_length+2, ENC_NA); - proto_tree_add_item(subtree, hf_isis_csnp_lsp_seq_num, tvb, offset+2+id_length+2, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_isis_csnp_lsp_remain_life, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(subtree, hf_isis_csnp_lsp_checksum, tvb, offset+2+id_length+2+4, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_isis_csnp_lsp_seq_num, tvb, offset+2+id_length+2, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_isis_csnp_lsp_remain_life, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_isis_csnp_lsp_checksum, tvb, offset+2+id_length+2+4, 2, ENC_BIG_ENDIAN); - length -= 2+id_length+2+4+2; - offset += 2+id_length+2+4+2; - } + length -= 2+id_length+2+4+2; + offset += 2+id_length+2+4+2; + } } static const isis_clv_handle_t clv_l1_csnp_opts[] = { - { - ISIS_CLV_LSP_ENTRIES, - "LSP entries", - &ett_isis_csnp_clv_lsp_entries, - dissect_snp_lsp_entries_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_csnp_clv_authentication, - dissect_snp_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_csnp_clv_ip_authentication, - dissect_snp_ip_authentication_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_csnp_clv_checksum, - dissect_snp_checksum_clv - }, - { - 0, "", NULL, NULL - } + { + ISIS_CLV_LSP_ENTRIES, + "LSP entries", + &ett_isis_csnp_clv_lsp_entries, + dissect_snp_lsp_entries_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_csnp_clv_authentication, + dissect_snp_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_csnp_clv_ip_authentication, + dissect_snp_ip_authentication_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_csnp_clv_checksum, + dissect_snp_checksum_clv + }, + { + 0, "", NULL, NULL + } }; static const isis_clv_handle_t clv_l2_csnp_opts[] = { - { - ISIS_CLV_LSP_ENTRIES, - "LSP entries", - &ett_isis_csnp_clv_lsp_entries, - dissect_snp_lsp_entries_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_csnp_clv_authentication, - dissect_snp_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_csnp_clv_ip_authentication, - dissect_snp_ip_authentication_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_csnp_clv_checksum, - dissect_snp_checksum_clv - }, - { - 0, "", NULL, NULL - } + { + ISIS_CLV_LSP_ENTRIES, + "LSP entries", + &ett_isis_csnp_clv_lsp_entries, + dissect_snp_lsp_entries_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_csnp_clv_authentication, + dissect_snp_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_csnp_clv_ip_authentication, + dissect_snp_ip_authentication_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_csnp_clv_checksum, + dissect_snp_checksum_clv + }, + { + 0, "", NULL, NULL + } }; static const isis_clv_handle_t clv_l1_psnp_opts[] = { - { - ISIS_CLV_LSP_ENTRIES, - "LSP entries", - &ett_isis_psnp_clv_lsp_entries, - dissect_snp_lsp_entries_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_psnp_clv_authentication, - dissect_snp_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_psnp_clv_ip_authentication, - dissect_snp_ip_authentication_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_psnp_clv_checksum, - dissect_snp_checksum_clv - }, - { - 0, "", NULL, NULL - } + { + ISIS_CLV_LSP_ENTRIES, + "LSP entries", + &ett_isis_psnp_clv_lsp_entries, + dissect_snp_lsp_entries_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_psnp_clv_authentication, + dissect_snp_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_psnp_clv_ip_authentication, + dissect_snp_ip_authentication_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_psnp_clv_checksum, + dissect_snp_checksum_clv + }, + { + 0, "", NULL, NULL + } }; static const isis_clv_handle_t clv_l2_psnp_opts[] = { - { - ISIS_CLV_LSP_ENTRIES, - "LSP entries", - &ett_isis_psnp_clv_lsp_entries, - dissect_snp_lsp_entries_clv - }, - { - ISIS_CLV_AUTHENTICATION, - "Authentication", - &ett_isis_psnp_clv_authentication, - dissect_snp_authentication_clv - }, - { - ISIS_CLV_IP_AUTHENTICATION, - "IP Authentication", - &ett_isis_psnp_clv_ip_authentication, - dissect_snp_ip_authentication_clv - }, - { - ISIS_CLV_CHECKSUM, - "Checksum", - &ett_isis_psnp_clv_checksum, - dissect_snp_checksum_clv - }, - { - 0, "", NULL, NULL - } + { + ISIS_CLV_LSP_ENTRIES, + "LSP entries", + &ett_isis_psnp_clv_lsp_entries, + dissect_snp_lsp_entries_clv + }, + { + ISIS_CLV_AUTHENTICATION, + "Authentication", + &ett_isis_psnp_clv_authentication, + dissect_snp_authentication_clv + }, + { + ISIS_CLV_IP_AUTHENTICATION, + "IP Authentication", + &ett_isis_psnp_clv_ip_authentication, + dissect_snp_ip_authentication_clv + }, + { + ISIS_CLV_CHECKSUM, + "Checksum", + &ett_isis_psnp_clv_checksum, + dissect_snp_checksum_clv + }, + { + 0, "", NULL, NULL + } }; static void dissect_isis_csnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, - const isis_clv_handle_t *opts, int header_length, int id_length) + const isis_clv_handle_t *opts, int header_length, int id_length) { - proto_item *ti; - proto_tree *csnp_tree = NULL; - guint16 pdu_length; - int len; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS CSNP"); - - ti = proto_tree_add_item(tree, proto_isis_csnp, tvb, offset, -1, ENC_NA); - csnp_tree = proto_item_add_subtree(ti, ett_isis_csnp); - - pdu_length = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint(csnp_tree, hf_isis_csnp_pdu_length, tvb, - offset, 2, pdu_length); - offset += 2; - - proto_tree_add_item(csnp_tree, hf_isis_csnp_source_id, tvb, offset, id_length, ENC_NA); - col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", tvb_print_system_id( tvb, offset, id_length )); - offset += id_length + 1; - - proto_tree_add_item(csnp_tree, hf_isis_csnp_start_lsp_id, tvb, offset, id_length + 2, ENC_NA); - col_append_fstr(pinfo->cinfo, COL_INFO, ", Start LSP-ID: %s", - tvb_print_system_id( tvb, offset, id_length+2 )); - offset += id_length + 2; - - proto_tree_add_item(csnp_tree, hf_isis_csnp_end_lsp_id, tvb, offset, id_length + 2, ENC_NA); - col_append_fstr(pinfo->cinfo, COL_INFO, ", End LSP-ID: %s", - tvb_print_system_id( tvb, offset, id_length+2 )); - offset += id_length + 2; - - len = pdu_length - header_length; - if (len < 0) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_csnp_short_packet, tvb, offset, -1, - "packet header length %d went beyond packet", header_length ); - return; - } - - isis_dissect_clvs(tvb, pinfo, csnp_tree, offset, - opts, &ei_isis_csnp_short_packet, len, id_length, ett_isis_csnp_clv_unknown ); + proto_item *ti; + proto_tree *csnp_tree = NULL; + guint16 pdu_length; + int len; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS CSNP"); + + ti = proto_tree_add_item(tree, proto_isis_csnp, tvb, offset, -1, ENC_NA); + csnp_tree = proto_item_add_subtree(ti, ett_isis_csnp); + + pdu_length = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint(csnp_tree, hf_isis_csnp_pdu_length, tvb, + offset, 2, pdu_length); + offset += 2; + + proto_tree_add_item(csnp_tree, hf_isis_csnp_source_id, tvb, offset, id_length, ENC_NA); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", tvb_print_system_id( tvb, offset, id_length )); + offset += id_length + 1; + + proto_tree_add_item(csnp_tree, hf_isis_csnp_start_lsp_id, tvb, offset, id_length + 2, ENC_NA); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Start LSP-ID: %s", + tvb_print_system_id( tvb, offset, id_length+2 )); + offset += id_length + 2; + + proto_tree_add_item(csnp_tree, hf_isis_csnp_end_lsp_id, tvb, offset, id_length + 2, ENC_NA); + col_append_fstr(pinfo->cinfo, COL_INFO, ", End LSP-ID: %s", + tvb_print_system_id( tvb, offset, id_length+2 )); + offset += id_length + 2; + + len = pdu_length - header_length; + if (len < 0) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_csnp_short_packet, tvb, offset, -1, + "packet header length %d went beyond packet", header_length ); + return; + } + + isis_dissect_clvs(tvb, pinfo, csnp_tree, offset, + opts, &ei_isis_csnp_short_packet, len, id_length, ett_isis_csnp_clv_unknown ); } static int dissect_isis_l1_csnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_csnp(tvb, pinfo, tree, 0, - clv_l1_csnp_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_csnp(tvb, pinfo, tree, 0, + clv_l1_csnp_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } static int dissect_isis_l2_csnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_csnp(tvb, pinfo, tree, 0, - clv_l2_csnp_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_csnp(tvb, pinfo, tree, 0, + clv_l2_csnp_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } static void dissect_isis_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, - const isis_clv_handle_t *opts, int header_length, int id_length) + const isis_clv_handle_t *opts, int header_length, int id_length) { - proto_item *ti; - proto_tree *psnp_tree; - guint16 pdu_length; - int len; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS PSNP"); - - ti = proto_tree_add_item(tree, proto_isis_psnp, tvb, offset, -1, ENC_NA); - psnp_tree = proto_item_add_subtree(ti, ett_isis_psnp); - - pdu_length = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint(psnp_tree, hf_isis_psnp_pdu_length, tvb, - offset, 2, pdu_length); - offset += 2; - - proto_tree_add_item(psnp_tree, hf_isis_psnp_source_id, tvb, offset, id_length, ENC_NA); - col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", tvb_print_system_id( tvb, offset, id_length )); - - offset += id_length + 1; - - len = pdu_length - header_length; - if (len < 0) { - proto_tree_add_expert_format(tree, pinfo, &ei_isis_psnp_long_packet, tvb, offset, -1, - "packet header length %d went beyond packet", header_length ); - return; - } - /* Call into payload dissector */ - isis_dissect_clvs(tvb, pinfo, psnp_tree, offset, - opts, &ei_isis_psnp_short_packet, len, id_length, ett_isis_psnp_clv_unknown ); + proto_item *ti; + proto_tree *psnp_tree; + guint16 pdu_length; + int len; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS PSNP"); + + ti = proto_tree_add_item(tree, proto_isis_psnp, tvb, offset, -1, ENC_NA); + psnp_tree = proto_item_add_subtree(ti, ett_isis_psnp); + + pdu_length = tvb_get_ntohs(tvb, offset); + proto_tree_add_uint(psnp_tree, hf_isis_psnp_pdu_length, tvb, + offset, 2, pdu_length); + offset += 2; + + proto_tree_add_item(psnp_tree, hf_isis_psnp_source_id, tvb, offset, id_length, ENC_NA); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", tvb_print_system_id( tvb, offset, id_length )); + + offset += id_length + 1; + + len = pdu_length - header_length; + if (len < 0) { + proto_tree_add_expert_format(tree, pinfo, &ei_isis_psnp_long_packet, tvb, offset, -1, + "packet header length %d went beyond packet", header_length ); + return; + } + /* Call into payload dissector */ + isis_dissect_clvs(tvb, pinfo, psnp_tree, offset, + opts, &ei_isis_psnp_short_packet, len, id_length, ett_isis_psnp_clv_unknown ); } static int dissect_isis_l1_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_psnp(tvb, pinfo, tree, 0, - clv_l1_psnp_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_psnp(tvb, pinfo, tree, 0, + clv_l1_psnp_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } static int dissect_isis_l2_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { - isis_data_t* isis = (isis_data_t*)data; - dissect_isis_psnp(tvb, pinfo, tree, 0, - clv_l2_psnp_opts, isis->header_length, isis->system_id_len); - return tvb_length(tvb); + isis_data_t* isis = (isis_data_t*)data; + dissect_isis_psnp(tvb, pinfo, tree, 0, + clv_l2_psnp_opts, isis->header_length, isis->system_id_len); + return tvb_length(tvb); } void proto_register_isis_csnp(void) { - static hf_register_info hf[] = { - { &hf_isis_csnp_pdu_length, - { "PDU length", "isis.csnp.pdu_length", FT_UINT16, - BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_source_id, - { "Source-ID", "isis.csnp.source_id", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_start_lsp_id, - { "Start LSP-ID", "isis.csnp.start_lsp_id", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_end_lsp_id, - { "End LSP-ID", "isis.csnp.end_lsp_id", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_lsp_id, - { "LSP-ID", "isis.csnp.lsp_id", - FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_lsp_seq_num, - { "LSP Sequence Number", "isis.csnp.lsp_seq_num", FT_UINT32, - BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_lsp_remain_life, - { "Remaining Lifetime", "isis.csnp.lsp_remain_life", FT_UINT16, - BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_lsp_checksum, - { "LSP checksum", "isis.csnp.lsp_checksum", FT_UINT16, - BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_csnp_checksum, - { "Checksum", "isis.csnp.checksum", FT_UINT16, - BASE_HEX, NULL, 0x0, NULL, HFILL }}, - }; - - static gint *ett[] = { - &ett_isis_csnp, - &ett_isis_csnp_clv_lsp_entries, - &ett_isis_csnp_lsp_entry, - &ett_isis_csnp_clv_authentication, - &ett_isis_csnp_clv_ip_authentication, - &ett_isis_csnp_clv_checksum, - &ett_isis_csnp_clv_unknown, - }; - - static ei_register_info ei[] = { - { &ei_isis_csnp_short_packet, { "isis.csnp.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, - { &ei_isis_csnp_long_packet, { "isis.csnp.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, - { &ei_isis_csnp_authentication, { "isis.csnp.authentication.unknown", PI_PROTOCOL, PI_WARN, "Unknown authentication type", EXPFILL }}, - }; - expert_module_t* expert_isis_csnp; - - /* Register the protocol name and description */ - proto_isis_csnp = proto_register_protocol(PROTO_STRING_CSNP, "ISIS CSNP", "isis.csnp"); - - proto_register_field_array(proto_isis_csnp, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_isis_csnp = expert_register_protocol(proto_isis_csnp); - expert_register_field_array(expert_isis_csnp, ei, array_length(ei)); + static hf_register_info hf[] = { + { &hf_isis_csnp_pdu_length, + { "PDU length", "isis.csnp.pdu_length", FT_UINT16, + BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_source_id, + { "Source-ID", "isis.csnp.source_id", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_start_lsp_id, + { "Start LSP-ID", "isis.csnp.start_lsp_id", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_end_lsp_id, + { "End LSP-ID", "isis.csnp.end_lsp_id", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_lsp_id, + { "LSP-ID", "isis.csnp.lsp_id", + FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_lsp_seq_num, + { "LSP Sequence Number", "isis.csnp.lsp_seq_num", FT_UINT32, + BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_lsp_remain_life, + { "Remaining Lifetime", "isis.csnp.lsp_remain_life", FT_UINT16, + BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_lsp_checksum, + { "LSP checksum", "isis.csnp.lsp_checksum", FT_UINT16, + BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_csnp_checksum, + { "Checksum", "isis.csnp.checksum", FT_UINT16, + BASE_HEX, NULL, 0x0, NULL, HFILL }}, + }; + + static gint *ett[] = { + &ett_isis_csnp, + &ett_isis_csnp_clv_lsp_entries, + &ett_isis_csnp_lsp_entry, + &ett_isis_csnp_clv_authentication, + &ett_isis_csnp_clv_ip_authentication, + &ett_isis_csnp_clv_checksum, + &ett_isis_csnp_clv_unknown, + }; + + static ei_register_info ei[] = { + { &ei_isis_csnp_short_packet, { "isis.csnp.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, + { &ei_isis_csnp_long_packet, { "isis.csnp.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, + { &ei_isis_csnp_authentication, { "isis.csnp.authentication.unknown", PI_PROTOCOL, PI_WARN, "Unknown authentication type", EXPFILL }}, + }; + expert_module_t* expert_isis_csnp; + + /* Register the protocol name and description */ + proto_isis_csnp = proto_register_protocol(PROTO_STRING_CSNP, "ISIS CSNP", "isis.csnp"); + + proto_register_field_array(proto_isis_csnp, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_isis_csnp = expert_register_protocol(proto_isis_csnp); + expert_register_field_array(expert_isis_csnp, ei, array_length(ei)); } void proto_reg_handoff_isis_csnp(void) { - dissector_add_uint("isis.type", ISIS_TYPE_L1_CSNP, new_create_dissector_handle(dissect_isis_l1_csnp, proto_isis_csnp)); - dissector_add_uint("isis.type", ISIS_TYPE_L2_CSNP, new_create_dissector_handle(dissect_isis_l2_csnp, proto_isis_csnp)); + dissector_add_uint("isis.type", ISIS_TYPE_L1_CSNP, new_create_dissector_handle(dissect_isis_l1_csnp, proto_isis_csnp)); + dissector_add_uint("isis.type", ISIS_TYPE_L2_CSNP, new_create_dissector_handle(dissect_isis_l2_csnp, proto_isis_csnp)); } void proto_register_isis_psnp(void) { - static hf_register_info hf[] = { - { &hf_isis_psnp_pdu_length, - { "PDU length", "isis.psnp.pdu_length", FT_UINT16, - BASE_DEC, NULL, 0x0, NULL, HFILL }}, - { &hf_isis_psnp_source_id, - { "Source-ID", "isis.psnp.source_id", - FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - }; - - static gint *ett[] = { - &ett_isis_psnp, - &ett_isis_psnp_clv_lsp_entries, - &ett_isis_psnp_lsp_entry, - &ett_isis_psnp_clv_authentication, - &ett_isis_psnp_clv_ip_authentication, - &ett_isis_psnp_clv_checksum, - &ett_isis_psnp_clv_unknown, - }; - static ei_register_info ei[] = { - { &ei_isis_psnp_long_packet, { "isis.psnp.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, - { &ei_isis_psnp_short_packet, { "isis.psnp.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, - }; - expert_module_t* expert_isis_psnp; - - /* Register the protocol name and description */ - proto_isis_psnp = proto_register_protocol(PROTO_STRING_PSNP, "ISIS PSNP", "isis.psnp"); - - proto_register_field_array(proto_isis_psnp, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_isis_psnp = expert_register_protocol(proto_isis_psnp); - expert_register_field_array(expert_isis_psnp, ei, array_length(ei)); + static hf_register_info hf[] = { + { &hf_isis_psnp_pdu_length, + { "PDU length", "isis.psnp.pdu_length", FT_UINT16, + BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_isis_psnp_source_id, + { "Source-ID", "isis.psnp.source_id", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + }; + + static gint *ett[] = { + &ett_isis_psnp, + &ett_isis_psnp_clv_lsp_entries, + &ett_isis_psnp_lsp_entry, + &ett_isis_psnp_clv_authentication, + &ett_isis_psnp_clv_ip_authentication, + &ett_isis_psnp_clv_checksum, + &ett_isis_psnp_clv_unknown, + }; + static ei_register_info ei[] = { + { &ei_isis_psnp_long_packet, { "isis.psnp.long_packet", PI_MALFORMED, PI_ERROR, "Long packet", EXPFILL }}, + { &ei_isis_psnp_short_packet, { "isis.psnp.short_packet", PI_MALFORMED, PI_ERROR, "Short packet", EXPFILL }}, + }; + expert_module_t* expert_isis_psnp; + + /* Register the protocol name and description */ + proto_isis_psnp = proto_register_protocol(PROTO_STRING_PSNP, "ISIS PSNP", "isis.psnp"); + + proto_register_field_array(proto_isis_psnp, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_isis_psnp = expert_register_protocol(proto_isis_psnp); + expert_register_field_array(expert_isis_psnp, ei, array_length(ei)); } void proto_reg_handoff_isis_psnp(void) { - dissector_add_uint("isis.type", ISIS_TYPE_L1_PSNP, new_create_dissector_handle(dissect_isis_l1_psnp, proto_isis_psnp)); - dissector_add_uint("isis.type", ISIS_TYPE_L2_PSNP, new_create_dissector_handle(dissect_isis_l2_psnp, proto_isis_psnp)); + dissector_add_uint("isis.type", ISIS_TYPE_L1_PSNP, new_create_dissector_handle(dissect_isis_l1_psnp, proto_isis_psnp)); + dissector_add_uint("isis.type", ISIS_TYPE_L2_PSNP, new_create_dissector_handle(dissect_isis_l2_psnp, proto_isis_psnp)); } diff --git a/epan/dissectors/packet-isis.c b/epan/dissectors/packet-isis.c index 29f43039e0..e7ae4871ff 100644 --- a/epan/dissectors/packet-isis.c +++ b/epan/dissectors/packet-isis.c @@ -73,79 +73,79 @@ static const value_string isis_vals[] = { static void dissect_isis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *ti, *version_item; - proto_tree *isis_tree = NULL; - int offset = 0; - guint8 isis_version; - guint8 isis_type; - tvbuff_t *next_tvb; - isis_data_t subdissector_data; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS"); - col_clear(pinfo->cinfo, COL_INFO); - - ti = proto_tree_add_item(tree, proto_isis, tvb, 0, -1, ENC_NA); - isis_tree = proto_item_add_subtree(ti, ett_isis); - - proto_tree_add_item(isis_tree, hf_isis_irpd, tvb, offset, 1, ENC_BIG_ENDIAN ); - offset += 1; - - subdissector_data.header_length = tvb_get_guint8(tvb, offset); - proto_tree_add_uint(isis_tree, hf_isis_header_length, tvb, - offset, 1, subdissector_data.header_length ); - offset += 1; - - isis_version = tvb_get_guint8(tvb, offset); - version_item = proto_tree_add_uint(isis_tree, hf_isis_version, tvb, - offset, 1, isis_version ); - if (isis_version != ISIS_REQUIRED_VERSION){ - col_add_fstr(pinfo->cinfo, COL_INFO, - "Unknown ISIS version (%u vs %u)", - isis_version, ISIS_REQUIRED_VERSION ); - expert_add_info(pinfo, version_item, &ei_isis_version); - return; - } - offset += 1; - - subdissector_data.system_id_len = tvb_get_guint8(tvb, offset); - proto_tree_add_uint(isis_tree, hf_isis_system_id_length, tvb, - offset, 1, subdissector_data.system_id_len ); - offset += 1; - - isis_type = tvb_get_guint8(tvb, offset) & ISIS_TYPE_MASK; - col_add_str(pinfo->cinfo, COL_INFO, - val_to_str ( isis_type, isis_vals, "Unknown (0x%x)" ) ); - - proto_tree_add_item(isis_tree, hf_isis_type, tvb, offset, 1, ENC_BIG_ENDIAN ); - proto_tree_add_item(isis_tree, hf_isis_type_reserved, tvb, offset, 1, ENC_BIG_ENDIAN ); - offset += 1; - - proto_tree_add_item(isis_tree, hf_isis_version2, tvb, offset, 1, ENC_BIG_ENDIAN ); - offset += 1; - - proto_tree_add_item(isis_tree, hf_isis_reserved, tvb, offset, 1, ENC_BIG_ENDIAN ); - offset += 1; - - proto_tree_add_item(isis_tree, hf_isis_max_area_adr, tvb, offset, 1, ENC_BIG_ENDIAN ); - offset += 1; - - /* - * Interpret the system ID length. - */ - if (subdissector_data.system_id_len == 0) - subdissector_data.system_id_len = 6; /* zero means 6-octet ID field length */ - else if (subdissector_data.system_id_len == 255) { - subdissector_data.system_id_len = 0; /* 255 means null ID field */ - /* XXX - what about the LAN ID? */ - } - /* XXX - otherwise, must be in the range 1 through 8 */ - - next_tvb = tvb_new_subset_remaining(tvb, offset); - if (!dissector_try_uint_new(isis_dissector_table, isis_type, next_tvb, - pinfo, tree, TRUE, &subdissector_data)) - { - proto_tree_add_expert(tree, pinfo, &ei_isis_type, tvb, offset, -1); - } + proto_item *ti, *version_item; + proto_tree *isis_tree = NULL; + int offset = 0; + guint8 isis_version; + guint8 isis_type; + tvbuff_t *next_tvb; + isis_data_t subdissector_data; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS"); + col_clear(pinfo->cinfo, COL_INFO); + + ti = proto_tree_add_item(tree, proto_isis, tvb, 0, -1, ENC_NA); + isis_tree = proto_item_add_subtree(ti, ett_isis); + + proto_tree_add_item(isis_tree, hf_isis_irpd, tvb, offset, 1, ENC_BIG_ENDIAN ); + offset += 1; + + subdissector_data.header_length = tvb_get_guint8(tvb, offset); + proto_tree_add_uint(isis_tree, hf_isis_header_length, tvb, + offset, 1, subdissector_data.header_length ); + offset += 1; + + isis_version = tvb_get_guint8(tvb, offset); + version_item = proto_tree_add_uint(isis_tree, hf_isis_version, tvb, + offset, 1, isis_version ); + if (isis_version != ISIS_REQUIRED_VERSION){ + col_add_fstr(pinfo->cinfo, COL_INFO, + "Unknown ISIS version (%u vs %u)", + isis_version, ISIS_REQUIRED_VERSION ); + expert_add_info(pinfo, version_item, &ei_isis_version); + return; + } + offset += 1; + + subdissector_data.system_id_len = tvb_get_guint8(tvb, offset); + proto_tree_add_uint(isis_tree, hf_isis_system_id_length, tvb, + offset, 1, subdissector_data.system_id_len ); + offset += 1; + + isis_type = tvb_get_guint8(tvb, offset) & ISIS_TYPE_MASK; + col_add_str(pinfo->cinfo, COL_INFO, + val_to_str ( isis_type, isis_vals, "Unknown (0x%x)" ) ); + + proto_tree_add_item(isis_tree, hf_isis_type, tvb, offset, 1, ENC_BIG_ENDIAN ); + proto_tree_add_item(isis_tree, hf_isis_type_reserved, tvb, offset, 1, ENC_BIG_ENDIAN ); + offset += 1; + + proto_tree_add_item(isis_tree, hf_isis_version2, tvb, offset, 1, ENC_BIG_ENDIAN ); + offset += 1; + + proto_tree_add_item(isis_tree, hf_isis_reserved, tvb, offset, 1, ENC_BIG_ENDIAN ); + offset += 1; + + proto_tree_add_item(isis_tree, hf_isis_max_area_adr, tvb, offset, 1, ENC_BIG_ENDIAN ); + offset += 1; + + /* + * Interpret the system ID length. + */ + if (subdissector_data.system_id_len == 0) + subdissector_data.system_id_len = 6; /* zero means 6-octet ID field length */ + else if (subdissector_data.system_id_len == 255) { + subdissector_data.system_id_len = 0; /* 255 means null ID field */ + /* XXX - what about the LAN ID? */ + } + /* XXX - otherwise, must be in the range 1 through 8 */ + + next_tvb = tvb_new_subset_remaining(tvb, offset); + if (!dissector_try_uint_new(isis_dissector_table, isis_type, next_tvb, + pinfo, tree, TRUE, &subdissector_data)) + { + proto_tree_add_expert(tree, pinfo, &ei_isis_type, tvb, offset, -1); + } } /* dissect_isis */ void @@ -153,7 +153,7 @@ proto_register_isis(void) { static hf_register_info hf[] = { { &hf_isis_irpd, - { "Intra Domain Routing Protocol Discriminator", "isis.irpd", + { "Intra Domain Routing Protocol Discriminator", "isis.irpd", FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, NULL, HFILL }}, { &hf_isis_header_length, @@ -196,23 +196,23 @@ proto_register_isis(void) &ett_isis, }; - static ei_register_info ei[] = { - { &ei_isis_version, { "isis.version.unknown", PI_PROTOCOL, PI_WARN, "Unknown ISIS version", EXPFILL }}, - { &ei_isis_type, { "isis.type.unknown", PI_PROTOCOL, PI_WARN, "Unknown ISIS packet type", EXPFILL }}, - }; + static ei_register_info ei[] = { + { &ei_isis_version, { "isis.version.unknown", PI_PROTOCOL, PI_WARN, "Unknown ISIS version", EXPFILL }}, + { &ei_isis_type, { "isis.type.unknown", PI_PROTOCOL, PI_WARN, "Unknown ISIS packet type", EXPFILL }}, + }; - expert_module_t* expert_isis; + expert_module_t* expert_isis; - proto_isis = proto_register_protocol(PROTO_STRING_ISIS, "ISIS", "isis"); - proto_register_field_array(proto_isis, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_isis = expert_register_protocol(proto_isis); - expert_register_field_array(expert_isis, ei, array_length(ei)); + proto_isis = proto_register_protocol(PROTO_STRING_ISIS, "ISIS", "isis"); + proto_register_field_array(proto_isis, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_isis = expert_register_protocol(proto_isis); + expert_register_field_array(expert_isis, ei, array_length(ei)); - isis_handle = register_dissector("isis", dissect_isis, proto_isis); + isis_handle = register_dissector("isis", dissect_isis, proto_isis); - isis_dissector_table = register_dissector_table("isis.type", - "ISIS Type", FT_UINT8, BASE_DEC); + isis_dissector_table = register_dissector_table("isis.type", + "ISIS Type", FT_UINT8, BASE_DEC); } void diff --git a/epan/dissectors/packet-isis.h b/epan/dissectors/packet-isis.h index 591cac090f..86a8f1eac2 100644 --- a/epan/dissectors/packet-isis.h +++ b/epan/dissectors/packet-isis.h @@ -43,15 +43,15 @@ #define ISIS_TYPE_L1_PSNP 26 #define ISIS_TYPE_L2_PSNP 27 -#define ISIS_TYPE_MASK 0x1f +#define ISIS_TYPE_MASK 0x1f #define ISIS_TYPE_RESERVED_MASK 0xe0 /* * Data given to subdissectors */ typedef struct isis_data { - guint8 header_length; - guint8 system_id_len; + guint8 header_length; + guint8 system_id_len; } isis_data_t; #endif /* _PACKET_ISIS_H */ |