X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/8706e16a51fa56b0a929b1e0e712c9e4e8bae3f2..refs/heads/tcpdump-3.9:/print-juniper.c diff --git a/print-juniper.c b/print-juniper.c index aa63d5cf..fde0b935 100644 --- a/print-juniper.c +++ b/print-juniper.c @@ -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;