Ethereal-dev: [Ethereal-dev] isis l1 externals support

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Hannes Gredler <hannes@xxxxxxxxxxx>
Date: Sun, 17 Jun 2001 03:15:54 +0200
ethereal developers,

pls find attached a patch to support decoding for
external_reachability TLVs at level 1 for is-is.

also cleaned up much of the tlv dissectors output
[now e.g. the ip_int_reach decoder puts out prefix-lenghts
rather than masks] therefore TLV 128,130,135 output looks now
almost the same.

/hannes  





? hannes-isis-hdlc-tcpdump.1500
? hannes-isis-hdlc-tcpdump.1500.2
? hannes-isis-lan-tcpdump.1500
? hannes-isis-auth-tcpdump.1514
? hannes-isis-ppp-tcpdump.1500
? hannes-isis-external-l1-tcpdump.1500
Index: packet-isis-lsp.c
===================================================================
RCS file: /cvsroot/ethereal/packet-isis-lsp.c,v
retrieving revision 1.15
diff -u -r1.15 packet-isis-lsp.c
--- packet-isis-lsp.c	2001/06/07 19:13:35	1.15
+++ packet-isis-lsp.c	2001/06/17 01:08:46
@@ -42,6 +42,7 @@
 #include <net/inet.h>
 #endif
 
+#include "epan/ipv4.h"
 #include "packet.h"
 #include "packet-osi.h"
 #include "packet-ipv6.h"
@@ -155,13 +156,19 @@
 		&ett_isis_lsp_clv_ext_is_reachability,
 		dissect_lsp_ext_is_reachability_clv
 	},
-	{
+        {
 		ISIS_CLV_L1_LSP_IP_INT_REACHABLE,
 		"IP Internal reachability",
 		&ett_isis_lsp_clv_ip_reachability,
 		dissect_lsp_ip_reachability_clv
 	},
 	{
+		ISIS_CLV_L1_LSP_IP_EXT_REACHABLE,
+		"IP External reachability",
+		&ett_isis_lsp_clv_ip_reachability,
+		dissect_lsp_ip_reachability_clv
+	},
+	{
 		ISIS_CLV_L1_LSP_EXT_IP_REACHABLE,
 		"Extended IP Reachability",
 		&ett_isis_lsp_clv_ext_ip_reachability,
@@ -261,6 +268,12 @@
 		dissect_lsp_ip_reachability_clv
 	},
 	{
+		ISIS_CLV_L2_LSP_IP_EXT_REACHABLE,
+		"IP External reachability",
+		&ett_isis_lsp_clv_ip_reachability,
+		dissect_lsp_ip_reachability_clv
+	},
+	{
 		ISIS_CLV_L2_LSP_NLPID,
 		"Protocols supported",
 		&ett_isis_lsp_clv_nlpid,
@@ -279,12 +292,6 @@
                 dissect_lsp_te_router_id_clv
         },
 	{
-		ISIS_CLV_L2_LSP_IP_EXT_REACHABLE,
-		"IP external reachability",
-		&ett_isis_lsp_clv_ip_reachability,
-		dissect_lsp_ip_reachability_clv
-	},
-	{
 		ISIS_CLV_L2_LSP_EXT_IP_REACHABLE,
 		"Extended IP Reachability",
 		&ett_isis_lsp_clv_ext_ip_reachability,
@@ -399,8 +406,21 @@
 		guint length, int id_length, frame_data *fd, proto_tree *tree) {
 	proto_item 	*ti;
 	proto_tree	*ntree = NULL;
-	guint32		src, mask;
+	guint32		src, mask, prefix_len;
 
+        guint32 bitmasks[33] = {
+	  0x00000000,
+	  0x00000008, 0x0000000c, 0x0000000e, 0x0000000f,
+	  0x000000f8, 0x000000fc, 0x000000fe, 0x000000ff,
+	  0x000008ff, 0x00000cff, 0x00000eff, 0x00000fff,
+	  0x0000f8ff, 0x0000fcff, 0x0000feff, 0x0000ffff,
+	  0x0008ffff, 0x000cffff, 0x000effff, 0x000fffff,
+	  0x00f8ffff, 0x00fcffff, 0x00feffff, 0x00ffffff,
+	  0x08ffffff, 0x0cffffff, 0x0effffff, 0x0fffffff,
+	  0xf8ffffff, 0xfcffffff, 0xfeffffff, 0xffffffff
+	};
+
+	  
 	while ( length > 0 ) {
 		if (length<12) {
 			isis_dissect_unknown(offset, length, tree, fd,
@@ -413,10 +433,33 @@
 		if ( tree ) {
 			memcpy(&src, &pd[offset+4], 4);
 			memcpy(&mask, &pd[offset+8], 4);
-			ti = proto_tree_add_text ( tree, NullTVB, offset, 12, 
-				"IPv4 prefix: %s : %s",
+
+			/* find out if the mask matches one of 33 possible prefix lengths */
+
+			prefix_len=0;
+
+			while(prefix_len<=33) {
+			  if (bitmasks[prefix_len++]==mask) {
+			    prefix_len--;
+			    break;
+			  }
+			}
+			
+			/* 34 indicates no match -> must be a discontiguous netmask
+			   lets dump the mask, otherwise print the prefix_len */
+
+			if(prefix_len==34) {
+			  ti = proto_tree_add_text ( tree, NullTVB, offset, 12,
+				"IPv4 prefix: %s mask %s",
+				ip_to_str((guint8*)&src),
+				ip_to_str((guint8*)&mask));
+			} else {
+			  ti = proto_tree_add_text ( tree, NullTVB, offset, 12, 
+				"IPv4 prefix: %s/%d",
 				ip_to_str((guint8*)&src),
-				ip_to_str((guint8*)&mask) );
+				prefix_len );
+			};
+
 			ntree = proto_item_add_subtree(ti, 
 				ett_isis_lsp_clv_ip_reachability);
 
@@ -496,18 +539,14 @@
 		byte_length = (bit_length + 7) / 8;
 		memcpy (prefix, &pd[offset+5], byte_length);
 		pi = proto_tree_add_text (tree, NullTVB, offset, 0,
-			"IPv4 prefix: %s /%d", 
+			"IPv4 prefix: %s/%d", 
 			ip_to_str (prefix),
 			bit_length );
 		subtree = proto_item_add_subtree (pi, 
 			ett_isis_lsp_part_of_clv_ext_ip_reachability);
 
 		proto_tree_add_text (subtree, NullTVB, offset, 4,
-			"Metric: %d", pntohl (&pd[offset]) );
-
-		proto_tree_add_text (subtree, NullTVB, offset+4, 1,
-			"Distribution: %s",
-			((ctrl_info & 0x80) == 0) ? "up" : "down" );
+			"Metric: %d, Distribution: %s", pntohl (&pd[offset]), ((ctrl_info & 0x80) == 0) ? "up" : "down" );
 
 		proto_tree_add_text (subtree, NullTVB, offset+4, 1,
 			"Sub_CLV(s): %s",
Index: packet-isis-lsp.h
===================================================================
RCS file: /cvsroot/ethereal/packet-isis-lsp.h,v
retrieving revision 1.6
diff -u -r1.6 packet-isis-lsp.h
--- packet-isis-lsp.h	2001/06/07 19:13:35	1.6
+++ packet-isis-lsp.h	2001/06/17 01:08:46
@@ -61,15 +61,16 @@
 #define ISIS_CLV_L1_LSP_AREA_ADDRESS		1
 #define ISIS_CLV_L1_LSP_IS_NEIGHBORS		2
 #define ISIS_CLV_L1_LSP_ES_NEIGHBORS		3
-#define ISIS_CLV_L1_LSP_EXT_IS_REACHABLE    22
+#define ISIS_CLV_L1_LSP_EXT_IS_REACHABLE        22
 #define ISIS_CLV_L1_LSP_IP_INT_REACHABLE	128
 #define ISIS_CLV_L1_LSP_NLPID			129
+#define ISIS_CLV_L1_LSP_IP_EXT_REACHABLE        130
 #define ISIS_CLV_L1_LSP_IP_INTERFACE_ADDR	132
 #define ISIS_CLV_L1_LSP_TE_ROUTER_ID            134 
-#define ISIS_CLV_L1_LSP_EXT_IP_REACHABLE    135
+#define ISIS_CLV_L1_LSP_EXT_IP_REACHABLE        135
 #define ISIS_CLV_L1_LSP_HOSTNAME                137
-#define ISIS_CLV_L1_LSP_IPv6_INTERFACE_ADDR 232
-#define ISIS_CLV_L1_LSP_IPv6_REACHABLE      236
+#define ISIS_CLV_L1_LSP_IPv6_INTERFACE_ADDR     232
+#define ISIS_CLV_L1_LSP_IPv6_REACHABLE          236
 /* 
  * Note, the spec say 133, but everyone seems to use 10. Any clue on why
  * this is would be appreciated!
@@ -84,17 +85,17 @@
 #define ISIS_CLV_L2_LSP_IS_NEIGHBORS		2
 #define ISIS_CLV_L2_LSP_PARTITION_DIS		4
 #define ISIS_CLV_L2_LSP_PREFIX_NEIGHBORS	5
-#define ISIS_CLV_L2_LSP_EXT_IS_REACHABLE    22
+#define ISIS_CLV_L2_LSP_EXT_IS_REACHABLE        22
 #define ISIS_CLV_L2_LSP_IP_INT_REACHABLE	128
 #define ISIS_CLV_L2_LSP_NLPID			129
 #define ISIS_CLV_L2_LSP_IP_EXT_REACHABLE	130
 #define ISIS_CLV_L2_LSP_IDRP_INFO		131
 #define ISIS_CLV_L2_LSP_IP_INTERFACE_ADDR	132
 #define ISIS_CLV_L2_LSP_TE_ROUTER_ID            134 
-#define ISIS_CLV_L2_LSP_EXT_IP_REACHABLE    135
+#define ISIS_CLV_L2_LSP_EXT_IP_REACHABLE        135
 #define ISIS_CLV_L2_LSP_HOSTNAME                137
-#define ISIS_CLV_L2_LSP_IPv6_INTERFACE_ADDR 232
-#define ISIS_CLV_L2_LSP_IPv6_REACHABLE      236
+#define ISIS_CLV_L2_LSP_IPv6_INTERFACE_ADDR     232
+#define ISIS_CLV_L2_LSP_IPv6_REACHABLE          236
 /* 
  * Note, the spec say 133, but everyone seems to use 10. Any clue on why
  * this is would be appreciated!
@@ -113,3 +114,9 @@
 	const u_char *pd, int offset, int id_length);
 
 #endif /* _PACKET_ISIS_LSP_H */
+
+
+
+
+
+