]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-mpls.c
don't pass on src & dst MAC adresses to the isoclns decoder as MAC adresses
[tcpdump] / print-mpls.c
index d7d8b7e20c33ff13217e7ece0db89953debf4ccc..7161b7b3bce00186f727b151f01b93506e2ef70f 100644 (file)
@@ -28,7 +28,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.4 2002-08-01 08:53:20 risso Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.8 2003-05-22 16:52:38 hannes Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -82,15 +82,14 @@ mpls_print(const u_char *bp, u_int length)
                TCHECK2(*p, sizeof(v));
                v = EXTRACT_32BITS(p);
                printf(" (");   /*)*/
-               printf("label 0x%x", MPLS_LABEL(v));
+               printf("label %u", MPLS_LABEL(v));
                if (vflag &&
                    MPLS_LABEL(v) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0]))
-                       printf("(%s)", mpls_labelname[MPLS_LABEL(v)]);
-               if (MPLS_EXP(v))
-                       printf(" exp 0x%x", MPLS_EXP(v));
+                       printf(" (%s)", mpls_labelname[MPLS_LABEL(v)]);
+               printf(", exp %u", MPLS_EXP(v));
                if (MPLS_STACK(v))
-                       printf("[S]");
-               printf(" TTL %u", MPLS_TTL(v));
+                       printf("[S]");
+               printf(", ttl %u", MPLS_TTL(v));
                /*(*/
                printf(")");
 
@@ -99,6 +98,7 @@ mpls_print(const u_char *bp, u_int length)
 
        switch (MPLS_LABEL(v)) {
        case 0: /* IPv4 explicit NULL label */
+        case 3:        /* IPv4 implicit NULL label */
                ip_print(p, length - (p - bp));
                break;
 #ifdef INET6
@@ -108,12 +108,89 @@ mpls_print(const u_char *bp, u_int length)
 #endif
        default:
                /*
-                * Since there's no indication of protocol in MPLS label
-                * encoding, we can print nothing further.
+                * Generally there's no indication of protocol in MPLS label
+                * encoding, however draft-hsmit-isis-aal5mux-00.txt describes
+                 * a technique that looks at the first payload byte if the BOS (bottom of stack)
+                 * bit is set and tries to determine the network layer protocol
+                 * 0x45-0x4f is IPv4
+                 * 0x60-0x6f is IPv6
+                 * 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS)
+                 * this technique is sometimes known as NULL encapsulation
+                 * and decoding is particularly useful for control-plane traffic [BGP]
+                 * which cisco by default sends MPLS encapsulated
                 */
-               return;
+
+                if (MPLS_STACK(v)) { /* only do this if the stack bit is set */
+                    switch(*p) {
+                    case 0x45:
+                    case 0x46:
+                    case 0x47:
+                    case 0x48:
+                    case 0x49:
+                    case 0x4a:
+                    case 0x4b:
+                    case 0x4c:
+                    case 0x4d:
+                    case 0x4e:
+                    case 0x4f:
+                       if (vflag>0) {
+                            printf("\n\t");
+                            ip_print(p, length - (p - bp));
+                           }
+                        else printf(", IP, length: %u",length);
+                        break;
+#ifdef INET6
+                    case 0x60:
+                    case 0x61:
+                    case 0x62:
+                    case 0x63:
+                    case 0x64:
+                    case 0x65:
+                    case 0x66:
+                    case 0x67:
+                    case 0x68:
+                    case 0x69:
+                    case 0x6a:
+                    case 0x6b:
+                    case 0x6c:
+                    case 0x6d:
+                    case 0x6e:
+                    case 0x6f:
+                       if (vflag>0) {
+                            printf("\n\t");
+                            ip6_print(p, length - (p - bp));
+                            }
+                       else printf(", IPv6, length: %u",length);
+                        break;
+#endif
+                    case 0x81:
+                    case 0x82:
+                    case 0x83:
+                       if (vflag>0) {
+                            printf("\n\t");
+                            isoclns_print(p, length - (p - bp), length - (p - bp));
+                           }
+                       else printf(", OSI, length: %u",length);
+                        break;
+                    default:
+                        /* ok bail out - we did not figure out what it is*/
+                        break;
+                    }
+                }
+                return;
        }
 
 trunc:
        printf("[|MPLS]");
 }
+
+/*
+ * draft-ietf-mpls-lsp-ping-02.txt
+ */
+void
+mpls_lsp_ping_print(const u_char *pptr, u_int length)
+{
+    printf("UDP, LSP-PING, length: %u", length);
+    if (vflag >1)
+       print_unknown_data(pptr,"\n\t  ", length);
+}