]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-isoclns.c
travis: try removing the matrix: clause and putting back the Coverity stuff.
[tcpdump] / print-isoclns.c
index e0afcfb6108c5c57bd216bc359a1a95f41eec628..f2235d289e205d261431151abd3b8af1150da3cb 100644 (file)
@@ -106,7 +106,7 @@ static const struct tok isis_pdu_values[] = {
 #define ISIS_TLV_PART_DIS            4   /* iso10589 */
 #define ISIS_TLV_PREFIX_NEIGH        5   /* iso10589 */
 #define ISIS_TLV_ISNEIGH             6   /* iso10589 */
-#define ISIS_TLV_ISNEIGH_VARLEN      7   /* iso10589 */
+#define ISIS_TLV_INSTANCE_ID         7   /* rfc8202 */
 #define ISIS_TLV_PADDING             8   /* iso10589 */
 #define ISIS_TLV_LSP                 9   /* iso10589 */
 #define ISIS_TLV_AUTH                10  /* iso10589, rfc3567 */
@@ -154,7 +154,7 @@ static const struct tok isis_tlv_values[] = {
     { ISIS_TLV_PART_DIS,           "Partition DIS"},
     { ISIS_TLV_PREFIX_NEIGH,       "Prefix Neighbors"},
     { ISIS_TLV_ISNEIGH,            "IS Neighbor(s)"},
-    { ISIS_TLV_ISNEIGH_VARLEN,     "IS Neighbor(s) (variable length)"},
+    { ISIS_TLV_INSTANCE_ID,        "Instance Identifier"},
     { ISIS_TLV_PADDING,            "Padding"},
     { ISIS_TLV_LSP,                "LSP entries"},
     { ISIS_TLV_AUTH,               "Authentication"},
@@ -348,6 +348,19 @@ static const struct tok isis_tlv_router_capability_flags[] = {
     { 0, NULL }
 };
 
+#define ISIS_SUBTLV_ROUTER_CAP_SR 2 /* rfc 8667 */
+
+static const struct tok isis_router_capability_subtlv_values[] = {
+    { ISIS_SUBTLV_ROUTER_CAP_SR, "SR-Capabilities"},
+    { 0, NULL }
+};
+
+static const struct tok isis_router_capability_sr_flags[] = {
+    { 0x80, "ipv4"},
+    { 0x40, "ipv6"},
+    { 0, NULL }
+};
+
 #define ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP           3 /* rfc5305 */
 #define ISIS_SUBTLV_EXT_IS_REACH_LINK_LOCAL_REMOTE_ID  4 /* rfc4205 */
 #define ISIS_SUBTLV_EXT_IS_REACH_LINK_REMOTE_ID        5 /* rfc5305 */
@@ -392,15 +405,42 @@ static const struct tok isis_ext_is_reach_subtlv_values[] = {
 
 #define ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32          1 /* draft-ietf-isis-admin-tags-01 */
 #define ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64          2 /* draft-ietf-isis-admin-tags-01 */
+#define ISIS_SUBTLV_EXTD_IP_REACH_PREFIX_SID           3 /* rfc8667 */
 #define ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR  117 /* draft-ietf-isis-wg-multi-topology-05 */
 
 static const struct tok isis_ext_ip_reach_subtlv_values[] = {
     { ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG32,           "32-Bit Administrative tag" },
     { ISIS_SUBTLV_EXTD_IP_REACH_ADMIN_TAG64,           "64-Bit Administrative tag" },
+    { ISIS_SUBTLV_EXTD_IP_REACH_PREFIX_SID,            "Prefix SID" },
     { ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR,     "Management Prefix Color" },
     { 0, NULL }
 };
 
+#define ISIS_PREFIX_SID_FLAG_R 0x80 /* rfc 8667 */
+#define ISIS_PREFIX_SID_FLAG_N 0x40 /* rfc 8667 */
+#define ISIS_PREFIX_SID_FLAG_P 0x20 /* rfc 8667 */
+#define ISIS_PREFIX_SID_FLAG_E 0x10 /* rfc 8667 */
+#define ISIS_PREFIX_SID_FLAG_V 0x08 /* rfc 8667 */
+#define ISIS_PREFIX_SID_FLAG_L 0x04 /* rfc 8667 */
+
+static const struct tok prefix_sid_flag_values[] = {
+    { ISIS_PREFIX_SID_FLAG_R, "Readvertisement"},
+    { ISIS_PREFIX_SID_FLAG_N, "Node"},
+    { ISIS_PREFIX_SID_FLAG_P, "No-PHP"},
+    { ISIS_PREFIX_SID_FLAG_E, "Explicit NULL"},
+    { ISIS_PREFIX_SID_FLAG_V, "Value"},
+    { ISIS_PREFIX_SID_FLAG_L, "Local"},
+    { 0, NULL}
+};
+
+
+/* rfc 8667 */
+static const struct tok prefix_sid_algo_values[] = {
+    { 0, "SPF"},
+    { 1, "strict-SPF"},
+    { 0, NULL}
+};
+
 static const struct tok isis_subtlv_link_attribute_values[] = {
     { 0x01, "Local Protection Available" },
     { 0x02, "Link excluded from local protection path" },
@@ -1860,6 +1900,31 @@ isis_print_ip_reach_subtlv(netdissect_options *ndo,
            subl-=8;
        }
        break;
+    case ISIS_SUBTLV_EXTD_IP_REACH_PREFIX_SID:
+       {
+           uint8_t algo, flags;
+           uint32_t sid;
+
+           flags = GET_U_1(tptr);
+           algo = GET_U_1(tptr+1);
+
+           if (flags & ISIS_PREFIX_SID_FLAG_V) {
+               sid = GET_BE_U_3(tptr+2);
+               tptr+=5;
+               subl-=5;
+           } else {
+               sid = GET_BE_U_4(tptr+2);
+               tptr+=6;
+               subl-=6;
+           }
+
+           ND_PRINT(", Flags [%s], Algo %s (%u), %s %u",
+                    bittok2str(prefix_sid_flag_values, "None", flags),
+                    tok2str(prefix_sid_algo_values, "Unknown", algo), algo,
+                    flags & ISIS_PREFIX_SID_FLAG_V ? "label" : "index",
+                    sid);
+       }
+       break;
     default:
        if (!print_unknown_data(ndo, tptr, "\n\t\t    ", subl))
          return(0);
@@ -2266,6 +2331,90 @@ trunc:
     return 0;
 }
 
+static void
+isis_print_router_cap_subtlv(netdissect_options *ndo, const uint8_t *tptr, uint8_t tlen)
+{
+    uint8_t subt, subl;
+
+    while (tlen >= 2) {
+       ND_TCHECK_LEN(tptr, 2);
+       subt = GET_U_1(tptr);
+       subl = GET_U_1(tptr+1);
+       tlen -= 2;
+       tptr += 2;
+
+       /* first lets see if we know the subTLVs name*/
+       ND_PRINT("\n\t\t%s subTLV #%u, length: %u",
+              tok2str(isis_router_capability_subtlv_values, "unknown", subt),
+              subt, subl);
+
+       /*
+        * Boundary check.
+        */
+       if (subl > tlen) {
+           break;
+       }
+       ND_TCHECK_LEN(tptr, subl);
+
+       switch (subt) {
+       case ISIS_SUBTLV_ROUTER_CAP_SR:
+           {
+               uint8_t flags, sid_tlen, sid_type, sid_len;
+               uint32_t range;
+               const uint8_t *sid_ptr;
+
+               flags = GET_U_1(tptr);
+               range = GET_BE_U_3(tptr+1);
+               ND_PRINT(", Flags [%s], Range %u",
+                        bittok2str(isis_router_capability_sr_flags, "None", flags),
+                        range);
+               sid_ptr = tptr + 4;
+               sid_tlen = subl - 4;
+
+               while (sid_tlen >= 5) {
+                   sid_type = GET_U_1(sid_ptr);
+                   sid_len = GET_U_1(sid_ptr+1);
+                   sid_tlen -= 2;
+                   sid_ptr += 2;
+
+                   /*
+                    * Boundary check.
+                    */
+                   if (sid_len > sid_tlen) {
+                       break;
+                   }
+
+                   switch (sid_type) {
+                   case 1:
+                       if (sid_len == 3) {
+                           ND_PRINT(", SID value %u", GET_BE_U_3(sid_ptr));
+                       } else if (sid_len == 4) {
+                           ND_PRINT(", SID value %u", GET_BE_U_4(sid_ptr));
+                       } else {
+                           ND_PRINT(", Unknown SID length%u", sid_len);
+                       }
+                       break;
+                   default:
+                       print_unknown_data(ndo, sid_ptr, "\n\t\t  ", sid_len);
+                   }
+
+                   sid_ptr += sid_len;
+                   sid_tlen -= sid_len;
+               }
+           }
+           break;
+       default:
+           print_unknown_data(ndo, tptr, "\n\t\t", subl);
+           break;
+       }
+
+       tlen -= subl;
+       tptr += subl;
+    }
+ trunc:
+    return;
+}
+
 /*
  * Clear checksum and lifetime prior to signature verification.
  */
@@ -2311,14 +2460,14 @@ isis_print(netdissect_options *ndo,
     const struct isis_tlv_es_reach *tlv_es_reach;
 
     uint8_t version, pdu_version, fixed_len;
-    uint8_t pdu_type, pdu_max_area, max_area, pdu_id_length, id_length, tlv_type, tlv_len, tlen, alen, lan_alen, prefix_len;
+    uint8_t pdu_type, pdu_max_area, max_area, pdu_id_length, id_length, tlv_type, tlv_len, tlen, alen, prefix_len;
     u_int ext_is_len, ext_ip_len;
     uint8_t mt_len;
     uint8_t isis_subtlv_idrp;
     const uint8_t *optr, *pptr, *tptr;
     u_int packet_len;
     u_short pdu_len, key_id;
-    u_int i,vendor_id;
+    u_int i,vendor_id, num_vals;
     uint8_t auth_type;
     uint8_t num_system_ids;
     int sigcheck;
@@ -2727,26 +2876,22 @@ isis_print(netdissect_options *ndo,
            }
            break;
 
-        case ISIS_TLV_ISNEIGH_VARLEN:
-            if (tlen < 1)
-               goto tlv_trunc;
-            ND_TCHECK_1(tptr);
-           lan_alen = GET_U_1(tptr); /* LAN address length */
-           tptr++;
-           tlen--;
-           if (lan_alen == 0) {
-                ND_PRINT("\n\t      LAN address length 0 bytes");
-                nd_print_invalid(ndo);
-                break;
-            }
-            ND_PRINT("\n\t      LAN address length %u bytes ", lan_alen);
-           while (tlen != 0) {
-                if (tlen < lan_alen)
-                    goto tlv_trunc;
-                ND_TCHECK_LEN(tptr, lan_alen);
-                ND_PRINT("\n\t\tIS Neighbor: %s", isis_print_id(ndo, tptr, lan_alen));
-                tlen -= lan_alen;
-                tptr +=lan_alen;
+        case ISIS_TLV_INSTANCE_ID:
+            if (tlen < 4)
+                goto tlv_trunc;
+            num_vals = (tlen-2)/2;
+            ND_PRINT("\n\t      Instance ID: %u, ITIDs(%u)%s ",
+                     GET_BE_U_2(tptr), num_vals,
+                     num_vals ? ":" : "");
+            tptr += 2;
+            tlen -= 2;
+            for (i=0; i < num_vals; i++) {
+                ND_PRINT("%u", GET_BE_U_2(tptr));
+                if (i < (num_vals - 1)) {
+                   ND_PRINT(", ");
+                }
+                tptr += 2;
+                tlen -= 2;
             }
             break;
 
@@ -3329,12 +3474,14 @@ isis_print(netdissect_options *ndo,
                 break;
             }
             ND_TCHECK_5(tptr); /* router-id + flags */
-            ND_PRINT("\n\t\tRouter-id: %s", GET_IPADDR_STRING(tptr));
-            ND_PRINT("\n\t\tFlags: [%s]",
-                      bittok2str(isis_tlv_router_capability_flags,
-                        "none",
-                        GET_U_1(tptr+4)));
-            /* FIXME Optional set of sub-TLV */
+            ND_PRINT("\n\t      Router-ID %s", GET_IPADDR_STRING(tptr));
+            ND_PRINT(", Flags [%s]",
+                    bittok2str(isis_tlv_router_capability_flags, "none", GET_U_1(tptr+4)));
+
+           /* Optional set of sub-TLV */
+           if (tlen > 5) {
+               isis_print_router_cap_subtlv(ndo, tptr+5, tlen-5);
+           }
             break;
 
         case ISIS_TLV_VENDOR_PRIVATE: