1*b636d99dSDavid van Moolenbroek /* NetBSD: print-juniper.c,v 1.2 2007/07/24 11:53:45 drochner Exp */
2*b636d99dSDavid van Moolenbroek
3*b636d99dSDavid van Moolenbroek /*
4*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
5*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code
6*b636d99dSDavid van Moolenbroek * distributions retain the above copyright notice and this paragraph
7*b636d99dSDavid van Moolenbroek * in its entirety, and (2) distributions including binary code include
8*b636d99dSDavid van Moolenbroek * the above copyright notice and this paragraph in its entirety in
9*b636d99dSDavid van Moolenbroek * the documentation or other materials provided with the distribution.
10*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
11*b636d99dSDavid van Moolenbroek * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
12*b636d99dSDavid van Moolenbroek * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
13*b636d99dSDavid van Moolenbroek * FOR A PARTICULAR PURPOSE.
14*b636d99dSDavid van Moolenbroek *
15*b636d99dSDavid van Moolenbroek * Original code by Hannes Gredler (hannes@juniper.net)
16*b636d99dSDavid van Moolenbroek */
17*b636d99dSDavid van Moolenbroek
18*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
19*b636d99dSDavid van Moolenbroek #ifndef lint
20*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-juniper.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
21*b636d99dSDavid van Moolenbroek #endif
22*b636d99dSDavid van Moolenbroek
23*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
24*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
25*b636d99dSDavid van Moolenbroek #include "config.h"
26*b636d99dSDavid van Moolenbroek #endif
27*b636d99dSDavid van Moolenbroek
28*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
29*b636d99dSDavid van Moolenbroek
30*b636d99dSDavid van Moolenbroek #include "interface.h"
31*b636d99dSDavid van Moolenbroek #include "addrtoname.h"
32*b636d99dSDavid van Moolenbroek #include "extract.h"
33*b636d99dSDavid van Moolenbroek #include "ppp.h"
34*b636d99dSDavid van Moolenbroek #include "llc.h"
35*b636d99dSDavid van Moolenbroek #include "nlpid.h"
36*b636d99dSDavid van Moolenbroek #include "ethertype.h"
37*b636d99dSDavid van Moolenbroek #include "atm.h"
38*b636d99dSDavid van Moolenbroek
39*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_OUT 0 /* Outgoing packet */
40*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_IN 1 /* Incoming packet */
41*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_PKT_IN 0x1 /* Incoming packet */
42*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_NO_L2 0x2 /* L2 header stripped */
43*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_IIF 0x4 /* IIF is valid */
44*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_FILTER 0x40 /* BPF filtering is supported */
45*b636d99dSDavid van Moolenbroek #define JUNIPER_BPF_EXT 0x80 /* extensions present */
46*b636d99dSDavid van Moolenbroek #define JUNIPER_MGC_NUMBER 0x4d4743 /* = "MGC" */
47*b636d99dSDavid van Moolenbroek
48*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_COOKIE_RE (1 << 3)
49*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_COOKIE_DIR (1 << 2)
50*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_L3_PROTO_SHIFT 4
51*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_L3_PROTO_MASK (0x17 << JUNIPER_LSQ_L3_PROTO_SHIFT)
52*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_L3_PROTO_IPV4 (0 << JUNIPER_LSQ_L3_PROTO_SHIFT)
53*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_L3_PROTO_IPV6 (1 << JUNIPER_LSQ_L3_PROTO_SHIFT)
54*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_L3_PROTO_MPLS (2 << JUNIPER_LSQ_L3_PROTO_SHIFT)
55*b636d99dSDavid van Moolenbroek #define JUNIPER_LSQ_L3_PROTO_ISO (3 << JUNIPER_LSQ_L3_PROTO_SHIFT)
56*b636d99dSDavid van Moolenbroek #define AS_PIC_COOKIE_LEN 8
57*b636d99dSDavid van Moolenbroek
58*b636d99dSDavid van Moolenbroek #define JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE 1
59*b636d99dSDavid van Moolenbroek #define JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE 2
60*b636d99dSDavid van Moolenbroek #define JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE 3
61*b636d99dSDavid van Moolenbroek #define JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE 4
62*b636d99dSDavid van Moolenbroek #define JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE 5
63*b636d99dSDavid van Moolenbroek
64*b636d99dSDavid van Moolenbroek static const struct tok juniper_ipsec_type_values[] = {
65*b636d99dSDavid van Moolenbroek { JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE, "ESP ENCR-AUTH" },
66*b636d99dSDavid van Moolenbroek { JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE, "ESP ENCR-AH AUTH" },
67*b636d99dSDavid van Moolenbroek { JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE, "ESP AUTH" },
68*b636d99dSDavid van Moolenbroek { JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE, "AH AUTH" },
69*b636d99dSDavid van Moolenbroek { JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE, "ESP ENCR" },
70*b636d99dSDavid van Moolenbroek { 0, NULL}
71*b636d99dSDavid van Moolenbroek };
72*b636d99dSDavid van Moolenbroek
73*b636d99dSDavid van Moolenbroek static const struct tok juniper_direction_values[] = {
74*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_IN, "In"},
75*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_OUT, "Out"},
76*b636d99dSDavid van Moolenbroek { 0, NULL}
77*b636d99dSDavid van Moolenbroek };
78*b636d99dSDavid van Moolenbroek
79*b636d99dSDavid van Moolenbroek /* codepoints for encoding extensions to a .pcap file */
80*b636d99dSDavid van Moolenbroek enum {
81*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_IFD_IDX = 1,
82*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_IFD_NAME = 2,
83*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_IFD_MEDIATYPE = 3,
84*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_IFL_IDX = 4,
85*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_IFL_UNIT = 5,
86*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_IFL_ENCAPS = 6,
87*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE = 7,
88*b636d99dSDavid van Moolenbroek JUNIPER_EXT_TLV_TTP_IFL_ENCAPS = 8
89*b636d99dSDavid van Moolenbroek };
90*b636d99dSDavid van Moolenbroek
91*b636d99dSDavid van Moolenbroek /* 1 byte type and 1-byte length */
92*b636d99dSDavid van Moolenbroek #define JUNIPER_EXT_TLV_OVERHEAD 2
93*b636d99dSDavid van Moolenbroek
94*b636d99dSDavid van Moolenbroek static const struct tok jnx_ext_tlv_values[] = {
95*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_IFD_IDX, "Device Interface Index" },
96*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_IFD_NAME,"Device Interface Name" },
97*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_IFD_MEDIATYPE, "Device Media Type" },
98*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_IFL_IDX, "Logical Interface Index" },
99*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_IFL_UNIT,"Logical Unit Number" },
100*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_IFL_ENCAPS, "Logical Interface Encapsulation" },
101*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE, "TTP derived Device Media Type" },
102*b636d99dSDavid van Moolenbroek { JUNIPER_EXT_TLV_TTP_IFL_ENCAPS, "TTP derived Logical Interface Encapsulation" },
103*b636d99dSDavid van Moolenbroek { 0, NULL }
104*b636d99dSDavid van Moolenbroek };
105*b636d99dSDavid van Moolenbroek
106*b636d99dSDavid van Moolenbroek static const struct tok jnx_flag_values[] = {
107*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_EXT, "Ext" },
108*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_FILTER, "Filter" },
109*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_IIF, "IIF" },
110*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_NO_L2, "no-L2" },
111*b636d99dSDavid van Moolenbroek { JUNIPER_BPF_PKT_IN, "In" },
112*b636d99dSDavid van Moolenbroek { 0, NULL }
113*b636d99dSDavid van Moolenbroek };
114*b636d99dSDavid van Moolenbroek
115*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHER 1
116*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FDDI 2
117*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_TOKENRING 3
118*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PPP 4
119*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FRAMERELAY 5
120*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_CISCOHDLC 6
121*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_SMDSDXI 7
122*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ATMPVC 8
123*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PPP_CCC 9
124*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FRAMERELAY_CCC 10
125*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_IPIP 11
126*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_GRE 12
127*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PIM 13
128*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PIMD 14
129*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_CISCOHDLC_CCC 15
130*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_VLAN_CCC 16
131*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_MLPPP 17
132*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_MLFR 18
133*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ML 19
134*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_LSI 20
135*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_DFE 21
136*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ATM_CELLRELAY_CCC 22
137*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_CRYPTO 23
138*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_GGSN 24
139*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_LSI_PPP 25
140*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_LSI_CISCOHDLC 26
141*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PPP_TCC 27
142*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FRAMERELAY_TCC 28
143*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_CISCOHDLC_TCC 29
144*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHERNET_CCC 30
145*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_VT 31
146*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_EXTENDED_VLAN_CCC 32
147*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHER_OVER_ATM 33
148*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_MONITOR 34
149*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHERNET_TCC 35
150*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_VLAN_TCC 36
151*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_EXTENDED_VLAN_TCC 37
152*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_CONTROLLER 38
153*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_MFR 39
154*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_LS 40
155*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHERNET_VPLS 41
156*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHERNET_VLAN_VPLS 42
157*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS 43
158*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_LT 44
159*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_SERVICES 45
160*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHER_VPLS_OVER_ATM 46
161*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FR_PORT_CCC 47
162*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FRAMERELAY_EXT_CCC 48
163*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FRAMERELAY_EXT_TCC 49
164*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_FRAMERELAY_FLEX 50
165*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_GGSNI 51
166*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_ETHERNET_FLEX 52
167*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_COLLECTOR 53
168*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_AGGREGATOR 54
169*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_LAPD 55
170*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PPPOE 56
171*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PPP_SUBORDINATE 57
172*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_CISCOHDLC_SUBORDINATE 58
173*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_DFC 59
174*b636d99dSDavid van Moolenbroek #define JUNIPER_IFML_PICPEER 60
175*b636d99dSDavid van Moolenbroek
176*b636d99dSDavid van Moolenbroek static const struct tok juniper_ifmt_values[] = {
177*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHER, "Ethernet" },
178*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FDDI, "FDDI" },
179*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_TOKENRING, "Token-Ring" },
180*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PPP, "PPP" },
181*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PPP_SUBORDINATE, "PPP-Subordinate" },
182*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FRAMERELAY, "Frame-Relay" },
183*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_CISCOHDLC, "Cisco-HDLC" },
184*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_SMDSDXI, "SMDS-DXI" },
185*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ATMPVC, "ATM-PVC" },
186*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PPP_CCC, "PPP-CCC" },
187*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FRAMERELAY_CCC, "Frame-Relay-CCC" },
188*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FRAMERELAY_EXT_CCC, "Extended FR-CCC" },
189*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_IPIP, "IP-over-IP" },
190*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_GRE, "GRE" },
191*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PIM, "PIM-Encapsulator" },
192*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PIMD, "PIM-Decapsulator" },
193*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_CISCOHDLC_CCC, "Cisco-HDLC-CCC" },
194*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_VLAN_CCC, "VLAN-CCC" },
195*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_EXTENDED_VLAN_CCC, "Extended-VLAN-CCC" },
196*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_MLPPP, "Multilink-PPP" },
197*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_MLFR, "Multilink-FR" },
198*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_MFR, "Multilink-FR-UNI-NNI" },
199*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ML, "Multilink" },
200*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_LS, "LinkService" },
201*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_LSI, "LSI" },
202*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ATM_CELLRELAY_CCC, "ATM-CCC-Cell-Relay" },
203*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_CRYPTO, "IPSEC-over-IP" },
204*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_GGSN, "GGSN" },
205*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PPP_TCC, "PPP-TCC" },
206*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FRAMERELAY_TCC, "Frame-Relay-TCC" },
207*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FRAMERELAY_EXT_TCC, "Extended FR-TCC" },
208*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_CISCOHDLC_TCC, "Cisco-HDLC-TCC" },
209*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHERNET_CCC, "Ethernet-CCC" },
210*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_VT, "VPN-Loopback-tunnel" },
211*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHER_OVER_ATM, "Ethernet-over-ATM" },
212*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHER_VPLS_OVER_ATM, "Ethernet-VPLS-over-ATM" },
213*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_MONITOR, "Monitor" },
214*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHERNET_TCC, "Ethernet-TCC" },
215*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_VLAN_TCC, "VLAN-TCC" },
216*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_EXTENDED_VLAN_TCC, "Extended-VLAN-TCC" },
217*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_CONTROLLER, "Controller" },
218*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHERNET_VPLS, "VPLS" },
219*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHERNET_VLAN_VPLS, "VLAN-VPLS" },
220*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS, "Extended-VLAN-VPLS" },
221*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_LT, "Logical-tunnel" },
222*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_SERVICES, "General-Services" },
223*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PPPOE, "PPPoE" },
224*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_ETHERNET_FLEX, "Flexible-Ethernet-Services" },
225*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_FRAMERELAY_FLEX, "Flexible-FrameRelay" },
226*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_COLLECTOR, "Flow-collection" },
227*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_PICPEER, "PIC Peer" },
228*b636d99dSDavid van Moolenbroek { JUNIPER_IFML_DFC, "Dynamic-Flow-Capture" },
229*b636d99dSDavid van Moolenbroek {0, NULL}
230*b636d99dSDavid van Moolenbroek };
231*b636d99dSDavid van Moolenbroek
232*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_SNAP 2
233*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_NLPID 3
234*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_VCMUX 4
235*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_LLC 5
236*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_PPP_VCMUX 6
237*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_PPP_LLC 7
238*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_PPP_FUNI 8
239*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_CCC 9
240*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_FR_NLPID 10
241*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_FR_SNAP 11
242*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_FR_PPP 12
243*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_FR_CCC 13
244*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ENET2 14
245*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_IEEE8023_SNAP 15
246*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_IEEE8023_LLC 16
247*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PPP 17
248*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_CISCOHDLC 18
249*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PPP_CCC 19
250*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_IPIP_NULL 20
251*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PIM_NULL 21
252*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_GRE_NULL 22
253*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_GRE_PPP 23
254*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PIMD_DECAPS 24
255*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_CISCOHDLC_CCC 25
256*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_CISCO_NLPID 26
257*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_VLAN_CCC 27
258*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_MLPPP 28
259*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_MLFR 29
260*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_LSI_NULL 30
261*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_AGGREGATE_UNUSED 31
262*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_CELLRELAY_CCC 32
263*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_CRYPTO 33
264*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_GGSN 34
265*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_TCC 35
266*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_FR_TCC 36
267*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PPP_TCC 37
268*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_CISCOHDLC_TCC 38
269*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ETHERNET_CCC 39
270*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_VT 40
271*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_EOA_LLC 41
272*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_EXTENDED_VLAN_CCC 42
273*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_SNAP_TCC 43
274*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_MONITOR 44
275*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ETHERNET_TCC 45
276*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_VLAN_TCC 46
277*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_EXTENDED_VLAN_TCC 47
278*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_MFR 48
279*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ETHERNET_VPLS 49
280*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ETHERNET_VLAN_VPLS 50
281*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS 51
282*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_SERVICES 52
283*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC 53
284*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_FR_PORT_CCC 54
285*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_MLPPP_LLC 55
286*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_EOA_CCC 56
287*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_LT_VLAN 57
288*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_COLLECTOR 58
289*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_AGGREGATOR 59
290*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_LAPD 60
291*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ATM_PPPOE_LLC 61
292*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_ETHERNET_PPPOE 62
293*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PPPOE 63
294*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PPP_SUBORDINATE 64
295*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_CISCOHDLC_SUBORDINATE 65
296*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_DFC 66
297*b636d99dSDavid van Moolenbroek #define JUNIPER_IFLE_PICPEER 67
298*b636d99dSDavid van Moolenbroek
299*b636d99dSDavid van Moolenbroek static const struct tok juniper_ifle_values[] = {
300*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_AGGREGATOR, "Aggregator" },
301*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_CCC, "CCC over ATM" },
302*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_CELLRELAY_CCC, "ATM CCC Cell Relay" },
303*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_CISCO_NLPID, "CISCO compatible NLPID" },
304*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_EOA_CCC, "Ethernet over ATM CCC" },
305*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_EOA_LLC, "Ethernet over ATM LLC" },
306*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC, "Ethernet VPLS over ATM LLC" },
307*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_LLC, "ATM LLC" },
308*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_MLPPP_LLC, "MLPPP over ATM LLC" },
309*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_NLPID, "ATM NLPID" },
310*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_PPPOE_LLC, "PPPoE over ATM LLC" },
311*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_PPP_FUNI, "PPP over FUNI" },
312*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_PPP_LLC, "PPP over ATM LLC" },
313*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_PPP_VCMUX, "PPP over ATM VCMUX" },
314*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_SNAP, "ATM SNAP" },
315*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_SNAP_TCC, "ATM SNAP TCC" },
316*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_TCC, "ATM VCMUX TCC" },
317*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ATM_VCMUX, "ATM VCMUX" },
318*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_CISCOHDLC, "C-HDLC" },
319*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_CISCOHDLC_CCC, "C-HDLC CCC" },
320*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_CISCOHDLC_SUBORDINATE, "C-HDLC via dialer" },
321*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_CISCOHDLC_TCC, "C-HDLC TCC" },
322*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_COLLECTOR, "Collector" },
323*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_CRYPTO, "Crypto" },
324*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ENET2, "Ethernet" },
325*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ETHERNET_CCC, "Ethernet CCC" },
326*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS, "Extended VLAN VPLS" },
327*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ETHERNET_PPPOE, "PPPoE over Ethernet" },
328*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ETHERNET_TCC, "Ethernet TCC" },
329*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ETHERNET_VLAN_VPLS, "VLAN VPLS" },
330*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_ETHERNET_VPLS, "VPLS" },
331*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_EXTENDED_VLAN_CCC, "Extended VLAN CCC" },
332*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_EXTENDED_VLAN_TCC, "Extended VLAN TCC" },
333*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_FR_CCC, "FR CCC" },
334*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_FR_NLPID, "FR NLPID" },
335*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_FR_PORT_CCC, "FR CCC" },
336*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_FR_PPP, "FR PPP" },
337*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_FR_SNAP, "FR SNAP" },
338*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_FR_TCC, "FR TCC" },
339*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_GGSN, "GGSN" },
340*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_GRE_NULL, "GRE NULL" },
341*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_GRE_PPP, "PPP over GRE" },
342*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_IPIP_NULL, "IPIP" },
343*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_LAPD, "LAPD" },
344*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_LSI_NULL, "LSI Null" },
345*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_LT_VLAN, "LT VLAN" },
346*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_MFR, "MFR" },
347*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_MLFR, "MLFR" },
348*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_MLPPP, "MLPPP" },
349*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_MONITOR, "Monitor" },
350*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PIMD_DECAPS, "PIMd" },
351*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PIM_NULL, "PIM Null" },
352*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PPP, "PPP" },
353*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PPPOE, "PPPoE" },
354*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PPP_CCC, "PPP CCC" },
355*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PPP_SUBORDINATE, "" },
356*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_PPP_TCC, "PPP TCC" },
357*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_SERVICES, "General Services" },
358*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_VLAN_CCC, "VLAN CCC" },
359*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_VLAN_TCC, "VLAN TCC" },
360*b636d99dSDavid van Moolenbroek { JUNIPER_IFLE_VT, "VT" },
361*b636d99dSDavid van Moolenbroek {0, NULL}
362*b636d99dSDavid van Moolenbroek };
363*b636d99dSDavid van Moolenbroek
364*b636d99dSDavid van Moolenbroek struct juniper_cookie_table_t {
365*b636d99dSDavid van Moolenbroek uint32_t pictype; /* pic type */
366*b636d99dSDavid van Moolenbroek uint8_t cookie_len; /* cookie len */
367*b636d99dSDavid van Moolenbroek const char *s; /* pic name */
368*b636d99dSDavid van Moolenbroek };
369*b636d99dSDavid van Moolenbroek
370*b636d99dSDavid van Moolenbroek static const struct juniper_cookie_table_t juniper_cookie_table[] = {
371*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ATM1
372*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_ATM1, 4, "ATM1"},
373*b636d99dSDavid van Moolenbroek #endif
374*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ATM2
375*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_ATM2, 8, "ATM2"},
376*b636d99dSDavid van Moolenbroek #endif
377*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MLPPP
378*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_MLPPP, 2, "MLPPP"},
379*b636d99dSDavid van Moolenbroek #endif
380*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MLFR
381*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_MLFR, 2, "MLFR"},
382*b636d99dSDavid van Moolenbroek #endif
383*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MFR
384*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_MFR, 4, "MFR"},
385*b636d99dSDavid van Moolenbroek #endif
386*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_PPPOE
387*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_PPPOE, 0, "PPPoE"},
388*b636d99dSDavid van Moolenbroek #endif
389*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_PPPOE_ATM
390*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_PPPOE_ATM, 0, "PPPoE ATM"},
391*b636d99dSDavid van Moolenbroek #endif
392*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_GGSN
393*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_GGSN, 8, "GGSN"},
394*b636d99dSDavid van Moolenbroek #endif
395*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MONITOR
396*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_MONITOR, 8, "MONITOR"},
397*b636d99dSDavid van Moolenbroek #endif
398*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_SERVICES
399*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_SERVICES, 8, "AS"},
400*b636d99dSDavid van Moolenbroek #endif
401*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ES
402*b636d99dSDavid van Moolenbroek { DLT_JUNIPER_ES, 0, "ES"},
403*b636d99dSDavid van Moolenbroek #endif
404*b636d99dSDavid van Moolenbroek { 0, 0, NULL }
405*b636d99dSDavid van Moolenbroek };
406*b636d99dSDavid van Moolenbroek
407*b636d99dSDavid van Moolenbroek struct juniper_l2info_t {
408*b636d99dSDavid van Moolenbroek uint32_t length;
409*b636d99dSDavid van Moolenbroek uint32_t caplen;
410*b636d99dSDavid van Moolenbroek uint32_t pictype;
411*b636d99dSDavid van Moolenbroek uint8_t direction;
412*b636d99dSDavid van Moolenbroek uint8_t header_len;
413*b636d99dSDavid van Moolenbroek uint8_t cookie_len;
414*b636d99dSDavid van Moolenbroek uint8_t cookie_type;
415*b636d99dSDavid van Moolenbroek uint8_t cookie[8];
416*b636d99dSDavid van Moolenbroek uint8_t bundle;
417*b636d99dSDavid van Moolenbroek uint16_t proto;
418*b636d99dSDavid van Moolenbroek uint8_t flags;
419*b636d99dSDavid van Moolenbroek };
420*b636d99dSDavid van Moolenbroek
421*b636d99dSDavid van Moolenbroek #define LS_COOKIE_ID 0x54
422*b636d99dSDavid van Moolenbroek #define AS_COOKIE_ID 0x47
423*b636d99dSDavid van Moolenbroek #define LS_MLFR_COOKIE_LEN 4
424*b636d99dSDavid van Moolenbroek #define ML_MLFR_COOKIE_LEN 2
425*b636d99dSDavid van Moolenbroek #define LS_MFR_COOKIE_LEN 6
426*b636d99dSDavid van Moolenbroek #define ATM1_COOKIE_LEN 4
427*b636d99dSDavid van Moolenbroek #define ATM2_COOKIE_LEN 8
428*b636d99dSDavid van Moolenbroek
429*b636d99dSDavid van Moolenbroek #define ATM2_PKT_TYPE_MASK 0x70
430*b636d99dSDavid van Moolenbroek #define ATM2_GAP_COUNT_MASK 0x3F
431*b636d99dSDavid van Moolenbroek
432*b636d99dSDavid van Moolenbroek #define JUNIPER_PROTO_NULL 1
433*b636d99dSDavid van Moolenbroek #define JUNIPER_PROTO_IPV4 2
434*b636d99dSDavid van Moolenbroek #define JUNIPER_PROTO_IPV6 6
435*b636d99dSDavid van Moolenbroek
436*b636d99dSDavid van Moolenbroek #define MFR_BE_MASK 0xc0
437*b636d99dSDavid van Moolenbroek
438*b636d99dSDavid van Moolenbroek static const struct tok juniper_protocol_values[] = {
439*b636d99dSDavid van Moolenbroek { JUNIPER_PROTO_NULL, "Null" },
440*b636d99dSDavid van Moolenbroek { JUNIPER_PROTO_IPV4, "IPv4" },
441*b636d99dSDavid van Moolenbroek { JUNIPER_PROTO_IPV6, "IPv6" },
442*b636d99dSDavid van Moolenbroek { 0, NULL}
443*b636d99dSDavid van Moolenbroek };
444*b636d99dSDavid van Moolenbroek
445*b636d99dSDavid van Moolenbroek static int ip_heuristic_guess(netdissect_options *, register const u_char *, u_int);
446*b636d99dSDavid van Moolenbroek static int juniper_ppp_heuristic_guess(netdissect_options *, register const u_char *, u_int);
447*b636d99dSDavid van Moolenbroek static int juniper_parse_header(netdissect_options *, const u_char *, const struct pcap_pkthdr *, struct juniper_l2info_t *);
448*b636d99dSDavid van Moolenbroek
449*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_GGSN
450*b636d99dSDavid van Moolenbroek u_int
juniper_ggsn_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)451*b636d99dSDavid van Moolenbroek juniper_ggsn_print(netdissect_options *ndo,
452*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
453*b636d99dSDavid van Moolenbroek {
454*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
455*b636d99dSDavid van Moolenbroek struct juniper_ggsn_header {
456*b636d99dSDavid van Moolenbroek uint8_t svc_id;
457*b636d99dSDavid van Moolenbroek uint8_t flags_len;
458*b636d99dSDavid van Moolenbroek uint8_t proto;
459*b636d99dSDavid van Moolenbroek uint8_t flags;
460*b636d99dSDavid van Moolenbroek uint8_t vlan_id[2];
461*b636d99dSDavid van Moolenbroek uint8_t res[2];
462*b636d99dSDavid van Moolenbroek };
463*b636d99dSDavid van Moolenbroek const struct juniper_ggsn_header *gh;
464*b636d99dSDavid van Moolenbroek
465*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_GGSN;
466*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
467*b636d99dSDavid van Moolenbroek return l2info.header_len;
468*b636d99dSDavid van Moolenbroek
469*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
470*b636d99dSDavid van Moolenbroek gh = (struct juniper_ggsn_header *)&l2info.cookie;
471*b636d99dSDavid van Moolenbroek
472*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag) {
473*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "proto %s (%u), vlan %u: ",
474*b636d99dSDavid van Moolenbroek tok2str(juniper_protocol_values,"Unknown",gh->proto),
475*b636d99dSDavid van Moolenbroek gh->proto,
476*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&gh->vlan_id[0])));
477*b636d99dSDavid van Moolenbroek }
478*b636d99dSDavid van Moolenbroek
479*b636d99dSDavid van Moolenbroek switch (gh->proto) {
480*b636d99dSDavid van Moolenbroek case JUNIPER_PROTO_IPV4:
481*b636d99dSDavid van Moolenbroek ip_print(ndo, p, l2info.length);
482*b636d99dSDavid van Moolenbroek break;
483*b636d99dSDavid van Moolenbroek case JUNIPER_PROTO_IPV6:
484*b636d99dSDavid van Moolenbroek ip6_print(ndo, p, l2info.length);
485*b636d99dSDavid van Moolenbroek break;
486*b636d99dSDavid van Moolenbroek default:
487*b636d99dSDavid van Moolenbroek if (!ndo->ndo_eflag)
488*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "unknown GGSN proto (%u)", gh->proto));
489*b636d99dSDavid van Moolenbroek }
490*b636d99dSDavid van Moolenbroek
491*b636d99dSDavid van Moolenbroek return l2info.header_len;
492*b636d99dSDavid van Moolenbroek }
493*b636d99dSDavid van Moolenbroek #endif
494*b636d99dSDavid van Moolenbroek
495*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ES
496*b636d99dSDavid van Moolenbroek u_int
juniper_es_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)497*b636d99dSDavid van Moolenbroek juniper_es_print(netdissect_options *ndo,
498*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
499*b636d99dSDavid van Moolenbroek {
500*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
501*b636d99dSDavid van Moolenbroek struct juniper_ipsec_header {
502*b636d99dSDavid van Moolenbroek uint8_t sa_index[2];
503*b636d99dSDavid van Moolenbroek uint8_t ttl;
504*b636d99dSDavid van Moolenbroek uint8_t type;
505*b636d99dSDavid van Moolenbroek uint8_t spi[4];
506*b636d99dSDavid van Moolenbroek uint8_t src_ip[4];
507*b636d99dSDavid van Moolenbroek uint8_t dst_ip[4];
508*b636d99dSDavid van Moolenbroek };
509*b636d99dSDavid van Moolenbroek u_int rewrite_len,es_type_bundle;
510*b636d99dSDavid van Moolenbroek const struct juniper_ipsec_header *ih;
511*b636d99dSDavid van Moolenbroek
512*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_ES;
513*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
514*b636d99dSDavid van Moolenbroek return l2info.header_len;
515*b636d99dSDavid van Moolenbroek
516*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
517*b636d99dSDavid van Moolenbroek ih = (struct juniper_ipsec_header *)p;
518*b636d99dSDavid van Moolenbroek
519*b636d99dSDavid van Moolenbroek switch (ih->type) {
520*b636d99dSDavid van Moolenbroek case JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE:
521*b636d99dSDavid van Moolenbroek case JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE:
522*b636d99dSDavid van Moolenbroek rewrite_len = 0;
523*b636d99dSDavid van Moolenbroek es_type_bundle = 1;
524*b636d99dSDavid van Moolenbroek break;
525*b636d99dSDavid van Moolenbroek case JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE:
526*b636d99dSDavid van Moolenbroek case JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE:
527*b636d99dSDavid van Moolenbroek case JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE:
528*b636d99dSDavid van Moolenbroek rewrite_len = 16;
529*b636d99dSDavid van Moolenbroek es_type_bundle = 0;
530*b636d99dSDavid van Moolenbroek break;
531*b636d99dSDavid van Moolenbroek default:
532*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "ES Invalid type %u, length %u",
533*b636d99dSDavid van Moolenbroek ih->type,
534*b636d99dSDavid van Moolenbroek l2info.length));
535*b636d99dSDavid van Moolenbroek return l2info.header_len;
536*b636d99dSDavid van Moolenbroek }
537*b636d99dSDavid van Moolenbroek
538*b636d99dSDavid van Moolenbroek l2info.length-=rewrite_len;
539*b636d99dSDavid van Moolenbroek p+=rewrite_len;
540*b636d99dSDavid van Moolenbroek
541*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag) {
542*b636d99dSDavid van Moolenbroek if (!es_type_bundle) {
543*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "ES SA, index %u, ttl %u type %s (%u), spi %u, Tunnel %s > %s, length %u\n",
544*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&ih->sa_index),
545*b636d99dSDavid van Moolenbroek ih->ttl,
546*b636d99dSDavid van Moolenbroek tok2str(juniper_ipsec_type_values,"Unknown",ih->type),
547*b636d99dSDavid van Moolenbroek ih->type,
548*b636d99dSDavid van Moolenbroek EXTRACT_32BITS(&ih->spi),
549*b636d99dSDavid van Moolenbroek ipaddr_string(ndo, &ih->src_ip),
550*b636d99dSDavid van Moolenbroek ipaddr_string(ndo, &ih->dst_ip),
551*b636d99dSDavid van Moolenbroek l2info.length));
552*b636d99dSDavid van Moolenbroek } else {
553*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "ES SA, index %u, ttl %u type %s (%u), length %u\n",
554*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&ih->sa_index),
555*b636d99dSDavid van Moolenbroek ih->ttl,
556*b636d99dSDavid van Moolenbroek tok2str(juniper_ipsec_type_values,"Unknown",ih->type),
557*b636d99dSDavid van Moolenbroek ih->type,
558*b636d99dSDavid van Moolenbroek l2info.length));
559*b636d99dSDavid van Moolenbroek }
560*b636d99dSDavid van Moolenbroek }
561*b636d99dSDavid van Moolenbroek
562*b636d99dSDavid van Moolenbroek ip_print(ndo, p, l2info.length);
563*b636d99dSDavid van Moolenbroek return l2info.header_len;
564*b636d99dSDavid van Moolenbroek }
565*b636d99dSDavid van Moolenbroek #endif
566*b636d99dSDavid van Moolenbroek
567*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MONITOR
568*b636d99dSDavid van Moolenbroek u_int
juniper_monitor_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)569*b636d99dSDavid van Moolenbroek juniper_monitor_print(netdissect_options *ndo,
570*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
571*b636d99dSDavid van Moolenbroek {
572*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
573*b636d99dSDavid van Moolenbroek struct juniper_monitor_header {
574*b636d99dSDavid van Moolenbroek uint8_t pkt_type;
575*b636d99dSDavid van Moolenbroek uint8_t padding;
576*b636d99dSDavid van Moolenbroek uint8_t iif[2];
577*b636d99dSDavid van Moolenbroek uint8_t service_id[4];
578*b636d99dSDavid van Moolenbroek };
579*b636d99dSDavid van Moolenbroek const struct juniper_monitor_header *mh;
580*b636d99dSDavid van Moolenbroek
581*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_MONITOR;
582*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
583*b636d99dSDavid van Moolenbroek return l2info.header_len;
584*b636d99dSDavid van Moolenbroek
585*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
586*b636d99dSDavid van Moolenbroek mh = (struct juniper_monitor_header *)p;
587*b636d99dSDavid van Moolenbroek
588*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag)
589*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "service-id %u, iif %u, pkt-type %u: ",
590*b636d99dSDavid van Moolenbroek EXTRACT_32BITS(&mh->service_id),
591*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&mh->iif),
592*b636d99dSDavid van Moolenbroek mh->pkt_type));
593*b636d99dSDavid van Moolenbroek
594*b636d99dSDavid van Moolenbroek /* no proto field - lets guess by first byte of IP header*/
595*b636d99dSDavid van Moolenbroek ip_heuristic_guess (ndo, p, l2info.length);
596*b636d99dSDavid van Moolenbroek
597*b636d99dSDavid van Moolenbroek return l2info.header_len;
598*b636d99dSDavid van Moolenbroek }
599*b636d99dSDavid van Moolenbroek #endif
600*b636d99dSDavid van Moolenbroek
601*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_SERVICES
602*b636d99dSDavid van Moolenbroek u_int
juniper_services_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)603*b636d99dSDavid van Moolenbroek juniper_services_print(netdissect_options *ndo,
604*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
605*b636d99dSDavid van Moolenbroek {
606*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
607*b636d99dSDavid van Moolenbroek struct juniper_services_header {
608*b636d99dSDavid van Moolenbroek uint8_t svc_id;
609*b636d99dSDavid van Moolenbroek uint8_t flags_len;
610*b636d99dSDavid van Moolenbroek uint8_t svc_set_id[2];
611*b636d99dSDavid van Moolenbroek uint8_t dir_iif[4];
612*b636d99dSDavid van Moolenbroek };
613*b636d99dSDavid van Moolenbroek const struct juniper_services_header *sh;
614*b636d99dSDavid van Moolenbroek
615*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_SERVICES;
616*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
617*b636d99dSDavid van Moolenbroek return l2info.header_len;
618*b636d99dSDavid van Moolenbroek
619*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
620*b636d99dSDavid van Moolenbroek sh = (struct juniper_services_header *)p;
621*b636d99dSDavid van Moolenbroek
622*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag)
623*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "service-id %u flags 0x%02x service-set-id 0x%04x iif %u: ",
624*b636d99dSDavid van Moolenbroek sh->svc_id,
625*b636d99dSDavid van Moolenbroek sh->flags_len,
626*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&sh->svc_set_id),
627*b636d99dSDavid van Moolenbroek EXTRACT_24BITS(&sh->dir_iif[1])));
628*b636d99dSDavid van Moolenbroek
629*b636d99dSDavid van Moolenbroek /* no proto field - lets guess by first byte of IP header*/
630*b636d99dSDavid van Moolenbroek ip_heuristic_guess (ndo, p, l2info.length);
631*b636d99dSDavid van Moolenbroek
632*b636d99dSDavid van Moolenbroek return l2info.header_len;
633*b636d99dSDavid van Moolenbroek }
634*b636d99dSDavid van Moolenbroek #endif
635*b636d99dSDavid van Moolenbroek
636*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_PPPOE
637*b636d99dSDavid van Moolenbroek u_int
juniper_pppoe_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)638*b636d99dSDavid van Moolenbroek juniper_pppoe_print(netdissect_options *ndo,
639*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
640*b636d99dSDavid van Moolenbroek {
641*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
642*b636d99dSDavid van Moolenbroek
643*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_PPPOE;
644*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
645*b636d99dSDavid van Moolenbroek return l2info.header_len;
646*b636d99dSDavid van Moolenbroek
647*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
648*b636d99dSDavid van Moolenbroek /* this DLT contains nothing but raw ethernet frames */
649*b636d99dSDavid van Moolenbroek ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
650*b636d99dSDavid van Moolenbroek return l2info.header_len;
651*b636d99dSDavid van Moolenbroek }
652*b636d99dSDavid van Moolenbroek #endif
653*b636d99dSDavid van Moolenbroek
654*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ETHER
655*b636d99dSDavid van Moolenbroek u_int
juniper_ether_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)656*b636d99dSDavid van Moolenbroek juniper_ether_print(netdissect_options *ndo,
657*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
658*b636d99dSDavid van Moolenbroek {
659*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
660*b636d99dSDavid van Moolenbroek
661*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_ETHER;
662*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
663*b636d99dSDavid van Moolenbroek return l2info.header_len;
664*b636d99dSDavid van Moolenbroek
665*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
666*b636d99dSDavid van Moolenbroek /* this DLT contains nothing but raw Ethernet frames */
667*b636d99dSDavid van Moolenbroek ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
668*b636d99dSDavid van Moolenbroek return l2info.header_len;
669*b636d99dSDavid van Moolenbroek }
670*b636d99dSDavid van Moolenbroek #endif
671*b636d99dSDavid van Moolenbroek
672*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_PPP
673*b636d99dSDavid van Moolenbroek u_int
juniper_ppp_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)674*b636d99dSDavid van Moolenbroek juniper_ppp_print(netdissect_options *ndo,
675*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
676*b636d99dSDavid van Moolenbroek {
677*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
678*b636d99dSDavid van Moolenbroek
679*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_PPP;
680*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
681*b636d99dSDavid van Moolenbroek return l2info.header_len;
682*b636d99dSDavid van Moolenbroek
683*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
684*b636d99dSDavid van Moolenbroek /* this DLT contains nothing but raw ppp frames */
685*b636d99dSDavid van Moolenbroek ppp_print(ndo, p, l2info.length);
686*b636d99dSDavid van Moolenbroek return l2info.header_len;
687*b636d99dSDavid van Moolenbroek }
688*b636d99dSDavid van Moolenbroek #endif
689*b636d99dSDavid van Moolenbroek
690*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_FRELAY
691*b636d99dSDavid van Moolenbroek u_int
juniper_frelay_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)692*b636d99dSDavid van Moolenbroek juniper_frelay_print(netdissect_options *ndo,
693*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
694*b636d99dSDavid van Moolenbroek {
695*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
696*b636d99dSDavid van Moolenbroek
697*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_FRELAY;
698*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
699*b636d99dSDavid van Moolenbroek return l2info.header_len;
700*b636d99dSDavid van Moolenbroek
701*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
702*b636d99dSDavid van Moolenbroek /* this DLT contains nothing but raw frame-relay frames */
703*b636d99dSDavid van Moolenbroek fr_print(ndo, p, l2info.length);
704*b636d99dSDavid van Moolenbroek return l2info.header_len;
705*b636d99dSDavid van Moolenbroek }
706*b636d99dSDavid van Moolenbroek #endif
707*b636d99dSDavid van Moolenbroek
708*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_CHDLC
709*b636d99dSDavid van Moolenbroek u_int
juniper_chdlc_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)710*b636d99dSDavid van Moolenbroek juniper_chdlc_print(netdissect_options *ndo,
711*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
712*b636d99dSDavid van Moolenbroek {
713*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
714*b636d99dSDavid van Moolenbroek
715*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_CHDLC;
716*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
717*b636d99dSDavid van Moolenbroek return l2info.header_len;
718*b636d99dSDavid van Moolenbroek
719*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
720*b636d99dSDavid van Moolenbroek /* this DLT contains nothing but raw c-hdlc frames */
721*b636d99dSDavid van Moolenbroek chdlc_print(ndo, p, l2info.length);
722*b636d99dSDavid van Moolenbroek return l2info.header_len;
723*b636d99dSDavid van Moolenbroek }
724*b636d99dSDavid van Moolenbroek #endif
725*b636d99dSDavid van Moolenbroek
726*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_PPPOE_ATM
727*b636d99dSDavid van Moolenbroek u_int
juniper_pppoe_atm_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)728*b636d99dSDavid van Moolenbroek juniper_pppoe_atm_print(netdissect_options *ndo,
729*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
730*b636d99dSDavid van Moolenbroek {
731*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
732*b636d99dSDavid van Moolenbroek uint16_t extracted_ethertype;
733*b636d99dSDavid van Moolenbroek
734*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_PPPOE_ATM;
735*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
736*b636d99dSDavid van Moolenbroek return l2info.header_len;
737*b636d99dSDavid van Moolenbroek
738*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
739*b636d99dSDavid van Moolenbroek
740*b636d99dSDavid van Moolenbroek extracted_ethertype = EXTRACT_16BITS(p);
741*b636d99dSDavid van Moolenbroek /* this DLT contains nothing but raw PPPoE frames,
742*b636d99dSDavid van Moolenbroek * prepended with a type field*/
743*b636d99dSDavid van Moolenbroek if (ethertype_print(ndo, extracted_ethertype,
744*b636d99dSDavid van Moolenbroek p+ETHERTYPE_LEN,
745*b636d99dSDavid van Moolenbroek l2info.length-ETHERTYPE_LEN,
746*b636d99dSDavid van Moolenbroek l2info.caplen-ETHERTYPE_LEN) == 0)
747*b636d99dSDavid van Moolenbroek /* ether_type not known, probably it wasn't one */
748*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "unknown ethertype 0x%04x", extracted_ethertype));
749*b636d99dSDavid van Moolenbroek
750*b636d99dSDavid van Moolenbroek return l2info.header_len;
751*b636d99dSDavid van Moolenbroek }
752*b636d99dSDavid van Moolenbroek #endif
753*b636d99dSDavid van Moolenbroek
754*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MLPPP
755*b636d99dSDavid van Moolenbroek u_int
juniper_mlppp_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)756*b636d99dSDavid van Moolenbroek juniper_mlppp_print(netdissect_options *ndo,
757*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
758*b636d99dSDavid van Moolenbroek {
759*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
760*b636d99dSDavid van Moolenbroek
761*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_MLPPP;
762*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
763*b636d99dSDavid van Moolenbroek return l2info.header_len;
764*b636d99dSDavid van Moolenbroek
765*b636d99dSDavid van Moolenbroek /* suppress Bundle-ID if frame was captured on a child-link
766*b636d99dSDavid van Moolenbroek * best indicator if the cookie looks like a proto */
767*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag &&
768*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&l2info.cookie) != PPP_OSI &&
769*b636d99dSDavid van Moolenbroek EXTRACT_16BITS(&l2info.cookie) != (PPP_ADDRESS << 8 | PPP_CONTROL))
770*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Bundle-ID %u: ", l2info.bundle));
771*b636d99dSDavid van Moolenbroek
772*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
773*b636d99dSDavid van Moolenbroek
774*b636d99dSDavid van Moolenbroek /* first try the LSQ protos */
775*b636d99dSDavid van Moolenbroek switch(l2info.proto) {
776*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_IPV4:
777*b636d99dSDavid van Moolenbroek /* IP traffic going to the RE would not have a cookie
778*b636d99dSDavid van Moolenbroek * -> this must be incoming IS-IS over PPP
779*b636d99dSDavid van Moolenbroek */
780*b636d99dSDavid van Moolenbroek if (l2info.cookie[4] == (JUNIPER_LSQ_COOKIE_RE|JUNIPER_LSQ_COOKIE_DIR))
781*b636d99dSDavid van Moolenbroek ppp_print(ndo, p, l2info.length);
782*b636d99dSDavid van Moolenbroek else
783*b636d99dSDavid van Moolenbroek ip_print(ndo, p, l2info.length);
784*b636d99dSDavid van Moolenbroek return l2info.header_len;
785*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_IPV6:
786*b636d99dSDavid van Moolenbroek ip6_print(ndo, p,l2info.length);
787*b636d99dSDavid van Moolenbroek return l2info.header_len;
788*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_MPLS:
789*b636d99dSDavid van Moolenbroek mpls_print(ndo, p, l2info.length);
790*b636d99dSDavid van Moolenbroek return l2info.header_len;
791*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_ISO:
792*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p, l2info.length, l2info.caplen);
793*b636d99dSDavid van Moolenbroek return l2info.header_len;
794*b636d99dSDavid van Moolenbroek default:
795*b636d99dSDavid van Moolenbroek break;
796*b636d99dSDavid van Moolenbroek }
797*b636d99dSDavid van Moolenbroek
798*b636d99dSDavid van Moolenbroek /* zero length cookie ? */
799*b636d99dSDavid van Moolenbroek switch (EXTRACT_16BITS(&l2info.cookie)) {
800*b636d99dSDavid van Moolenbroek case PPP_OSI:
801*b636d99dSDavid van Moolenbroek ppp_print(ndo, p - 2, l2info.length + 2);
802*b636d99dSDavid van Moolenbroek break;
803*b636d99dSDavid van Moolenbroek case (PPP_ADDRESS << 8 | PPP_CONTROL): /* fall through */
804*b636d99dSDavid van Moolenbroek default:
805*b636d99dSDavid van Moolenbroek ppp_print(ndo, p, l2info.length);
806*b636d99dSDavid van Moolenbroek break;
807*b636d99dSDavid van Moolenbroek }
808*b636d99dSDavid van Moolenbroek
809*b636d99dSDavid van Moolenbroek return l2info.header_len;
810*b636d99dSDavid van Moolenbroek }
811*b636d99dSDavid van Moolenbroek #endif
812*b636d99dSDavid van Moolenbroek
813*b636d99dSDavid van Moolenbroek
814*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MFR
815*b636d99dSDavid van Moolenbroek u_int
juniper_mfr_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)816*b636d99dSDavid van Moolenbroek juniper_mfr_print(netdissect_options *ndo,
817*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
818*b636d99dSDavid van Moolenbroek {
819*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
820*b636d99dSDavid van Moolenbroek
821*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_MFR;
822*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
823*b636d99dSDavid van Moolenbroek return l2info.header_len;
824*b636d99dSDavid van Moolenbroek
825*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
826*b636d99dSDavid van Moolenbroek
827*b636d99dSDavid van Moolenbroek /* child-link ? */
828*b636d99dSDavid van Moolenbroek if (l2info.cookie_len == 0) {
829*b636d99dSDavid van Moolenbroek mfr_print(ndo, p, l2info.length);
830*b636d99dSDavid van Moolenbroek return l2info.header_len;
831*b636d99dSDavid van Moolenbroek }
832*b636d99dSDavid van Moolenbroek
833*b636d99dSDavid van Moolenbroek /* first try the LSQ protos */
834*b636d99dSDavid van Moolenbroek if (l2info.cookie_len == AS_PIC_COOKIE_LEN) {
835*b636d99dSDavid van Moolenbroek switch(l2info.proto) {
836*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_IPV4:
837*b636d99dSDavid van Moolenbroek ip_print(ndo, p, l2info.length);
838*b636d99dSDavid van Moolenbroek return l2info.header_len;
839*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_IPV6:
840*b636d99dSDavid van Moolenbroek ip6_print(ndo, p,l2info.length);
841*b636d99dSDavid van Moolenbroek return l2info.header_len;
842*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_MPLS:
843*b636d99dSDavid van Moolenbroek mpls_print(ndo, p, l2info.length);
844*b636d99dSDavid van Moolenbroek return l2info.header_len;
845*b636d99dSDavid van Moolenbroek case JUNIPER_LSQ_L3_PROTO_ISO:
846*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p, l2info.length, l2info.caplen);
847*b636d99dSDavid van Moolenbroek return l2info.header_len;
848*b636d99dSDavid van Moolenbroek default:
849*b636d99dSDavid van Moolenbroek break;
850*b636d99dSDavid van Moolenbroek }
851*b636d99dSDavid van Moolenbroek return l2info.header_len;
852*b636d99dSDavid van Moolenbroek }
853*b636d99dSDavid van Moolenbroek
854*b636d99dSDavid van Moolenbroek /* suppress Bundle-ID if frame was captured on a child-link */
855*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag && EXTRACT_32BITS(l2info.cookie) != 1)
856*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Bundle-ID %u, ", l2info.bundle));
857*b636d99dSDavid van Moolenbroek switch (l2info.proto) {
858*b636d99dSDavid van Moolenbroek case (LLCSAP_ISONS<<8 | LLCSAP_ISONS):
859*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
860*b636d99dSDavid van Moolenbroek break;
861*b636d99dSDavid van Moolenbroek case (LLC_UI<<8 | NLPID_Q933):
862*b636d99dSDavid van Moolenbroek case (LLC_UI<<8 | NLPID_IP):
863*b636d99dSDavid van Moolenbroek case (LLC_UI<<8 | NLPID_IP6):
864*b636d99dSDavid van Moolenbroek /* pass IP{4,6} to the OSI layer for proper link-layer printing */
865*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p - 1, l2info.length + 1, l2info.caplen + 1);
866*b636d99dSDavid van Moolenbroek break;
867*b636d99dSDavid van Moolenbroek default:
868*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "unknown protocol 0x%04x, length %u", l2info.proto, l2info.length));
869*b636d99dSDavid van Moolenbroek }
870*b636d99dSDavid van Moolenbroek
871*b636d99dSDavid van Moolenbroek return l2info.header_len;
872*b636d99dSDavid van Moolenbroek }
873*b636d99dSDavid van Moolenbroek #endif
874*b636d99dSDavid van Moolenbroek
875*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MLFR
876*b636d99dSDavid van Moolenbroek u_int
juniper_mlfr_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)877*b636d99dSDavid van Moolenbroek juniper_mlfr_print(netdissect_options *ndo,
878*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
879*b636d99dSDavid van Moolenbroek {
880*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
881*b636d99dSDavid van Moolenbroek
882*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_MLFR;
883*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
884*b636d99dSDavid van Moolenbroek return l2info.header_len;
885*b636d99dSDavid van Moolenbroek
886*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
887*b636d99dSDavid van Moolenbroek
888*b636d99dSDavid van Moolenbroek /* suppress Bundle-ID if frame was captured on a child-link */
889*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag && EXTRACT_32BITS(l2info.cookie) != 1)
890*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Bundle-ID %u, ", l2info.bundle));
891*b636d99dSDavid van Moolenbroek switch (l2info.proto) {
892*b636d99dSDavid van Moolenbroek case (LLC_UI):
893*b636d99dSDavid van Moolenbroek case (LLC_UI<<8):
894*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p, l2info.length, l2info.caplen);
895*b636d99dSDavid van Moolenbroek break;
896*b636d99dSDavid van Moolenbroek case (LLC_UI<<8 | NLPID_Q933):
897*b636d99dSDavid van Moolenbroek case (LLC_UI<<8 | NLPID_IP):
898*b636d99dSDavid van Moolenbroek case (LLC_UI<<8 | NLPID_IP6):
899*b636d99dSDavid van Moolenbroek /* pass IP{4,6} to the OSI layer for proper link-layer printing */
900*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p - 1, l2info.length + 1, l2info.caplen + 1);
901*b636d99dSDavid van Moolenbroek break;
902*b636d99dSDavid van Moolenbroek default:
903*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "unknown protocol 0x%04x, length %u", l2info.proto, l2info.length));
904*b636d99dSDavid van Moolenbroek }
905*b636d99dSDavid van Moolenbroek
906*b636d99dSDavid van Moolenbroek return l2info.header_len;
907*b636d99dSDavid van Moolenbroek }
908*b636d99dSDavid van Moolenbroek #endif
909*b636d99dSDavid van Moolenbroek
910*b636d99dSDavid van Moolenbroek /*
911*b636d99dSDavid van Moolenbroek * ATM1 PIC cookie format
912*b636d99dSDavid van Moolenbroek *
913*b636d99dSDavid van Moolenbroek * +-----+-------------------------+-------------------------------+
914*b636d99dSDavid van Moolenbroek * |fmtid| vc index | channel ID |
915*b636d99dSDavid van Moolenbroek * +-----+-------------------------+-------------------------------+
916*b636d99dSDavid van Moolenbroek */
917*b636d99dSDavid van Moolenbroek
918*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ATM1
919*b636d99dSDavid van Moolenbroek u_int
juniper_atm1_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)920*b636d99dSDavid van Moolenbroek juniper_atm1_print(netdissect_options *ndo,
921*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
922*b636d99dSDavid van Moolenbroek {
923*b636d99dSDavid van Moolenbroek uint16_t extracted_ethertype;
924*b636d99dSDavid van Moolenbroek
925*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
926*b636d99dSDavid van Moolenbroek
927*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_ATM1;
928*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
929*b636d99dSDavid van Moolenbroek return l2info.header_len;
930*b636d99dSDavid van Moolenbroek
931*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
932*b636d99dSDavid van Moolenbroek
933*b636d99dSDavid van Moolenbroek if (l2info.cookie[0] == 0x80) { /* OAM cell ? */
934*b636d99dSDavid van Moolenbroek oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
935*b636d99dSDavid van Moolenbroek return l2info.header_len;
936*b636d99dSDavid van Moolenbroek }
937*b636d99dSDavid van Moolenbroek
938*b636d99dSDavid van Moolenbroek if (EXTRACT_24BITS(p) == 0xfefe03 || /* NLPID encaps ? */
939*b636d99dSDavid van Moolenbroek EXTRACT_24BITS(p) == 0xaaaa03) { /* SNAP encaps ? */
940*b636d99dSDavid van Moolenbroek
941*b636d99dSDavid van Moolenbroek if (llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL,
942*b636d99dSDavid van Moolenbroek &extracted_ethertype) != 0)
943*b636d99dSDavid van Moolenbroek return l2info.header_len;
944*b636d99dSDavid van Moolenbroek }
945*b636d99dSDavid van Moolenbroek
946*b636d99dSDavid van Moolenbroek if (p[0] == 0x03) { /* Cisco style NLPID encaps ? */
947*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
948*b636d99dSDavid van Moolenbroek /* FIXME check if frame was recognized */
949*b636d99dSDavid van Moolenbroek return l2info.header_len;
950*b636d99dSDavid van Moolenbroek }
951*b636d99dSDavid van Moolenbroek
952*b636d99dSDavid van Moolenbroek if (ip_heuristic_guess(ndo, p, l2info.length) != 0) /* last try - vcmux encaps ? */
953*b636d99dSDavid van Moolenbroek return l2info.header_len;
954*b636d99dSDavid van Moolenbroek
955*b636d99dSDavid van Moolenbroek return l2info.header_len;
956*b636d99dSDavid van Moolenbroek }
957*b636d99dSDavid van Moolenbroek #endif
958*b636d99dSDavid van Moolenbroek
959*b636d99dSDavid van Moolenbroek /*
960*b636d99dSDavid van Moolenbroek * ATM2 PIC cookie format
961*b636d99dSDavid van Moolenbroek *
962*b636d99dSDavid van Moolenbroek * +-------------------------------+---------+---+-----+-----------+
963*b636d99dSDavid van Moolenbroek * | channel ID | reserv |AAL| CCRQ| gap cnt |
964*b636d99dSDavid van Moolenbroek * +-------------------------------+---------+---+-----+-----------+
965*b636d99dSDavid van Moolenbroek */
966*b636d99dSDavid van Moolenbroek
967*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ATM2
968*b636d99dSDavid van Moolenbroek u_int
juniper_atm2_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)969*b636d99dSDavid van Moolenbroek juniper_atm2_print(netdissect_options *ndo,
970*b636d99dSDavid van Moolenbroek const struct pcap_pkthdr *h, register const u_char *p)
971*b636d99dSDavid van Moolenbroek {
972*b636d99dSDavid van Moolenbroek uint16_t extracted_ethertype;
973*b636d99dSDavid van Moolenbroek
974*b636d99dSDavid van Moolenbroek struct juniper_l2info_t l2info;
975*b636d99dSDavid van Moolenbroek
976*b636d99dSDavid van Moolenbroek l2info.pictype = DLT_JUNIPER_ATM2;
977*b636d99dSDavid van Moolenbroek if (juniper_parse_header(ndo, p, h, &l2info) == 0)
978*b636d99dSDavid van Moolenbroek return l2info.header_len;
979*b636d99dSDavid van Moolenbroek
980*b636d99dSDavid van Moolenbroek p+=l2info.header_len;
981*b636d99dSDavid van Moolenbroek
982*b636d99dSDavid van Moolenbroek if (l2info.cookie[7] & ATM2_PKT_TYPE_MASK) { /* OAM cell ? */
983*b636d99dSDavid van Moolenbroek oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
984*b636d99dSDavid van Moolenbroek return l2info.header_len;
985*b636d99dSDavid van Moolenbroek }
986*b636d99dSDavid van Moolenbroek
987*b636d99dSDavid van Moolenbroek if (EXTRACT_24BITS(p) == 0xfefe03 || /* NLPID encaps ? */
988*b636d99dSDavid van Moolenbroek EXTRACT_24BITS(p) == 0xaaaa03) { /* SNAP encaps ? */
989*b636d99dSDavid van Moolenbroek
990*b636d99dSDavid van Moolenbroek if (llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL,
991*b636d99dSDavid van Moolenbroek &extracted_ethertype) != 0)
992*b636d99dSDavid van Moolenbroek return l2info.header_len;
993*b636d99dSDavid van Moolenbroek }
994*b636d99dSDavid van Moolenbroek
995*b636d99dSDavid van Moolenbroek if (l2info.direction != JUNIPER_BPF_PKT_IN && /* ether-over-1483 encaps ? */
996*b636d99dSDavid van Moolenbroek (EXTRACT_32BITS(l2info.cookie) & ATM2_GAP_COUNT_MASK)) {
997*b636d99dSDavid van Moolenbroek ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
998*b636d99dSDavid van Moolenbroek return l2info.header_len;
999*b636d99dSDavid van Moolenbroek }
1000*b636d99dSDavid van Moolenbroek
1001*b636d99dSDavid van Moolenbroek if (p[0] == 0x03) { /* Cisco style NLPID encaps ? */
1002*b636d99dSDavid van Moolenbroek isoclns_print(ndo, p + 1, l2info.length - 1, l2info.caplen - 1);
1003*b636d99dSDavid van Moolenbroek /* FIXME check if frame was recognized */
1004*b636d99dSDavid van Moolenbroek return l2info.header_len;
1005*b636d99dSDavid van Moolenbroek }
1006*b636d99dSDavid van Moolenbroek
1007*b636d99dSDavid van Moolenbroek if(juniper_ppp_heuristic_guess(ndo, p, l2info.length) != 0) /* PPPoA vcmux encaps ? */
1008*b636d99dSDavid van Moolenbroek return l2info.header_len;
1009*b636d99dSDavid van Moolenbroek
1010*b636d99dSDavid van Moolenbroek if (ip_heuristic_guess(ndo, p, l2info.length) != 0) /* last try - vcmux encaps ? */
1011*b636d99dSDavid van Moolenbroek return l2info.header_len;
1012*b636d99dSDavid van Moolenbroek
1013*b636d99dSDavid van Moolenbroek return l2info.header_len;
1014*b636d99dSDavid van Moolenbroek }
1015*b636d99dSDavid van Moolenbroek #endif
1016*b636d99dSDavid van Moolenbroek
1017*b636d99dSDavid van Moolenbroek
1018*b636d99dSDavid van Moolenbroek /* try to guess, based on all PPP protos that are supported in
1019*b636d99dSDavid van Moolenbroek * a juniper router if the payload data is encapsulated using PPP */
1020*b636d99dSDavid van Moolenbroek static int
juniper_ppp_heuristic_guess(netdissect_options * ndo,register const u_char * p,u_int length)1021*b636d99dSDavid van Moolenbroek juniper_ppp_heuristic_guess(netdissect_options *ndo,
1022*b636d99dSDavid van Moolenbroek register const u_char *p, u_int length)
1023*b636d99dSDavid van Moolenbroek {
1024*b636d99dSDavid van Moolenbroek switch(EXTRACT_16BITS(p)) {
1025*b636d99dSDavid van Moolenbroek case PPP_IP :
1026*b636d99dSDavid van Moolenbroek case PPP_OSI :
1027*b636d99dSDavid van Moolenbroek case PPP_MPLS_UCAST :
1028*b636d99dSDavid van Moolenbroek case PPP_MPLS_MCAST :
1029*b636d99dSDavid van Moolenbroek case PPP_IPCP :
1030*b636d99dSDavid van Moolenbroek case PPP_OSICP :
1031*b636d99dSDavid van Moolenbroek case PPP_MPLSCP :
1032*b636d99dSDavid van Moolenbroek case PPP_LCP :
1033*b636d99dSDavid van Moolenbroek case PPP_PAP :
1034*b636d99dSDavid van Moolenbroek case PPP_CHAP :
1035*b636d99dSDavid van Moolenbroek case PPP_ML :
1036*b636d99dSDavid van Moolenbroek #ifdef INET6
1037*b636d99dSDavid van Moolenbroek case PPP_IPV6 :
1038*b636d99dSDavid van Moolenbroek case PPP_IPV6CP :
1039*b636d99dSDavid van Moolenbroek #endif
1040*b636d99dSDavid van Moolenbroek ppp_print(ndo, p, length);
1041*b636d99dSDavid van Moolenbroek break;
1042*b636d99dSDavid van Moolenbroek
1043*b636d99dSDavid van Moolenbroek default:
1044*b636d99dSDavid van Moolenbroek return 0; /* did not find a ppp header */
1045*b636d99dSDavid van Moolenbroek break;
1046*b636d99dSDavid van Moolenbroek }
1047*b636d99dSDavid van Moolenbroek return 1; /* we printed a ppp packet */
1048*b636d99dSDavid van Moolenbroek }
1049*b636d99dSDavid van Moolenbroek
1050*b636d99dSDavid van Moolenbroek static int
ip_heuristic_guess(netdissect_options * ndo,register const u_char * p,u_int length)1051*b636d99dSDavid van Moolenbroek ip_heuristic_guess(netdissect_options *ndo,
1052*b636d99dSDavid van Moolenbroek register const u_char *p, u_int length)
1053*b636d99dSDavid van Moolenbroek {
1054*b636d99dSDavid van Moolenbroek switch(p[0]) {
1055*b636d99dSDavid van Moolenbroek case 0x45:
1056*b636d99dSDavid van Moolenbroek case 0x46:
1057*b636d99dSDavid van Moolenbroek case 0x47:
1058*b636d99dSDavid van Moolenbroek case 0x48:
1059*b636d99dSDavid van Moolenbroek case 0x49:
1060*b636d99dSDavid van Moolenbroek case 0x4a:
1061*b636d99dSDavid van Moolenbroek case 0x4b:
1062*b636d99dSDavid van Moolenbroek case 0x4c:
1063*b636d99dSDavid van Moolenbroek case 0x4d:
1064*b636d99dSDavid van Moolenbroek case 0x4e:
1065*b636d99dSDavid van Moolenbroek case 0x4f:
1066*b636d99dSDavid van Moolenbroek ip_print(ndo, p, length);
1067*b636d99dSDavid van Moolenbroek break;
1068*b636d99dSDavid van Moolenbroek case 0x60:
1069*b636d99dSDavid van Moolenbroek case 0x61:
1070*b636d99dSDavid van Moolenbroek case 0x62:
1071*b636d99dSDavid van Moolenbroek case 0x63:
1072*b636d99dSDavid van Moolenbroek case 0x64:
1073*b636d99dSDavid van Moolenbroek case 0x65:
1074*b636d99dSDavid van Moolenbroek case 0x66:
1075*b636d99dSDavid van Moolenbroek case 0x67:
1076*b636d99dSDavid van Moolenbroek case 0x68:
1077*b636d99dSDavid van Moolenbroek case 0x69:
1078*b636d99dSDavid van Moolenbroek case 0x6a:
1079*b636d99dSDavid van Moolenbroek case 0x6b:
1080*b636d99dSDavid van Moolenbroek case 0x6c:
1081*b636d99dSDavid van Moolenbroek case 0x6d:
1082*b636d99dSDavid van Moolenbroek case 0x6e:
1083*b636d99dSDavid van Moolenbroek case 0x6f:
1084*b636d99dSDavid van Moolenbroek ip6_print(ndo, p, length);
1085*b636d99dSDavid van Moolenbroek break;
1086*b636d99dSDavid van Moolenbroek default:
1087*b636d99dSDavid van Moolenbroek return 0; /* did not find a ip header */
1088*b636d99dSDavid van Moolenbroek break;
1089*b636d99dSDavid van Moolenbroek }
1090*b636d99dSDavid van Moolenbroek return 1; /* we printed an v4/v6 packet */
1091*b636d99dSDavid van Moolenbroek }
1092*b636d99dSDavid van Moolenbroek
1093*b636d99dSDavid van Moolenbroek static int
juniper_read_tlv_value(const u_char * p,u_int tlv_type,u_int tlv_len)1094*b636d99dSDavid van Moolenbroek juniper_read_tlv_value(const u_char *p, u_int tlv_type, u_int tlv_len)
1095*b636d99dSDavid van Moolenbroek {
1096*b636d99dSDavid van Moolenbroek int tlv_value;
1097*b636d99dSDavid van Moolenbroek
1098*b636d99dSDavid van Moolenbroek /* TLVs < 128 are little endian encoded */
1099*b636d99dSDavid van Moolenbroek if (tlv_type < 128) {
1100*b636d99dSDavid van Moolenbroek switch (tlv_len) {
1101*b636d99dSDavid van Moolenbroek case 1:
1102*b636d99dSDavid van Moolenbroek tlv_value = *p;
1103*b636d99dSDavid van Moolenbroek break;
1104*b636d99dSDavid van Moolenbroek case 2:
1105*b636d99dSDavid van Moolenbroek tlv_value = EXTRACT_LE_16BITS(p);
1106*b636d99dSDavid van Moolenbroek break;
1107*b636d99dSDavid van Moolenbroek case 3:
1108*b636d99dSDavid van Moolenbroek tlv_value = EXTRACT_LE_24BITS(p);
1109*b636d99dSDavid van Moolenbroek break;
1110*b636d99dSDavid van Moolenbroek case 4:
1111*b636d99dSDavid van Moolenbroek tlv_value = EXTRACT_LE_32BITS(p);
1112*b636d99dSDavid van Moolenbroek break;
1113*b636d99dSDavid van Moolenbroek default:
1114*b636d99dSDavid van Moolenbroek tlv_value = -1;
1115*b636d99dSDavid van Moolenbroek break;
1116*b636d99dSDavid van Moolenbroek }
1117*b636d99dSDavid van Moolenbroek } else {
1118*b636d99dSDavid van Moolenbroek /* TLVs >= 128 are big endian encoded */
1119*b636d99dSDavid van Moolenbroek switch (tlv_len) {
1120*b636d99dSDavid van Moolenbroek case 1:
1121*b636d99dSDavid van Moolenbroek tlv_value = *p;
1122*b636d99dSDavid van Moolenbroek break;
1123*b636d99dSDavid van Moolenbroek case 2:
1124*b636d99dSDavid van Moolenbroek tlv_value = EXTRACT_16BITS(p);
1125*b636d99dSDavid van Moolenbroek break;
1126*b636d99dSDavid van Moolenbroek case 3:
1127*b636d99dSDavid van Moolenbroek tlv_value = EXTRACT_24BITS(p);
1128*b636d99dSDavid van Moolenbroek break;
1129*b636d99dSDavid van Moolenbroek case 4:
1130*b636d99dSDavid van Moolenbroek tlv_value = EXTRACT_32BITS(p);
1131*b636d99dSDavid van Moolenbroek break;
1132*b636d99dSDavid van Moolenbroek default:
1133*b636d99dSDavid van Moolenbroek tlv_value = -1;
1134*b636d99dSDavid van Moolenbroek break;
1135*b636d99dSDavid van Moolenbroek }
1136*b636d99dSDavid van Moolenbroek }
1137*b636d99dSDavid van Moolenbroek return tlv_value;
1138*b636d99dSDavid van Moolenbroek }
1139*b636d99dSDavid van Moolenbroek
1140*b636d99dSDavid van Moolenbroek static int
juniper_parse_header(netdissect_options * ndo,const u_char * p,const struct pcap_pkthdr * h,struct juniper_l2info_t * l2info)1141*b636d99dSDavid van Moolenbroek juniper_parse_header(netdissect_options *ndo,
1142*b636d99dSDavid van Moolenbroek const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info)
1143*b636d99dSDavid van Moolenbroek {
1144*b636d99dSDavid van Moolenbroek const struct juniper_cookie_table_t *lp = juniper_cookie_table;
1145*b636d99dSDavid van Moolenbroek u_int idx, jnx_ext_len, jnx_header_len = 0;
1146*b636d99dSDavid van Moolenbroek uint8_t tlv_type,tlv_len;
1147*b636d99dSDavid van Moolenbroek uint32_t control_word;
1148*b636d99dSDavid van Moolenbroek int tlv_value;
1149*b636d99dSDavid van Moolenbroek const u_char *tptr;
1150*b636d99dSDavid van Moolenbroek
1151*b636d99dSDavid van Moolenbroek
1152*b636d99dSDavid van Moolenbroek l2info->header_len = 0;
1153*b636d99dSDavid van Moolenbroek l2info->cookie_len = 0;
1154*b636d99dSDavid van Moolenbroek l2info->proto = 0;
1155*b636d99dSDavid van Moolenbroek
1156*b636d99dSDavid van Moolenbroek
1157*b636d99dSDavid van Moolenbroek l2info->length = h->len;
1158*b636d99dSDavid van Moolenbroek l2info->caplen = h->caplen;
1159*b636d99dSDavid van Moolenbroek ND_TCHECK2(p[0], 4);
1160*b636d99dSDavid van Moolenbroek l2info->flags = p[3];
1161*b636d99dSDavid van Moolenbroek l2info->direction = p[3]&JUNIPER_BPF_PKT_IN;
1162*b636d99dSDavid van Moolenbroek
1163*b636d99dSDavid van Moolenbroek if (EXTRACT_24BITS(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */
1164*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "no magic-number found!"));
1165*b636d99dSDavid van Moolenbroek return 0;
1166*b636d99dSDavid van Moolenbroek }
1167*b636d99dSDavid van Moolenbroek
1168*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag) /* print direction */
1169*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%3s ", tok2str(juniper_direction_values, "---", l2info->direction)));
1170*b636d99dSDavid van Moolenbroek
1171*b636d99dSDavid van Moolenbroek /* magic number + flags */
1172*b636d99dSDavid van Moolenbroek jnx_header_len = 4;
1173*b636d99dSDavid van Moolenbroek
1174*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1175*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\tJuniper PCAP Flags [%s]",
1176*b636d99dSDavid van Moolenbroek bittok2str(jnx_flag_values, "none", l2info->flags)));
1177*b636d99dSDavid van Moolenbroek
1178*b636d99dSDavid van Moolenbroek /* extensions present ? - calculate how much bytes to skip */
1179*b636d99dSDavid van Moolenbroek if ((l2info->flags & JUNIPER_BPF_EXT ) == JUNIPER_BPF_EXT ) {
1180*b636d99dSDavid van Moolenbroek
1181*b636d99dSDavid van Moolenbroek tptr = p+jnx_header_len;
1182*b636d99dSDavid van Moolenbroek
1183*b636d99dSDavid van Moolenbroek /* ok to read extension length ? */
1184*b636d99dSDavid van Moolenbroek ND_TCHECK2(tptr[0], 2);
1185*b636d99dSDavid van Moolenbroek jnx_ext_len = EXTRACT_16BITS(tptr);
1186*b636d99dSDavid van Moolenbroek jnx_header_len += 2;
1187*b636d99dSDavid van Moolenbroek tptr +=2;
1188*b636d99dSDavid van Moolenbroek
1189*b636d99dSDavid van Moolenbroek /* nail up the total length -
1190*b636d99dSDavid van Moolenbroek * just in case something goes wrong
1191*b636d99dSDavid van Moolenbroek * with TLV parsing */
1192*b636d99dSDavid van Moolenbroek jnx_header_len += jnx_ext_len;
1193*b636d99dSDavid van Moolenbroek
1194*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1195*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", PCAP Extension(s) total length %u", jnx_ext_len));
1196*b636d99dSDavid van Moolenbroek
1197*b636d99dSDavid van Moolenbroek ND_TCHECK2(tptr[0], jnx_ext_len);
1198*b636d99dSDavid van Moolenbroek while (jnx_ext_len > JUNIPER_EXT_TLV_OVERHEAD) {
1199*b636d99dSDavid van Moolenbroek tlv_type = *(tptr++);
1200*b636d99dSDavid van Moolenbroek tlv_len = *(tptr++);
1201*b636d99dSDavid van Moolenbroek tlv_value = 0;
1202*b636d99dSDavid van Moolenbroek
1203*b636d99dSDavid van Moolenbroek /* sanity check */
1204*b636d99dSDavid van Moolenbroek if (tlv_type == 0 || tlv_len == 0)
1205*b636d99dSDavid van Moolenbroek break;
1206*b636d99dSDavid van Moolenbroek
1207*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1208*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t %s Extension TLV #%u, length %u, value ",
1209*b636d99dSDavid van Moolenbroek tok2str(jnx_ext_tlv_values,"Unknown",tlv_type),
1210*b636d99dSDavid van Moolenbroek tlv_type,
1211*b636d99dSDavid van Moolenbroek tlv_len));
1212*b636d99dSDavid van Moolenbroek
1213*b636d99dSDavid van Moolenbroek tlv_value = juniper_read_tlv_value(tptr, tlv_type, tlv_len);
1214*b636d99dSDavid van Moolenbroek switch (tlv_type) {
1215*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_IFD_NAME:
1216*b636d99dSDavid van Moolenbroek /* FIXME */
1217*b636d99dSDavid van Moolenbroek break;
1218*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_IFD_MEDIATYPE:
1219*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE:
1220*b636d99dSDavid van Moolenbroek if (tlv_value != -1) {
1221*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1222*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s (%u)",
1223*b636d99dSDavid van Moolenbroek tok2str(juniper_ifmt_values, "Unknown", tlv_value),
1224*b636d99dSDavid van Moolenbroek tlv_value));
1225*b636d99dSDavid van Moolenbroek }
1226*b636d99dSDavid van Moolenbroek break;
1227*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_IFL_ENCAPS:
1228*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_TTP_IFL_ENCAPS:
1229*b636d99dSDavid van Moolenbroek if (tlv_value != -1) {
1230*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1231*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s (%u)",
1232*b636d99dSDavid van Moolenbroek tok2str(juniper_ifle_values, "Unknown", tlv_value),
1233*b636d99dSDavid van Moolenbroek tlv_value));
1234*b636d99dSDavid van Moolenbroek }
1235*b636d99dSDavid van Moolenbroek break;
1236*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_IFL_IDX: /* fall through */
1237*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_IFL_UNIT:
1238*b636d99dSDavid van Moolenbroek case JUNIPER_EXT_TLV_IFD_IDX:
1239*b636d99dSDavid van Moolenbroek default:
1240*b636d99dSDavid van Moolenbroek if (tlv_value != -1) {
1241*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1242*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%u", tlv_value));
1243*b636d99dSDavid van Moolenbroek }
1244*b636d99dSDavid van Moolenbroek break;
1245*b636d99dSDavid van Moolenbroek }
1246*b636d99dSDavid van Moolenbroek
1247*b636d99dSDavid van Moolenbroek tptr+=tlv_len;
1248*b636d99dSDavid van Moolenbroek jnx_ext_len -= tlv_len+JUNIPER_EXT_TLV_OVERHEAD;
1249*b636d99dSDavid van Moolenbroek }
1250*b636d99dSDavid van Moolenbroek
1251*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
1252*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t-----original packet-----\n\t"));
1253*b636d99dSDavid van Moolenbroek }
1254*b636d99dSDavid van Moolenbroek
1255*b636d99dSDavid van Moolenbroek if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {
1256*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag)
1257*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "no-L2-hdr, "));
1258*b636d99dSDavid van Moolenbroek
1259*b636d99dSDavid van Moolenbroek /* there is no link-layer present -
1260*b636d99dSDavid van Moolenbroek * perform the v4/v6 heuristics
1261*b636d99dSDavid van Moolenbroek * to figure out what it is
1262*b636d99dSDavid van Moolenbroek */
1263*b636d99dSDavid van Moolenbroek ND_TCHECK2(p[jnx_header_len + 4], 1);
1264*b636d99dSDavid van Moolenbroek if (ip_heuristic_guess(ndo, p + jnx_header_len + 4,
1265*b636d99dSDavid van Moolenbroek l2info->length - (jnx_header_len + 4)) == 0)
1266*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "no IP-hdr found!"));
1267*b636d99dSDavid van Moolenbroek
1268*b636d99dSDavid van Moolenbroek l2info->header_len=jnx_header_len+4;
1269*b636d99dSDavid van Moolenbroek return 0; /* stop parsing the output further */
1270*b636d99dSDavid van Moolenbroek
1271*b636d99dSDavid van Moolenbroek }
1272*b636d99dSDavid van Moolenbroek l2info->header_len = jnx_header_len;
1273*b636d99dSDavid van Moolenbroek p+=l2info->header_len;
1274*b636d99dSDavid van Moolenbroek l2info->length -= l2info->header_len;
1275*b636d99dSDavid van Moolenbroek l2info->caplen -= l2info->header_len;
1276*b636d99dSDavid van Moolenbroek
1277*b636d99dSDavid van Moolenbroek /* search through the cookie table and copy values matching for our PIC type */
1278*b636d99dSDavid van Moolenbroek while (lp->s != NULL) {
1279*b636d99dSDavid van Moolenbroek if (lp->pictype == l2info->pictype) {
1280*b636d99dSDavid van Moolenbroek
1281*b636d99dSDavid van Moolenbroek l2info->cookie_len += lp->cookie_len;
1282*b636d99dSDavid van Moolenbroek
1283*b636d99dSDavid van Moolenbroek switch (p[0]) {
1284*b636d99dSDavid van Moolenbroek case LS_COOKIE_ID:
1285*b636d99dSDavid van Moolenbroek l2info->cookie_type = LS_COOKIE_ID;
1286*b636d99dSDavid van Moolenbroek l2info->cookie_len += 2;
1287*b636d99dSDavid van Moolenbroek break;
1288*b636d99dSDavid van Moolenbroek case AS_COOKIE_ID:
1289*b636d99dSDavid van Moolenbroek l2info->cookie_type = AS_COOKIE_ID;
1290*b636d99dSDavid van Moolenbroek l2info->cookie_len = 8;
1291*b636d99dSDavid van Moolenbroek break;
1292*b636d99dSDavid van Moolenbroek
1293*b636d99dSDavid van Moolenbroek default:
1294*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[0];
1295*b636d99dSDavid van Moolenbroek break;
1296*b636d99dSDavid van Moolenbroek }
1297*b636d99dSDavid van Moolenbroek
1298*b636d99dSDavid van Moolenbroek
1299*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MFR
1300*b636d99dSDavid van Moolenbroek /* MFR child links don't carry cookies */
1301*b636d99dSDavid van Moolenbroek if (l2info->pictype == DLT_JUNIPER_MFR &&
1302*b636d99dSDavid van Moolenbroek (p[0] & MFR_BE_MASK) == MFR_BE_MASK) {
1303*b636d99dSDavid van Moolenbroek l2info->cookie_len = 0;
1304*b636d99dSDavid van Moolenbroek }
1305*b636d99dSDavid van Moolenbroek #endif
1306*b636d99dSDavid van Moolenbroek
1307*b636d99dSDavid van Moolenbroek l2info->header_len += l2info->cookie_len;
1308*b636d99dSDavid van Moolenbroek l2info->length -= l2info->cookie_len;
1309*b636d99dSDavid van Moolenbroek l2info->caplen -= l2info->cookie_len;
1310*b636d99dSDavid van Moolenbroek
1311*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag)
1312*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s-PIC, cookie-len %u",
1313*b636d99dSDavid van Moolenbroek lp->s,
1314*b636d99dSDavid van Moolenbroek l2info->cookie_len));
1315*b636d99dSDavid van Moolenbroek
1316*b636d99dSDavid van Moolenbroek if (l2info->cookie_len > 0) {
1317*b636d99dSDavid van Moolenbroek ND_TCHECK2(p[0], l2info->cookie_len);
1318*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag)
1319*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", cookie 0x"));
1320*b636d99dSDavid van Moolenbroek for (idx = 0; idx < l2info->cookie_len; idx++) {
1321*b636d99dSDavid van Moolenbroek l2info->cookie[idx] = p[idx]; /* copy cookie data */
1322*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag) ND_PRINT((ndo, "%02x", p[idx]));
1323*b636d99dSDavid van Moolenbroek }
1324*b636d99dSDavid van Moolenbroek }
1325*b636d99dSDavid van Moolenbroek
1326*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag) ND_PRINT((ndo, ": ")); /* print demarc b/w L2/L3*/
1327*b636d99dSDavid van Moolenbroek
1328*b636d99dSDavid van Moolenbroek
1329*b636d99dSDavid van Moolenbroek l2info->proto = EXTRACT_16BITS(p+l2info->cookie_len);
1330*b636d99dSDavid van Moolenbroek break;
1331*b636d99dSDavid van Moolenbroek }
1332*b636d99dSDavid van Moolenbroek ++lp;
1333*b636d99dSDavid van Moolenbroek }
1334*b636d99dSDavid van Moolenbroek p+=l2info->cookie_len;
1335*b636d99dSDavid van Moolenbroek
1336*b636d99dSDavid van Moolenbroek /* DLT_ specific parsing */
1337*b636d99dSDavid van Moolenbroek switch(l2info->pictype) {
1338*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MLPPP
1339*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_MLPPP:
1340*b636d99dSDavid van Moolenbroek switch (l2info->cookie_type) {
1341*b636d99dSDavid van Moolenbroek case LS_COOKIE_ID:
1342*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[1];
1343*b636d99dSDavid van Moolenbroek break;
1344*b636d99dSDavid van Moolenbroek case AS_COOKIE_ID:
1345*b636d99dSDavid van Moolenbroek l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
1346*b636d99dSDavid van Moolenbroek l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
1347*b636d99dSDavid van Moolenbroek break;
1348*b636d99dSDavid van Moolenbroek default:
1349*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[0];
1350*b636d99dSDavid van Moolenbroek break;
1351*b636d99dSDavid van Moolenbroek }
1352*b636d99dSDavid van Moolenbroek break;
1353*b636d99dSDavid van Moolenbroek #endif
1354*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MLFR
1355*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_MLFR:
1356*b636d99dSDavid van Moolenbroek switch (l2info->cookie_type) {
1357*b636d99dSDavid van Moolenbroek case LS_COOKIE_ID:
1358*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[1];
1359*b636d99dSDavid van Moolenbroek l2info->proto = EXTRACT_16BITS(p);
1360*b636d99dSDavid van Moolenbroek l2info->header_len += 2;
1361*b636d99dSDavid van Moolenbroek l2info->length -= 2;
1362*b636d99dSDavid van Moolenbroek l2info->caplen -= 2;
1363*b636d99dSDavid van Moolenbroek break;
1364*b636d99dSDavid van Moolenbroek case AS_COOKIE_ID:
1365*b636d99dSDavid van Moolenbroek l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
1366*b636d99dSDavid van Moolenbroek l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
1367*b636d99dSDavid van Moolenbroek break;
1368*b636d99dSDavid van Moolenbroek default:
1369*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[0];
1370*b636d99dSDavid van Moolenbroek l2info->header_len += 2;
1371*b636d99dSDavid van Moolenbroek l2info->length -= 2;
1372*b636d99dSDavid van Moolenbroek l2info->caplen -= 2;
1373*b636d99dSDavid van Moolenbroek break;
1374*b636d99dSDavid van Moolenbroek }
1375*b636d99dSDavid van Moolenbroek break;
1376*b636d99dSDavid van Moolenbroek #endif
1377*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_MFR
1378*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_MFR:
1379*b636d99dSDavid van Moolenbroek switch (l2info->cookie_type) {
1380*b636d99dSDavid van Moolenbroek case LS_COOKIE_ID:
1381*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[1];
1382*b636d99dSDavid van Moolenbroek l2info->proto = EXTRACT_16BITS(p);
1383*b636d99dSDavid van Moolenbroek l2info->header_len += 2;
1384*b636d99dSDavid van Moolenbroek l2info->length -= 2;
1385*b636d99dSDavid van Moolenbroek l2info->caplen -= 2;
1386*b636d99dSDavid van Moolenbroek break;
1387*b636d99dSDavid van Moolenbroek case AS_COOKIE_ID:
1388*b636d99dSDavid van Moolenbroek l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;
1389*b636d99dSDavid van Moolenbroek l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
1390*b636d99dSDavid van Moolenbroek break;
1391*b636d99dSDavid van Moolenbroek default:
1392*b636d99dSDavid van Moolenbroek l2info->bundle = l2info->cookie[0];
1393*b636d99dSDavid van Moolenbroek break;
1394*b636d99dSDavid van Moolenbroek }
1395*b636d99dSDavid van Moolenbroek break;
1396*b636d99dSDavid van Moolenbroek #endif
1397*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ATM2
1398*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_ATM2:
1399*b636d99dSDavid van Moolenbroek ND_TCHECK2(p[0], 4);
1400*b636d99dSDavid van Moolenbroek /* ATM cell relay control word present ? */
1401*b636d99dSDavid van Moolenbroek if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {
1402*b636d99dSDavid van Moolenbroek control_word = EXTRACT_32BITS(p);
1403*b636d99dSDavid van Moolenbroek /* some control word heuristics */
1404*b636d99dSDavid van Moolenbroek switch(control_word) {
1405*b636d99dSDavid van Moolenbroek case 0: /* zero control word */
1406*b636d99dSDavid van Moolenbroek case 0x08000000: /* < JUNOS 7.4 control-word */
1407*b636d99dSDavid van Moolenbroek case 0x08380000: /* cntl word plus cell length (56) >= JUNOS 7.4*/
1408*b636d99dSDavid van Moolenbroek l2info->header_len += 4;
1409*b636d99dSDavid van Moolenbroek break;
1410*b636d99dSDavid van Moolenbroek default:
1411*b636d99dSDavid van Moolenbroek break;
1412*b636d99dSDavid van Moolenbroek }
1413*b636d99dSDavid van Moolenbroek
1414*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag)
1415*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "control-word 0x%08x ", control_word));
1416*b636d99dSDavid van Moolenbroek }
1417*b636d99dSDavid van Moolenbroek break;
1418*b636d99dSDavid van Moolenbroek #endif
1419*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_GGSN
1420*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_GGSN:
1421*b636d99dSDavid van Moolenbroek break;
1422*b636d99dSDavid van Moolenbroek #endif
1423*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ATM1
1424*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_ATM1:
1425*b636d99dSDavid van Moolenbroek break;
1426*b636d99dSDavid van Moolenbroek #endif
1427*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_PPP
1428*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_PPP:
1429*b636d99dSDavid van Moolenbroek break;
1430*b636d99dSDavid van Moolenbroek #endif
1431*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_CHDLC
1432*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_CHDLC:
1433*b636d99dSDavid van Moolenbroek break;
1434*b636d99dSDavid van Moolenbroek #endif
1435*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_ETHER
1436*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_ETHER:
1437*b636d99dSDavid van Moolenbroek break;
1438*b636d99dSDavid van Moolenbroek #endif
1439*b636d99dSDavid van Moolenbroek #ifdef DLT_JUNIPER_FRELAY
1440*b636d99dSDavid van Moolenbroek case DLT_JUNIPER_FRELAY:
1441*b636d99dSDavid van Moolenbroek break;
1442*b636d99dSDavid van Moolenbroek #endif
1443*b636d99dSDavid van Moolenbroek
1444*b636d99dSDavid van Moolenbroek default:
1445*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "Unknown Juniper DLT_ type %u: ", l2info->pictype));
1446*b636d99dSDavid van Moolenbroek break;
1447*b636d99dSDavid van Moolenbroek }
1448*b636d99dSDavid van Moolenbroek
1449*b636d99dSDavid van Moolenbroek if (ndo->ndo_eflag > 1)
1450*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "hlen %u, proto 0x%04x, ", l2info->header_len, l2info->proto));
1451*b636d99dSDavid van Moolenbroek
1452*b636d99dSDavid van Moolenbroek return 1; /* everything went ok so far. continue parsing */
1453*b636d99dSDavid van Moolenbroek trunc:
1454*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "[|juniper_hdr], length %u", h->len));
1455*b636d99dSDavid van Moolenbroek return 0;
1456*b636d99dSDavid van Moolenbroek }
1457*b636d99dSDavid van Moolenbroek
1458*b636d99dSDavid van Moolenbroek
1459*b636d99dSDavid van Moolenbroek /*
1460*b636d99dSDavid van Moolenbroek * Local Variables:
1461*b636d99dSDavid van Moolenbroek * c-style: whitesmith
1462*b636d99dSDavid van Moolenbroek * c-basic-offset: 4
1463*b636d99dSDavid van Moolenbroek * End:
1464*b636d99dSDavid van Moolenbroek */
1465