summaryrefslogtreecommitdiff
path: root/print-juniper.c
diff options
context:
space:
mode:
authorhannes <hannes>2006-02-24 12:18:03 +0000
committerhannes <hannes>2006-02-24 12:18:03 +0000
commit0f3fba52a6adfe54e71dc35d8d307fab5d52bf88 (patch)
tree8a935af3bf42008cf4d7ce48319c99d2b073d0c7 /print-juniper.c
parent50b4920bc51263ce3a2647b6a1d2289629650854 (diff)
downloadtcpdump-0f3fba52a6adfe54e71dc35d8d307fab5d52bf88.tar.gz
improve Control Word detection heuristics for OAM cells
Diffstat (limited to 'print-juniper.c')
-rw-r--r--print-juniper.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/print-juniper.c b/print-juniper.c
index 9b0a70fd..7dfc06cf 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.29 2006-02-01 14:42:17 hannes Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-juniper.c,v 1.30 2006-02-24 12:18:03 hannes Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -710,7 +710,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;
@@ -721,12 +720,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;
}
@@ -890,6 +883,7 @@ 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, jnx_ext_len, jnx_header_len = 0;
u_int8_t tlv_type,tlv_len;
+ u_int32_t control_word;
int tlv_value;
const u_char *tptr;
@@ -1130,10 +1124,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