aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-isis-snp.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2013-12-22 18:18:12 +0000
committerMichael Mann <mmann78@netscape.net>2013-12-22 18:18:12 +0000
commit89786cc8c764737f8681abd406dfaa4ffdb4f561 (patch)
treed050a14fcc847bb01fb03c4a0dacb3e83bcdc3b0 /epan/dissectors/packet-isis-snp.c
parent302a4cf1c053e789e6b3ad0ec0863d9843350f7c (diff)
Overhaul the ISIS dissectors
1. Make real dissectors and call dissector_try_uint_new for each "isis.type" 2. Use make_register script for dissector initialization 3. Replace isis_dissect_unknown() with real expert info 4. Use convert_proto_tree_add_text.pl to make many more filterable items and gets some files off of the checkAPIs.pl naughty list. 5. Remove (now unnecessary) dissector specific header files 6. Do some reordering of functions to eliminate the need for function declarations. Additional whitespace formatting and modelines should probably be applied to all of these dissectors. Used capture files from bug 5354 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5354) and bug 1792 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=1792) for fuzztesting. svn path=/trunk/; revision=54367
Diffstat (limited to 'epan/dissectors/packet-isis-snp.c')
-rw-r--r--epan/dissectors/packet-isis-snp.c598
1 files changed, 279 insertions, 319 deletions
diff --git a/epan/dissectors/packet-isis-snp.c b/epan/dissectors/packet-isis-snp.c
index a5e073b08b..be178bda04 100644
--- a/epan/dissectors/packet-isis-snp.c
+++ b/epan/dissectors/packet-isis-snp.c
@@ -27,14 +27,24 @@
#include <glib.h>
#include <epan/packet.h>
+#include <epan/expert.h>
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
-#include "packet-isis-lsp.h"
-#include "packet-isis-snp.h"
+
+static int proto_isis_csnp = -1;
+static int proto_isis_psnp = -1;
/* csnp packets */
static int hf_isis_csnp_pdu_length = -1;
+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;
static gint ett_isis_csnp = -1;
static gint ett_isis_csnp_clv_lsp_entries = -1;
static gint ett_isis_csnp_lsp_entry = -1;
@@ -43,8 +53,13 @@ static gint ett_isis_csnp_clv_ip_authentication = -1;
static gint ett_isis_csnp_clv_checksum = -1;
static gint ett_isis_csnp_clv_unknown = -1;
+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;
+
/* psnp packets */
static int hf_isis_psnp_pdu_length = -1;
+static int hf_isis_psnp_source_id = -1;
static gint ett_isis_psnp = -1;
static gint ett_isis_psnp_clv_lsp_entries = -1;
static gint ett_isis_psnp_lsp_entry = -1;
@@ -53,14 +68,114 @@ static gint ett_isis_psnp_clv_ip_authentication = -1;
static gint ett_isis_psnp_clv_checksum = -1;
static gint ett_isis_psnp_clv_unknown = -1;
-static void dissect_snp_authentication_clv(tvbuff_t *tvb,
- proto_tree *tree, int offset, int id_length, int length);
-static void dissect_snp_ip_authentication_clv(tvbuff_t *tvb,
- proto_tree *tree, int offset, int id_length, int length);
-static void dissect_snp_checksum_clv(tvbuff_t *tvb,
- proto_tree *tree, int offset, int id_length, int length);
-static void dissect_snp_lsp_entries_clv(tvbuff_t *tvb,
- proto_tree *tree, int offset, int id_length, int length);
+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,
+ "Packet length %d went beyond packet", tvb_length(tvb));
+ 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_item *ti;
+ proto_tree *subtree;
+ const guint8 *source_id;
+
+ 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;
+ }
+
+ ti = proto_tree_add_text(tree, tvb, offset, 2+id_length+2+4+2, "LSP Entry");
+ subtree = proto_item_add_subtree(ti,ett_isis_csnp_lsp_entry);
+
+ source_id = tvb_get_ptr(tvb, offset+2, id_length+2);
+ proto_tree_add_bytes_format_value(tree, hf_isis_csnp_lsp_id, tvb,
+ offset+2, 8, source_id, "%s", print_system_id(source_id, id_length+2));
+
+ 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;
+ }
+
+}
static const isis_clv_handle_t clv_l1_csnp_opts[] = {
{
@@ -182,356 +297,173 @@ static const isis_clv_handle_t clv_l2_psnp_opts[] = {
}
};
-/*
- * 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
- *
- * 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 payload to decode.
- *
- * Output:
- * void, but we will add to proto tree if !NULL.
- */
static void
-dissect_snp_lsp_entries_clv(tvbuff_t *tvb, proto_tree *tree, int offset,
- int id_length, int length)
-{
- proto_tree *subtree,*ti;
-
- while ( length > 0 ) {
- if ( length < 2+id_length+2+4+2 ) {
- isis_dissect_unknown(tvb, tree, offset,
- "Short SNP header entry (%d vs %d)", length,
- 2+id_length+2+4+2 );
- return;
- }
-
- ti = proto_tree_add_text(tree, tvb, offset, 2+id_length+2+4+2,
- "LSP-ID: %s, Sequence: 0x%08x, Lifetime: %5us, Checksum: 0x%04x",
- print_system_id( tvb_get_ptr(tvb, offset+2, id_length+2), id_length+2 ),
- tvb_get_ntohl(tvb, offset+2+id_length+2),
- tvb_get_ntohs(tvb, offset),
- tvb_get_ntohs(tvb, offset+2+id_length+2+4));
-
- subtree = proto_item_add_subtree(ti,ett_isis_csnp_lsp_entry);
-
- proto_tree_add_text(subtree, tvb, offset+2, 8,
- "LSP-ID: : %s",
- print_system_id( tvb_get_ptr(tvb, offset+2, id_length+2), id_length+2 ));
-
- proto_tree_add_text(subtree, tvb, offset+2+id_length+2, 4,
- "LSP Sequence Number : 0x%08x",
- tvb_get_ntohl(tvb, offset+2+id_length+2));
-
- proto_tree_add_text(subtree, tvb, offset, 2,
- "Remaining Lifetime : %us",
- tvb_get_ntohs(tvb, offset));
-
- proto_tree_add_text(subtree, tvb, offset+2+id_length+2+4, 2,
- "LSP checksum : 0x%04x",
- tvb_get_ntohs(tvb, offset+2+id_length+2+4));
-
- length -= 2+id_length+2+4+2;
- offset += 2+id_length+2+4+2;
- }
-
-}
-
-
-/*
- * Name: isis_dissect_isis_csnp()
- *
- * Description:
- * Tear apart a L1 or L2 CSNP header and then call into payload dissect
- * to pull apart the lsp id payload.
- *
- * 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 : type (l1 csnp, l2 csnp)
- * int : header length of packet.
- * int : length of IDs in packet.
- *
- * Output:
- * void, but we will add to proto tree if !NULL.
- */
-void
-isis_dissect_isis_csnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
- int type, int header_length, int id_length)
+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)
{
proto_item *ti;
proto_tree *csnp_tree = NULL;
guint16 pdu_length;
int len;
+ const guint8 *source_id;
+ gchar* system_id;
- if (tree) {
- ti = proto_tree_add_text(tree, tvb, offset, -1,
- PROTO_STRING_CSNP);
- csnp_tree = proto_item_add_subtree(ti, ett_isis_csnp);
- }
+ 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);
- if (tree) {
- proto_tree_add_uint(csnp_tree, hf_isis_csnp_pdu_length, tvb,
+ proto_tree_add_uint(csnp_tree, hf_isis_csnp_pdu_length, tvb,
offset, 2, pdu_length);
- }
offset += 2;
- if (tree) {
- proto_tree_add_text(csnp_tree, tvb, offset, id_length + 1,
- "Source-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+1), id_length+1 ) );
- }
- col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+1), id_length+1 ) );
-
+ source_id = tvb_get_ptr(tvb, offset, id_length);
+ system_id = print_system_id( source_id, id_length );
+ proto_tree_add_bytes_format_value(csnp_tree, hf_isis_csnp_source_id, tvb,
+ offset, id_length, source_id,
+ "%s", system_id);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", system_id);
offset += id_length + 1;
- proto_tree_add_text(csnp_tree, tvb, offset, id_length + 2, "Start LSP-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+2), id_length+2 ) );
-
- col_append_fstr(pinfo->cinfo, COL_INFO, ", Start LSP-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+2), id_length+2 ) );
-
+ source_id = tvb_get_ptr(tvb, offset, id_length+2);
+ system_id = print_system_id( source_id, id_length+2 );
+ proto_tree_add_bytes_format_value(csnp_tree, hf_isis_csnp_start_lsp_id, tvb,
+ offset, id_length + 2, source_id,
+ "%s", system_id);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", Start LSP-ID: %s", system_id);
offset += id_length + 2;
- proto_tree_add_text(csnp_tree, tvb, offset, id_length + 2, "End LSP-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+2), id_length+2 ) );
-
- col_append_fstr(pinfo->cinfo, COL_INFO, ", End LSP-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+2), id_length+2 ) );
-
+ source_id = tvb_get_ptr(tvb, offset, id_length+2);
+ system_id = print_system_id( source_id, id_length+2 );
+ proto_tree_add_bytes_format_value(csnp_tree, hf_isis_csnp_end_lsp_id, tvb,
+ offset, id_length + 2, source_id,
+ "%s", system_id);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", End LSP-ID: %s", system_id);
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;
}
- /* Call into payload dissector */
- if (type == ISIS_TYPE_L1_CSNP ) {
- isis_dissect_clvs(tvb, csnp_tree, offset,
- clv_l1_csnp_opts, len, id_length,
- ett_isis_csnp_clv_unknown );
- } else {
- isis_dissect_clvs(tvb, csnp_tree, offset,
- clv_l2_csnp_opts, len, id_length,
- ett_isis_csnp_clv_unknown );
- }
+
+ isis_dissect_clvs(tvb, pinfo, csnp_tree, offset,
+ opts, &ei_isis_csnp_short_packet, len, id_length, ett_isis_csnp_clv_unknown );
}
-/*
- * Name: isis_dissect_isis_psnp()
- *
- * Description:
- * Tear apart a L1 or L2 PSNP header and then call into payload dissect
- * to pull apart the lsp id payload.
- *
- * Input:
- * tvbuff_t * : tvbuffer for packet data
- * proto_tree * : protocol display tree to add to. May be NULL.
- * int : our offset into packet data
- * int : type (l1 psnp, l2 psnp)
- * int : header length of packet.
- * int : length of IDs in packet.
- *
- * Output:
- * void, but we will add to proto tree if !NULL.
- */
-void
-isis_dissect_isis_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
- int type, int header_length, int id_length)
+
+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);
+}
+
+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);
+}
+
+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)
{
proto_item *ti;
- proto_tree *psnp_tree = NULL;
+ proto_tree *psnp_tree;
guint16 pdu_length;
int len;
+ const guint8 *source_id;
+ gchar* system_id;
- if (tree) {
- ti = proto_tree_add_text(tree, tvb, offset, -1,
- PROTO_STRING_PSNP);
- psnp_tree = proto_item_add_subtree(ti, ett_isis_psnp);
- }
+ 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);
- if (tree) {
- proto_tree_add_uint(psnp_tree, hf_isis_psnp_pdu_length, tvb,
+ proto_tree_add_uint(psnp_tree, hf_isis_psnp_pdu_length, tvb,
offset, 2, pdu_length);
- }
offset += 2;
- proto_tree_add_text(psnp_tree, tvb, offset, id_length + 1, "Source-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+1), id_length + 1 ) );
-
- col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s",
- print_system_id( tvb_get_ptr(tvb, offset, id_length+1), id_length+1 ) );
+ source_id = tvb_get_ptr(tvb, offset, id_length);
+ system_id = print_system_id( source_id, id_length );
+ proto_tree_add_bytes_format_value(psnp_tree, hf_isis_psnp_source_id, tvb,
+ offset, id_length, source_id,
+ "%s", system_id);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", Source-ID: %s", system_id);
offset += id_length + 1;
len = pdu_length - header_length;
if (len < 0) {
- isis_dissect_unknown(tvb, tree, offset,
- "packet header length %d went beyond packet",
- header_length );
+ 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 */
- if (type == ISIS_TYPE_L1_PSNP ) {
- isis_dissect_clvs(tvb, psnp_tree, offset,
- clv_l1_psnp_opts, len, id_length,
- ett_isis_psnp_clv_unknown );
- } else {
- isis_dissect_clvs(tvb, psnp_tree, offset,
- clv_l2_psnp_opts, len, id_length,
- ett_isis_psnp_clv_unknown );
- }
+ isis_dissect_clvs(tvb, pinfo, psnp_tree, offset,
+ opts, &ei_isis_psnp_short_packet, len, id_length, ett_isis_psnp_clv_unknown );
}
-/*
- * Name: dissect_snp_authentication_clv()
- *
- * Description:
- * Decode for a snp 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
- *
- * Output:
- * void, will modify proto_tree if not null.
- */
-static void
-dissect_snp_authentication_clv(tvbuff_t *tvb, proto_tree *tree, int offset,
- int id_length _U_, int length)
+static int
+dissect_isis_l1_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- isis_dissect_authentication_clv(tvb, tree, offset, length);
+ 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);
}
-/*
- * Name: dissect_snp_ip_authentication_clv()
- *
- * Description:
- * Decode for a snp 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
- *
- * Output:
- * void, will modify proto_tree if not null.
- */
-static void
-dissect_snp_ip_authentication_clv(tvbuff_t *tvb, proto_tree *tree, int offset,
- int id_length _U_, int length)
+static int
+dissect_isis_l2_psnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- isis_dissect_ip_authentication_clv(tvb, tree, offset, length);
+ 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);
}
-/*
- * Name: dissect_snp_checksum_clv()
- *
- * Description:
- * dump and verify the optional checksum in TLV 12
- *
- * 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
- *
- * Output:
- * void, but we will add to proto tree if !NULL.
- */
-
-static void
-dissect_snp_checksum_clv(tvbuff_t *tvb,
- proto_tree *tree, int offset, int id_length _U_, int length) {
-
- guint16 pdu_length,checksum, cacl_checksum=0;
-
- if (tree) {
- if ( length != 2 ) {
- proto_tree_add_text ( tree, tvb, offset, length,
- "incorrect checksum length (%u), should be (2)", length );
- return;
- }
-
- 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_tree_add_text ( tree, tvb, offset, length,
- "Checksum: 0x%04x [unused]", checksum);
- break;
- case DATA_MISSING :
- isis_dissect_unknown(tvb, tree, offset,
- "[packet length %d went beyond packet]",
- tvb_length(tvb));
- break;
- case CKSUM_NOT_OK :
- proto_tree_add_text ( tree, tvb, offset, length,
- "Checksum: 0x%04x [incorrect, should be 0x%04x]",
- checksum,
- cacl_checksum);
- break;
- case CKSUM_OK :
- proto_tree_add_text ( tree, tvb, offset, length,
- "Checksum: 0x%04x [correct]", checksum);
- break;
- default :
- g_message("'check_and_get_checksum' returned an invalid value");
- }
- }
-}
-
-/*
- * Name: isis_register_csnp()
- *
- * Description:
- * Register our protocol sub-sets with protocol manager.
- *
- * Input:
- * int : protocol index for the ISIS protocol
- *
- * Output:
- * void
- */
void
-isis_register_csnp(int proto_isis) {
+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_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_isis_csnp_start_lsp_id,
+ { "Start LSP-ID", "isis.csnp.start_lsp_id",
+ FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_isis_csnp_end_lsp_id,
+ { "End LSP-ID", "isis.csnp.end_lsp_id",
+ FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_isis_csnp_lsp_id,
+ { "LSP-ID", "isis.csnp.lsp_id",
+ FT_BYTES, 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,
@@ -542,30 +474,41 @@ isis_register_csnp(int proto_isis) {
&ett_isis_csnp_clv_unknown,
};
- proto_register_field_array(proto_isis, hf, array_length(hf));
+ 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));
+}
-/*
- * Name: isis_register_psnp()
- *
- * Description:
- * Register our protocol sub-sets with protocol manager.
- *
- * Input:
- * int : protocol index for the ISIS protocol
- *
- * Output:
- * void
- */
void
-isis_register_psnp(int proto_isis) {
+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,
@@ -575,7 +518,24 @@ isis_register_psnp(int proto_isis) {
&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;
- proto_register_field_array(proto_isis, hf, array_length(hf));
+ /* 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));
}