1a5779b6eSRui Paulo /* NetBSD: print-juniper.c,v 1.2 2007/07/24 11:53:45 drochner Exp */
2a5779b6eSRui Paulo
31de50e9fSSam Leffler /*
41de50e9fSSam Leffler * Redistribution and use in source and binary forms, with or without
51de50e9fSSam Leffler * modification, are permitted provided that: (1) source code
61de50e9fSSam Leffler * distributions retain the above copyright notice and this paragraph
71de50e9fSSam Leffler * in its entirety, and (2) distributions including binary code include
81de50e9fSSam Leffler * the above copyright notice and this paragraph in its entirety in
91de50e9fSSam Leffler * the documentation or other materials provided with the distribution.
101de50e9fSSam Leffler * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
111de50e9fSSam Leffler * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
121de50e9fSSam Leffler * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
131de50e9fSSam Leffler * FOR A PARTICULAR PURPOSE.
141de50e9fSSam Leffler *
150bff6a5aSEd Maste * Original code by Hannes Gredler (hannes@gredler.at)
161de50e9fSSam Leffler */
171de50e9fSSam Leffler
183340d773SGleb Smirnoff /* \summary: DLT_JUNIPER_* printers */
193340d773SGleb Smirnoff
201de50e9fSSam Leffler #ifndef lint
21a5779b6eSRui Paulo #else
22a5779b6eSRui Paulo __RCSID("NetBSD: print-juniper.c,v 1.3 2007/07/25 06:31:32 dogcow Exp ");
231de50e9fSSam Leffler #endif
241de50e9fSSam Leffler
25ee67461eSJoseph Mingrone #include <config.h>
261de50e9fSSam Leffler
27ee67461eSJoseph Mingrone #include "netdissect-stdinc.h"
281de50e9fSSam Leffler
293340d773SGleb Smirnoff #include <string.h>
303340d773SGleb Smirnoff
31ee67461eSJoseph Mingrone #define ND_LONGJMP_FROM_TCHECK
323340d773SGleb Smirnoff #include "netdissect.h"
33f4d0c64aSSam Leffler #include "addrtoname.h"
341de50e9fSSam Leffler #include "extract.h"
351de50e9fSSam Leffler #include "ppp.h"
361de50e9fSSam Leffler #include "llc.h"
371de50e9fSSam Leffler #include "nlpid.h"
38f4d0c64aSSam Leffler #include "ethertype.h"
39f4d0c64aSSam Leffler #include "atm.h"
401de50e9fSSam Leffler
41ee67461eSJoseph Mingrone /*
42ee67461eSJoseph Mingrone * If none of the Juniper DLT_s are defined, there's nothing to do.
43ee67461eSJoseph Mingrone */
44ee67461eSJoseph Mingrone #if defined(DLT_JUNIPER_GGSN) || defined(DLT_JUNIPER_ES) || \
45ee67461eSJoseph Mingrone defined(DLT_JUNIPER_MONITOR) || defined(DLT_JUNIPER_SERVICES) || \
46ee67461eSJoseph Mingrone defined(DLT_JUNIPER_PPPOE) || defined(DLT_JUNIPER_ETHER) || \
47ee67461eSJoseph Mingrone defined(DLT_JUNIPER_PPP) || defined(DLT_JUNIPER_FRELAY) || \
48ee67461eSJoseph Mingrone defined(DLT_JUNIPER_CHDLC) || defined(DLT_JUNIPER_PPPOE_ATM) || \
49ee67461eSJoseph Mingrone defined(DLT_JUNIPER_MLPPP) || defined(DLT_JUNIPER_MFR) || \
50ee67461eSJoseph Mingrone defined(DLT_JUNIPER_MLFR) || defined(DLT_JUNIPER_ATM1) || \
51ee67461eSJoseph Mingrone defined(DLT_JUNIPER_ATM2)
521de50e9fSSam Leffler #define JUNIPER_BPF_OUT 0 /* Outgoing packet */
531de50e9fSSam Leffler #define JUNIPER_BPF_IN 1 /* Incoming packet */
541de50e9fSSam Leffler #define JUNIPER_BPF_PKT_IN 0x1 /* Incoming packet */
551de50e9fSSam Leffler #define JUNIPER_BPF_NO_L2 0x2 /* L2 header stripped */
56a5779b6eSRui Paulo #define JUNIPER_BPF_IIF 0x4 /* IIF is valid */
57a5779b6eSRui Paulo #define JUNIPER_BPF_FILTER 0x40 /* BPF filtering is supported */
582ebc47dbSSam Leffler #define JUNIPER_BPF_EXT 0x80 /* extensions present */
59f4d0c64aSSam Leffler #define JUNIPER_MGC_NUMBER 0x4d4743 /* = "MGC" */
60f4d0c64aSSam Leffler
612ebc47dbSSam Leffler #define JUNIPER_LSQ_COOKIE_RE (1 << 3)
622ebc47dbSSam Leffler #define JUNIPER_LSQ_COOKIE_DIR (1 << 2)
63f4d0c64aSSam Leffler #define JUNIPER_LSQ_L3_PROTO_SHIFT 4
64f4d0c64aSSam Leffler #define JUNIPER_LSQ_L3_PROTO_MASK (0x17 << JUNIPER_LSQ_L3_PROTO_SHIFT)
65f4d0c64aSSam Leffler #define JUNIPER_LSQ_L3_PROTO_IPV4 (0 << JUNIPER_LSQ_L3_PROTO_SHIFT)
66f4d0c64aSSam Leffler #define JUNIPER_LSQ_L3_PROTO_IPV6 (1 << JUNIPER_LSQ_L3_PROTO_SHIFT)
67f4d0c64aSSam Leffler #define JUNIPER_LSQ_L3_PROTO_MPLS (2 << JUNIPER_LSQ_L3_PROTO_SHIFT)
68f4d0c64aSSam Leffler #define JUNIPER_LSQ_L3_PROTO_ISO (3 << JUNIPER_LSQ_L3_PROTO_SHIFT)
692ebc47dbSSam Leffler #define AS_PIC_COOKIE_LEN 8
70f4d0c64aSSam Leffler
71f4d0c64aSSam Leffler #define JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE 1
72f4d0c64aSSam Leffler #define JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE 2
73f4d0c64aSSam Leffler #define JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE 3
74f4d0c64aSSam Leffler #define JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE 4
75f4d0c64aSSam Leffler #define JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE 5
76f4d0c64aSSam Leffler
77ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_ES
783c602fabSXin LI static const struct tok juniper_ipsec_type_values[] = {
79f4d0c64aSSam Leffler { JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE, "ESP ENCR-AUTH" },
80f4d0c64aSSam Leffler { JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE, "ESP ENCR-AH AUTH" },
81f4d0c64aSSam Leffler { JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE, "ESP AUTH" },
82f4d0c64aSSam Leffler { JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE, "AH AUTH" },
83f4d0c64aSSam Leffler { JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE, "ESP ENCR" },
84f4d0c64aSSam Leffler { 0, NULL}
85f4d0c64aSSam Leffler };
86ee67461eSJoseph Mingrone #endif
87f4d0c64aSSam Leffler
883c602fabSXin LI static const struct tok juniper_direction_values[] = {
89f4d0c64aSSam Leffler { JUNIPER_BPF_IN, "In"},
90f4d0c64aSSam Leffler { JUNIPER_BPF_OUT, "Out"},
91f4d0c64aSSam Leffler { 0, NULL}
92f4d0c64aSSam Leffler };
93f4d0c64aSSam Leffler
94a5779b6eSRui Paulo /* codepoints for encoding extensions to a .pcap file */
95a5779b6eSRui Paulo enum {
96a5779b6eSRui Paulo JUNIPER_EXT_TLV_IFD_IDX = 1,
97a5779b6eSRui Paulo JUNIPER_EXT_TLV_IFD_NAME = 2,
98a5779b6eSRui Paulo JUNIPER_EXT_TLV_IFD_MEDIATYPE = 3,
99a5779b6eSRui Paulo JUNIPER_EXT_TLV_IFL_IDX = 4,
100a5779b6eSRui Paulo JUNIPER_EXT_TLV_IFL_UNIT = 5,
101a5779b6eSRui Paulo JUNIPER_EXT_TLV_IFL_ENCAPS = 6,
102a5779b6eSRui Paulo JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE = 7,
103a5779b6eSRui Paulo JUNIPER_EXT_TLV_TTP_IFL_ENCAPS = 8
104a5779b6eSRui Paulo };
105a5779b6eSRui Paulo
106a5779b6eSRui Paulo /* 1 byte type and 1-byte length */
1073340d773SGleb Smirnoff #define JUNIPER_EXT_TLV_OVERHEAD 2U
108a5779b6eSRui Paulo
1093c602fabSXin LI static const struct tok jnx_ext_tlv_values[] = {
110a5779b6eSRui Paulo { JUNIPER_EXT_TLV_IFD_IDX, "Device Interface Index" },
111a5779b6eSRui Paulo { JUNIPER_EXT_TLV_IFD_NAME,"Device Interface Name" },
112a5779b6eSRui Paulo { JUNIPER_EXT_TLV_IFD_MEDIATYPE, "Device Media Type" },
113a5779b6eSRui Paulo { JUNIPER_EXT_TLV_IFL_IDX, "Logical Interface Index" },
114a5779b6eSRui Paulo { JUNIPER_EXT_TLV_IFL_UNIT,"Logical Unit Number" },
115a5779b6eSRui Paulo { JUNIPER_EXT_TLV_IFL_ENCAPS, "Logical Interface Encapsulation" },
116a5779b6eSRui Paulo { JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE, "TTP derived Device Media Type" },
117a5779b6eSRui Paulo { JUNIPER_EXT_TLV_TTP_IFL_ENCAPS, "TTP derived Logical Interface Encapsulation" },
118a5779b6eSRui Paulo { 0, NULL }
119a5779b6eSRui Paulo };
120a5779b6eSRui Paulo
1213c602fabSXin LI static const struct tok jnx_flag_values[] = {
122a5779b6eSRui Paulo { JUNIPER_BPF_EXT, "Ext" },
123a5779b6eSRui Paulo { JUNIPER_BPF_FILTER, "Filter" },
124a5779b6eSRui Paulo { JUNIPER_BPF_IIF, "IIF" },
125a5779b6eSRui Paulo { JUNIPER_BPF_NO_L2, "no-L2" },
126a5779b6eSRui Paulo { JUNIPER_BPF_PKT_IN, "In" },
127a5779b6eSRui Paulo { 0, NULL }
128a5779b6eSRui Paulo };
129a5779b6eSRui Paulo
130a5779b6eSRui Paulo #define JUNIPER_IFML_ETHER 1
131a5779b6eSRui Paulo #define JUNIPER_IFML_FDDI 2
132a5779b6eSRui Paulo #define JUNIPER_IFML_TOKENRING 3
133a5779b6eSRui Paulo #define JUNIPER_IFML_PPP 4
134a5779b6eSRui Paulo #define JUNIPER_IFML_FRAMERELAY 5
135a5779b6eSRui Paulo #define JUNIPER_IFML_CISCOHDLC 6
136a5779b6eSRui Paulo #define JUNIPER_IFML_SMDSDXI 7
137a5779b6eSRui Paulo #define JUNIPER_IFML_ATMPVC 8
138a5779b6eSRui Paulo #define JUNIPER_IFML_PPP_CCC 9
139a5779b6eSRui Paulo #define JUNIPER_IFML_FRAMERELAY_CCC 10
140a5779b6eSRui Paulo #define JUNIPER_IFML_IPIP 11
141a5779b6eSRui Paulo #define JUNIPER_IFML_GRE 12
142a5779b6eSRui Paulo #define JUNIPER_IFML_PIM 13
143a5779b6eSRui Paulo #define JUNIPER_IFML_PIMD 14
144a5779b6eSRui Paulo #define JUNIPER_IFML_CISCOHDLC_CCC 15
145a5779b6eSRui Paulo #define JUNIPER_IFML_VLAN_CCC 16
146a5779b6eSRui Paulo #define JUNIPER_IFML_MLPPP 17
147a5779b6eSRui Paulo #define JUNIPER_IFML_MLFR 18
148a5779b6eSRui Paulo #define JUNIPER_IFML_ML 19
149a5779b6eSRui Paulo #define JUNIPER_IFML_LSI 20
150a5779b6eSRui Paulo #define JUNIPER_IFML_DFE 21
151a5779b6eSRui Paulo #define JUNIPER_IFML_ATM_CELLRELAY_CCC 22
152a5779b6eSRui Paulo #define JUNIPER_IFML_CRYPTO 23
153a5779b6eSRui Paulo #define JUNIPER_IFML_GGSN 24
154a5779b6eSRui Paulo #define JUNIPER_IFML_LSI_PPP 25
155a5779b6eSRui Paulo #define JUNIPER_IFML_LSI_CISCOHDLC 26
156a5779b6eSRui Paulo #define JUNIPER_IFML_PPP_TCC 27
157a5779b6eSRui Paulo #define JUNIPER_IFML_FRAMERELAY_TCC 28
158a5779b6eSRui Paulo #define JUNIPER_IFML_CISCOHDLC_TCC 29
159a5779b6eSRui Paulo #define JUNIPER_IFML_ETHERNET_CCC 30
160a5779b6eSRui Paulo #define JUNIPER_IFML_VT 31
161a5779b6eSRui Paulo #define JUNIPER_IFML_EXTENDED_VLAN_CCC 32
162a5779b6eSRui Paulo #define JUNIPER_IFML_ETHER_OVER_ATM 33
163a5779b6eSRui Paulo #define JUNIPER_IFML_MONITOR 34
164a5779b6eSRui Paulo #define JUNIPER_IFML_ETHERNET_TCC 35
165a5779b6eSRui Paulo #define JUNIPER_IFML_VLAN_TCC 36
166a5779b6eSRui Paulo #define JUNIPER_IFML_EXTENDED_VLAN_TCC 37
167a5779b6eSRui Paulo #define JUNIPER_IFML_CONTROLLER 38
168a5779b6eSRui Paulo #define JUNIPER_IFML_MFR 39
169a5779b6eSRui Paulo #define JUNIPER_IFML_LS 40
170a5779b6eSRui Paulo #define JUNIPER_IFML_ETHERNET_VPLS 41
171a5779b6eSRui Paulo #define JUNIPER_IFML_ETHERNET_VLAN_VPLS 42
172a5779b6eSRui Paulo #define JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS 43
173a5779b6eSRui Paulo #define JUNIPER_IFML_LT 44
174a5779b6eSRui Paulo #define JUNIPER_IFML_SERVICES 45
175a5779b6eSRui Paulo #define JUNIPER_IFML_ETHER_VPLS_OVER_ATM 46
176a5779b6eSRui Paulo #define JUNIPER_IFML_FR_PORT_CCC 47
177a5779b6eSRui Paulo #define JUNIPER_IFML_FRAMERELAY_EXT_CCC 48
178a5779b6eSRui Paulo #define JUNIPER_IFML_FRAMERELAY_EXT_TCC 49
179a5779b6eSRui Paulo #define JUNIPER_IFML_FRAMERELAY_FLEX 50
180a5779b6eSRui Paulo #define JUNIPER_IFML_GGSNI 51
181a5779b6eSRui Paulo #define JUNIPER_IFML_ETHERNET_FLEX 52
182a5779b6eSRui Paulo #define JUNIPER_IFML_COLLECTOR 53
183a5779b6eSRui Paulo #define JUNIPER_IFML_AGGREGATOR 54
184a5779b6eSRui Paulo #define JUNIPER_IFML_LAPD 55
185a5779b6eSRui Paulo #define JUNIPER_IFML_PPPOE 56
186a5779b6eSRui Paulo #define JUNIPER_IFML_PPP_SUBORDINATE 57
187a5779b6eSRui Paulo #define JUNIPER_IFML_CISCOHDLC_SUBORDINATE 58
188a5779b6eSRui Paulo #define JUNIPER_IFML_DFC 59
189a5779b6eSRui Paulo #define JUNIPER_IFML_PICPEER 60
190a5779b6eSRui Paulo
1913c602fabSXin LI static const struct tok juniper_ifmt_values[] = {
192a5779b6eSRui Paulo { JUNIPER_IFML_ETHER, "Ethernet" },
193a5779b6eSRui Paulo { JUNIPER_IFML_FDDI, "FDDI" },
194a5779b6eSRui Paulo { JUNIPER_IFML_TOKENRING, "Token-Ring" },
195a5779b6eSRui Paulo { JUNIPER_IFML_PPP, "PPP" },
196a5779b6eSRui Paulo { JUNIPER_IFML_PPP_SUBORDINATE, "PPP-Subordinate" },
197a5779b6eSRui Paulo { JUNIPER_IFML_FRAMERELAY, "Frame-Relay" },
198a5779b6eSRui Paulo { JUNIPER_IFML_CISCOHDLC, "Cisco-HDLC" },
199a5779b6eSRui Paulo { JUNIPER_IFML_SMDSDXI, "SMDS-DXI" },
200a5779b6eSRui Paulo { JUNIPER_IFML_ATMPVC, "ATM-PVC" },
201a5779b6eSRui Paulo { JUNIPER_IFML_PPP_CCC, "PPP-CCC" },
202a5779b6eSRui Paulo { JUNIPER_IFML_FRAMERELAY_CCC, "Frame-Relay-CCC" },
203a5779b6eSRui Paulo { JUNIPER_IFML_FRAMERELAY_EXT_CCC, "Extended FR-CCC" },
204a5779b6eSRui Paulo { JUNIPER_IFML_IPIP, "IP-over-IP" },
205a5779b6eSRui Paulo { JUNIPER_IFML_GRE, "GRE" },
206a5779b6eSRui Paulo { JUNIPER_IFML_PIM, "PIM-Encapsulator" },
207a5779b6eSRui Paulo { JUNIPER_IFML_PIMD, "PIM-Decapsulator" },
208a5779b6eSRui Paulo { JUNIPER_IFML_CISCOHDLC_CCC, "Cisco-HDLC-CCC" },
209a5779b6eSRui Paulo { JUNIPER_IFML_VLAN_CCC, "VLAN-CCC" },
210a5779b6eSRui Paulo { JUNIPER_IFML_EXTENDED_VLAN_CCC, "Extended-VLAN-CCC" },
211a5779b6eSRui Paulo { JUNIPER_IFML_MLPPP, "Multilink-PPP" },
212a5779b6eSRui Paulo { JUNIPER_IFML_MLFR, "Multilink-FR" },
213a5779b6eSRui Paulo { JUNIPER_IFML_MFR, "Multilink-FR-UNI-NNI" },
214a5779b6eSRui Paulo { JUNIPER_IFML_ML, "Multilink" },
215a5779b6eSRui Paulo { JUNIPER_IFML_LS, "LinkService" },
216a5779b6eSRui Paulo { JUNIPER_IFML_LSI, "LSI" },
217a5779b6eSRui Paulo { JUNIPER_IFML_ATM_CELLRELAY_CCC, "ATM-CCC-Cell-Relay" },
218a5779b6eSRui Paulo { JUNIPER_IFML_CRYPTO, "IPSEC-over-IP" },
219a5779b6eSRui Paulo { JUNIPER_IFML_GGSN, "GGSN" },
220a5779b6eSRui Paulo { JUNIPER_IFML_PPP_TCC, "PPP-TCC" },
221a5779b6eSRui Paulo { JUNIPER_IFML_FRAMERELAY_TCC, "Frame-Relay-TCC" },
222a5779b6eSRui Paulo { JUNIPER_IFML_FRAMERELAY_EXT_TCC, "Extended FR-TCC" },
223a5779b6eSRui Paulo { JUNIPER_IFML_CISCOHDLC_TCC, "Cisco-HDLC-TCC" },
224a5779b6eSRui Paulo { JUNIPER_IFML_ETHERNET_CCC, "Ethernet-CCC" },
225a5779b6eSRui Paulo { JUNIPER_IFML_VT, "VPN-Loopback-tunnel" },
226a5779b6eSRui Paulo { JUNIPER_IFML_ETHER_OVER_ATM, "Ethernet-over-ATM" },
227a5779b6eSRui Paulo { JUNIPER_IFML_ETHER_VPLS_OVER_ATM, "Ethernet-VPLS-over-ATM" },
228a5779b6eSRui Paulo { JUNIPER_IFML_MONITOR, "Monitor" },
229a5779b6eSRui Paulo { JUNIPER_IFML_ETHERNET_TCC, "Ethernet-TCC" },
230a5779b6eSRui Paulo { JUNIPER_IFML_VLAN_TCC, "VLAN-TCC" },
231a5779b6eSRui Paulo { JUNIPER_IFML_EXTENDED_VLAN_TCC, "Extended-VLAN-TCC" },
232a5779b6eSRui Paulo { JUNIPER_IFML_CONTROLLER, "Controller" },
233a5779b6eSRui Paulo { JUNIPER_IFML_ETHERNET_VPLS, "VPLS" },
234a5779b6eSRui Paulo { JUNIPER_IFML_ETHERNET_VLAN_VPLS, "VLAN-VPLS" },
235a5779b6eSRui Paulo { JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS, "Extended-VLAN-VPLS" },
236a5779b6eSRui Paulo { JUNIPER_IFML_LT, "Logical-tunnel" },
237a5779b6eSRui Paulo { JUNIPER_IFML_SERVICES, "General-Services" },
238a5779b6eSRui Paulo { JUNIPER_IFML_PPPOE, "PPPoE" },
239a5779b6eSRui Paulo { JUNIPER_IFML_ETHERNET_FLEX, "Flexible-Ethernet-Services" },
240a5779b6eSRui Paulo { JUNIPER_IFML_FRAMERELAY_FLEX, "Flexible-FrameRelay" },
241a5779b6eSRui Paulo { JUNIPER_IFML_COLLECTOR, "Flow-collection" },
242a5779b6eSRui Paulo { JUNIPER_IFML_PICPEER, "PIC Peer" },
243a5779b6eSRui Paulo { JUNIPER_IFML_DFC, "Dynamic-Flow-Capture" },
244a5779b6eSRui Paulo {0, NULL}
245a5779b6eSRui Paulo };
246a5779b6eSRui Paulo
247a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_SNAP 2
248a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_NLPID 3
249a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_VCMUX 4
250a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_LLC 5
251a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_PPP_VCMUX 6
252a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_PPP_LLC 7
253a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_PPP_FUNI 8
254a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_CCC 9
255a5779b6eSRui Paulo #define JUNIPER_IFLE_FR_NLPID 10
256a5779b6eSRui Paulo #define JUNIPER_IFLE_FR_SNAP 11
257a5779b6eSRui Paulo #define JUNIPER_IFLE_FR_PPP 12
258a5779b6eSRui Paulo #define JUNIPER_IFLE_FR_CCC 13
259a5779b6eSRui Paulo #define JUNIPER_IFLE_ENET2 14
260a5779b6eSRui Paulo #define JUNIPER_IFLE_IEEE8023_SNAP 15
261a5779b6eSRui Paulo #define JUNIPER_IFLE_IEEE8023_LLC 16
262a5779b6eSRui Paulo #define JUNIPER_IFLE_PPP 17
263a5779b6eSRui Paulo #define JUNIPER_IFLE_CISCOHDLC 18
264a5779b6eSRui Paulo #define JUNIPER_IFLE_PPP_CCC 19
265a5779b6eSRui Paulo #define JUNIPER_IFLE_IPIP_NULL 20
266a5779b6eSRui Paulo #define JUNIPER_IFLE_PIM_NULL 21
267a5779b6eSRui Paulo #define JUNIPER_IFLE_GRE_NULL 22
268a5779b6eSRui Paulo #define JUNIPER_IFLE_GRE_PPP 23
269a5779b6eSRui Paulo #define JUNIPER_IFLE_PIMD_DECAPS 24
270a5779b6eSRui Paulo #define JUNIPER_IFLE_CISCOHDLC_CCC 25
271a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_CISCO_NLPID 26
272a5779b6eSRui Paulo #define JUNIPER_IFLE_VLAN_CCC 27
273a5779b6eSRui Paulo #define JUNIPER_IFLE_MLPPP 28
274a5779b6eSRui Paulo #define JUNIPER_IFLE_MLFR 29
275a5779b6eSRui Paulo #define JUNIPER_IFLE_LSI_NULL 30
276a5779b6eSRui Paulo #define JUNIPER_IFLE_AGGREGATE_UNUSED 31
277a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_CELLRELAY_CCC 32
278a5779b6eSRui Paulo #define JUNIPER_IFLE_CRYPTO 33
279a5779b6eSRui Paulo #define JUNIPER_IFLE_GGSN 34
280a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_TCC 35
281a5779b6eSRui Paulo #define JUNIPER_IFLE_FR_TCC 36
282a5779b6eSRui Paulo #define JUNIPER_IFLE_PPP_TCC 37
283a5779b6eSRui Paulo #define JUNIPER_IFLE_CISCOHDLC_TCC 38
284a5779b6eSRui Paulo #define JUNIPER_IFLE_ETHERNET_CCC 39
285a5779b6eSRui Paulo #define JUNIPER_IFLE_VT 40
286a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_EOA_LLC 41
287a5779b6eSRui Paulo #define JUNIPER_IFLE_EXTENDED_VLAN_CCC 42
288a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_SNAP_TCC 43
289a5779b6eSRui Paulo #define JUNIPER_IFLE_MONITOR 44
290a5779b6eSRui Paulo #define JUNIPER_IFLE_ETHERNET_TCC 45
291a5779b6eSRui Paulo #define JUNIPER_IFLE_VLAN_TCC 46
292a5779b6eSRui Paulo #define JUNIPER_IFLE_EXTENDED_VLAN_TCC 47
293a5779b6eSRui Paulo #define JUNIPER_IFLE_MFR 48
294a5779b6eSRui Paulo #define JUNIPER_IFLE_ETHERNET_VPLS 49
295a5779b6eSRui Paulo #define JUNIPER_IFLE_ETHERNET_VLAN_VPLS 50
296a5779b6eSRui Paulo #define JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS 51
297a5779b6eSRui Paulo #define JUNIPER_IFLE_SERVICES 52
298a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC 53
299a5779b6eSRui Paulo #define JUNIPER_IFLE_FR_PORT_CCC 54
300a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_MLPPP_LLC 55
301a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_EOA_CCC 56
302a5779b6eSRui Paulo #define JUNIPER_IFLE_LT_VLAN 57
303a5779b6eSRui Paulo #define JUNIPER_IFLE_COLLECTOR 58
304a5779b6eSRui Paulo #define JUNIPER_IFLE_AGGREGATOR 59
305a5779b6eSRui Paulo #define JUNIPER_IFLE_LAPD 60
306a5779b6eSRui Paulo #define JUNIPER_IFLE_ATM_PPPOE_LLC 61
307a5779b6eSRui Paulo #define JUNIPER_IFLE_ETHERNET_PPPOE 62
308a5779b6eSRui Paulo #define JUNIPER_IFLE_PPPOE 63
309a5779b6eSRui Paulo #define JUNIPER_IFLE_PPP_SUBORDINATE 64
310a5779b6eSRui Paulo #define JUNIPER_IFLE_CISCOHDLC_SUBORDINATE 65
311a5779b6eSRui Paulo #define JUNIPER_IFLE_DFC 66
312a5779b6eSRui Paulo #define JUNIPER_IFLE_PICPEER 67
313a5779b6eSRui Paulo
3143c602fabSXin LI static const struct tok juniper_ifle_values[] = {
315a5779b6eSRui Paulo { JUNIPER_IFLE_AGGREGATOR, "Aggregator" },
316a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_CCC, "CCC over ATM" },
317a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_CELLRELAY_CCC, "ATM CCC Cell Relay" },
318a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_CISCO_NLPID, "CISCO compatible NLPID" },
319a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_EOA_CCC, "Ethernet over ATM CCC" },
320a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_EOA_LLC, "Ethernet over ATM LLC" },
321a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC, "Ethernet VPLS over ATM LLC" },
322a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_LLC, "ATM LLC" },
323a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_MLPPP_LLC, "MLPPP over ATM LLC" },
324a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_NLPID, "ATM NLPID" },
325a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_PPPOE_LLC, "PPPoE over ATM LLC" },
326a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_PPP_FUNI, "PPP over FUNI" },
327a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_PPP_LLC, "PPP over ATM LLC" },
328a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_PPP_VCMUX, "PPP over ATM VCMUX" },
329a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_SNAP, "ATM SNAP" },
330a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_SNAP_TCC, "ATM SNAP TCC" },
331a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_TCC, "ATM VCMUX TCC" },
332a5779b6eSRui Paulo { JUNIPER_IFLE_ATM_VCMUX, "ATM VCMUX" },
333a5779b6eSRui Paulo { JUNIPER_IFLE_CISCOHDLC, "C-HDLC" },
334a5779b6eSRui Paulo { JUNIPER_IFLE_CISCOHDLC_CCC, "C-HDLC CCC" },
335a5779b6eSRui Paulo { JUNIPER_IFLE_CISCOHDLC_SUBORDINATE, "C-HDLC via dialer" },
336a5779b6eSRui Paulo { JUNIPER_IFLE_CISCOHDLC_TCC, "C-HDLC TCC" },
337a5779b6eSRui Paulo { JUNIPER_IFLE_COLLECTOR, "Collector" },
338a5779b6eSRui Paulo { JUNIPER_IFLE_CRYPTO, "Crypto" },
339a5779b6eSRui Paulo { JUNIPER_IFLE_ENET2, "Ethernet" },
340a5779b6eSRui Paulo { JUNIPER_IFLE_ETHERNET_CCC, "Ethernet CCC" },
341a5779b6eSRui Paulo { JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS, "Extended VLAN VPLS" },
342a5779b6eSRui Paulo { JUNIPER_IFLE_ETHERNET_PPPOE, "PPPoE over Ethernet" },
343a5779b6eSRui Paulo { JUNIPER_IFLE_ETHERNET_TCC, "Ethernet TCC" },
344a5779b6eSRui Paulo { JUNIPER_IFLE_ETHERNET_VLAN_VPLS, "VLAN VPLS" },
345a5779b6eSRui Paulo { JUNIPER_IFLE_ETHERNET_VPLS, "VPLS" },
346a5779b6eSRui Paulo { JUNIPER_IFLE_EXTENDED_VLAN_CCC, "Extended VLAN CCC" },
347a5779b6eSRui Paulo { JUNIPER_IFLE_EXTENDED_VLAN_TCC, "Extended VLAN TCC" },
348a5779b6eSRui Paulo { JUNIPER_IFLE_FR_CCC, "FR CCC" },
349a5779b6eSRui Paulo { JUNIPER_IFLE_FR_NLPID, "FR NLPID" },
350a5779b6eSRui Paulo { JUNIPER_IFLE_FR_PORT_CCC, "FR CCC" },
351a5779b6eSRui Paulo { JUNIPER_IFLE_FR_PPP, "FR PPP" },
352a5779b6eSRui Paulo { JUNIPER_IFLE_FR_SNAP, "FR SNAP" },
353a5779b6eSRui Paulo { JUNIPER_IFLE_FR_TCC, "FR TCC" },
354a5779b6eSRui Paulo { JUNIPER_IFLE_GGSN, "GGSN" },
355a5779b6eSRui Paulo { JUNIPER_IFLE_GRE_NULL, "GRE NULL" },
356a5779b6eSRui Paulo { JUNIPER_IFLE_GRE_PPP, "PPP over GRE" },
357a5779b6eSRui Paulo { JUNIPER_IFLE_IPIP_NULL, "IPIP" },
358a5779b6eSRui Paulo { JUNIPER_IFLE_LAPD, "LAPD" },
359a5779b6eSRui Paulo { JUNIPER_IFLE_LSI_NULL, "LSI Null" },
360a5779b6eSRui Paulo { JUNIPER_IFLE_LT_VLAN, "LT VLAN" },
361a5779b6eSRui Paulo { JUNIPER_IFLE_MFR, "MFR" },
362a5779b6eSRui Paulo { JUNIPER_IFLE_MLFR, "MLFR" },
363a5779b6eSRui Paulo { JUNIPER_IFLE_MLPPP, "MLPPP" },
364a5779b6eSRui Paulo { JUNIPER_IFLE_MONITOR, "Monitor" },
365a5779b6eSRui Paulo { JUNIPER_IFLE_PIMD_DECAPS, "PIMd" },
366a5779b6eSRui Paulo { JUNIPER_IFLE_PIM_NULL, "PIM Null" },
367a5779b6eSRui Paulo { JUNIPER_IFLE_PPP, "PPP" },
368a5779b6eSRui Paulo { JUNIPER_IFLE_PPPOE, "PPPoE" },
369a5779b6eSRui Paulo { JUNIPER_IFLE_PPP_CCC, "PPP CCC" },
370a5779b6eSRui Paulo { JUNIPER_IFLE_PPP_SUBORDINATE, "" },
371a5779b6eSRui Paulo { JUNIPER_IFLE_PPP_TCC, "PPP TCC" },
372a5779b6eSRui Paulo { JUNIPER_IFLE_SERVICES, "General Services" },
373a5779b6eSRui Paulo { JUNIPER_IFLE_VLAN_CCC, "VLAN CCC" },
374a5779b6eSRui Paulo { JUNIPER_IFLE_VLAN_TCC, "VLAN TCC" },
375a5779b6eSRui Paulo { JUNIPER_IFLE_VT, "VT" },
376a5779b6eSRui Paulo {0, NULL}
377a5779b6eSRui Paulo };
378a5779b6eSRui Paulo
379f4d0c64aSSam Leffler struct juniper_cookie_table_t {
3803c602fabSXin LI uint32_t pictype; /* pic type */
3813c602fabSXin LI uint8_t cookie_len; /* cookie len */
382f4d0c64aSSam Leffler const char *s; /* pic name */
383f4d0c64aSSam Leffler };
384f4d0c64aSSam Leffler
3853c602fabSXin LI static const struct juniper_cookie_table_t juniper_cookie_table[] = {
386f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_ATM1
387f4d0c64aSSam Leffler { DLT_JUNIPER_ATM1, 4, "ATM1"},
388f4d0c64aSSam Leffler #endif
389f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_ATM2
390f4d0c64aSSam Leffler { DLT_JUNIPER_ATM2, 8, "ATM2"},
391f4d0c64aSSam Leffler #endif
392f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MLPPP
393f4d0c64aSSam Leffler { DLT_JUNIPER_MLPPP, 2, "MLPPP"},
394f4d0c64aSSam Leffler #endif
395f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MLFR
396f4d0c64aSSam Leffler { DLT_JUNIPER_MLFR, 2, "MLFR"},
397f4d0c64aSSam Leffler #endif
398f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MFR
399f4d0c64aSSam Leffler { DLT_JUNIPER_MFR, 4, "MFR"},
400f4d0c64aSSam Leffler #endif
401f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_PPPOE
402f4d0c64aSSam Leffler { DLT_JUNIPER_PPPOE, 0, "PPPoE"},
403f4d0c64aSSam Leffler #endif
404f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_PPPOE_ATM
405f4d0c64aSSam Leffler { DLT_JUNIPER_PPPOE_ATM, 0, "PPPoE ATM"},
406f4d0c64aSSam Leffler #endif
407f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_GGSN
408f4d0c64aSSam Leffler { DLT_JUNIPER_GGSN, 8, "GGSN"},
409f4d0c64aSSam Leffler #endif
410f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MONITOR
411f4d0c64aSSam Leffler { DLT_JUNIPER_MONITOR, 8, "MONITOR"},
412f4d0c64aSSam Leffler #endif
413f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_SERVICES
414f4d0c64aSSam Leffler { DLT_JUNIPER_SERVICES, 8, "AS"},
415f4d0c64aSSam Leffler #endif
416f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_ES
417f4d0c64aSSam Leffler { DLT_JUNIPER_ES, 0, "ES"},
418f4d0c64aSSam Leffler #endif
419f4d0c64aSSam Leffler { 0, 0, NULL }
420f4d0c64aSSam Leffler };
421f4d0c64aSSam Leffler
422f4d0c64aSSam Leffler struct juniper_l2info_t {
4233c602fabSXin LI uint32_t length;
4243c602fabSXin LI uint32_t caplen;
4253c602fabSXin LI uint32_t pictype;
4263c602fabSXin LI uint8_t direction;
427ee67461eSJoseph Mingrone u_int header_len;
4283c602fabSXin LI uint8_t cookie_len;
4293c602fabSXin LI uint8_t cookie_type;
4303c602fabSXin LI uint8_t cookie[8];
431ee67461eSJoseph Mingrone u_int bundle;
4323c602fabSXin LI uint16_t proto;
4333c602fabSXin LI uint8_t flags;
434f4d0c64aSSam Leffler };
4351de50e9fSSam Leffler
4361de50e9fSSam Leffler #define LS_COOKIE_ID 0x54
437f4d0c64aSSam Leffler #define AS_COOKIE_ID 0x47
438f4d0c64aSSam Leffler #define LS_MLFR_COOKIE_LEN 4
439f4d0c64aSSam Leffler #define ML_MLFR_COOKIE_LEN 2
440f4d0c64aSSam Leffler #define LS_MFR_COOKIE_LEN 6
441f4d0c64aSSam Leffler #define ATM1_COOKIE_LEN 4
442f4d0c64aSSam Leffler #define ATM2_COOKIE_LEN 8
4431de50e9fSSam Leffler
4441de50e9fSSam Leffler #define ATM2_PKT_TYPE_MASK 0x70
4451de50e9fSSam Leffler #define ATM2_GAP_COUNT_MASK 0x3F
4461de50e9fSSam Leffler
447f4d0c64aSSam Leffler #define JUNIPER_PROTO_NULL 1
448f4d0c64aSSam Leffler #define JUNIPER_PROTO_IPV4 2
449f4d0c64aSSam Leffler #define JUNIPER_PROTO_IPV6 6
450f4d0c64aSSam Leffler
4512ebc47dbSSam Leffler #define MFR_BE_MASK 0xc0
4522ebc47dbSSam Leffler
453ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_GGSN
4543c602fabSXin LI static const struct tok juniper_protocol_values[] = {
455f4d0c64aSSam Leffler { JUNIPER_PROTO_NULL, "Null" },
456f4d0c64aSSam Leffler { JUNIPER_PROTO_IPV4, "IPv4" },
457f4d0c64aSSam Leffler { JUNIPER_PROTO_IPV6, "IPv6" },
458f4d0c64aSSam Leffler { 0, NULL}
459f4d0c64aSSam Leffler };
460ee67461eSJoseph Mingrone #endif
461f4d0c64aSSam Leffler
462ee67461eSJoseph Mingrone static int ip_heuristic_guess(netdissect_options *, const u_char *, u_int);
463ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_ATM2
464ee67461eSJoseph Mingrone static int juniper_ppp_heuristic_guess(netdissect_options *, const u_char *, u_int);
465ee67461eSJoseph Mingrone #endif
4663c602fabSXin LI static int juniper_parse_header(netdissect_options *, const u_char *, const struct pcap_pkthdr *, struct juniper_l2info_t *);
4671de50e9fSSam Leffler
468f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_GGSN
469ee67461eSJoseph Mingrone void
juniper_ggsn_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)470ee67461eSJoseph Mingrone juniper_ggsn_if_print(netdissect_options *ndo,
471ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
472f4d0c64aSSam Leffler {
473f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
474f4d0c64aSSam Leffler struct juniper_ggsn_header {
475ee67461eSJoseph Mingrone nd_uint8_t svc_id;
476ee67461eSJoseph Mingrone nd_uint8_t flags_len;
477ee67461eSJoseph Mingrone nd_uint8_t proto;
478ee67461eSJoseph Mingrone nd_uint8_t flags;
479ee67461eSJoseph Mingrone nd_uint16_t vlan_id;
480ee67461eSJoseph Mingrone nd_byte res[2];
481f4d0c64aSSam Leffler };
482f4d0c64aSSam Leffler const struct juniper_ggsn_header *gh;
483ee67461eSJoseph Mingrone uint8_t proto;
484f4d0c64aSSam Leffler
485ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_ggsn";
486ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
487f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_GGSN;
488ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
489ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
490ee67461eSJoseph Mingrone return;
491ee67461eSJoseph Mingrone }
492f4d0c64aSSam Leffler
493f4d0c64aSSam Leffler p+=l2info.header_len;
494a5779b6eSRui Paulo gh = (struct juniper_ggsn_header *)&l2info.cookie;
495f4d0c64aSSam Leffler
496ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
497ee67461eSJoseph Mingrone proto = EXTRACT_U_1(gh->proto);
4983c602fabSXin LI if (ndo->ndo_eflag) {
499ee67461eSJoseph Mingrone ND_PRINT("proto %s (%u), vlan %u: ",
500ee67461eSJoseph Mingrone tok2str(juniper_protocol_values,"Unknown",proto),
501ee67461eSJoseph Mingrone proto,
502ee67461eSJoseph Mingrone EXTRACT_BE_U_2(gh->vlan_id));
503a5779b6eSRui Paulo }
504f4d0c64aSSam Leffler
505ee67461eSJoseph Mingrone switch (proto) {
506f4d0c64aSSam Leffler case JUNIPER_PROTO_IPV4:
5073c602fabSXin LI ip_print(ndo, p, l2info.length);
508f4d0c64aSSam Leffler break;
509f4d0c64aSSam Leffler case JUNIPER_PROTO_IPV6:
5103c602fabSXin LI ip6_print(ndo, p, l2info.length);
511f4d0c64aSSam Leffler break;
512f4d0c64aSSam Leffler default:
5133c602fabSXin LI if (!ndo->ndo_eflag)
514ee67461eSJoseph Mingrone ND_PRINT("unknown GGSN proto (%u)", proto);
515f4d0c64aSSam Leffler }
516f4d0c64aSSam Leffler
517ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
518f4d0c64aSSam Leffler }
519f4d0c64aSSam Leffler #endif
520f4d0c64aSSam Leffler
521f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_ES
522ee67461eSJoseph Mingrone void
juniper_es_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)523ee67461eSJoseph Mingrone juniper_es_if_print(netdissect_options *ndo,
524ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
525f4d0c64aSSam Leffler {
526f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
527f4d0c64aSSam Leffler struct juniper_ipsec_header {
528ee67461eSJoseph Mingrone nd_uint16_t sa_index;
529ee67461eSJoseph Mingrone nd_uint8_t ttl;
530ee67461eSJoseph Mingrone nd_uint8_t type;
531ee67461eSJoseph Mingrone nd_uint32_t spi;
532ee67461eSJoseph Mingrone nd_ipv4 src_ip;
533ee67461eSJoseph Mingrone nd_ipv4 dst_ip;
534f4d0c64aSSam Leffler };
535f4d0c64aSSam Leffler u_int rewrite_len,es_type_bundle;
536f4d0c64aSSam Leffler const struct juniper_ipsec_header *ih;
537f4d0c64aSSam Leffler
538ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_es";
539ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
540f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_ES;
541ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
542ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
543ee67461eSJoseph Mingrone return;
544ee67461eSJoseph Mingrone }
545f4d0c64aSSam Leffler
546f4d0c64aSSam Leffler p+=l2info.header_len;
5473340d773SGleb Smirnoff ih = (const struct juniper_ipsec_header *)p;
548f4d0c64aSSam Leffler
549ee67461eSJoseph Mingrone ND_TCHECK_SIZE(ih);
550ee67461eSJoseph Mingrone switch (GET_U_1(ih->type)) {
551f4d0c64aSSam Leffler case JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE:
552f4d0c64aSSam Leffler case JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE:
553f4d0c64aSSam Leffler rewrite_len = 0;
554f4d0c64aSSam Leffler es_type_bundle = 1;
555f4d0c64aSSam Leffler break;
556f4d0c64aSSam Leffler case JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE:
557f4d0c64aSSam Leffler case JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE:
558f4d0c64aSSam Leffler case JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE:
559f4d0c64aSSam Leffler rewrite_len = 16;
560f4d0c64aSSam Leffler es_type_bundle = 0;
5613c602fabSXin LI break;
562f4d0c64aSSam Leffler default:
563ee67461eSJoseph Mingrone ND_PRINT("ES Invalid type %u, length %u",
564ee67461eSJoseph Mingrone GET_U_1(ih->type),
565ee67461eSJoseph Mingrone l2info.length);
566ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
567ee67461eSJoseph Mingrone return;
568f4d0c64aSSam Leffler }
569f4d0c64aSSam Leffler
570f4d0c64aSSam Leffler l2info.length-=rewrite_len;
571f4d0c64aSSam Leffler p+=rewrite_len;
572f4d0c64aSSam Leffler
5733c602fabSXin LI if (ndo->ndo_eflag) {
574f4d0c64aSSam Leffler if (!es_type_bundle) {
575ee67461eSJoseph Mingrone ND_PRINT("ES SA, index %u, ttl %u type %s (%u), spi %u, Tunnel %s > %s, length %u\n",
576ee67461eSJoseph Mingrone GET_BE_U_2(ih->sa_index),
577ee67461eSJoseph Mingrone GET_U_1(ih->ttl),
578ee67461eSJoseph Mingrone tok2str(juniper_ipsec_type_values,"Unknown",GET_U_1(ih->type)),
579ee67461eSJoseph Mingrone GET_U_1(ih->type),
580ee67461eSJoseph Mingrone GET_BE_U_4(ih->spi),
581ee67461eSJoseph Mingrone GET_IPADDR_STRING(ih->src_ip),
582ee67461eSJoseph Mingrone GET_IPADDR_STRING(ih->dst_ip),
583ee67461eSJoseph Mingrone l2info.length);
584f4d0c64aSSam Leffler } else {
585ee67461eSJoseph Mingrone ND_PRINT("ES SA, index %u, ttl %u type %s (%u), length %u\n",
586ee67461eSJoseph Mingrone GET_BE_U_2(ih->sa_index),
587ee67461eSJoseph Mingrone GET_U_1(ih->ttl),
588ee67461eSJoseph Mingrone tok2str(juniper_ipsec_type_values,"Unknown",GET_U_1(ih->type)),
589ee67461eSJoseph Mingrone GET_U_1(ih->type),
590ee67461eSJoseph Mingrone l2info.length);
591f4d0c64aSSam Leffler }
592f4d0c64aSSam Leffler }
593f4d0c64aSSam Leffler
5943c602fabSXin LI ip_print(ndo, p, l2info.length);
595ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
596f4d0c64aSSam Leffler }
597f4d0c64aSSam Leffler #endif
598f4d0c64aSSam Leffler
599f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MONITOR
600ee67461eSJoseph Mingrone void
juniper_monitor_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)601ee67461eSJoseph Mingrone juniper_monitor_if_print(netdissect_options *ndo,
602ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
603f4d0c64aSSam Leffler {
604f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
605f4d0c64aSSam Leffler struct juniper_monitor_header {
606ee67461eSJoseph Mingrone nd_uint8_t pkt_type;
607ee67461eSJoseph Mingrone nd_byte padding;
608ee67461eSJoseph Mingrone nd_uint16_t iif;
609ee67461eSJoseph Mingrone nd_uint32_t service_id;
610f4d0c64aSSam Leffler };
611f4d0c64aSSam Leffler const struct juniper_monitor_header *mh;
612f4d0c64aSSam Leffler
613ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_monitor";
614ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
615f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_MONITOR;
616ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
617ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
618ee67461eSJoseph Mingrone return;
619ee67461eSJoseph Mingrone }
620f4d0c64aSSam Leffler
621f4d0c64aSSam Leffler p+=l2info.header_len;
6223340d773SGleb Smirnoff mh = (const struct juniper_monitor_header *)p;
623f4d0c64aSSam Leffler
624ee67461eSJoseph Mingrone ND_TCHECK_SIZE(mh);
6253c602fabSXin LI if (ndo->ndo_eflag)
626ee67461eSJoseph Mingrone ND_PRINT("service-id %u, iif %u, pkt-type %u: ",
627ee67461eSJoseph Mingrone GET_BE_U_4(mh->service_id),
628ee67461eSJoseph Mingrone GET_BE_U_2(mh->iif),
629ee67461eSJoseph Mingrone GET_U_1(mh->pkt_type));
630f4d0c64aSSam Leffler
631f4d0c64aSSam Leffler /* no proto field - lets guess by first byte of IP header*/
6323c602fabSXin LI ip_heuristic_guess (ndo, p, l2info.length);
633f4d0c64aSSam Leffler
634ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
635f4d0c64aSSam Leffler }
636f4d0c64aSSam Leffler #endif
637f4d0c64aSSam Leffler
638f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_SERVICES
639ee67461eSJoseph Mingrone void
juniper_services_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)640ee67461eSJoseph Mingrone juniper_services_if_print(netdissect_options *ndo,
641ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
642f4d0c64aSSam Leffler {
643f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
644f4d0c64aSSam Leffler struct juniper_services_header {
645ee67461eSJoseph Mingrone nd_uint8_t svc_id;
646ee67461eSJoseph Mingrone nd_uint8_t flags_len;
647ee67461eSJoseph Mingrone nd_uint16_t svc_set_id;
648ee67461eSJoseph Mingrone nd_byte pad;
649ee67461eSJoseph Mingrone nd_uint24_t dir_iif;
650f4d0c64aSSam Leffler };
651f4d0c64aSSam Leffler const struct juniper_services_header *sh;
652f4d0c64aSSam Leffler
653ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_services";
654ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
655f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_SERVICES;
656ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
657ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
658ee67461eSJoseph Mingrone return;
659ee67461eSJoseph Mingrone }
660f4d0c64aSSam Leffler
661f4d0c64aSSam Leffler p+=l2info.header_len;
6623340d773SGleb Smirnoff sh = (const struct juniper_services_header *)p;
663f4d0c64aSSam Leffler
664ee67461eSJoseph Mingrone ND_TCHECK_SIZE(sh);
6653c602fabSXin LI if (ndo->ndo_eflag)
666ee67461eSJoseph Mingrone ND_PRINT("service-id %u flags 0x%02x service-set-id 0x%04x iif %u: ",
667ee67461eSJoseph Mingrone GET_U_1(sh->svc_id),
668ee67461eSJoseph Mingrone GET_U_1(sh->flags_len),
669ee67461eSJoseph Mingrone GET_BE_U_2(sh->svc_set_id),
670ee67461eSJoseph Mingrone GET_BE_U_3(sh->dir_iif));
671f4d0c64aSSam Leffler
672f4d0c64aSSam Leffler /* no proto field - lets guess by first byte of IP header*/
6733c602fabSXin LI ip_heuristic_guess (ndo, p, l2info.length);
674f4d0c64aSSam Leffler
675ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
676f4d0c64aSSam Leffler }
677f4d0c64aSSam Leffler #endif
678f4d0c64aSSam Leffler
679f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_PPPOE
680ee67461eSJoseph Mingrone void
juniper_pppoe_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)681ee67461eSJoseph Mingrone juniper_pppoe_if_print(netdissect_options *ndo,
682ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
683f4d0c64aSSam Leffler {
684f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
685f4d0c64aSSam Leffler
686ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_pppoe";
687ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
688f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_PPPOE;
689ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
690ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
691ee67461eSJoseph Mingrone return;
692ee67461eSJoseph Mingrone }
693f4d0c64aSSam Leffler
694f4d0c64aSSam Leffler p+=l2info.header_len;
695f4d0c64aSSam Leffler /* this DLT contains nothing but raw ethernet frames */
6963c602fabSXin LI ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
697ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
698f4d0c64aSSam Leffler }
699f4d0c64aSSam Leffler #endif
700f4d0c64aSSam Leffler
7012ebc47dbSSam Leffler #ifdef DLT_JUNIPER_ETHER
702ee67461eSJoseph Mingrone void
juniper_ether_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)703ee67461eSJoseph Mingrone juniper_ether_if_print(netdissect_options *ndo,
704ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
7052ebc47dbSSam Leffler {
7062ebc47dbSSam Leffler struct juniper_l2info_t l2info;
7072ebc47dbSSam Leffler
708ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_ether";
709ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
7102ebc47dbSSam Leffler l2info.pictype = DLT_JUNIPER_ETHER;
711ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
712ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
713ee67461eSJoseph Mingrone return;
714ee67461eSJoseph Mingrone }
7152ebc47dbSSam Leffler
7162ebc47dbSSam Leffler p+=l2info.header_len;
7172ebc47dbSSam Leffler /* this DLT contains nothing but raw Ethernet frames */
718ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len +=
719ee67461eSJoseph Mingrone l2info.header_len +
7203c602fabSXin LI ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
7212ebc47dbSSam Leffler }
7222ebc47dbSSam Leffler #endif
7232ebc47dbSSam Leffler
7242ebc47dbSSam Leffler #ifdef DLT_JUNIPER_PPP
725ee67461eSJoseph Mingrone void
juniper_ppp_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)726ee67461eSJoseph Mingrone juniper_ppp_if_print(netdissect_options *ndo,
727ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
7282ebc47dbSSam Leffler {
7292ebc47dbSSam Leffler struct juniper_l2info_t l2info;
7302ebc47dbSSam Leffler
731ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_ppp";
732ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
7332ebc47dbSSam Leffler l2info.pictype = DLT_JUNIPER_PPP;
734ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
735ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
736ee67461eSJoseph Mingrone return;
737ee67461eSJoseph Mingrone }
7382ebc47dbSSam Leffler
7392ebc47dbSSam Leffler p+=l2info.header_len;
7402ebc47dbSSam Leffler /* this DLT contains nothing but raw ppp frames */
7413c602fabSXin LI ppp_print(ndo, p, l2info.length);
742ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
7432ebc47dbSSam Leffler }
7442ebc47dbSSam Leffler #endif
7452ebc47dbSSam Leffler
7462ebc47dbSSam Leffler #ifdef DLT_JUNIPER_FRELAY
747ee67461eSJoseph Mingrone void
juniper_frelay_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)748ee67461eSJoseph Mingrone juniper_frelay_if_print(netdissect_options *ndo,
749ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
7502ebc47dbSSam Leffler {
7512ebc47dbSSam Leffler struct juniper_l2info_t l2info;
7522ebc47dbSSam Leffler
753ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_frelay";
754ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
7552ebc47dbSSam Leffler l2info.pictype = DLT_JUNIPER_FRELAY;
756ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
757ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
758ee67461eSJoseph Mingrone return;
759ee67461eSJoseph Mingrone }
7602ebc47dbSSam Leffler
7612ebc47dbSSam Leffler p+=l2info.header_len;
7622ebc47dbSSam Leffler /* this DLT contains nothing but raw frame-relay frames */
7633c602fabSXin LI fr_print(ndo, p, l2info.length);
764ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
7652ebc47dbSSam Leffler }
7662ebc47dbSSam Leffler #endif
7672ebc47dbSSam Leffler
7682ebc47dbSSam Leffler #ifdef DLT_JUNIPER_CHDLC
769ee67461eSJoseph Mingrone void
juniper_chdlc_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)770ee67461eSJoseph Mingrone juniper_chdlc_if_print(netdissect_options *ndo,
771ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
7722ebc47dbSSam Leffler {
7732ebc47dbSSam Leffler struct juniper_l2info_t l2info;
7742ebc47dbSSam Leffler
775ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_chdlc";
776ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
7772ebc47dbSSam Leffler l2info.pictype = DLT_JUNIPER_CHDLC;
778ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
779ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
780ee67461eSJoseph Mingrone return;
781ee67461eSJoseph Mingrone }
7822ebc47dbSSam Leffler
7832ebc47dbSSam Leffler p+=l2info.header_len;
7842ebc47dbSSam Leffler /* this DLT contains nothing but raw c-hdlc frames */
7853c602fabSXin LI chdlc_print(ndo, p, l2info.length);
786ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
7872ebc47dbSSam Leffler }
7882ebc47dbSSam Leffler #endif
7892ebc47dbSSam Leffler
790f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_PPPOE_ATM
791ee67461eSJoseph Mingrone void
juniper_pppoe_atm_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)792ee67461eSJoseph Mingrone juniper_pppoe_atm_if_print(netdissect_options *ndo,
793ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
794f4d0c64aSSam Leffler {
795f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
7963c602fabSXin LI uint16_t extracted_ethertype;
797f4d0c64aSSam Leffler
798ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_pppoe_atm";
799ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
800f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_PPPOE_ATM;
801ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
802ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
803ee67461eSJoseph Mingrone return;
804ee67461eSJoseph Mingrone }
805f4d0c64aSSam Leffler
806f4d0c64aSSam Leffler p+=l2info.header_len;
807f4d0c64aSSam Leffler
808ee67461eSJoseph Mingrone extracted_ethertype = GET_BE_U_2(p);
809f4d0c64aSSam Leffler /* this DLT contains nothing but raw PPPoE frames,
810f4d0c64aSSam Leffler * prepended with a type field*/
8113c602fabSXin LI if (ethertype_print(ndo, extracted_ethertype,
812f4d0c64aSSam Leffler p+ETHERTYPE_LEN,
813f4d0c64aSSam Leffler l2info.length-ETHERTYPE_LEN,
8143340d773SGleb Smirnoff l2info.caplen-ETHERTYPE_LEN,
8153340d773SGleb Smirnoff NULL, NULL) == 0)
816f4d0c64aSSam Leffler /* ether_type not known, probably it wasn't one */
817ee67461eSJoseph Mingrone ND_PRINT("unknown ethertype 0x%04x", extracted_ethertype);
818f4d0c64aSSam Leffler
819ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
820f4d0c64aSSam Leffler }
821f4d0c64aSSam Leffler #endif
822f4d0c64aSSam Leffler
823f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MLPPP
824ee67461eSJoseph Mingrone void
juniper_mlppp_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)825ee67461eSJoseph Mingrone juniper_mlppp_if_print(netdissect_options *ndo,
826ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
8271de50e9fSSam Leffler {
828f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
8291de50e9fSSam Leffler
830ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_mlppp";
831ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
832f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_MLPPP;
833ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
834ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
835ee67461eSJoseph Mingrone return;
836ee67461eSJoseph Mingrone }
8371de50e9fSSam Leffler
8381de50e9fSSam Leffler /* suppress Bundle-ID if frame was captured on a child-link
839f4d0c64aSSam Leffler * best indicator if the cookie looks like a proto */
8403c602fabSXin LI if (ndo->ndo_eflag &&
841ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
842ee67461eSJoseph Mingrone EXTRACT_BE_U_2(&l2info.cookie) != PPP_OSI &&
843ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
844ee67461eSJoseph Mingrone EXTRACT_BE_U_2(&l2info.cookie) != (PPP_ADDRESS << 8 | PPP_CONTROL))
845ee67461eSJoseph Mingrone ND_PRINT("Bundle-ID %u: ", l2info.bundle);
8461de50e9fSSam Leffler
847f4d0c64aSSam Leffler p+=l2info.header_len;
848f4d0c64aSSam Leffler
849f4d0c64aSSam Leffler /* first try the LSQ protos */
850f4d0c64aSSam Leffler switch(l2info.proto) {
851f4d0c64aSSam Leffler case JUNIPER_LSQ_L3_PROTO_IPV4:
8522ebc47dbSSam Leffler /* IP traffic going to the RE would not have a cookie
8532ebc47dbSSam Leffler * -> this must be incoming IS-IS over PPP
8542ebc47dbSSam Leffler */
8552ebc47dbSSam Leffler if (l2info.cookie[4] == (JUNIPER_LSQ_COOKIE_RE|JUNIPER_LSQ_COOKIE_DIR))
8563c602fabSXin LI ppp_print(ndo, p, l2info.length);
8572ebc47dbSSam Leffler else
8583c602fabSXin LI ip_print(ndo, p, l2info.length);
859ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
860ee67461eSJoseph Mingrone return;
861f4d0c64aSSam Leffler case JUNIPER_LSQ_L3_PROTO_IPV6:
8623c602fabSXin LI ip6_print(ndo, p,l2info.length);
863ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
864ee67461eSJoseph Mingrone return;
865f4d0c64aSSam Leffler case JUNIPER_LSQ_L3_PROTO_MPLS:
8663c602fabSXin LI mpls_print(ndo, p, l2info.length);
867ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
868ee67461eSJoseph Mingrone return;
869f4d0c64aSSam Leffler case JUNIPER_LSQ_L3_PROTO_ISO:
8700bff6a5aSEd Maste isoclns_print(ndo, p, l2info.length);
871ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
872ee67461eSJoseph Mingrone return;
873f4d0c64aSSam Leffler default:
874f4d0c64aSSam Leffler break;
875f4d0c64aSSam Leffler }
876f4d0c64aSSam Leffler
877f4d0c64aSSam Leffler /* zero length cookie ? */
878ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
879ee67461eSJoseph Mingrone switch (EXTRACT_BE_U_2(&l2info.cookie)) {
8801de50e9fSSam Leffler case PPP_OSI:
8813c602fabSXin LI ppp_print(ndo, p - 2, l2info.length + 2);
8821de50e9fSSam Leffler break;
8831de50e9fSSam Leffler case (PPP_ADDRESS << 8 | PPP_CONTROL): /* fall through */
8841de50e9fSSam Leffler default:
8853c602fabSXin LI ppp_print(ndo, p, l2info.length);
8861de50e9fSSam Leffler break;
8871de50e9fSSam Leffler }
8881de50e9fSSam Leffler
889ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
8901de50e9fSSam Leffler }
891f4d0c64aSSam Leffler #endif
8921de50e9fSSam Leffler
8931de50e9fSSam Leffler
894f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MFR
895ee67461eSJoseph Mingrone void
juniper_mfr_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)896ee67461eSJoseph Mingrone juniper_mfr_if_print(netdissect_options *ndo,
897ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
8981de50e9fSSam Leffler {
899f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
9001de50e9fSSam Leffler
901ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_mfr";
9023340d773SGleb Smirnoff memset(&l2info, 0, sizeof(l2info));
903f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_MFR;
904ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
905ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
906ee67461eSJoseph Mingrone return;
907ee67461eSJoseph Mingrone }
9081de50e9fSSam Leffler
909f4d0c64aSSam Leffler p+=l2info.header_len;
9102ebc47dbSSam Leffler
9112ebc47dbSSam Leffler /* child-link ? */
9122ebc47dbSSam Leffler if (l2info.cookie_len == 0) {
9133c602fabSXin LI mfr_print(ndo, p, l2info.length);
914ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
915ee67461eSJoseph Mingrone return;
9162ebc47dbSSam Leffler }
9172ebc47dbSSam Leffler
9182ebc47dbSSam Leffler /* first try the LSQ protos */
9192ebc47dbSSam Leffler if (l2info.cookie_len == AS_PIC_COOKIE_LEN) {
9202ebc47dbSSam Leffler switch(l2info.proto) {
9212ebc47dbSSam Leffler case JUNIPER_LSQ_L3_PROTO_IPV4:
9223c602fabSXin LI ip_print(ndo, p, l2info.length);
923ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
924ee67461eSJoseph Mingrone return;
9252ebc47dbSSam Leffler case JUNIPER_LSQ_L3_PROTO_IPV6:
9263c602fabSXin LI ip6_print(ndo, p,l2info.length);
927ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
928ee67461eSJoseph Mingrone return;
9292ebc47dbSSam Leffler case JUNIPER_LSQ_L3_PROTO_MPLS:
9303c602fabSXin LI mpls_print(ndo, p, l2info.length);
931ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
932ee67461eSJoseph Mingrone return;
9332ebc47dbSSam Leffler case JUNIPER_LSQ_L3_PROTO_ISO:
9340bff6a5aSEd Maste isoclns_print(ndo, p, l2info.length);
935ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
936ee67461eSJoseph Mingrone return;
9372ebc47dbSSam Leffler default:
9382ebc47dbSSam Leffler break;
9392ebc47dbSSam Leffler }
940ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
941ee67461eSJoseph Mingrone return;
9422ebc47dbSSam Leffler }
9432ebc47dbSSam Leffler
9441de50e9fSSam Leffler /* suppress Bundle-ID if frame was captured on a child-link */
945ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
946ee67461eSJoseph Mingrone if (ndo->ndo_eflag && EXTRACT_BE_U_4(l2info.cookie) != 1)
947ee67461eSJoseph Mingrone ND_PRINT("Bundle-ID %u, ", l2info.bundle);
948f4d0c64aSSam Leffler switch (l2info.proto) {
949f4d0c64aSSam Leffler case (LLCSAP_ISONS<<8 | LLCSAP_ISONS):
950ee67461eSJoseph Mingrone /* At least one byte is required */
951ee67461eSJoseph Mingrone ND_TCHECK_LEN(p, 1);
9520bff6a5aSEd Maste isoclns_print(ndo, p + 1, l2info.length - 1);
9531de50e9fSSam Leffler break;
9541de50e9fSSam Leffler case (LLC_UI<<8 | NLPID_Q933):
9551de50e9fSSam Leffler case (LLC_UI<<8 | NLPID_IP):
9561de50e9fSSam Leffler case (LLC_UI<<8 | NLPID_IP6):
957f4d0c64aSSam Leffler /* pass IP{4,6} to the OSI layer for proper link-layer printing */
9580bff6a5aSEd Maste isoclns_print(ndo, p - 1, l2info.length + 1);
9591de50e9fSSam Leffler break;
9601de50e9fSSam Leffler default:
961ee67461eSJoseph Mingrone ND_PRINT("unknown protocol 0x%04x, length %u", l2info.proto, l2info.length);
9621de50e9fSSam Leffler }
9631de50e9fSSam Leffler
964ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
9651de50e9fSSam Leffler }
966f4d0c64aSSam Leffler #endif
967f4d0c64aSSam Leffler
968f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_MLFR
969ee67461eSJoseph Mingrone void
juniper_mlfr_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)970ee67461eSJoseph Mingrone juniper_mlfr_if_print(netdissect_options *ndo,
971ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
972f4d0c64aSSam Leffler {
973f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
974f4d0c64aSSam Leffler
975ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_mlfr";
976ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
977f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_MLFR;
978ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
979ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
980ee67461eSJoseph Mingrone return;
981ee67461eSJoseph Mingrone }
982f4d0c64aSSam Leffler
983f4d0c64aSSam Leffler p+=l2info.header_len;
984f4d0c64aSSam Leffler
985f4d0c64aSSam Leffler /* suppress Bundle-ID if frame was captured on a child-link */
986ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
987ee67461eSJoseph Mingrone if (ndo->ndo_eflag && EXTRACT_BE_U_4(l2info.cookie) != 1)
988ee67461eSJoseph Mingrone ND_PRINT("Bundle-ID %u, ", l2info.bundle);
989f4d0c64aSSam Leffler switch (l2info.proto) {
990f4d0c64aSSam Leffler case (LLC_UI):
991f4d0c64aSSam Leffler case (LLC_UI<<8):
9920bff6a5aSEd Maste isoclns_print(ndo, p, l2info.length);
993f4d0c64aSSam Leffler break;
994f4d0c64aSSam Leffler case (LLC_UI<<8 | NLPID_Q933):
995f4d0c64aSSam Leffler case (LLC_UI<<8 | NLPID_IP):
996f4d0c64aSSam Leffler case (LLC_UI<<8 | NLPID_IP6):
997f4d0c64aSSam Leffler /* pass IP{4,6} to the OSI layer for proper link-layer printing */
9980bff6a5aSEd Maste isoclns_print(ndo, p - 1, l2info.length + 1);
999f4d0c64aSSam Leffler break;
1000f4d0c64aSSam Leffler default:
1001ee67461eSJoseph Mingrone ND_PRINT("unknown protocol 0x%04x, length %u", l2info.proto, l2info.length);
1002f4d0c64aSSam Leffler }
1003f4d0c64aSSam Leffler
1004ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1005f4d0c64aSSam Leffler }
1006f4d0c64aSSam Leffler #endif
10071de50e9fSSam Leffler
10081de50e9fSSam Leffler /*
10091de50e9fSSam Leffler * ATM1 PIC cookie format
10101de50e9fSSam Leffler *
10111de50e9fSSam Leffler * +-----+-------------------------+-------------------------------+
10121de50e9fSSam Leffler * |fmtid| vc index | channel ID |
10131de50e9fSSam Leffler * +-----+-------------------------+-------------------------------+
10141de50e9fSSam Leffler */
10151de50e9fSSam Leffler
1016f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_ATM1
1017ee67461eSJoseph Mingrone void
juniper_atm1_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)1018ee67461eSJoseph Mingrone juniper_atm1_if_print(netdissect_options *ndo,
1019ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
10201de50e9fSSam Leffler {
10213340d773SGleb Smirnoff int llc_hdrlen;
10221de50e9fSSam Leffler
1023f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
10241de50e9fSSam Leffler
1025ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_atm1";
1026ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
1027f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_ATM1;
1028ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
1029ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1030ee67461eSJoseph Mingrone return;
1031ee67461eSJoseph Mingrone }
10321de50e9fSSam Leffler
1033f4d0c64aSSam Leffler p+=l2info.header_len;
10341de50e9fSSam Leffler
1035f4d0c64aSSam Leffler if (l2info.cookie[0] == 0x80) { /* OAM cell ? */
10363c602fabSXin LI oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
1037ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1038ee67461eSJoseph Mingrone return;
10391de50e9fSSam Leffler }
10401de50e9fSSam Leffler
1041ee67461eSJoseph Mingrone if (GET_BE_U_3(p) == 0xfefe03 || /* NLPID encaps ? */
1042ee67461eSJoseph Mingrone GET_BE_U_3(p) == 0xaaaa03) { /* SNAP encaps ? */
10431de50e9fSSam Leffler
10443340d773SGleb Smirnoff llc_hdrlen = llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
1045ee67461eSJoseph Mingrone if (llc_hdrlen > 0) {
1046ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1047ee67461eSJoseph Mingrone return;
1048ee67461eSJoseph Mingrone }
10491de50e9fSSam Leffler }
10501de50e9fSSam Leffler
1051ee67461eSJoseph Mingrone if (GET_U_1(p) == 0x03) { /* Cisco style NLPID encaps ? */
1052ee67461eSJoseph Mingrone /* At least one byte is required */
1053ee67461eSJoseph Mingrone ND_TCHECK_LEN(p, 1);
10540bff6a5aSEd Maste isoclns_print(ndo, p + 1, l2info.length - 1);
10551de50e9fSSam Leffler /* FIXME check if frame was recognized */
1056ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1057ee67461eSJoseph Mingrone return;
10581de50e9fSSam Leffler }
10591de50e9fSSam Leffler
1060ee67461eSJoseph Mingrone if (ip_heuristic_guess(ndo, p, l2info.length) != 0) { /* last try - vcmux encaps ? */
1061ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1062ee67461eSJoseph Mingrone return;
1063ee67461eSJoseph Mingrone }
10641de50e9fSSam Leffler
1065ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
10661de50e9fSSam Leffler }
1067f4d0c64aSSam Leffler #endif
10681de50e9fSSam Leffler
10691de50e9fSSam Leffler /*
10701de50e9fSSam Leffler * ATM2 PIC cookie format
10711de50e9fSSam Leffler *
10721de50e9fSSam Leffler * +-------------------------------+---------+---+-----+-----------+
10731de50e9fSSam Leffler * | channel ID | reserv |AAL| CCRQ| gap cnt |
10741de50e9fSSam Leffler * +-------------------------------+---------+---+-----+-----------+
10751de50e9fSSam Leffler */
10761de50e9fSSam Leffler
1077f4d0c64aSSam Leffler #ifdef DLT_JUNIPER_ATM2
1078ee67461eSJoseph Mingrone void
juniper_atm2_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)1079ee67461eSJoseph Mingrone juniper_atm2_if_print(netdissect_options *ndo,
1080ee67461eSJoseph Mingrone const struct pcap_pkthdr *h, const u_char *p)
10811de50e9fSSam Leffler {
10823340d773SGleb Smirnoff int llc_hdrlen;
10831de50e9fSSam Leffler
1084f4d0c64aSSam Leffler struct juniper_l2info_t l2info;
10851de50e9fSSam Leffler
1086ee67461eSJoseph Mingrone ndo->ndo_protocol = "juniper_atm2";
1087ee67461eSJoseph Mingrone memset(&l2info, 0, sizeof(l2info));
1088f4d0c64aSSam Leffler l2info.pictype = DLT_JUNIPER_ATM2;
1089ee67461eSJoseph Mingrone if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
1090ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1091ee67461eSJoseph Mingrone return;
1092ee67461eSJoseph Mingrone }
1093f4d0c64aSSam Leffler
1094f4d0c64aSSam Leffler p+=l2info.header_len;
1095f4d0c64aSSam Leffler
1096f4d0c64aSSam Leffler if (l2info.cookie[7] & ATM2_PKT_TYPE_MASK) { /* OAM cell ? */
10973c602fabSXin LI oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
1098ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1099ee67461eSJoseph Mingrone return;
11001de50e9fSSam Leffler }
11011de50e9fSSam Leffler
1102ee67461eSJoseph Mingrone if (GET_BE_U_3(p) == 0xfefe03 || /* NLPID encaps ? */
1103ee67461eSJoseph Mingrone GET_BE_U_3(p) == 0xaaaa03) { /* SNAP encaps ? */
11041de50e9fSSam Leffler
11053340d773SGleb Smirnoff llc_hdrlen = llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
1106ee67461eSJoseph Mingrone if (llc_hdrlen > 0) {
1107ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1108ee67461eSJoseph Mingrone return;
1109ee67461eSJoseph Mingrone }
11101de50e9fSSam Leffler }
11111de50e9fSSam Leffler
1112f4d0c64aSSam Leffler if (l2info.direction != JUNIPER_BPF_PKT_IN && /* ether-over-1483 encaps ? */
1113ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1114ee67461eSJoseph Mingrone (EXTRACT_BE_U_4(l2info.cookie) & ATM2_GAP_COUNT_MASK)) {
11153c602fabSXin LI ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
1116ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1117ee67461eSJoseph Mingrone return;
11181de50e9fSSam Leffler }
11191de50e9fSSam Leffler
1120ee67461eSJoseph Mingrone if (GET_U_1(p) == 0x03) { /* Cisco style NLPID encaps ? */
1121ee67461eSJoseph Mingrone /* At least one byte is required */
1122ee67461eSJoseph Mingrone ND_TCHECK_LEN(p, 1);
11230bff6a5aSEd Maste isoclns_print(ndo, p + 1, l2info.length - 1);
11241de50e9fSSam Leffler /* FIXME check if frame was recognized */
1125ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1126ee67461eSJoseph Mingrone return;
11271de50e9fSSam Leffler }
11281de50e9fSSam Leffler
1129ee67461eSJoseph Mingrone if(juniper_ppp_heuristic_guess(ndo, p, l2info.length) != 0) { /* PPPoA vcmux encaps ? */
1130ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1131ee67461eSJoseph Mingrone return;
11321de50e9fSSam Leffler }
11331de50e9fSSam Leffler
1134ee67461eSJoseph Mingrone if (ip_heuristic_guess(ndo, p, l2info.length) != 0) { /* last try - vcmux encaps ? */
1135ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1136ee67461eSJoseph Mingrone return;
1137ee67461eSJoseph Mingrone }
1138ee67461eSJoseph Mingrone
1139ee67461eSJoseph Mingrone ndo->ndo_ll_hdr_len += l2info.header_len;
1140ee67461eSJoseph Mingrone }
11411de50e9fSSam Leffler
11421de50e9fSSam Leffler /* try to guess, based on all PPP protos that are supported in
11431de50e9fSSam Leffler * a juniper router if the payload data is encapsulated using PPP */
11443c602fabSXin LI static int
juniper_ppp_heuristic_guess(netdissect_options * ndo,const u_char * p,u_int length)11453c602fabSXin LI juniper_ppp_heuristic_guess(netdissect_options *ndo,
1146ee67461eSJoseph Mingrone const u_char *p, u_int length)
11478bdc5a62SPatrick Kelsey {
1148ee67461eSJoseph Mingrone switch(GET_BE_U_2(p)) {
11491de50e9fSSam Leffler case PPP_IP :
11501de50e9fSSam Leffler case PPP_OSI :
11511de50e9fSSam Leffler case PPP_MPLS_UCAST :
11521de50e9fSSam Leffler case PPP_MPLS_MCAST :
11531de50e9fSSam Leffler case PPP_IPCP :
11541de50e9fSSam Leffler case PPP_OSICP :
11551de50e9fSSam Leffler case PPP_MPLSCP :
11561de50e9fSSam Leffler case PPP_LCP :
11571de50e9fSSam Leffler case PPP_PAP :
11581de50e9fSSam Leffler case PPP_CHAP :
11591de50e9fSSam Leffler case PPP_ML :
11601de50e9fSSam Leffler case PPP_IPV6 :
11611de50e9fSSam Leffler case PPP_IPV6CP :
11623c602fabSXin LI ppp_print(ndo, p, length);
11631de50e9fSSam Leffler break;
11641de50e9fSSam Leffler
11651de50e9fSSam Leffler default:
11661de50e9fSSam Leffler return 0; /* did not find a ppp header */
11671de50e9fSSam Leffler break;
11681de50e9fSSam Leffler }
11691de50e9fSSam Leffler return 1; /* we printed a ppp packet */
11701de50e9fSSam Leffler }
1171ee67461eSJoseph Mingrone #endif
11721de50e9fSSam Leffler
11733c602fabSXin LI static int
ip_heuristic_guess(netdissect_options * ndo,const u_char * p,u_int length)11743c602fabSXin LI ip_heuristic_guess(netdissect_options *ndo,
1175ee67461eSJoseph Mingrone const u_char *p, u_int length)
11768bdc5a62SPatrick Kelsey {
1177ee67461eSJoseph Mingrone switch(GET_U_1(p)) {
11781de50e9fSSam Leffler case 0x45:
11791de50e9fSSam Leffler case 0x46:
11801de50e9fSSam Leffler case 0x47:
11811de50e9fSSam Leffler case 0x48:
11821de50e9fSSam Leffler case 0x49:
11831de50e9fSSam Leffler case 0x4a:
11841de50e9fSSam Leffler case 0x4b:
11851de50e9fSSam Leffler case 0x4c:
11861de50e9fSSam Leffler case 0x4d:
11871de50e9fSSam Leffler case 0x4e:
11881de50e9fSSam Leffler case 0x4f:
11893c602fabSXin LI ip_print(ndo, p, length);
11901de50e9fSSam Leffler break;
11911de50e9fSSam Leffler case 0x60:
11921de50e9fSSam Leffler case 0x61:
11931de50e9fSSam Leffler case 0x62:
11941de50e9fSSam Leffler case 0x63:
11951de50e9fSSam Leffler case 0x64:
11961de50e9fSSam Leffler case 0x65:
11971de50e9fSSam Leffler case 0x66:
11981de50e9fSSam Leffler case 0x67:
11991de50e9fSSam Leffler case 0x68:
12001de50e9fSSam Leffler case 0x69:
12011de50e9fSSam Leffler case 0x6a:
12021de50e9fSSam Leffler case 0x6b:
12031de50e9fSSam Leffler case 0x6c:
12041de50e9fSSam Leffler case 0x6d:
12051de50e9fSSam Leffler case 0x6e:
12061de50e9fSSam Leffler case 0x6f:
12073c602fabSXin LI ip6_print(ndo, p, length);
12081de50e9fSSam Leffler break;
12091de50e9fSSam Leffler default:
12101de50e9fSSam Leffler return 0; /* did not find a ip header */
12111de50e9fSSam Leffler break;
12121de50e9fSSam Leffler }
12131de50e9fSSam Leffler return 1; /* we printed an v4/v6 packet */
12141de50e9fSSam Leffler }
12151de50e9fSSam Leffler
12163c602fabSXin LI static int
juniper_read_tlv_value(netdissect_options * ndo,const u_char * p,u_int tlv_type,u_int tlv_len)1217ee67461eSJoseph Mingrone juniper_read_tlv_value(netdissect_options *ndo,
1218ee67461eSJoseph Mingrone const u_char *p, u_int tlv_type, u_int tlv_len)
12198bdc5a62SPatrick Kelsey {
1220a5779b6eSRui Paulo int tlv_value;
1221a5779b6eSRui Paulo
1222a5779b6eSRui Paulo /* TLVs < 128 are little endian encoded */
1223a5779b6eSRui Paulo if (tlv_type < 128) {
1224a5779b6eSRui Paulo switch (tlv_len) {
1225a5779b6eSRui Paulo case 1:
1226ee67461eSJoseph Mingrone tlv_value = GET_U_1(p);
1227a5779b6eSRui Paulo break;
1228a5779b6eSRui Paulo case 2:
1229ee67461eSJoseph Mingrone tlv_value = GET_LE_U_2(p);
1230a5779b6eSRui Paulo break;
1231a5779b6eSRui Paulo case 3:
1232ee67461eSJoseph Mingrone tlv_value = GET_LE_U_3(p);
1233a5779b6eSRui Paulo break;
1234a5779b6eSRui Paulo case 4:
1235ee67461eSJoseph Mingrone tlv_value = GET_LE_U_4(p);
1236a5779b6eSRui Paulo break;
1237a5779b6eSRui Paulo default:
1238a5779b6eSRui Paulo tlv_value = -1;
1239a5779b6eSRui Paulo break;
1240a5779b6eSRui Paulo }
1241a5779b6eSRui Paulo } else {
1242a5779b6eSRui Paulo /* TLVs >= 128 are big endian encoded */
1243a5779b6eSRui Paulo switch (tlv_len) {
1244a5779b6eSRui Paulo case 1:
1245ee67461eSJoseph Mingrone tlv_value = GET_U_1(p);
1246a5779b6eSRui Paulo break;
1247a5779b6eSRui Paulo case 2:
1248ee67461eSJoseph Mingrone tlv_value = GET_BE_U_2(p);
1249a5779b6eSRui Paulo break;
1250a5779b6eSRui Paulo case 3:
1251ee67461eSJoseph Mingrone tlv_value = GET_BE_U_3(p);
1252a5779b6eSRui Paulo break;
1253a5779b6eSRui Paulo case 4:
1254ee67461eSJoseph Mingrone tlv_value = GET_BE_U_4(p);
1255a5779b6eSRui Paulo break;
1256a5779b6eSRui Paulo default:
1257a5779b6eSRui Paulo tlv_value = -1;
1258a5779b6eSRui Paulo break;
1259a5779b6eSRui Paulo }
1260a5779b6eSRui Paulo }
1261a5779b6eSRui Paulo return tlv_value;
1262a5779b6eSRui Paulo }
1263a5779b6eSRui Paulo
12641de50e9fSSam Leffler static int
juniper_parse_header(netdissect_options * ndo,const u_char * p,const struct pcap_pkthdr * h,struct juniper_l2info_t * l2info)12653c602fabSXin LI juniper_parse_header(netdissect_options *ndo,
12668bdc5a62SPatrick Kelsey const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info)
12678bdc5a62SPatrick Kelsey {
1268ee67461eSJoseph Mingrone const struct juniper_cookie_table_t *lp;
1269ee67461eSJoseph Mingrone u_int idx, extension_length, jnx_header_len = 0;
12703c602fabSXin LI uint8_t tlv_type,tlv_len;
1271ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_ATM2
12723c602fabSXin LI uint32_t control_word;
1273ee67461eSJoseph Mingrone #endif
1274a5779b6eSRui Paulo int tlv_value;
1275a5779b6eSRui Paulo const u_char *tptr;
1276a5779b6eSRui Paulo
12771de50e9fSSam Leffler
1278f4d0c64aSSam Leffler l2info->header_len = 0;
1279f4d0c64aSSam Leffler l2info->cookie_len = 0;
1280f4d0c64aSSam Leffler l2info->proto = 0;
12811de50e9fSSam Leffler
1282f4d0c64aSSam Leffler
1283f4d0c64aSSam Leffler l2info->length = h->len;
1284f4d0c64aSSam Leffler l2info->caplen = h->caplen;
1285ee67461eSJoseph Mingrone l2info->flags = GET_U_1(p + 3);
1286ee67461eSJoseph Mingrone l2info->direction = GET_U_1(p + 3) & JUNIPER_BPF_PKT_IN;
1287f4d0c64aSSam Leffler
1288ee67461eSJoseph Mingrone if (GET_BE_U_3(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */
1289ee67461eSJoseph Mingrone ND_PRINT("no magic-number found!");
1290f4d0c64aSSam Leffler return 0;
12912ebc47dbSSam Leffler }
1292f4d0c64aSSam Leffler
12933c602fabSXin LI if (ndo->ndo_eflag) /* print direction */
1294ee67461eSJoseph Mingrone ND_PRINT("%3s ", tok2str(juniper_direction_values, "---", l2info->direction));
12951de50e9fSSam Leffler
1296a5779b6eSRui Paulo /* magic number + flags */
1297a5779b6eSRui Paulo jnx_header_len = 4;
12982ebc47dbSSam Leffler
12993c602fabSXin LI if (ndo->ndo_vflag > 1)
1300ee67461eSJoseph Mingrone ND_PRINT("\n\tJuniper PCAP Flags [%s]",
1301ee67461eSJoseph Mingrone bittok2str(jnx_flag_values, "none", l2info->flags));
1302a5779b6eSRui Paulo
1303a5779b6eSRui Paulo /* extensions present ? - calculate how much bytes to skip */
1304a5779b6eSRui Paulo if ((l2info->flags & JUNIPER_BPF_EXT ) == JUNIPER_BPF_EXT ) {
1305a5779b6eSRui Paulo
1306a5779b6eSRui Paulo tptr = p+jnx_header_len;
1307a5779b6eSRui Paulo
1308a5779b6eSRui Paulo /* ok to read extension length ? */
1309ee67461eSJoseph Mingrone extension_length = GET_BE_U_2(tptr);
1310a5779b6eSRui Paulo jnx_header_len += 2;
1311a5779b6eSRui Paulo tptr +=2;
1312a5779b6eSRui Paulo
1313a5779b6eSRui Paulo /* nail up the total length -
1314a5779b6eSRui Paulo * just in case something goes wrong
1315a5779b6eSRui Paulo * with TLV parsing */
1316ee67461eSJoseph Mingrone jnx_header_len += extension_length;
1317a5779b6eSRui Paulo
13183c602fabSXin LI if (ndo->ndo_vflag > 1)
1319ee67461eSJoseph Mingrone ND_PRINT(", PCAP Extension(s) total length %u", extension_length);
1320a5779b6eSRui Paulo
1321ee67461eSJoseph Mingrone ND_TCHECK_LEN(tptr, extension_length);
1322ee67461eSJoseph Mingrone while (extension_length > JUNIPER_EXT_TLV_OVERHEAD) {
1323ee67461eSJoseph Mingrone tlv_type = GET_U_1(tptr);
1324ee67461eSJoseph Mingrone tptr++;
1325ee67461eSJoseph Mingrone tlv_len = GET_U_1(tptr);
1326ee67461eSJoseph Mingrone tptr++;
1327a5779b6eSRui Paulo tlv_value = 0;
1328a5779b6eSRui Paulo
13293340d773SGleb Smirnoff /* sanity checks */
1330a5779b6eSRui Paulo if (tlv_type == 0 || tlv_len == 0)
1331a5779b6eSRui Paulo break;
1332*0a7e5f1fSJoseph Mingrone ND_ICHECK_U(extension_length, <,
1333*0a7e5f1fSJoseph Mingrone tlv_len + JUNIPER_EXT_TLV_OVERHEAD);
1334a5779b6eSRui Paulo
13353c602fabSXin LI if (ndo->ndo_vflag > 1)
1336ee67461eSJoseph Mingrone ND_PRINT("\n\t %s Extension TLV #%u, length %u, value ",
1337a5779b6eSRui Paulo tok2str(jnx_ext_tlv_values,"Unknown",tlv_type),
1338a5779b6eSRui Paulo tlv_type,
1339ee67461eSJoseph Mingrone tlv_len);
1340a5779b6eSRui Paulo
1341ee67461eSJoseph Mingrone tlv_value = juniper_read_tlv_value(ndo, tptr, tlv_type, tlv_len);
1342a5779b6eSRui Paulo switch (tlv_type) {
1343a5779b6eSRui Paulo case JUNIPER_EXT_TLV_IFD_NAME:
1344a5779b6eSRui Paulo /* FIXME */
1345a5779b6eSRui Paulo break;
1346a5779b6eSRui Paulo case JUNIPER_EXT_TLV_IFD_MEDIATYPE:
1347a5779b6eSRui Paulo case JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE:
1348a5779b6eSRui Paulo if (tlv_value != -1) {
13493c602fabSXin LI if (ndo->ndo_vflag > 1)
1350ee67461eSJoseph Mingrone ND_PRINT("%s (%u)",
1351a5779b6eSRui Paulo tok2str(juniper_ifmt_values, "Unknown", tlv_value),
1352ee67461eSJoseph Mingrone tlv_value);
1353a5779b6eSRui Paulo }
1354a5779b6eSRui Paulo break;
1355a5779b6eSRui Paulo case JUNIPER_EXT_TLV_IFL_ENCAPS:
1356a5779b6eSRui Paulo case JUNIPER_EXT_TLV_TTP_IFL_ENCAPS:
1357a5779b6eSRui Paulo if (tlv_value != -1) {
13583c602fabSXin LI if (ndo->ndo_vflag > 1)
1359ee67461eSJoseph Mingrone ND_PRINT("%s (%u)",
1360a5779b6eSRui Paulo tok2str(juniper_ifle_values, "Unknown", tlv_value),
1361ee67461eSJoseph Mingrone tlv_value);
1362a5779b6eSRui Paulo }
1363a5779b6eSRui Paulo break;
1364a5779b6eSRui Paulo case JUNIPER_EXT_TLV_IFL_IDX: /* fall through */
1365a5779b6eSRui Paulo case JUNIPER_EXT_TLV_IFL_UNIT:
1366a5779b6eSRui Paulo case JUNIPER_EXT_TLV_IFD_IDX:
1367a5779b6eSRui Paulo default:
1368a5779b6eSRui Paulo if (tlv_value != -1) {
13693c602fabSXin LI if (ndo->ndo_vflag > 1)
1370ee67461eSJoseph Mingrone ND_PRINT("%u", tlv_value);
1371a5779b6eSRui Paulo }
1372a5779b6eSRui Paulo break;
1373a5779b6eSRui Paulo }
1374a5779b6eSRui Paulo
1375a5779b6eSRui Paulo tptr+=tlv_len;
1376ee67461eSJoseph Mingrone extension_length -= tlv_len+JUNIPER_EXT_TLV_OVERHEAD;
1377a5779b6eSRui Paulo }
1378a5779b6eSRui Paulo
13793c602fabSXin LI if (ndo->ndo_vflag > 1)
1380ee67461eSJoseph Mingrone ND_PRINT("\n\t-----original packet-----\n\t");
1381a5779b6eSRui Paulo }
1382a5779b6eSRui Paulo
1383a5779b6eSRui Paulo if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {
13843c602fabSXin LI if (ndo->ndo_eflag)
1385ee67461eSJoseph Mingrone ND_PRINT("no-L2-hdr, ");
13861de50e9fSSam Leffler
13871de50e9fSSam Leffler /* there is no link-layer present -
13881de50e9fSSam Leffler * perform the v4/v6 heuristics
13891de50e9fSSam Leffler * to figure out what it is
13901de50e9fSSam Leffler */
1391ee67461eSJoseph Mingrone ND_TCHECK_1(p + (jnx_header_len + 4));
13923c602fabSXin LI if (ip_heuristic_guess(ndo, p + jnx_header_len + 4,
13933c602fabSXin LI l2info->length - (jnx_header_len + 4)) == 0)
1394ee67461eSJoseph Mingrone ND_PRINT("no IP-hdr found!");
13951de50e9fSSam Leffler
1396a5779b6eSRui Paulo l2info->header_len=jnx_header_len+4;
13971de50e9fSSam Leffler return 0; /* stop parsing the output further */
13981de50e9fSSam Leffler
13991de50e9fSSam Leffler }
1400a5779b6eSRui Paulo l2info->header_len = jnx_header_len;
1401f4d0c64aSSam Leffler p+=l2info->header_len;
1402f4d0c64aSSam Leffler l2info->length -= l2info->header_len;
1403f4d0c64aSSam Leffler l2info->caplen -= l2info->header_len;
1404f4d0c64aSSam Leffler
1405ee67461eSJoseph Mingrone /* search through the cookie table for one matching our PIC type */
1406ee67461eSJoseph Mingrone lp = NULL;
1407ee67461eSJoseph Mingrone for (const struct juniper_cookie_table_t *table_lp = juniper_cookie_table;
1408ee67461eSJoseph Mingrone table_lp->s != NULL; table_lp++) {
1409ee67461eSJoseph Mingrone if (table_lp->pictype == l2info->pictype) {
1410ee67461eSJoseph Mingrone lp = table_lp;
1411ee67461eSJoseph Mingrone break;
1412ee67461eSJoseph Mingrone }
1413ee67461eSJoseph Mingrone }
1414f4d0c64aSSam Leffler
1415ee67461eSJoseph Mingrone /* If we found one matching our PIC type, copy its values */
1416ee67461eSJoseph Mingrone if (lp != NULL) {
14172ebc47dbSSam Leffler l2info->cookie_len += lp->cookie_len;
1418f4d0c64aSSam Leffler
1419ee67461eSJoseph Mingrone switch (GET_U_1(p)) {
1420f4d0c64aSSam Leffler case LS_COOKIE_ID:
1421f4d0c64aSSam Leffler l2info->cookie_type = LS_COOKIE_ID;
1422f4d0c64aSSam Leffler l2info->cookie_len += 2;
1423f4d0c64aSSam Leffler break;
1424f4d0c64aSSam Leffler case AS_COOKIE_ID:
1425f4d0c64aSSam Leffler l2info->cookie_type = AS_COOKIE_ID;
14262ebc47dbSSam Leffler l2info->cookie_len = 8;
1427f4d0c64aSSam Leffler break;
1428f4d0c64aSSam Leffler
1429f4d0c64aSSam Leffler default:
1430f4d0c64aSSam Leffler l2info->bundle = l2info->cookie[0];
1431f4d0c64aSSam Leffler break;
1432f4d0c64aSSam Leffler }
1433f4d0c64aSSam Leffler
14342ebc47dbSSam Leffler
14352ebc47dbSSam Leffler #ifdef DLT_JUNIPER_MFR
14362ebc47dbSSam Leffler /* MFR child links don't carry cookies */
14372ebc47dbSSam Leffler if (l2info->pictype == DLT_JUNIPER_MFR &&
1438ee67461eSJoseph Mingrone (GET_U_1(p) & MFR_BE_MASK) == MFR_BE_MASK) {
14392ebc47dbSSam Leffler l2info->cookie_len = 0;
14402ebc47dbSSam Leffler }
14412ebc47dbSSam Leffler #endif
14422ebc47dbSSam Leffler
14432ebc47dbSSam Leffler l2info->header_len += l2info->cookie_len;
14442ebc47dbSSam Leffler l2info->length -= l2info->cookie_len;
14452ebc47dbSSam Leffler l2info->caplen -= l2info->cookie_len;
14462ebc47dbSSam Leffler
14473c602fabSXin LI if (ndo->ndo_eflag)
1448ee67461eSJoseph Mingrone ND_PRINT("%s-PIC, cookie-len %u",
1449f4d0c64aSSam Leffler lp->s,
1450ee67461eSJoseph Mingrone l2info->cookie_len);
1451f4d0c64aSSam Leffler
145239e421e8SCy Schubert if (l2info->cookie_len > 8) {
1453ee67461eSJoseph Mingrone nd_print_invalid(ndo);
145439e421e8SCy Schubert return 0;
145539e421e8SCy Schubert }
145639e421e8SCy Schubert
1457f4d0c64aSSam Leffler if (l2info->cookie_len > 0) {
1458ee67461eSJoseph Mingrone ND_TCHECK_LEN(p, l2info->cookie_len);
14593c602fabSXin LI if (ndo->ndo_eflag)
1460ee67461eSJoseph Mingrone ND_PRINT(", cookie 0x");
1461f4d0c64aSSam Leffler for (idx = 0; idx < l2info->cookie_len; idx++) {
1462ee67461eSJoseph Mingrone l2info->cookie[idx] = GET_U_1(p + idx); /* copy cookie data */
1463ee67461eSJoseph Mingrone if (ndo->ndo_eflag) ND_PRINT("%02x", GET_U_1(p + idx));
1464f4d0c64aSSam Leffler }
1465f4d0c64aSSam Leffler }
1466f4d0c64aSSam Leffler
1467ee67461eSJoseph Mingrone if (ndo->ndo_eflag) ND_PRINT(": "); /* print demarc b/w L2/L3*/
1468f4d0c64aSSam Leffler
1469f4d0c64aSSam Leffler
1470ee67461eSJoseph Mingrone l2info->proto = GET_BE_U_2(p + l2info->cookie_len);
1471f4d0c64aSSam Leffler }
1472f4d0c64aSSam Leffler p+=l2info->cookie_len;
1473f4d0c64aSSam Leffler
1474f4d0c64aSSam Leffler /* DLT_ specific parsing */
1475f4d0c64aSSam Leffler switch(l2info->pictype) {
14762ebc47dbSSam Leffler #ifdef DLT_JUNIPER_MLPPP
1477f4d0c64aSSam Leffler case DLT_JUNIPER_MLPPP:
1478f4d0c64aSSam Leffler switch (l2info->cookie_type) {
1479f4d0c64aSSam Leffler case LS_COOKIE_ID:
1480f4d0c64aSSam Leffler l2info->bundle = l2info->cookie[1];
1481f4d0c64aSSam Leffler break;
1482f4d0c64aSSam Leffler case AS_COOKIE_ID:
1483ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1484ee67461eSJoseph Mingrone l2info->bundle = (EXTRACT_BE_U_2(&l2info->cookie[6])>>3)&0xfff;
1485f4d0c64aSSam Leffler l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
1486f4d0c64aSSam Leffler break;
1487f4d0c64aSSam Leffler default:
1488f4d0c64aSSam Leffler l2info->bundle = l2info->cookie[0];
1489f4d0c64aSSam Leffler break;
1490f4d0c64aSSam Leffler }
1491f4d0c64aSSam Leffler break;
14922ebc47dbSSam Leffler #endif
14932ebc47dbSSam Leffler #ifdef DLT_JUNIPER_MLFR
14942ebc47dbSSam Leffler case DLT_JUNIPER_MLFR:
1495f4d0c64aSSam Leffler switch (l2info->cookie_type) {
1496f4d0c64aSSam Leffler case LS_COOKIE_ID:
1497f4d0c64aSSam Leffler l2info->bundle = l2info->cookie[1];
1498ee67461eSJoseph Mingrone l2info->proto = GET_BE_U_2(p);
1499f4d0c64aSSam Leffler l2info->header_len += 2;
1500f4d0c64aSSam Leffler l2info->length -= 2;
1501f4d0c64aSSam Leffler l2info->caplen -= 2;
1502f4d0c64aSSam Leffler break;
15032ebc47dbSSam Leffler case AS_COOKIE_ID:
1504ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1505ee67461eSJoseph Mingrone l2info->bundle = (EXTRACT_BE_U_2(&l2info->cookie[6])>>3)&0xfff;
15062ebc47dbSSam Leffler l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
15072ebc47dbSSam Leffler break;
15082ebc47dbSSam Leffler default:
15092ebc47dbSSam Leffler l2info->bundle = l2info->cookie[0];
15102ebc47dbSSam Leffler l2info->header_len += 2;
15112ebc47dbSSam Leffler l2info->length -= 2;
15122ebc47dbSSam Leffler l2info->caplen -= 2;
15132ebc47dbSSam Leffler break;
15142ebc47dbSSam Leffler }
15152ebc47dbSSam Leffler break;
15162ebc47dbSSam Leffler #endif
15172ebc47dbSSam Leffler #ifdef DLT_JUNIPER_MFR
15182ebc47dbSSam Leffler case DLT_JUNIPER_MFR:
15192ebc47dbSSam Leffler switch (l2info->cookie_type) {
15202ebc47dbSSam Leffler case LS_COOKIE_ID:
15212ebc47dbSSam Leffler l2info->bundle = l2info->cookie[1];
1522ee67461eSJoseph Mingrone l2info->proto = GET_BE_U_2(p);
15232ebc47dbSSam Leffler l2info->header_len += 2;
15242ebc47dbSSam Leffler l2info->length -= 2;
15252ebc47dbSSam Leffler l2info->caplen -= 2;
15262ebc47dbSSam Leffler break;
15272ebc47dbSSam Leffler case AS_COOKIE_ID:
1528ee67461eSJoseph Mingrone /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1529ee67461eSJoseph Mingrone l2info->bundle = (EXTRACT_BE_U_2(&l2info->cookie[6])>>3)&0xfff;
15302ebc47dbSSam Leffler l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
15312ebc47dbSSam Leffler break;
15322ebc47dbSSam Leffler default:
15332ebc47dbSSam Leffler l2info->bundle = l2info->cookie[0];
15342ebc47dbSSam Leffler break;
15352ebc47dbSSam Leffler }
15362ebc47dbSSam Leffler break;
15372ebc47dbSSam Leffler #endif
15382ebc47dbSSam Leffler #ifdef DLT_JUNIPER_ATM2
1539f4d0c64aSSam Leffler case DLT_JUNIPER_ATM2:
1540ee67461eSJoseph Mingrone ND_TCHECK_4(p);
1541f4d0c64aSSam Leffler /* ATM cell relay control word present ? */
1542b5bfcb5dSMax Laier if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {
1543ee67461eSJoseph Mingrone control_word = GET_BE_U_4(p);
1544b5bfcb5dSMax Laier /* some control word heuristics */
1545b5bfcb5dSMax Laier switch(control_word) {
1546b5bfcb5dSMax Laier case 0: /* zero control word */
1547b5bfcb5dSMax Laier case 0x08000000: /* < JUNOS 7.4 control-word */
1548b5bfcb5dSMax Laier case 0x08380000: /* cntl word plus cell length (56) >= JUNOS 7.4*/
1549f4d0c64aSSam Leffler l2info->header_len += 4;
1550b5bfcb5dSMax Laier break;
1551b5bfcb5dSMax Laier default:
1552b5bfcb5dSMax Laier break;
1553b5bfcb5dSMax Laier }
1554b5bfcb5dSMax Laier
15553c602fabSXin LI if (ndo->ndo_eflag)
1556ee67461eSJoseph Mingrone ND_PRINT("control-word 0x%08x ", control_word);
1557f4d0c64aSSam Leffler }
1558f4d0c64aSSam Leffler break;
15592ebc47dbSSam Leffler #endif
1560ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_ES
1561ee67461eSJoseph Mingrone case DLT_JUNIPER_ES:
1562ee67461eSJoseph Mingrone break;
1563ee67461eSJoseph Mingrone #endif
1564a5779b6eSRui Paulo #ifdef DLT_JUNIPER_GGSN
1565a5779b6eSRui Paulo case DLT_JUNIPER_GGSN:
1566a5779b6eSRui Paulo break;
1567a5779b6eSRui Paulo #endif
1568ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_SERVICES
1569ee67461eSJoseph Mingrone case DLT_JUNIPER_SERVICES:
1570ee67461eSJoseph Mingrone break;
1571ee67461eSJoseph Mingrone #endif
15722ebc47dbSSam Leffler #ifdef DLT_JUNIPER_ATM1
1573f4d0c64aSSam Leffler case DLT_JUNIPER_ATM1:
15742ebc47dbSSam Leffler break;
15752ebc47dbSSam Leffler #endif
1576b5bfcb5dSMax Laier #ifdef DLT_JUNIPER_PPP
1577b5bfcb5dSMax Laier case DLT_JUNIPER_PPP:
1578b5bfcb5dSMax Laier break;
1579b5bfcb5dSMax Laier #endif
1580b5bfcb5dSMax Laier #ifdef DLT_JUNIPER_CHDLC
1581b5bfcb5dSMax Laier case DLT_JUNIPER_CHDLC:
1582b5bfcb5dSMax Laier break;
1583b5bfcb5dSMax Laier #endif
1584b5bfcb5dSMax Laier #ifdef DLT_JUNIPER_ETHER
1585b5bfcb5dSMax Laier case DLT_JUNIPER_ETHER:
1586b5bfcb5dSMax Laier break;
1587b5bfcb5dSMax Laier #endif
1588b5bfcb5dSMax Laier #ifdef DLT_JUNIPER_FRELAY
1589b5bfcb5dSMax Laier case DLT_JUNIPER_FRELAY:
1590b5bfcb5dSMax Laier break;
1591b5bfcb5dSMax Laier #endif
1592ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_MONITOR
1593ee67461eSJoseph Mingrone case DLT_JUNIPER_MONITOR:
1594ee67461eSJoseph Mingrone break;
1595ee67461eSJoseph Mingrone #endif
1596ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_PPPOE
1597ee67461eSJoseph Mingrone case DLT_JUNIPER_PPPOE:
1598ee67461eSJoseph Mingrone break;
1599ee67461eSJoseph Mingrone #endif
1600ee67461eSJoseph Mingrone #ifdef DLT_JUNIPER_PPPOE_ATM
1601ee67461eSJoseph Mingrone case DLT_JUNIPER_PPPOE_ATM:
1602ee67461eSJoseph Mingrone break;
1603ee67461eSJoseph Mingrone #endif
1604b5bfcb5dSMax Laier
1605f4d0c64aSSam Leffler default:
1606ee67461eSJoseph Mingrone ND_PRINT("Unknown Juniper DLT_ type %u: ", l2info->pictype);
1607f4d0c64aSSam Leffler break;
1608f4d0c64aSSam Leffler }
1609f4d0c64aSSam Leffler
1610ee67461eSJoseph Mingrone if (ndo->ndo_eflag)
1611ee67461eSJoseph Mingrone ND_PRINT("hlen %u, proto 0x%04x, ", l2info->header_len, l2info->proto);
1612f4d0c64aSSam Leffler
16131de50e9fSSam Leffler return 1; /* everything went ok so far. continue parsing */
1614ee67461eSJoseph Mingrone invalid:
1615ee67461eSJoseph Mingrone nd_print_invalid(ndo);
1616f4d0c64aSSam Leffler return 0;
16171de50e9fSSam Leffler }
1618ee67461eSJoseph Mingrone #endif /* defined(DLT_JUNIPER_GGSN) || defined(DLT_JUNIPER_ES) || \
1619ee67461eSJoseph Mingrone defined(DLT_JUNIPER_MONITOR) || defined(DLT_JUNIPER_SERVICES) || \
1620ee67461eSJoseph Mingrone defined(DLT_JUNIPER_PPPOE) || defined(DLT_JUNIPER_ETHER) || \
1621ee67461eSJoseph Mingrone defined(DLT_JUNIPER_PPP) || defined(DLT_JUNIPER_FRELAY) || \
1622ee67461eSJoseph Mingrone defined(DLT_JUNIPER_CHDLC) || defined(DLT_JUNIPER_PPPOE_ATM) || \
1623ee67461eSJoseph Mingrone defined(DLT_JUNIPER_MLPPP) || defined(DLT_JUNIPER_MFR) || \
1624ee67461eSJoseph Mingrone defined(DLT_JUNIPER_MLFR) || defined(DLT_JUNIPER_ATM1) || \
1625ee67461eSJoseph Mingrone defined(DLT_JUNIPER_ATM2) */
1626