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