]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Added support for SPB
authorAjith Adapa <[email protected]>
Tue, 22 May 2012 12:27:33 +0000 (17:57 +0530)
committerAjith Adapa <[email protected]>
Tue, 22 May 2012 12:27:33 +0000 (17:57 +0530)
nlpid.c
nlpid.h
print-isoclns.c

diff --git a/nlpid.c b/nlpid.c
index 64a359baca694a08ba5f175db945c1de3171ddff..9579ba3a1629f55fc63a8478625b0557ed766da5 100755 (executable)
--- a/nlpid.c
+++ b/nlpid.c
@@ -36,6 +36,7 @@ const struct tok nlpid_values[] = {
     { NLPID_ISIS, "IS-IS" },
     { NLPID_CONS, "CONS" },
     { NLPID_IDRP, "IDRP" },
+    { NLPID_SPB, "ISIS_SPB" },
     { NLPID_MFR, "FRF.15" },
     { NLPID_IP, "IPv4" },
     { NLPID_PPP, "PPP" },
diff --git a/nlpid.h b/nlpid.h
index 8931835a9940cada9bb480aa69d4da82bf60994a..1546fc6ec76dfcb5ebff3d73cef9453bb4010b02 100644 (file)
--- a/nlpid.h
+++ b/nlpid.h
 
 extern const struct tok nlpid_values[];
 
-#define        NLPID_NULLNS    0x00
+#define        NLPID_NULLNS      0x00
 #define NLPID_Q933      0x08 /* ANSI T1.617 Annex D or ITU-T Q.933 Annex A */
 #define NLPID_LMI       0x09 /* The original, aka Cisco, aka Gang of Four */
 #define NLPID_SNAP      0x80
-#define        NLPID_CLNP      0x81 /* iso9577 */
-#define        NLPID_ESIS      0x82 /* iso9577 */
-#define        NLPID_ISIS      0x83 /* iso9577 */
+#define        NLPID_CLNP          0x81 /* iso9577 */
+#define        NLPID_ESIS          0x82 /* iso9577 */
+#define        NLPID_ISIS          0x83 /* iso9577 */
 #define NLPID_CONS      0x84
 #define NLPID_IDRP      0x85
 #define NLPID_MFR       0xb1 /* FRF.15 */
+#define NLPID_SPB       0xc1 /* IEEE 802.1aq/D4.5 */
 #define NLPID_IP        0xcc
 #define NLPID_PPP       0xcf
 #define NLPID_X25_ESIS  0x8a
index 57637055377b2c6c9c60f67e1b0ff076d08fee8e..9c7c647469cbe0c090aa0adf6d9dda9f52b013d6 100644 (file)
@@ -126,6 +126,8 @@ static struct tok isis_pdu_values[] = {
 #define ISIS_TLV_EXTD_IP_REACH       135 /* draft-ietf-isis-traffic-05 */
 #define ISIS_TLV_HOSTNAME            137 /* rfc2763 */
 #define ISIS_TLV_SHARED_RISK_GROUP   138 /* draft-ietf-isis-gmpls-extensions */
+#define ISIS_TLV_MT_PORT_CAP         143 /* rfc6165 */
+#define ISIS_TLV_MT_CAPABILITY       144 /* rfc6329 */
 #define ISIS_TLV_NORTEL_PRIVATE1     176
 #define ISIS_TLV_NORTEL_PRIVATE2     177
 #define ISIS_TLV_RESTART_SIGNALING   211 /* rfc3847 */
@@ -170,6 +172,8 @@ static struct tok isis_tlv_values[] = {
     { ISIS_TLV_TE_ROUTER_ID,       "Traffic Engineering Router ID"},
     { ISIS_TLV_EXTD_IP_REACH,      "Extended IPv4 Reachability"},
     { ISIS_TLV_SHARED_RISK_GROUP,  "Shared Risk Link Group"},
+    { ISIS_TLV_MT_PORT_CAP,        "Multi-Topology-Aware Port Capability"},
+    { ISIS_TLV_MT_CAPABILITY,      "Multi-Topology Capability"},
     { ISIS_TLV_NORTEL_PRIVATE1,    "Nortel Proprietary"},
     { ISIS_TLV_NORTEL_PRIVATE2,    "Nortel Proprietary"},
     { ISIS_TLV_HOSTNAME,           "Hostname"},
@@ -350,6 +354,8 @@ static struct tok clnp_option_qos_global_values[] = {
 #define ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR    21 /* rfc4205 */
 #define ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS       22 /* rfc4124 */
 
+#define ISIS_SUBTLV_SPB_METRIC                        29 /* rfc6329 */
+
 static struct tok isis_ext_is_reach_subtlv_values[] = {
     { ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP,            "Administrative groups" },
     { ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID,   "Link Local/Remote Identifier" },
@@ -365,6 +371,7 @@ static struct tok isis_ext_is_reach_subtlv_values[] = {
     { ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR,      "Interface Switching Capability" },
     { ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS_OLD,     "Bandwidth Constraints (old)" },
     { ISIS_SUBTLV_EXT_IS_REACH_BW_CONSTRAINTS,         "Bandwidth Constraints" },
+    { ISIS_SUBTLV_SPB_METRIC,                          "SPB Metric" },
     { 250,                                             "Reserved for cisco specific extensions" },
     { 251,                                             "Reserved for cisco specific extensions" },
     { 252,                                             "Reserved for cisco specific extensions" },
@@ -417,6 +424,51 @@ static struct tok isis_subtlv_idrp_values[] = {
     { 0, NULL}
 };
 
+#define ISIS_SUBTLV_SPB_MCID          4
+#define ISIS_SUBTLV_SPB_DIGEST        5
+#define ISIS_SUBTLV_SPB_BVID          6
+
+#define ISIS_SUBTLV_SPB_INSTANCE      1
+
+#define ISIS_SPB_MCID_LEN                         51
+#define ISIS_SUBTLV_SPB_MCID_MIN_LEN              102
+#define ISIS_SUBTLV_SPB_DIGEST_MIN_LEN            33
+#define ISIS_SUBTLV_SPB_BVID_MIN_LEN              6
+#define ISIS_SUBTLV_SPB_INSTANCE_MIN_LEN          19
+#define ISIS_SUBTLV_SPB_INSTANCE_VLAN_TUPLE_LEN   8
+
+static struct tok isis_mt_port_cap_subtlv_values[] = {
+    { ISIS_SUBTLV_SPB_MCID,           "SPB MCID" },
+    { ISIS_SUBTLV_SPB_DIGEST,         "SPB Digest" },
+    { ISIS_SUBTLV_SPB_BVID,           "SPB BVID" },
+    { 0, NULL }
+};
+
+static struct tok isis_mt_capability_subtlv_values[] = {
+    { ISIS_SUBTLV_SPB_INSTANCE,      "SPB Instance" },
+    { 0, NULL }
+};
+
+struct isis_spb_mcid {
+  u_int8_t  format_id;    
+  u_int8_t  name[32];  
+  u_int8_t  revision_lvl[2];
+  u_int8_t  digest[16]; 
+};
+
+struct isis_subtlv_spb_mcid {
+  struct isis_spb_mcid mcid;
+  struct isis_spb_mcid aux_mcid;
+};
+
+struct isis_subtlv_spb_instance {
+  u_int8_t cist_root_id[8];
+  u_int8_t cist_external_root_path_cost[4];
+  u_int8_t bridge_priority[2];
+  u_int8_t spsourceid[4];
+  u_int8_t no_of_trees;  
+};
+
 #define CLNP_SEGMENT_PART  0x80
 #define CLNP_MORE_SEGMENTS 0x40
 #define CLNP_REQUEST_ER    0x20
@@ -1247,6 +1299,221 @@ trunc:
        return;
 }   
 
+
+static int
+isis_print_mcid (const struct isis_spb_mcid *mcid)
+{
+  int i;
+
+  printf( "ID: %d, Name: ", mcid->format_id);
+
+  for(i=0; i<32; i++) 
+  { 
+    printf("%c", mcid->name[i]);
+    if(mcid->name[i] == '\0')
+    break;
+  }
+
+  printf("\n\t              Lvl: %d", 
+          EXTRACT_16BITS(mcid->revision_lvl));
+
+  printf( ", Digest: ");
+
+  for(i=0;i<16;i++) 
+    printf("%.2x ",mcid->digest[i]);
+}
+
+static int
+isis_print_mt_port_cap_subtlv (const u_int8_t *tptr, int len)
+{
+  int stlv_type;
+  int stlv_len;
+  const struct isis_subtlv_spb_mcid *subtlv_spb_mcid;
+  int i;
+
+  while (len > 0)
+  {
+    stlv_type = *(tptr++);
+    stlv_len  = *(tptr++);
+
+    /* first lets see if we know the subTLVs name*/
+    printf("\n\t       %s subTLV #%u, length: %u",
+               tok2str(isis_mt_port_cap_subtlv_values, "unknown", stlv_type),
+               stlv_type,
+               stlv_len);
+
+    len = len -2;
+
+    switch (stlv_type)
+    {
+      case ISIS_SUBTLV_SPB_MCID:
+
+          if (!TTEST2(*(tptr), ISIS_SUBTLV_SPB_MCID_MIN_LEN))
+            goto trunctlv;
+
+          subtlv_spb_mcid = (struct isis_subtlv_spb_mcid *)tptr;
+
+          printf( "\n\t         MCID: ");
+          isis_print_mcid (&(subtlv_spb_mcid->mcid));
+
+          printf( "\t         AUX-MCID: ");
+          isis_print_mcid (&(subtlv_spb_mcid->aux_mcid));
+
+          tptr = tptr + sizeof(struct isis_subtlv_spb_mcid);
+          len = len - sizeof(struct isis_subtlv_spb_mcid);
+
+          break;
+
+      case ISIS_SUBTLV_SPB_DIGEST:
+
+          if (!TTEST2(*(tptr), ISIS_SUBTLV_SPB_DIGEST_MIN_LEN))
+            goto trunctlv;
+
+          printf ("\n\t         RES: %d V: %d A: %d D: %d",
+                        (*(tptr) >> 5), (((*tptr)>> 4) & 0x01),
+                        ((*(tptr) >> 2) & 0x03), ((*tptr) & 0x03));
+
+          tptr++;
+
+          printf( "\n\t         Digest: ");
+          
+          for(i=1;i<=8; i++)
+          {
+            printf("%08x ", EXTRACT_32BITS(tptr));
+            if (i%4 == 0 && i != 8)
+              printf("\n\t                 ");
+            tptr = tptr + 4;
+          }
+
+          len = len - ISIS_SUBTLV_SPB_DIGEST_MIN_LEN;
+
+          break;
+
+      case ISIS_SUBTLV_SPB_BVID:
+
+          if (!TTEST2(*(tptr), stlv_len))
+            goto trunctlv;
+
+          while (len)
+          {
+            if (!TTEST2(*(tptr), ISIS_SUBTLV_SPB_BVID_MIN_LEN))
+              goto trunctlv;
+
+            printf("\n\t           ECT: %08x", 
+                      EXTRACT_32BITS(tptr));
+
+            tptr = tptr+4;
+
+            printf(" B-Vlan: %d, U:%01x, M:%01x RES: %01x",
+                     (EXTRACT_16BITS (tptr) >> 4) ,
+                     (EXTRACT_16BITS (tptr) >> 3) & 0x01,
+                     (EXTRACT_16BITS (tptr) >> 2) & 0x01,
+                     (EXTRACT_16BITS (tptr) & 0x03));
+
+            tptr = tptr + 2;
+            len = len - ISIS_SUBTLV_SPB_BVID_MIN_LEN;
+          }
+
+          break;
+      
+      defualt:
+          break;
+    }
+  }
+
+  return 0;
+
+  trunctlv:
+    printf("\n\t\t packet exceeded snapshot");
+    return(1); 
+}
+
+
+static int
+isis_print_mt_capability_subtlv (const u_int8_t *tptr, int len)
+{
+  int stlv_type;
+  int stlv_len;
+  const struct isis_subtlv_spb_mcid *subtlv_spb_mcid;
+  int i;
+
+  while (len > 0) 
+  {   
+    stlv_type = *(tptr++);
+    stlv_len  = *(tptr++);
+
+    /* first lets see if we know the subTLVs name*/
+    printf("\n\t       %s subTLV #%u, length: %u",
+               tok2str(isis_mt_capability_subtlv_values, "unknown", stlv_type),
+               stlv_type,
+               stlv_len);
+    len = len - 2;
+
+    switch (stlv_type)
+    {    
+      case ISIS_SUBTLV_SPB_INSTANCE:
+
+          if (!TTEST2(*(tptr), ISIS_SUBTLV_SPB_INSTANCE_MIN_LEN)) 
+            goto trunctlv;
+
+          printf("\n\t         CIST Root-ID: %08x", EXTRACT_32BITS(tptr));
+          tptr = tptr+4;
+          printf(" %08x", EXTRACT_32BITS(tptr));
+          tptr = tptr+4;
+          printf(", Path Cost: %08x", EXTRACT_32BITS(tptr));
+          tptr = tptr+4;
+          printf(", Prio: %d", EXTRACT_16BITS(tptr));
+          tptr = tptr + 2; 
+          printf("\n\t         RES: %d", 
+                    EXTRACT_16BITS(tptr) >> 5);
+          printf(", V: %d", 
+                    (EXTRACT_16BITS(tptr) >> 4) & 0x0001);
+          printf(", SPSource-ID: %d", 
+                    (EXTRACT_32BITS(tptr) & 0x000fffff));
+          tptr = tptr+4;
+          printf(", No of Trees: %x", *(tptr));
+
+          len = len - ISIS_SUBTLV_SPB_INSTANCE_MIN_LEN;
+
+          while (len > 0)
+          {
+            if (!TTEST2(*(tptr), ISIS_SUBTLV_SPB_INSTANCE_VLAN_TUPLE_LEN))
+              goto trunctlv;
+
+
+            printf ("\n\t         U:%d, M:%d, A:%d, RES:%d",
+                      *(tptr) >> 7, (*(tptr) >> 6) & 0x01,
+                      (*(tptr) >> 5) & 0x01, (*(tptr) & 0x1f));
+            
+            tptr++;
+    
+            printf (", ECT: %08x", EXTRACT_32BITS(tptr));
+
+            tptr = tptr + 4;
+
+            printf (", BVID: %d, SPVID: %d",
+                      (EXTRACT_24BITS(tptr) >> 12) & 0x000fff,
+                      EXTRACT_24BITS(tptr) & 0x000fff);
+
+            tptr = tptr + 3;
+            len = len - ISIS_SUBTLV_SPB_INSTANCE_VLAN_TUPLE_LEN;             
+          }
+
+          break;
+
+      default:
+        break;
+    }
+  }
+  return 0;
+
+  trunctlv:
+    printf("\n\t\t packet exceeded snapshot");
+    return(1);
+}
+
+
 /* shared routine for printing system, node and lsp-ids */
 static char *
 isis_print_id(const u_int8_t *cp, int id_len)
@@ -1504,6 +1771,14 @@ isis_print_is_reach_subtlv (const u_int8_t *tptr,u_int subt,u_int subl,const cha
                    *(tptr+1));
             }
             break;
+        case ISIS_SUBTLV_SPB_METRIC:
+            if (subl >= 6) {
+              printf (", LM: %u", EXTRACT_24BITS(tptr));
+              tptr=tptr+3;
+              printf (", P: %u", *(tptr));
+              printf (", P-ID: %u", EXTRACT_16BITS(++tptr));
+            }
+            break;
         case ISIS_SUBTLV_EXT_IS_REACH_INTF_SW_CAP_DESCR:
             if (subl >= 36) {
               gmpls_switch_cap = *tptr;
@@ -2445,6 +2720,40 @@ static int isis_print (const u_int8_t *p, u_int length)
            }
            break;
 
+    case ISIS_TLV_MT_PORT_CAP:
+
+      if (!TTEST2(*(tptr), 2))
+        goto trunctlv;
+
+      printf("\n\t       RES: %d, MTID(s): %d",
+              (EXTRACT_16BITS (tptr) >> 12),    
+              (EXTRACT_16BITS (tptr) & 0x0fff));
+
+      tmp = tmp-2;
+      tptr = tptr+2;
+
+      if (tmp)
+        isis_print_mt_port_cap_subtlv (tptr, tmp);
+      break;
+
+    case ISIS_TLV_MT_CAPABILITY:
+
+      if (!TTEST2(*(tptr), 2))
+        goto trunctlv;
+
+      printf("\n\t       O: %d, RES: %d, MTID(s): %d",
+                (EXTRACT_16BITS(tptr) >> 15) & 0x01,
+                (EXTRACT_16BITS(tptr) >> 12) & 0x07,
+                EXTRACT_16BITS(tptr) & 0x0fff);
+
+      tmp = tmp-2;
+      tptr = tptr+2;
+
+      if (tmp)
+        isis_print_mt_capability_subtlv (tptr, tmp);
+
+      break;
+
        case ISIS_TLV_TE_ROUTER_ID:
            if (!TTEST2(*pptr, sizeof(struct in_addr)))
                goto trunctlv;