summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-juniper.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcpdump/print-juniper.c')
-rw-r--r--contrib/tcpdump/print-juniper.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/contrib/tcpdump/print-juniper.c b/contrib/tcpdump/print-juniper.c
index 57de6d9..b5837e3 100644
--- a/contrib/tcpdump/print-juniper.c
+++ b/contrib/tcpdump/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;
OpenPOWER on IntegriCloud