2001-07-02 00:46:21 +00:00
/* packet-isis.c
1999-12-15 04:34:44 +00:00
* Routines for ISO / OSI network and transport protocol packet disassembly , core
* bits .
*
2014-03-05 07:53:22 +00:00
* Stuart Stanley < stuarts @ mxmail . net >
1999-12-15 04:34:44 +00:00
*
2006-05-21 04:49:01 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
1999-12-15 04:34:44 +00:00
* Copyright 1998 Gerald Combs
2002-08-28 21:04:11 +00:00
*
2018-02-12 11:23:27 +00:00
* SPDX - License - Identifier : GPL - 2.0 - or - later
1999-12-15 04:34:44 +00:00
*/
2012-09-20 02:03:38 +00:00
# include "config.h"
1999-12-15 04:34:44 +00:00
2002-01-21 07:37:49 +00:00
# include <epan/packet.h>
2013-12-22 18:18:12 +00:00
# include <epan/expert.h>
2005-09-17 00:02:31 +00:00
# include <epan/nlpid.h>
2010-06-02 19:29:14 +00:00
# include <epan/etypes.h>
2000-04-15 22:11:26 +00:00
# include "packet-osi.h"
1999-12-15 04:34:44 +00:00
# include "packet-isis.h"
2013-12-15 23:44:12 +00:00
void proto_register_isis ( void ) ;
void proto_reg_handoff_isis ( void ) ;
2000-04-15 22:11:26 +00:00
2013-12-22 18:18:12 +00:00
static dissector_table_t isis_dissector_table ;
1999-12-15 04:34:44 +00:00
/* isis base header */
2000-04-15 22:11:26 +00:00
static int proto_isis = - 1 ;
1999-12-15 04:34:44 +00:00
2000-04-15 22:11:26 +00:00
static int hf_isis_irpd = - 1 ;
static int hf_isis_header_length = - 1 ;
static int hf_isis_version = - 1 ;
static int hf_isis_system_id_length = - 1 ;
static int hf_isis_type = - 1 ;
2013-12-22 18:18:12 +00:00
static int hf_isis_type_reserved = - 1 ;
2000-04-15 22:11:26 +00:00
static int hf_isis_version2 = - 1 ;
static int hf_isis_reserved = - 1 ;
static int hf_isis_max_area_adr = - 1 ;
2017-05-18 07:15:03 +00:00
int hf_isis_clv_key_id = - 1 ;
1999-12-15 04:34:44 +00:00
2000-04-15 22:11:26 +00:00
static gint ett_isis = - 1 ;
1999-12-15 04:34:44 +00:00
2020-04-02 23:46:23 +00:00
static expert_field ei_isis_length_indicator_too_small = EI_INIT ;
2013-12-22 18:18:12 +00:00
static expert_field ei_isis_version = EI_INIT ;
2017-04-02 18:41:41 +00:00
static expert_field ei_isis_version2 = EI_INIT ;
static expert_field ei_isis_reserved = EI_INIT ;
2013-12-22 18:18:12 +00:00
static expert_field ei_isis_type = EI_INIT ;
2013-08-05 19:09:44 +00:00
static dissector_handle_t isis_handle ;
1999-12-15 04:34:44 +00:00
static const value_string isis_vals [ ] = {
2014-08-06 07:07:02 +00:00
{ ISIS_TYPE_L1_HELLO , " L1 HELLO " } ,
{ ISIS_TYPE_L2_HELLO , " L2 HELLO " } ,
{ ISIS_TYPE_PTP_HELLO , " P2P HELLO " } ,
{ ISIS_TYPE_L1_LSP , " L1 LSP " } ,
{ ISIS_TYPE_L2_LSP , " L2 LSP " } ,
{ ISIS_TYPE_L1_CSNP , " L1 CSNP " } ,
{ ISIS_TYPE_L2_CSNP , " L2 CSNP " } ,
{ ISIS_TYPE_L1_PSNP , " L1 PSNP " } ,
{ ISIS_TYPE_L2_PSNP , " L2 PSNP " } ,
{ 0 , NULL }
} ;
1999-12-15 04:34:44 +00:00
2015-11-23 03:59:08 +00:00
static int
dissect_isis ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2001-07-02 00:19:34 +00:00
{
2017-04-02 18:41:41 +00:00
proto_item * ti , * version_item , * version2_item , * reserved_item ;
2014-08-01 18:59:19 +00:00
proto_tree * isis_tree = NULL ;
int offset = 0 ;
2017-04-02 18:41:41 +00:00
guint8 isis_version , isis_version2 , isis_reserved ;
2014-08-01 18:59:19 +00:00
guint8 isis_type ;
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 ) ;
2020-04-02 23:46:23 +00:00
subdissector_data . header_length_item =
proto_tree_add_uint ( isis_tree , hf_isis_header_length , tvb ,
2014-08-01 18:59:19 +00:00
offset , 1 , subdissector_data . header_length ) ;
offset + = 1 ;
2020-04-02 23:46:23 +00:00
if ( subdissector_data . header_length < 8 ) {
/* Not large enough to include the part of the header that
we dissect here . */
expert_add_info ( pinfo , subdissector_data . header_length_item , & ei_isis_length_indicator_too_small ) ;
return tvb_captured_length ( tvb ) ;
}
subdissector_data . ei_bad_header_length = & ei_isis_length_indicator_too_small ;
2014-08-01 18:59:19 +00:00
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 ) {
expert_add_info ( pinfo , version_item , & ei_isis_version ) ;
}
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 ;
2017-04-02 18:41:41 +00:00
proto_tree_add_item ( isis_tree , hf_isis_type_reserved , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2014-08-01 18:59:19 +00:00
isis_type = tvb_get_guint8 ( tvb , offset ) & ISIS_TYPE_MASK ;
col_add_str ( pinfo - > cinfo , COL_INFO ,
2017-04-02 18:41:41 +00:00
val_to_str ( isis_type , isis_vals , " Unknown (0x%x) " ) ) ;
2014-08-01 18:59:19 +00:00
proto_tree_add_item ( isis_tree , hf_isis_type , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
2017-04-02 18:41:41 +00:00
isis_version2 = tvb_get_guint8 ( tvb , offset ) ;
version2_item = proto_tree_add_item ( isis_tree , hf_isis_version2 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
if ( isis_version2 ! = 1 ) {
expert_add_info ( pinfo , version2_item , & ei_isis_version2 ) ;
}
2014-08-01 18:59:19 +00:00
offset + = 1 ;
2017-04-02 18:41:41 +00:00
isis_reserved = tvb_get_guint8 ( tvb , offset ) ;
reserved_item = proto_tree_add_item ( isis_tree , hf_isis_reserved , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
if ( isis_reserved ! = 0 ) {
expert_add_info ( pinfo , reserved_item , & ei_isis_reserved ) ;
}
2014-08-01 18:59:19 +00:00
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 */
2020-04-02 23:46:23 +00:00
/*
* We must pass the entire ISIS PDU to the dissector , as some
* dissectors are for ISIS PDU types that might contain a
* checksum TLV , and that checksum is over the entire PDU .
*/
if ( ! dissector_try_uint_new ( isis_dissector_table , isis_type , tvb ,
2014-08-01 18:59:19 +00:00
pinfo , tree , TRUE , & subdissector_data ) )
{
proto_tree_add_expert ( tree , pinfo , & ei_isis_type , tvb , offset , - 1 ) ;
}
2015-11-23 03:59:08 +00:00
return tvb_captured_length ( tvb ) ;
1999-12-15 04:34:44 +00:00
} /* dissect_isis */
2002-08-28 21:04:11 +00:00
void
2013-12-15 23:44:12 +00:00
proto_register_isis ( void )
{
2000-04-15 22:11:26 +00:00
static hf_register_info hf [ ] = {
{ & hf_isis_irpd ,
2020-08-31 11:39:37 +00:00
{ " Intradomain Routing Protocol Discriminator " , " isis.irpd " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
FT_UINT8 , BASE_HEX , VALS ( nlpid_vals ) , 0x0 , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
{ & hf_isis_header_length ,
2017-04-02 18:41:41 +00:00
{ " Length Indicator " , " isis.len " , FT_UINT8 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
{ & hf_isis_version ,
2017-04-02 18:41:41 +00:00
{ " Version/Protocol ID Extension " , " isis.version " , FT_UINT8 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
{ & hf_isis_system_id_length ,
2017-04-02 18:41:41 +00:00
{ " ID Length " , " isis.sysid_len " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
FT_UINT8 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
2002-08-28 21:04:11 +00:00
{ & hf_isis_type ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
{ " PDU Type " , " isis.type " , FT_UINT8 , BASE_DEC ,
2013-12-22 18:18:12 +00:00
VALS ( isis_vals ) , ISIS_TYPE_MASK , NULL , HFILL } } ,
{ & hf_isis_type_reserved ,
2017-04-02 18:41:41 +00:00
{ " Reserved " , " isis.type.reserved " , FT_UINT8 , BASE_HEX ,
2013-12-22 18:18:12 +00:00
NULL , ISIS_TYPE_RESERVED_MASK , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
2002-08-28 21:04:11 +00:00
{ & hf_isis_version2 ,
2017-04-02 18:41:41 +00:00
{ " Version " , " isis.version2 " , FT_UINT8 , BASE_DEC , NULL ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
0x0 , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
{ & hf_isis_reserved ,
2017-04-02 18:41:41 +00:00
{ " Reserved " , " isis.reserved " , FT_UINT8 , BASE_DEC , NULL ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
0x0 , NULL , HFILL } } ,
2000-04-15 22:11:26 +00:00
{ & hf_isis_max_area_adr ,
2017-04-02 18:41:41 +00:00
{ " Maximum Area Addresses " , " isis.max_area_adr " , FT_UINT8 , BASE_DEC , NULL ,
0x0 , " Maximum Area Addresses, 0 means 3 " , HFILL } } ,
2000-04-15 22:11:26 +00:00
2017-05-18 07:15:03 +00:00
{ & hf_isis_clv_key_id ,
{ " Key ID " , " isis.clv.key_id " , FT_UINT16 , BASE_DEC , NULL ,
0x0 , NULL , HFILL } } ,
2017-04-02 18:41:41 +00:00
} ;
2000-04-15 22:11:26 +00:00
/*
* Note , we pull in the unknown CLV handler here , since it
* is used by all ISIS packet types .
2001-07-02 01:46:22 +00:00
*/
2000-04-15 22:11:26 +00:00
static gint * ett [ ] = {
& ett_isis ,
} ;
2014-08-01 18:59:19 +00:00
static ei_register_info ei [ ] = {
2020-04-02 23:46:23 +00:00
{ & ei_isis_length_indicator_too_small , { " isis.length_indicator_too_small " , PI_MALFORMED , PI_ERROR , " ISIS length indicator value smaller than the fixed length header size " , EXPFILL } } ,
2014-08-01 18:59:19 +00:00
{ & ei_isis_version , { " isis.version.unknown " , PI_PROTOCOL , PI_WARN , " Unknown ISIS version " , EXPFILL } } ,
2017-04-02 18:41:41 +00:00
{ & ei_isis_version2 , { " isis.version2.notone " , PI_PROTOCOL , PI_WARN , " Version must be 1 " , EXPFILL } } ,
{ & ei_isis_reserved , { " isis.reserved.notzero " , PI_PROTOCOL , PI_WARN , " Reserved must be 0 " , EXPFILL } } ,
2014-08-01 18:59:19 +00:00
{ & ei_isis_type , { " isis.type.unknown " , PI_PROTOCOL , PI_WARN , " Unknown ISIS packet type " , EXPFILL } } ,
} ;
2001-12-20 07:33:21 +00:00
2014-08-01 18:59:19 +00:00
expert_module_t * expert_isis ;
2012-02-02 21:10:13 +00:00
2014-08-01 18:59:19 +00:00
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 ) ) ;
2013-12-22 18:18:12 +00:00
2015-12-09 04:04:01 +00:00
isis_handle = register_dissector ( " isis " , dissect_isis , proto_isis ) ;
2013-12-22 18:18:12 +00:00
2014-08-01 18:59:19 +00:00
isis_dissector_table = register_dissector_table ( " isis.type " ,
2016-08-30 22:51:54 +00:00
" ISIS Type " , proto_isis , FT_UINT8 , BASE_DEC ) ;
1999-12-15 04:34:44 +00:00
}
2000-04-17 01:36:31 +00:00
void
proto_reg_handoff_isis ( void )
{
2013-09-12 20:34:19 +00:00
dissector_add_uint ( " osinl.incl " , NLPID_ISO10589_ISIS , isis_handle ) ;
2010-12-20 05:35:29 +00:00
dissector_add_uint ( " ethertype " , ETHERTYPE_L2ISIS , isis_handle ) ;
2000-04-17 01:36:31 +00:00
}
2014-08-06 07:07:02 +00:00
/*
2019-07-26 18:43:17 +00:00
* Editor modelines - https : //www.wireshark.org/tools/modelines.html
2014-08-06 07:07:02 +00:00
*
* Local variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
* vi : set shiftwidth = 4 tabstop = 8 expandtab :
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/