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