1999-12-15 04:34:44 +00:00
|
|
|
/* packet-isis-snp.c
|
|
|
|
* Routines for decoding isis complete & partial SNP and their payload
|
|
|
|
*
|
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
|
|
|
*
|
1999-12-15 04:34:44 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
1999-12-15 04:34:44 +00:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
1999-12-15 04:34:44 +00:00
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2012-06-28 22:56:06 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
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
|
|
|
|
|
|
|
#include <glib.h>
|
2002-01-21 07:37:49 +00:00
|
|
|
#include <epan/packet.h>
|
2013-12-22 18:18:12 +00:00
|
|
|
#include <epan/expert.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"
|
|
|
|
#include "packet-isis-clv.h"
|
2013-12-22 18:18:12 +00:00
|
|
|
|
2013-12-27 10:49:35 +00:00
|
|
|
void proto_register_isis_csnp(void);
|
|
|
|
void proto_reg_handoff_isis_csnp(void);
|
|
|
|
void proto_register_isis_psnp(void);
|
|
|
|
void proto_reg_handoff_isis_psnp(void);
|
|
|
|
void proto_register_isis_lsp(void);
|
|
|
|
void proto_reg_handoff_isis_lsp(void);
|
|
|
|
void proto_register_isis_hello(void);
|
|
|
|
void proto_reg_handoff_isis_hello(void);
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
static int proto_isis_csnp = -1;
|
|
|
|
static int proto_isis_psnp = -1;
|
1999-12-15 04:34:44 +00:00
|
|
|
|
|
|
|
/* csnp packets */
|
|
|
|
static int hf_isis_csnp_pdu_length = -1;
|
2013-12-22 18:18:12 +00:00
|
|
|
static int hf_isis_csnp_source_id = -1;
|
|
|
|
static int hf_isis_csnp_start_lsp_id = -1;
|
|
|
|
static int hf_isis_csnp_end_lsp_id = -1;
|
|
|
|
static int hf_isis_csnp_lsp_id = -1;
|
|
|
|
static int hf_isis_csnp_lsp_seq_num = -1;
|
|
|
|
static int hf_isis_csnp_lsp_remain_life = -1;
|
|
|
|
static int hf_isis_csnp_lsp_checksum = -1;
|
|
|
|
static int hf_isis_csnp_checksum = -1;
|
1999-12-15 04:34:44 +00:00
|
|
|
static gint ett_isis_csnp = -1;
|
2003-12-08 20:40:33 +00:00
|
|
|
static gint ett_isis_csnp_clv_lsp_entries = -1;
|
2003-03-31 07:44:09 +00:00
|
|
|
static gint ett_isis_csnp_lsp_entry = -1;
|
2003-12-08 20:40:33 +00:00
|
|
|
static gint ett_isis_csnp_clv_authentication = -1;
|
|
|
|
static gint ett_isis_csnp_clv_ip_authentication = -1;
|
|
|
|
static gint ett_isis_csnp_clv_checksum = -1;
|
1999-12-15 04:34:44 +00:00
|
|
|
static gint ett_isis_csnp_clv_unknown = -1;
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
static expert_field ei_isis_csnp_short_packet = EI_INIT;
|
|
|
|
static expert_field ei_isis_csnp_long_packet = EI_INIT;
|
|
|
|
static expert_field ei_isis_csnp_authentication = EI_INIT;
|
|
|
|
|
1999-12-15 04:34:44 +00:00
|
|
|
/* psnp packets */
|
|
|
|
static int hf_isis_psnp_pdu_length = -1;
|
2013-12-22 18:18:12 +00:00
|
|
|
static int hf_isis_psnp_source_id = -1;
|
1999-12-15 04:34:44 +00:00
|
|
|
static gint ett_isis_psnp = -1;
|
2003-12-08 20:40:33 +00:00
|
|
|
static gint ett_isis_psnp_clv_lsp_entries = -1;
|
2003-03-31 07:44:09 +00:00
|
|
|
static gint ett_isis_psnp_lsp_entry = -1;
|
2003-12-08 20:40:33 +00:00
|
|
|
static gint ett_isis_psnp_clv_authentication = -1;
|
|
|
|
static gint ett_isis_psnp_clv_ip_authentication = -1;
|
|
|
|
static gint ett_isis_psnp_clv_checksum = -1;
|
1999-12-15 04:34:44 +00:00
|
|
|
static gint ett_isis_psnp_clv_unknown = -1;
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
static expert_field ei_isis_psnp_short_packet = EI_INIT;
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
isis_dissect_ip_authentication_clv(tvb, tree, offset, length);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Name: dissect_snp_checksum_clv()
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* dump and verify the optional checksum in TLV 12
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
dissect_snp_checksum_clv(tvbuff_t *tvb, packet_info* pinfo,
|
|
|
|
proto_tree *tree, int offset, int id_length _U_, int length) {
|
|
|
|
|
|
|
|
guint16 pdu_length,checksum, cacl_checksum=0;
|
|
|
|
proto_item* ti;
|
|
|
|
|
|
|
|
if ( length != 2 ) {
|
|
|
|
proto_tree_add_expert_format(tree, pinfo, &ei_isis_csnp_short_packet, tvb, offset, -1,
|
|
|
|
"incorrect checksum length (%u), should be (2)", length );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ti = proto_tree_add_item( tree, hf_isis_csnp_checksum, tvb, offset, length, ENC_BIG_ENDIAN);
|
|
|
|
|
|
|
|
checksum = tvb_get_ntohs(tvb, offset);
|
|
|
|
|
|
|
|
/* the check_and_get_checksum() function needs to know how big
|
|
|
|
* the packet is. we can either pass through the pdu-len through several layers
|
|
|
|
* of dissectors and wrappers or extract the PDU length field from the PDU specific header
|
|
|
|
* which is offseted 8 bytes (relative to the beginning of the IS-IS packet) in SNPs */
|
|
|
|
|
|
|
|
pdu_length = tvb_get_ntohs(tvb, 8);
|
|
|
|
|
|
|
|
/* unlike the LSP checksum verification which starts at an offset of 12 we start at offset 0*/
|
|
|
|
switch (check_and_get_checksum(tvb, 0, pdu_length, checksum, offset, &cacl_checksum))
|
|
|
|
{
|
|
|
|
case NO_CKSUM :
|
|
|
|
proto_item_append_text(ti, " [unused]");
|
|
|
|
break;
|
|
|
|
case DATA_MISSING :
|
|
|
|
expert_add_info_format(pinfo, ti, &ei_isis_csnp_long_packet,
|
2014-06-19 17:18:16 +00:00
|
|
|
"Packet length %d went beyond packet", tvb_length(tvb));
|
2013-12-22 18:18:12 +00:00
|
|
|
break;
|
|
|
|
case CKSUM_NOT_OK :
|
|
|
|
proto_item_append_text(ti, " [incorrect, should be 0x%04x]", cacl_checksum);
|
|
|
|
break;
|
|
|
|
case CKSUM_OK :
|
|
|
|
proto_item_append_text(ti, " [correct]");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
dissect_snp_lsp_entries_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset,
|
|
|
|
int id_length, int length)
|
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2014-06-29 13:13:51 +00:00
|
|
|
subtree = proto_tree_add_subtree(tree, tvb, offset, 2+id_length+2+4+2,
|
|
|
|
ett_isis_csnp_lsp_entry, NULL, "LSP Entry");
|
2013-12-22 18:18:12 +00:00
|
|
|
|
2013-12-23 15:18:48 +00:00
|
|
|
proto_tree_add_item(tree, hf_isis_csnp_lsp_id, tvb, offset+2, id_length+2, ENC_NA);
|
2013-12-22 18:18:12 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
1999-12-15 04:34:44 +00:00
|
|
|
|
|
|
|
static const isis_clv_handle_t clv_l1_csnp_opts[] = {
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_LSP_ENTRIES,
|
1999-12-15 04:34:44 +00:00
|
|
|
"LSP entries",
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_csnp_clv_lsp_entries,
|
|
|
|
dissect_snp_lsp_entries_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_AUTHENTICATION,
|
|
|
|
"Authentication",
|
|
|
|
&ett_isis_csnp_clv_authentication,
|
|
|
|
dissect_snp_authentication_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
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
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2002-08-28 21:04:11 +00:00
|
|
|
0, "", NULL, NULL
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const isis_clv_handle_t clv_l2_csnp_opts[] = {
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_LSP_ENTRIES,
|
1999-12-15 04:34:44 +00:00
|
|
|
"LSP entries",
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_csnp_clv_lsp_entries,
|
|
|
|
dissect_snp_lsp_entries_clv
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ISIS_CLV_AUTHENTICATION,
|
|
|
|
"Authentication",
|
|
|
|
&ett_isis_csnp_clv_authentication,
|
|
|
|
dissect_snp_authentication_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_IP_AUTHENTICATION,
|
|
|
|
"IP Authentication",
|
|
|
|
&ett_isis_csnp_clv_ip_authentication,
|
|
|
|
dissect_snp_ip_authentication_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_CHECKSUM,
|
|
|
|
"Checksum",
|
|
|
|
&ett_isis_csnp_clv_checksum,
|
|
|
|
dissect_snp_checksum_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2002-08-28 21:04:11 +00:00
|
|
|
0, "", NULL, NULL
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const isis_clv_handle_t clv_l1_psnp_opts[] = {
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_LSP_ENTRIES,
|
1999-12-15 04:34:44 +00:00
|
|
|
"LSP entries",
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_psnp_clv_lsp_entries,
|
|
|
|
dissect_snp_lsp_entries_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_AUTHENTICATION,
|
|
|
|
"Authentication",
|
|
|
|
&ett_isis_psnp_clv_authentication,
|
|
|
|
dissect_snp_authentication_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
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
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2002-08-28 21:04:11 +00:00
|
|
|
0, "", NULL, NULL
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const isis_clv_handle_t clv_l2_psnp_opts[] = {
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_LSP_ENTRIES,
|
1999-12-15 04:34:44 +00:00
|
|
|
"LSP entries",
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_psnp_clv_lsp_entries,
|
|
|
|
dissect_snp_lsp_entries_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
ISIS_CLV_AUTHENTICATION,
|
|
|
|
"Authentication",
|
|
|
|
&ett_isis_psnp_clv_authentication,
|
|
|
|
dissect_snp_authentication_clv
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2003-12-08 20:40:33 +00:00
|
|
|
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
|
1999-12-15 04:34:44 +00:00
|
|
|
},
|
|
|
|
{
|
2002-08-28 21:04:11 +00:00
|
|
|
0, "", NULL, NULL
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
};
|
2002-09-02 22:10:17 +00:00
|
|
|
|
2002-08-28 21:04:11 +00:00
|
|
|
static void
|
2013-12-22 18:18:12 +00:00
|
|
|
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)
|
2001-07-02 00:19:34 +00:00
|
|
|
{
|
1999-12-15 04:34:44 +00:00
|
|
|
proto_item *ti;
|
|
|
|
proto_tree *csnp_tree = NULL;
|
2000-06-19 08:33:50 +00:00
|
|
|
guint16 pdu_length;
|
1999-12-15 04:34:44 +00:00
|
|
|
int len;
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
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);
|
2000-06-19 08:33:50 +00:00
|
|
|
|
2001-07-02 00:19:34 +00:00
|
|
|
pdu_length = tvb_get_ntohs(tvb, offset);
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_tree_add_uint(csnp_tree, hf_isis_csnp_pdu_length, tvb,
|
2000-06-19 08:33:50 +00:00
|
|
|
offset, 2, pdu_length);
|
|
|
|
offset += 2;
|
|
|
|
|
2013-12-23 15:18:48 +00:00
|
|
|
proto_tree_add_item(csnp_tree, hf_isis_csnp_source_id, tvb, offset, id_length, ENC_NA);
|
2014-04-14 22:43:03 +00:00
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", tvb_print_system_id( tvb, offset, id_length ));
|
2000-06-19 08:33:50 +00:00
|
|
|
offset += id_length + 1;
|
1999-12-15 04:34:44 +00:00
|
|
|
|
2013-12-23 15:18:48 +00:00
|
|
|
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",
|
2014-04-14 22:43:03 +00:00
|
|
|
tvb_print_system_id( tvb, offset, id_length+2 ));
|
2000-06-19 08:33:50 +00:00
|
|
|
offset += id_length + 2;
|
|
|
|
|
2013-12-23 15:18:48 +00:00
|
|
|
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",
|
2014-04-14 22:43:03 +00:00
|
|
|
tvb_print_system_id( tvb, offset, id_length+2 ));
|
2000-06-19 08:33:50 +00:00
|
|
|
offset += id_length + 2;
|
|
|
|
|
|
|
|
len = pdu_length - header_length;
|
1999-12-15 04:34:44 +00:00
|
|
|
if (len < 0) {
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_tree_add_expert_format(tree, pinfo, &ei_isis_csnp_short_packet, tvb, offset, -1,
|
|
|
|
"packet header length %d went beyond packet", header_length );
|
1999-12-15 04:34:44 +00:00
|
|
|
return;
|
|
|
|
}
|
2014-02-25 16:27:32 +00:00
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
isis_dissect_clvs(tvb, pinfo, csnp_tree, offset,
|
|
|
|
opts, &ei_isis_csnp_short_packet, len, id_length, ett_isis_csnp_clv_unknown );
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
|
|
|
|
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);
|
2014-06-19 17:18:16 +00:00
|
|
|
return tvb_length(tvb);
|
2013-12-22 18:18:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2014-06-19 17:18:16 +00:00
|
|
|
return tvb_length(tvb);
|
2013-12-22 18:18:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2001-07-02 00:19:34 +00:00
|
|
|
{
|
1999-12-15 04:34:44 +00:00
|
|
|
proto_item *ti;
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_tree *psnp_tree;
|
2000-06-19 08:33:50 +00:00
|
|
|
guint16 pdu_length;
|
1999-12-15 04:34:44 +00:00
|
|
|
int len;
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
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);
|
2000-06-19 08:33:50 +00:00
|
|
|
|
2001-07-02 00:19:34 +00:00
|
|
|
pdu_length = tvb_get_ntohs(tvb, offset);
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_tree_add_uint(psnp_tree, hf_isis_psnp_pdu_length, tvb,
|
2000-06-19 08:33:50 +00:00
|
|
|
offset, 2, pdu_length);
|
|
|
|
offset += 2;
|
|
|
|
|
2013-12-23 15:18:48 +00:00
|
|
|
proto_tree_add_item(psnp_tree, hf_isis_psnp_source_id, tvb, offset, id_length, ENC_NA);
|
2014-04-14 22:43:03 +00:00
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", tvb_print_system_id( tvb, offset, id_length ));
|
2013-06-14 17:49:53 +00:00
|
|
|
|
2000-06-19 08:33:50 +00:00
|
|
|
offset += id_length + 1;
|
1999-12-15 04:34:44 +00:00
|
|
|
|
2000-06-19 08:33:50 +00:00
|
|
|
len = pdu_length - header_length;
|
1999-12-15 04:34:44 +00:00
|
|
|
if (len < 0) {
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_tree_add_expert_format(tree, pinfo, &ei_isis_psnp_long_packet, tvb, offset, -1,
|
|
|
|
"packet header length %d went beyond packet", header_length );
|
1999-12-15 04:34:44 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
/* Call into payload dissector */
|
2013-12-22 18:18:12 +00:00
|
|
|
isis_dissect_clvs(tvb, pinfo, psnp_tree, offset,
|
|
|
|
opts, &ei_isis_psnp_short_packet, len, id_length, ett_isis_psnp_clv_unknown );
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
static int
|
|
|
|
dissect_isis_l1_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
|
2001-07-02 00:19:34 +00:00
|
|
|
{
|
2013-12-22 18:18:12 +00:00
|
|
|
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);
|
2014-06-19 17:18:16 +00:00
|
|
|
return tvb_length(tvb);
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
static int
|
|
|
|
dissect_isis_l2_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
|
2001-07-02 00:19:34 +00:00
|
|
|
{
|
2013-12-22 18:18:12 +00:00
|
|
|
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);
|
2014-06-19 17:18:16 +00:00
|
|
|
return tvb_length(tvb);
|
2003-12-08 20:40:33 +00:00
|
|
|
}
|
|
|
|
|
2002-08-28 21:04:11 +00:00
|
|
|
void
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_register_isis_csnp(void)
|
|
|
|
{
|
1999-12-15 04:34:44 +00:00
|
|
|
static hf_register_info hf[] = {
|
|
|
|
{ &hf_isis_csnp_pdu_length,
|
2002-08-28 21:04:11 +00:00
|
|
|
{ "PDU length", "isis.csnp.pdu_length", FT_UINT16,
|
2009-06-19 02:09:52 +00:00
|
|
|
BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2013-12-22 18:18:12 +00:00
|
|
|
{ &hf_isis_csnp_source_id,
|
|
|
|
{ "Source-ID", "isis.csnp.source_id",
|
2013-12-23 15:18:48 +00:00
|
|
|
FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2013-12-22 18:18:12 +00:00
|
|
|
{ &hf_isis_csnp_start_lsp_id,
|
|
|
|
{ "Start LSP-ID", "isis.csnp.start_lsp_id",
|
2013-12-23 15:18:48 +00:00
|
|
|
FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2013-12-22 18:18:12 +00:00
|
|
|
{ &hf_isis_csnp_end_lsp_id,
|
|
|
|
{ "End LSP-ID", "isis.csnp.end_lsp_id",
|
2013-12-23 15:18:48 +00:00
|
|
|
FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2013-12-22 18:18:12 +00:00
|
|
|
{ &hf_isis_csnp_lsp_id,
|
|
|
|
{ "LSP-ID", "isis.csnp.lsp_id",
|
2013-12-23 15:18:48 +00:00
|
|
|
FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2013-12-22 18:18:12 +00:00
|
|
|
{ &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 }},
|
1999-12-15 04:34:44 +00:00
|
|
|
};
|
2013-12-22 18:18:12 +00:00
|
|
|
|
1999-12-15 04:34:44 +00:00
|
|
|
static gint *ett[] = {
|
|
|
|
&ett_isis_csnp,
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_csnp_clv_lsp_entries,
|
2003-03-31 07:44:09 +00:00
|
|
|
&ett_isis_csnp_lsp_entry,
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_csnp_clv_authentication,
|
|
|
|
&ett_isis_csnp_clv_ip_authentication,
|
|
|
|
&ett_isis_csnp_clv_checksum,
|
1999-12-15 04:34:44 +00:00
|
|
|
&ett_isis_csnp_clv_unknown,
|
|
|
|
};
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
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));
|
1999-12-15 04:34:44 +00:00
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
2013-12-22 18:18:12 +00:00
|
|
|
expert_isis_csnp = expert_register_protocol(proto_isis_csnp);
|
|
|
|
expert_register_field_array(expert_isis_csnp, ei, array_length(ei));
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
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));
|
|
|
|
}
|
1999-12-15 04:34:44 +00:00
|
|
|
|
2002-08-28 21:04:11 +00:00
|
|
|
void
|
2013-12-22 18:18:12 +00:00
|
|
|
proto_register_isis_psnp(void)
|
|
|
|
{
|
1999-12-15 04:34:44 +00:00
|
|
|
static hf_register_info hf[] = {
|
|
|
|
{ &hf_isis_psnp_pdu_length,
|
2002-08-28 21:04:11 +00:00
|
|
|
{ "PDU length", "isis.psnp.pdu_length", FT_UINT16,
|
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 }},
|
2013-12-22 18:18:12 +00:00
|
|
|
{ &hf_isis_psnp_source_id,
|
|
|
|
{ "Source-ID", "isis.psnp.source_id",
|
|
|
|
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
1999-12-15 04:34:44 +00:00
|
|
|
};
|
2013-12-22 18:18:12 +00:00
|
|
|
|
1999-12-15 04:34:44 +00:00
|
|
|
static gint *ett[] = {
|
|
|
|
&ett_isis_psnp,
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_psnp_clv_lsp_entries,
|
2003-03-31 07:44:09 +00:00
|
|
|
&ett_isis_psnp_lsp_entry,
|
2003-12-08 20:40:33 +00:00
|
|
|
&ett_isis_psnp_clv_authentication,
|
|
|
|
&ett_isis_psnp_clv_ip_authentication,
|
|
|
|
&ett_isis_psnp_clv_checksum,
|
1999-12-15 04:34:44 +00:00
|
|
|
&ett_isis_psnp_clv_unknown,
|
|
|
|
};
|
2013-12-22 18:18:12 +00:00
|
|
|
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;
|
1999-12-15 04:34:44 +00:00
|
|
|
|
2013-12-22 18:18:12 +00:00
|
|
|
/* 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));
|
1999-12-15 04:34:44 +00:00
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
2013-12-22 18:18:12 +00:00
|
|
|
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));
|
1999-12-15 04:34:44 +00:00
|
|
|
}
|