]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-juniper.c
Backout CHANGES update - wrong branch
[tcpdump] / print-juniper.c
index aa63d5cf865e1796298d3da429019a1a448fa714..fde0b9350433603cf6aa3ce2b2b8d53fe43a98f7 100644 (file)
@@ -15,7 +15,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-juniper.c,v 1.8.2.19 2005-08-23 10:29:42 hannes Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-juniper.c,v 1.8.2.22 2006-05-10 22:42:46 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -670,7 +670,6 @@ u_int
 juniper_atm2_print(const struct pcap_pkthdr *h, register const u_char *p)
 {
         u_int16_t extracted_ethertype;
-        u_int32_t control_word;
 
         struct juniper_l2info_t l2info;
 
@@ -681,12 +680,6 @@ juniper_atm2_print(const struct pcap_pkthdr *h, register const u_char *p)
         p+=l2info.header_len;
 
         if (l2info.cookie[7] & ATM2_PKT_TYPE_MASK) { /* OAM cell ? */
-            control_word = EXTRACT_32BITS(p);
-            if(control_word == 0 || control_word == 0x08000000) {
-                l2info.header_len += 4;
-                l2info.length -= 4;
-                p += 4;
-            }
             oam_print(p,l2info.length,ATM_OAM_NOHEC);
             return l2info.header_len;
         }
@@ -802,6 +795,9 @@ juniper_parse_header (const u_char *p, const struct pcap_pkthdr *h, struct junip
 
     struct juniper_cookie_table_t *lp = juniper_cookie_table;
     u_int idx, offset;
+#ifdef DLT_JUNIPER_ATM2
+    u_int32_t control_word;
+#endif
 
     l2info->header_len = 0;
     l2info->cookie_len = 0;
@@ -974,10 +970,21 @@ juniper_parse_header (const u_char *p, const struct pcap_pkthdr *h, struct junip
     case DLT_JUNIPER_ATM2:
         TCHECK2(p[0],4);
         /* ATM cell relay control word present ? */
-        if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK && *p & 0x08) {
-            l2info->header_len += 4;
+        if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {
+            control_word = EXTRACT_32BITS(p);
+            /* some control word heuristics */
+            switch(control_word) {
+            case 0: /* zero control word */
+            case 0x08000000: /* < JUNOS 7.4 control-word */
+            case 0x08380000: /* cntl word plus cell length (56) >= JUNOS 7.4*/
+                l2info->header_len += 4;
+                break;
+            default:
+                break;
+            }
+            
             if (eflag)
-                printf("control-word 0x%08x ",EXTRACT_32BITS(p));
+                printf("control-word 0x%08x ", control_word);
         }
         break;
 #endif
@@ -985,6 +992,23 @@ juniper_parse_header (const u_char *p, const struct pcap_pkthdr *h, struct junip
     case DLT_JUNIPER_ATM1:
         break;
 #endif
+#ifdef DLT_JUNIPER_PPP
+    case DLT_JUNIPER_PPP:
+        break;
+#endif
+#ifdef DLT_JUNIPER_CHDLC
+    case DLT_JUNIPER_CHDLC:
+        break;
+#endif
+#ifdef DLT_JUNIPER_ETHER
+    case DLT_JUNIPER_ETHER:
+        break;
+#endif
+#ifdef DLT_JUNIPER_FRELAY
+    case DLT_JUNIPER_FRELAY:
+        break;
+#endif
+
     default:
         printf("Unknown Juniper DLT_ type %u: ", l2info->pictype);
         break;