xref: /dragonfly/contrib/tcpdump/print-juniper.c (revision ed775ee7)
1ea7b4bf5SPeter Avalos /*     NetBSD: print-juniper.c,v 1.2 2007/07/24 11:53:45 drochner Exp        */
2ea7b4bf5SPeter Avalos 
341c99275SPeter Avalos /*
441c99275SPeter Avalos  * Redistribution and use in source and binary forms, with or without
541c99275SPeter Avalos  * modification, are permitted provided that: (1) source code
641c99275SPeter Avalos  * distributions retain the above copyright notice and this paragraph
741c99275SPeter Avalos  * in its entirety, and (2) distributions including binary code include
841c99275SPeter Avalos  * the above copyright notice and this paragraph in its entirety in
941c99275SPeter Avalos  * the documentation or other materials provided with the distribution.
1041c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
1141c99275SPeter Avalos  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1241c99275SPeter Avalos  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1341c99275SPeter Avalos  * FOR A PARTICULAR PURPOSE.
1441c99275SPeter Avalos  *
15411677aeSAaron LI  * Original code by Hannes Gredler (hannes@gredler.at)
1641c99275SPeter Avalos  */
1741c99275SPeter Avalos 
18411677aeSAaron LI /* \summary: DLT_JUNIPER_* printers */
19411677aeSAaron LI 
2041c99275SPeter Avalos #ifndef lint
21ea7b4bf5SPeter Avalos #else
22ea7b4bf5SPeter Avalos __RCSID("NetBSD: print-juniper.c,v 1.3 2007/07/25 06:31:32 dogcow Exp ");
2341c99275SPeter Avalos #endif
2441c99275SPeter Avalos 
2541c99275SPeter Avalos #ifdef HAVE_CONFIG_H
26*ed775ee7SAntonio Huete Jimenez #include <config.h>
2741c99275SPeter Avalos #endif
2841c99275SPeter Avalos 
29*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
3041c99275SPeter Avalos 
31411677aeSAaron LI #include <string.h>
3241c99275SPeter Avalos 
33411677aeSAaron LI #include "netdissect.h"
3441c99275SPeter Avalos #include "addrtoname.h"
3541c99275SPeter Avalos #include "extract.h"
3641c99275SPeter Avalos #include "ppp.h"
3741c99275SPeter Avalos #include "llc.h"
3841c99275SPeter Avalos #include "nlpid.h"
3941c99275SPeter Avalos #include "ethertype.h"
4041c99275SPeter Avalos #include "atm.h"
4141c99275SPeter Avalos 
42*ed775ee7SAntonio Huete Jimenez /*
43*ed775ee7SAntonio Huete Jimenez  * If none of the Juniper DLT_s are defined, there's nothing to do.
44*ed775ee7SAntonio Huete Jimenez  */
45*ed775ee7SAntonio Huete Jimenez #if defined(DLT_JUNIPER_GGSN) || defined(DLT_JUNIPER_ES) || \
46*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_MONITOR) || defined(DLT_JUNIPER_SERVICES) || \
47*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_PPPOE) || defined(DLT_JUNIPER_ETHER) || \
48*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_PPP) || defined(DLT_JUNIPER_FRELAY) || \
49*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_CHDLC) || defined(DLT_JUNIPER_PPPOE_ATM) || \
50*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_MLPPP) || defined(DLT_JUNIPER_MFR) || \
51*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_MLFR) || defined(DLT_JUNIPER_ATM1) || \
52*ed775ee7SAntonio Huete Jimenez     defined(DLT_JUNIPER_ATM2)
5341c99275SPeter Avalos #define JUNIPER_BPF_OUT           0       /* Outgoing packet */
5441c99275SPeter Avalos #define JUNIPER_BPF_IN            1       /* Incoming packet */
5541c99275SPeter Avalos #define JUNIPER_BPF_PKT_IN        0x1     /* Incoming packet */
5641c99275SPeter Avalos #define JUNIPER_BPF_NO_L2         0x2     /* L2 header stripped */
57ea7b4bf5SPeter Avalos #define JUNIPER_BPF_IIF           0x4     /* IIF is valid */
58ea7b4bf5SPeter Avalos #define JUNIPER_BPF_FILTER        0x40    /* BPF filtering is supported */
5941c99275SPeter Avalos #define JUNIPER_BPF_EXT           0x80    /* extensions present */
6041c99275SPeter Avalos #define JUNIPER_MGC_NUMBER        0x4d4743 /* = "MGC" */
6141c99275SPeter Avalos 
6241c99275SPeter Avalos #define JUNIPER_LSQ_COOKIE_RE         (1 << 3)
6341c99275SPeter Avalos #define JUNIPER_LSQ_COOKIE_DIR        (1 << 2)
6441c99275SPeter Avalos #define JUNIPER_LSQ_L3_PROTO_SHIFT     4
6541c99275SPeter Avalos #define JUNIPER_LSQ_L3_PROTO_MASK     (0x17 << JUNIPER_LSQ_L3_PROTO_SHIFT)
6641c99275SPeter Avalos #define JUNIPER_LSQ_L3_PROTO_IPV4     (0 << JUNIPER_LSQ_L3_PROTO_SHIFT)
6741c99275SPeter Avalos #define JUNIPER_LSQ_L3_PROTO_IPV6     (1 << JUNIPER_LSQ_L3_PROTO_SHIFT)
6841c99275SPeter Avalos #define JUNIPER_LSQ_L3_PROTO_MPLS     (2 << JUNIPER_LSQ_L3_PROTO_SHIFT)
6941c99275SPeter Avalos #define JUNIPER_LSQ_L3_PROTO_ISO      (3 << JUNIPER_LSQ_L3_PROTO_SHIFT)
7041c99275SPeter Avalos #define AS_PIC_COOKIE_LEN 8
7141c99275SPeter Avalos 
7241c99275SPeter Avalos #define JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE 1
7341c99275SPeter Avalos #define JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE 2
7441c99275SPeter Avalos #define JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE 3
7541c99275SPeter Avalos #define JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE 4
7641c99275SPeter Avalos #define JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE 5
7741c99275SPeter Avalos 
78*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ES
79411677aeSAaron LI static const struct tok juniper_ipsec_type_values[] = {
8041c99275SPeter Avalos     { JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE, "ESP ENCR-AUTH" },
8141c99275SPeter Avalos     { JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE, "ESP ENCR-AH AUTH" },
8241c99275SPeter Avalos     { JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE, "ESP AUTH" },
8341c99275SPeter Avalos     { JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE, "AH AUTH" },
8441c99275SPeter Avalos     { JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE, "ESP ENCR" },
8541c99275SPeter Avalos     { 0, NULL}
8641c99275SPeter Avalos };
87*ed775ee7SAntonio Huete Jimenez #endif
8841c99275SPeter Avalos 
89411677aeSAaron LI static const struct tok juniper_direction_values[] = {
9041c99275SPeter Avalos     { JUNIPER_BPF_IN,  "In"},
9141c99275SPeter Avalos     { JUNIPER_BPF_OUT, "Out"},
9241c99275SPeter Avalos     { 0, NULL}
9341c99275SPeter Avalos };
9441c99275SPeter Avalos 
95ea7b4bf5SPeter Avalos /* codepoints for encoding extensions to a .pcap file */
96ea7b4bf5SPeter Avalos enum {
97ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_IFD_IDX = 1,
98ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_IFD_NAME = 2,
99ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_IFD_MEDIATYPE = 3,
100ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_IFL_IDX = 4,
101ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_IFL_UNIT = 5,
102ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_IFL_ENCAPS = 6,
103ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE = 7,
104ea7b4bf5SPeter Avalos     JUNIPER_EXT_TLV_TTP_IFL_ENCAPS = 8
105ea7b4bf5SPeter Avalos };
106ea7b4bf5SPeter Avalos 
107ea7b4bf5SPeter Avalos /* 1 byte type and 1-byte length */
108411677aeSAaron LI #define JUNIPER_EXT_TLV_OVERHEAD 2U
109ea7b4bf5SPeter Avalos 
110411677aeSAaron LI static const struct tok jnx_ext_tlv_values[] = {
111ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_IFD_IDX, "Device Interface Index" },
112ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_IFD_NAME,"Device Interface Name" },
113ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_IFD_MEDIATYPE, "Device Media Type" },
114ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_IFL_IDX, "Logical Interface Index" },
115ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_IFL_UNIT,"Logical Unit Number" },
116ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_IFL_ENCAPS, "Logical Interface Encapsulation" },
117ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE, "TTP derived Device Media Type" },
118ea7b4bf5SPeter Avalos     { JUNIPER_EXT_TLV_TTP_IFL_ENCAPS, "TTP derived Logical Interface Encapsulation" },
119ea7b4bf5SPeter Avalos     { 0, NULL }
120ea7b4bf5SPeter Avalos };
121ea7b4bf5SPeter Avalos 
122411677aeSAaron LI static const struct tok jnx_flag_values[] = {
123ea7b4bf5SPeter Avalos     { JUNIPER_BPF_EXT, "Ext" },
124ea7b4bf5SPeter Avalos     { JUNIPER_BPF_FILTER, "Filter" },
125ea7b4bf5SPeter Avalos     { JUNIPER_BPF_IIF, "IIF" },
126ea7b4bf5SPeter Avalos     { JUNIPER_BPF_NO_L2, "no-L2" },
127ea7b4bf5SPeter Avalos     { JUNIPER_BPF_PKT_IN, "In" },
128ea7b4bf5SPeter Avalos     { 0, NULL }
129ea7b4bf5SPeter Avalos };
130ea7b4bf5SPeter Avalos 
131ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHER              1
132ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FDDI               2
133ea7b4bf5SPeter Avalos #define JUNIPER_IFML_TOKENRING          3
134ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PPP                4
135ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FRAMERELAY         5
136ea7b4bf5SPeter Avalos #define JUNIPER_IFML_CISCOHDLC          6
137ea7b4bf5SPeter Avalos #define JUNIPER_IFML_SMDSDXI            7
138ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ATMPVC             8
139ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PPP_CCC            9
140ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FRAMERELAY_CCC     10
141ea7b4bf5SPeter Avalos #define JUNIPER_IFML_IPIP               11
142ea7b4bf5SPeter Avalos #define JUNIPER_IFML_GRE                12
143ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PIM                13
144ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PIMD               14
145ea7b4bf5SPeter Avalos #define JUNIPER_IFML_CISCOHDLC_CCC      15
146ea7b4bf5SPeter Avalos #define JUNIPER_IFML_VLAN_CCC           16
147ea7b4bf5SPeter Avalos #define JUNIPER_IFML_MLPPP              17
148ea7b4bf5SPeter Avalos #define JUNIPER_IFML_MLFR               18
149ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ML                 19
150ea7b4bf5SPeter Avalos #define JUNIPER_IFML_LSI                20
151ea7b4bf5SPeter Avalos #define JUNIPER_IFML_DFE                21
152ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ATM_CELLRELAY_CCC  22
153ea7b4bf5SPeter Avalos #define JUNIPER_IFML_CRYPTO             23
154ea7b4bf5SPeter Avalos #define JUNIPER_IFML_GGSN               24
155ea7b4bf5SPeter Avalos #define JUNIPER_IFML_LSI_PPP            25
156ea7b4bf5SPeter Avalos #define JUNIPER_IFML_LSI_CISCOHDLC      26
157ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PPP_TCC            27
158ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FRAMERELAY_TCC     28
159ea7b4bf5SPeter Avalos #define JUNIPER_IFML_CISCOHDLC_TCC      29
160ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHERNET_CCC       30
161ea7b4bf5SPeter Avalos #define JUNIPER_IFML_VT                 31
162ea7b4bf5SPeter Avalos #define JUNIPER_IFML_EXTENDED_VLAN_CCC  32
163ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHER_OVER_ATM     33
164ea7b4bf5SPeter Avalos #define JUNIPER_IFML_MONITOR            34
165ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHERNET_TCC       35
166ea7b4bf5SPeter Avalos #define JUNIPER_IFML_VLAN_TCC           36
167ea7b4bf5SPeter Avalos #define JUNIPER_IFML_EXTENDED_VLAN_TCC  37
168ea7b4bf5SPeter Avalos #define JUNIPER_IFML_CONTROLLER         38
169ea7b4bf5SPeter Avalos #define JUNIPER_IFML_MFR                39
170ea7b4bf5SPeter Avalos #define JUNIPER_IFML_LS                 40
171ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHERNET_VPLS      41
172ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHERNET_VLAN_VPLS 42
173ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS 43
174ea7b4bf5SPeter Avalos #define JUNIPER_IFML_LT                 44
175ea7b4bf5SPeter Avalos #define JUNIPER_IFML_SERVICES           45
176ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHER_VPLS_OVER_ATM 46
177ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FR_PORT_CCC        47
178ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FRAMERELAY_EXT_CCC 48
179ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FRAMERELAY_EXT_TCC 49
180ea7b4bf5SPeter Avalos #define JUNIPER_IFML_FRAMERELAY_FLEX    50
181ea7b4bf5SPeter Avalos #define JUNIPER_IFML_GGSNI              51
182ea7b4bf5SPeter Avalos #define JUNIPER_IFML_ETHERNET_FLEX      52
183ea7b4bf5SPeter Avalos #define JUNIPER_IFML_COLLECTOR          53
184ea7b4bf5SPeter Avalos #define JUNIPER_IFML_AGGREGATOR         54
185ea7b4bf5SPeter Avalos #define JUNIPER_IFML_LAPD               55
186ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PPPOE              56
187ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PPP_SUBORDINATE    57
188ea7b4bf5SPeter Avalos #define JUNIPER_IFML_CISCOHDLC_SUBORDINATE  58
189ea7b4bf5SPeter Avalos #define JUNIPER_IFML_DFC                59
190ea7b4bf5SPeter Avalos #define JUNIPER_IFML_PICPEER            60
191ea7b4bf5SPeter Avalos 
192411677aeSAaron LI static const struct tok juniper_ifmt_values[] = {
193ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHER, "Ethernet" },
194ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FDDI, "FDDI" },
195ea7b4bf5SPeter Avalos     { JUNIPER_IFML_TOKENRING, "Token-Ring" },
196ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PPP, "PPP" },
197ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PPP_SUBORDINATE, "PPP-Subordinate" },
198ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FRAMERELAY, "Frame-Relay" },
199ea7b4bf5SPeter Avalos     { JUNIPER_IFML_CISCOHDLC, "Cisco-HDLC" },
200ea7b4bf5SPeter Avalos     { JUNIPER_IFML_SMDSDXI, "SMDS-DXI" },
201ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ATMPVC, "ATM-PVC" },
202ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PPP_CCC, "PPP-CCC" },
203ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FRAMERELAY_CCC, "Frame-Relay-CCC" },
204ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FRAMERELAY_EXT_CCC, "Extended FR-CCC" },
205ea7b4bf5SPeter Avalos     { JUNIPER_IFML_IPIP, "IP-over-IP" },
206ea7b4bf5SPeter Avalos     { JUNIPER_IFML_GRE, "GRE" },
207ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PIM, "PIM-Encapsulator" },
208ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PIMD, "PIM-Decapsulator" },
209ea7b4bf5SPeter Avalos     { JUNIPER_IFML_CISCOHDLC_CCC, "Cisco-HDLC-CCC" },
210ea7b4bf5SPeter Avalos     { JUNIPER_IFML_VLAN_CCC, "VLAN-CCC" },
211ea7b4bf5SPeter Avalos     { JUNIPER_IFML_EXTENDED_VLAN_CCC, "Extended-VLAN-CCC" },
212ea7b4bf5SPeter Avalos     { JUNIPER_IFML_MLPPP, "Multilink-PPP" },
213ea7b4bf5SPeter Avalos     { JUNIPER_IFML_MLFR, "Multilink-FR" },
214ea7b4bf5SPeter Avalos     { JUNIPER_IFML_MFR, "Multilink-FR-UNI-NNI" },
215ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ML, "Multilink" },
216ea7b4bf5SPeter Avalos     { JUNIPER_IFML_LS, "LinkService" },
217ea7b4bf5SPeter Avalos     { JUNIPER_IFML_LSI, "LSI" },
218ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ATM_CELLRELAY_CCC, "ATM-CCC-Cell-Relay" },
219ea7b4bf5SPeter Avalos     { JUNIPER_IFML_CRYPTO, "IPSEC-over-IP" },
220ea7b4bf5SPeter Avalos     { JUNIPER_IFML_GGSN, "GGSN" },
221ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PPP_TCC, "PPP-TCC" },
222ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FRAMERELAY_TCC, "Frame-Relay-TCC" },
223ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FRAMERELAY_EXT_TCC, "Extended FR-TCC" },
224ea7b4bf5SPeter Avalos     { JUNIPER_IFML_CISCOHDLC_TCC, "Cisco-HDLC-TCC" },
225ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHERNET_CCC, "Ethernet-CCC" },
226ea7b4bf5SPeter Avalos     { JUNIPER_IFML_VT, "VPN-Loopback-tunnel" },
227ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHER_OVER_ATM, "Ethernet-over-ATM" },
228ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHER_VPLS_OVER_ATM, "Ethernet-VPLS-over-ATM" },
229ea7b4bf5SPeter Avalos     { JUNIPER_IFML_MONITOR, "Monitor" },
230ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHERNET_TCC, "Ethernet-TCC" },
231ea7b4bf5SPeter Avalos     { JUNIPER_IFML_VLAN_TCC, "VLAN-TCC" },
232ea7b4bf5SPeter Avalos     { JUNIPER_IFML_EXTENDED_VLAN_TCC, "Extended-VLAN-TCC" },
233ea7b4bf5SPeter Avalos     { JUNIPER_IFML_CONTROLLER, "Controller" },
234ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHERNET_VPLS, "VPLS" },
235ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHERNET_VLAN_VPLS, "VLAN-VPLS" },
236ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHERNET_EXTENDED_VLAN_VPLS, "Extended-VLAN-VPLS" },
237ea7b4bf5SPeter Avalos     { JUNIPER_IFML_LT, "Logical-tunnel" },
238ea7b4bf5SPeter Avalos     { JUNIPER_IFML_SERVICES, "General-Services" },
239ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PPPOE, "PPPoE" },
240ea7b4bf5SPeter Avalos     { JUNIPER_IFML_ETHERNET_FLEX, "Flexible-Ethernet-Services" },
241ea7b4bf5SPeter Avalos     { JUNIPER_IFML_FRAMERELAY_FLEX, "Flexible-FrameRelay" },
242ea7b4bf5SPeter Avalos     { JUNIPER_IFML_COLLECTOR, "Flow-collection" },
243ea7b4bf5SPeter Avalos     { JUNIPER_IFML_PICPEER, "PIC Peer" },
244ea7b4bf5SPeter Avalos     { JUNIPER_IFML_DFC, "Dynamic-Flow-Capture" },
245ea7b4bf5SPeter Avalos     {0,                    NULL}
246ea7b4bf5SPeter Avalos };
247ea7b4bf5SPeter Avalos 
248ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_SNAP           2
249ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_NLPID          3
250ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_VCMUX          4
251ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_LLC            5
252ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_PPP_VCMUX      6
253ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_PPP_LLC        7
254ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_PPP_FUNI       8
255ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_CCC            9
256ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_FR_NLPID           10
257ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_FR_SNAP            11
258ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_FR_PPP             12
259ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_FR_CCC             13
260ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ENET2              14
261ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_IEEE8023_SNAP      15
262ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_IEEE8023_LLC       16
263ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PPP                17
264ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_CISCOHDLC          18
265ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PPP_CCC            19
266ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_IPIP_NULL          20
267ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PIM_NULL           21
268ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_GRE_NULL           22
269ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_GRE_PPP            23
270ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PIMD_DECAPS        24
271ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_CISCOHDLC_CCC      25
272ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_CISCO_NLPID    26
273ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_VLAN_CCC           27
274ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_MLPPP              28
275ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_MLFR               29
276ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_LSI_NULL           30
277ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_AGGREGATE_UNUSED   31
278ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_CELLRELAY_CCC  32
279ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_CRYPTO             33
280ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_GGSN               34
281ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_TCC            35
282ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_FR_TCC             36
283ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PPP_TCC            37
284ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_CISCOHDLC_TCC      38
285ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ETHERNET_CCC       39
286ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_VT                 40
287ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_EOA_LLC        41
288ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_EXTENDED_VLAN_CCC          42
289ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_SNAP_TCC       43
290ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_MONITOR            44
291ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ETHERNET_TCC       45
292ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_VLAN_TCC           46
293ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_EXTENDED_VLAN_TCC  47
294ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_MFR                48
295ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ETHERNET_VPLS      49
296ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ETHERNET_VLAN_VPLS 50
297ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS 51
298ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_SERVICES           52
299ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC                53
300ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_FR_PORT_CCC        54
301ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_MLPPP_LLC      55
302ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_EOA_CCC        56
303ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_LT_VLAN            57
304ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_COLLECTOR          58
305ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_AGGREGATOR         59
306ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_LAPD               60
307ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ATM_PPPOE_LLC          61
308ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_ETHERNET_PPPOE         62
309ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PPPOE                  63
310ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PPP_SUBORDINATE        64
311ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_CISCOHDLC_SUBORDINATE  65
312ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_DFC                    66
313ea7b4bf5SPeter Avalos #define JUNIPER_IFLE_PICPEER                67
314ea7b4bf5SPeter Avalos 
315411677aeSAaron LI static const struct tok juniper_ifle_values[] = {
316ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_AGGREGATOR, "Aggregator" },
317ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_CCC, "CCC over ATM" },
318ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_CELLRELAY_CCC, "ATM CCC Cell Relay" },
319ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_CISCO_NLPID, "CISCO compatible NLPID" },
320ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_EOA_CCC, "Ethernet over ATM CCC" },
321ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_EOA_LLC, "Ethernet over ATM LLC" },
322ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_ETHER_VPLS_ATM_LLC, "Ethernet VPLS over ATM LLC" },
323ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_LLC, "ATM LLC" },
324ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_MLPPP_LLC, "MLPPP over ATM LLC" },
325ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_NLPID, "ATM NLPID" },
326ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_PPPOE_LLC, "PPPoE over ATM LLC" },
327ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_PPP_FUNI, "PPP over FUNI" },
328ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_PPP_LLC, "PPP over ATM LLC" },
329ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_PPP_VCMUX, "PPP over ATM VCMUX" },
330ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_SNAP, "ATM SNAP" },
331ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_SNAP_TCC, "ATM SNAP TCC" },
332ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_TCC, "ATM VCMUX TCC" },
333ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ATM_VCMUX, "ATM VCMUX" },
334ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_CISCOHDLC, "C-HDLC" },
335ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_CISCOHDLC_CCC, "C-HDLC CCC" },
336ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_CISCOHDLC_SUBORDINATE, "C-HDLC via dialer" },
337ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_CISCOHDLC_TCC, "C-HDLC TCC" },
338ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_COLLECTOR, "Collector" },
339ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_CRYPTO, "Crypto" },
340ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ENET2, "Ethernet" },
341ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ETHERNET_CCC, "Ethernet CCC" },
342ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ETHERNET_EXTENDED_VLAN_VPLS, "Extended VLAN VPLS" },
343ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ETHERNET_PPPOE, "PPPoE over Ethernet" },
344ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ETHERNET_TCC, "Ethernet TCC" },
345ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ETHERNET_VLAN_VPLS, "VLAN VPLS" },
346ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_ETHERNET_VPLS, "VPLS" },
347ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_EXTENDED_VLAN_CCC, "Extended VLAN CCC" },
348ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_EXTENDED_VLAN_TCC, "Extended VLAN TCC" },
349ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_FR_CCC, "FR CCC" },
350ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_FR_NLPID, "FR NLPID" },
351ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_FR_PORT_CCC, "FR CCC" },
352ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_FR_PPP, "FR PPP" },
353ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_FR_SNAP, "FR SNAP" },
354ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_FR_TCC, "FR TCC" },
355ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_GGSN, "GGSN" },
356ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_GRE_NULL, "GRE NULL" },
357ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_GRE_PPP, "PPP over GRE" },
358ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_IPIP_NULL, "IPIP" },
359ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_LAPD, "LAPD" },
360ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_LSI_NULL, "LSI Null" },
361ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_LT_VLAN, "LT VLAN" },
362ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_MFR, "MFR" },
363ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_MLFR, "MLFR" },
364ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_MLPPP, "MLPPP" },
365ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_MONITOR, "Monitor" },
366ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PIMD_DECAPS, "PIMd" },
367ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PIM_NULL, "PIM Null" },
368ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PPP, "PPP" },
369ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PPPOE, "PPPoE" },
370ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PPP_CCC, "PPP CCC" },
371ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PPP_SUBORDINATE, "" },
372ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_PPP_TCC, "PPP TCC" },
373ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_SERVICES, "General Services" },
374ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_VLAN_CCC, "VLAN CCC" },
375ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_VLAN_TCC, "VLAN TCC" },
376ea7b4bf5SPeter Avalos     { JUNIPER_IFLE_VT, "VT" },
377ea7b4bf5SPeter Avalos     {0,                    NULL}
378ea7b4bf5SPeter Avalos };
379ea7b4bf5SPeter Avalos 
38041c99275SPeter Avalos struct juniper_cookie_table_t {
381411677aeSAaron LI     uint32_t pictype;		/* pic type */
382411677aeSAaron LI     uint8_t  cookie_len;	/* cookie len */
38341c99275SPeter Avalos     const char *s;		/* pic name */
38441c99275SPeter Avalos };
38541c99275SPeter Avalos 
386411677aeSAaron LI static const struct juniper_cookie_table_t juniper_cookie_table[] = {
38741c99275SPeter Avalos #ifdef DLT_JUNIPER_ATM1
38841c99275SPeter Avalos     { DLT_JUNIPER_ATM1,  4, "ATM1"},
38941c99275SPeter Avalos #endif
39041c99275SPeter Avalos #ifdef DLT_JUNIPER_ATM2
39141c99275SPeter Avalos     { DLT_JUNIPER_ATM2,  8, "ATM2"},
39241c99275SPeter Avalos #endif
39341c99275SPeter Avalos #ifdef DLT_JUNIPER_MLPPP
39441c99275SPeter Avalos     { DLT_JUNIPER_MLPPP, 2, "MLPPP"},
39541c99275SPeter Avalos #endif
39641c99275SPeter Avalos #ifdef DLT_JUNIPER_MLFR
39741c99275SPeter Avalos     { DLT_JUNIPER_MLFR,  2, "MLFR"},
39841c99275SPeter Avalos #endif
39941c99275SPeter Avalos #ifdef DLT_JUNIPER_MFR
40041c99275SPeter Avalos     { DLT_JUNIPER_MFR,   4, "MFR"},
40141c99275SPeter Avalos #endif
40241c99275SPeter Avalos #ifdef DLT_JUNIPER_PPPOE
40341c99275SPeter Avalos     { DLT_JUNIPER_PPPOE, 0, "PPPoE"},
40441c99275SPeter Avalos #endif
40541c99275SPeter Avalos #ifdef DLT_JUNIPER_PPPOE_ATM
40641c99275SPeter Avalos     { DLT_JUNIPER_PPPOE_ATM, 0, "PPPoE ATM"},
40741c99275SPeter Avalos #endif
40841c99275SPeter Avalos #ifdef DLT_JUNIPER_GGSN
40941c99275SPeter Avalos     { DLT_JUNIPER_GGSN, 8, "GGSN"},
41041c99275SPeter Avalos #endif
41141c99275SPeter Avalos #ifdef DLT_JUNIPER_MONITOR
41241c99275SPeter Avalos     { DLT_JUNIPER_MONITOR, 8, "MONITOR"},
41341c99275SPeter Avalos #endif
41441c99275SPeter Avalos #ifdef DLT_JUNIPER_SERVICES
41541c99275SPeter Avalos     { DLT_JUNIPER_SERVICES, 8, "AS"},
41641c99275SPeter Avalos #endif
41741c99275SPeter Avalos #ifdef DLT_JUNIPER_ES
41841c99275SPeter Avalos     { DLT_JUNIPER_ES, 0, "ES"},
41941c99275SPeter Avalos #endif
42041c99275SPeter Avalos     { 0, 0, NULL }
42141c99275SPeter Avalos };
42241c99275SPeter Avalos 
42341c99275SPeter Avalos struct juniper_l2info_t {
424411677aeSAaron LI     uint32_t length;
425411677aeSAaron LI     uint32_t caplen;
426411677aeSAaron LI     uint32_t pictype;
427411677aeSAaron LI     uint8_t direction;
428*ed775ee7SAntonio Huete Jimenez     u_int header_len;
429411677aeSAaron LI     uint8_t cookie_len;
430411677aeSAaron LI     uint8_t cookie_type;
431411677aeSAaron LI     uint8_t cookie[8];
432*ed775ee7SAntonio Huete Jimenez     u_int bundle;
433411677aeSAaron LI     uint16_t proto;
434411677aeSAaron LI     uint8_t flags;
43541c99275SPeter Avalos };
43641c99275SPeter Avalos 
43741c99275SPeter Avalos #define LS_COOKIE_ID            0x54
43841c99275SPeter Avalos #define AS_COOKIE_ID            0x47
43941c99275SPeter Avalos #define LS_MLFR_COOKIE_LEN	4
44041c99275SPeter Avalos #define ML_MLFR_COOKIE_LEN	2
44141c99275SPeter Avalos #define LS_MFR_COOKIE_LEN	6
44241c99275SPeter Avalos #define ATM1_COOKIE_LEN         4
44341c99275SPeter Avalos #define ATM2_COOKIE_LEN         8
44441c99275SPeter Avalos 
44541c99275SPeter Avalos #define ATM2_PKT_TYPE_MASK  0x70
44641c99275SPeter Avalos #define ATM2_GAP_COUNT_MASK 0x3F
44741c99275SPeter Avalos 
44841c99275SPeter Avalos #define JUNIPER_PROTO_NULL          1
44941c99275SPeter Avalos #define JUNIPER_PROTO_IPV4          2
45041c99275SPeter Avalos #define JUNIPER_PROTO_IPV6          6
45141c99275SPeter Avalos 
45241c99275SPeter Avalos #define MFR_BE_MASK 0xc0
45341c99275SPeter Avalos 
454*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_GGSN
455411677aeSAaron LI static const struct tok juniper_protocol_values[] = {
45641c99275SPeter Avalos     { JUNIPER_PROTO_NULL, "Null" },
45741c99275SPeter Avalos     { JUNIPER_PROTO_IPV4, "IPv4" },
45841c99275SPeter Avalos     { JUNIPER_PROTO_IPV6, "IPv6" },
45941c99275SPeter Avalos     { 0, NULL}
46041c99275SPeter Avalos };
461*ed775ee7SAntonio Huete Jimenez #endif
46241c99275SPeter Avalos 
463*ed775ee7SAntonio Huete Jimenez static int ip_heuristic_guess(netdissect_options *, const u_char *, u_int);
464*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ATM2
465*ed775ee7SAntonio Huete Jimenez static int juniper_ppp_heuristic_guess(netdissect_options *, const u_char *, u_int);
466*ed775ee7SAntonio Huete Jimenez #endif
467411677aeSAaron LI static int juniper_parse_header(netdissect_options *, const u_char *, const struct pcap_pkthdr *, struct juniper_l2info_t *);
46841c99275SPeter Avalos 
46941c99275SPeter Avalos #ifdef DLT_JUNIPER_GGSN
470*ed775ee7SAntonio Huete Jimenez void
juniper_ggsn_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)471*ed775ee7SAntonio Huete Jimenez juniper_ggsn_if_print(netdissect_options *ndo,
472*ed775ee7SAntonio Huete Jimenez                       const struct pcap_pkthdr *h, const u_char *p)
47341c99275SPeter Avalos {
47441c99275SPeter Avalos         struct juniper_l2info_t l2info;
47541c99275SPeter Avalos         struct juniper_ggsn_header {
476*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  svc_id;
477*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  flags_len;
478*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  proto;
479*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  flags;
480*ed775ee7SAntonio Huete Jimenez             nd_uint16_t vlan_id;
481*ed775ee7SAntonio Huete Jimenez             nd_byte     res[2];
48241c99275SPeter Avalos         };
48341c99275SPeter Avalos         const struct juniper_ggsn_header *gh;
484*ed775ee7SAntonio Huete Jimenez         uint8_t proto;
48541c99275SPeter Avalos 
486*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_ggsn";
487*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
48841c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_GGSN;
489*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
490*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
491*ed775ee7SAntonio Huete Jimenez             return;
492*ed775ee7SAntonio Huete Jimenez         }
49341c99275SPeter Avalos 
49441c99275SPeter Avalos         p+=l2info.header_len;
495ea7b4bf5SPeter Avalos         gh = (struct juniper_ggsn_header *)&l2info.cookie;
49641c99275SPeter Avalos 
497*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_SIZE(gh);
498*ed775ee7SAntonio Huete Jimenez         proto = GET_U_1(gh->proto);
499411677aeSAaron LI         if (ndo->ndo_eflag) {
500*ed775ee7SAntonio Huete Jimenez             ND_PRINT("proto %s (%u), vlan %u: ",
501*ed775ee7SAntonio Huete Jimenez                    tok2str(juniper_protocol_values,"Unknown",proto),
502*ed775ee7SAntonio Huete Jimenez                    proto,
503*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_2(gh->vlan_id));
504ea7b4bf5SPeter Avalos         }
50541c99275SPeter Avalos 
506*ed775ee7SAntonio Huete Jimenez         switch (proto) {
50741c99275SPeter Avalos         case JUNIPER_PROTO_IPV4:
508411677aeSAaron LI             ip_print(ndo, p, l2info.length);
50941c99275SPeter Avalos             break;
51041c99275SPeter Avalos         case JUNIPER_PROTO_IPV6:
511411677aeSAaron LI             ip6_print(ndo, p, l2info.length);
51241c99275SPeter Avalos             break;
51341c99275SPeter Avalos         default:
514411677aeSAaron LI             if (!ndo->ndo_eflag)
515*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("unknown GGSN proto (%u)", proto);
51641c99275SPeter Avalos         }
51741c99275SPeter Avalos 
518*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
519*ed775ee7SAntonio Huete Jimenez         return;
520411677aeSAaron LI 
521411677aeSAaron LI trunc:
522*ed775ee7SAntonio Huete Jimenez         nd_print_trunc(ndo);
523*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
52441c99275SPeter Avalos }
52541c99275SPeter Avalos #endif
52641c99275SPeter Avalos 
52741c99275SPeter Avalos #ifdef DLT_JUNIPER_ES
528*ed775ee7SAntonio Huete Jimenez void
juniper_es_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)529*ed775ee7SAntonio Huete Jimenez juniper_es_if_print(netdissect_options *ndo,
530*ed775ee7SAntonio Huete Jimenez                     const struct pcap_pkthdr *h, const u_char *p)
53141c99275SPeter Avalos {
53241c99275SPeter Avalos         struct juniper_l2info_t l2info;
53341c99275SPeter Avalos         struct juniper_ipsec_header {
534*ed775ee7SAntonio Huete Jimenez             nd_uint16_t sa_index;
535*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  ttl;
536*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  type;
537*ed775ee7SAntonio Huete Jimenez             nd_uint32_t spi;
538*ed775ee7SAntonio Huete Jimenez             nd_ipv4     src_ip;
539*ed775ee7SAntonio Huete Jimenez             nd_ipv4     dst_ip;
54041c99275SPeter Avalos         };
54141c99275SPeter Avalos         u_int rewrite_len,es_type_bundle;
54241c99275SPeter Avalos         const struct juniper_ipsec_header *ih;
54341c99275SPeter Avalos 
544*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_es";
545*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
54641c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_ES;
547*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
548*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
549*ed775ee7SAntonio Huete Jimenez             return;
550*ed775ee7SAntonio Huete Jimenez         }
55141c99275SPeter Avalos 
55241c99275SPeter Avalos         p+=l2info.header_len;
553411677aeSAaron LI         ih = (const struct juniper_ipsec_header *)p;
55441c99275SPeter Avalos 
555*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_SIZE(ih);
556*ed775ee7SAntonio Huete Jimenez         switch (GET_U_1(ih->type)) {
55741c99275SPeter Avalos         case JUNIPER_IPSEC_O_ESP_ENCRYPT_ESP_AUTHEN_TYPE:
55841c99275SPeter Avalos         case JUNIPER_IPSEC_O_ESP_ENCRYPT_AH_AUTHEN_TYPE:
55941c99275SPeter Avalos             rewrite_len = 0;
56041c99275SPeter Avalos             es_type_bundle = 1;
56141c99275SPeter Avalos             break;
56241c99275SPeter Avalos         case JUNIPER_IPSEC_O_ESP_AUTHENTICATION_TYPE:
56341c99275SPeter Avalos         case JUNIPER_IPSEC_O_AH_AUTHENTICATION_TYPE:
56441c99275SPeter Avalos         case JUNIPER_IPSEC_O_ESP_ENCRYPTION_TYPE:
56541c99275SPeter Avalos             rewrite_len = 16;
56641c99275SPeter Avalos             es_type_bundle = 0;
567411677aeSAaron LI             break;
56841c99275SPeter Avalos         default:
569*ed775ee7SAntonio Huete Jimenez             ND_PRINT("ES Invalid type %u, length %u",
570*ed775ee7SAntonio Huete Jimenez                    GET_U_1(ih->type),
571*ed775ee7SAntonio Huete Jimenez                    l2info.length);
572*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
573*ed775ee7SAntonio Huete Jimenez             return;
57441c99275SPeter Avalos         }
57541c99275SPeter Avalos 
57641c99275SPeter Avalos         l2info.length-=rewrite_len;
57741c99275SPeter Avalos         p+=rewrite_len;
57841c99275SPeter Avalos 
579411677aeSAaron LI         if (ndo->ndo_eflag) {
58041c99275SPeter Avalos             if (!es_type_bundle) {
581*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("ES SA, index %u, ttl %u type %s (%u), spi %u, Tunnel %s > %s, length %u\n",
582*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(ih->sa_index),
583*ed775ee7SAntonio Huete Jimenez                        GET_U_1(ih->ttl),
584*ed775ee7SAntonio Huete Jimenez                        tok2str(juniper_ipsec_type_values,"Unknown",GET_U_1(ih->type)),
585*ed775ee7SAntonio Huete Jimenez                        GET_U_1(ih->type),
586*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(ih->spi),
587*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(ih->src_ip),
588*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(ih->dst_ip),
589*ed775ee7SAntonio Huete Jimenez                        l2info.length);
59041c99275SPeter Avalos             } else {
591*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("ES SA, index %u, ttl %u type %s (%u), length %u\n",
592*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(ih->sa_index),
593*ed775ee7SAntonio Huete Jimenez                        GET_U_1(ih->ttl),
594*ed775ee7SAntonio Huete Jimenez                        tok2str(juniper_ipsec_type_values,"Unknown",GET_U_1(ih->type)),
595*ed775ee7SAntonio Huete Jimenez                        GET_U_1(ih->type),
596*ed775ee7SAntonio Huete Jimenez                        l2info.length);
59741c99275SPeter Avalos             }
59841c99275SPeter Avalos         }
59941c99275SPeter Avalos 
600411677aeSAaron LI         ip_print(ndo, p, l2info.length);
601*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
602*ed775ee7SAntonio Huete Jimenez         return;
603411677aeSAaron LI 
604411677aeSAaron LI trunc:
605*ed775ee7SAntonio Huete Jimenez         nd_print_trunc(ndo);
606*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
60741c99275SPeter Avalos }
60841c99275SPeter Avalos #endif
60941c99275SPeter Avalos 
61041c99275SPeter Avalos #ifdef DLT_JUNIPER_MONITOR
611*ed775ee7SAntonio Huete Jimenez void
juniper_monitor_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)612*ed775ee7SAntonio Huete Jimenez juniper_monitor_if_print(netdissect_options *ndo,
613*ed775ee7SAntonio Huete Jimenez                          const struct pcap_pkthdr *h, const u_char *p)
61441c99275SPeter Avalos {
61541c99275SPeter Avalos         struct juniper_l2info_t l2info;
61641c99275SPeter Avalos         struct juniper_monitor_header {
617*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  pkt_type;
618*ed775ee7SAntonio Huete Jimenez             nd_byte     padding;
619*ed775ee7SAntonio Huete Jimenez             nd_uint16_t iif;
620*ed775ee7SAntonio Huete Jimenez             nd_uint32_t service_id;
62141c99275SPeter Avalos         };
62241c99275SPeter Avalos         const struct juniper_monitor_header *mh;
62341c99275SPeter Avalos 
624*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_monitor";
625*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
62641c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_MONITOR;
627*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
628*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
629*ed775ee7SAntonio Huete Jimenez             return;
630*ed775ee7SAntonio Huete Jimenez         }
63141c99275SPeter Avalos 
63241c99275SPeter Avalos         p+=l2info.header_len;
633411677aeSAaron LI         mh = (const struct juniper_monitor_header *)p;
63441c99275SPeter Avalos 
635*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_SIZE(mh);
636411677aeSAaron LI         if (ndo->ndo_eflag)
637*ed775ee7SAntonio Huete Jimenez             ND_PRINT("service-id %u, iif %u, pkt-type %u: ",
638*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_4(mh->service_id),
639*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_2(mh->iif),
640*ed775ee7SAntonio Huete Jimenez                    GET_U_1(mh->pkt_type));
64141c99275SPeter Avalos 
64241c99275SPeter Avalos         /* no proto field - lets guess by first byte of IP header*/
643411677aeSAaron LI         ip_heuristic_guess (ndo, p, l2info.length);
64441c99275SPeter Avalos 
645*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
646*ed775ee7SAntonio Huete Jimenez         return;
647411677aeSAaron LI 
648411677aeSAaron LI trunc:
649*ed775ee7SAntonio Huete Jimenez         nd_print_trunc(ndo);
650*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
65141c99275SPeter Avalos }
65241c99275SPeter Avalos #endif
65341c99275SPeter Avalos 
65441c99275SPeter Avalos #ifdef DLT_JUNIPER_SERVICES
655*ed775ee7SAntonio Huete Jimenez void
juniper_services_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)656*ed775ee7SAntonio Huete Jimenez juniper_services_if_print(netdissect_options *ndo,
657*ed775ee7SAntonio Huete Jimenez                           const struct pcap_pkthdr *h, const u_char *p)
65841c99275SPeter Avalos {
65941c99275SPeter Avalos         struct juniper_l2info_t l2info;
66041c99275SPeter Avalos         struct juniper_services_header {
661*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  svc_id;
662*ed775ee7SAntonio Huete Jimenez             nd_uint8_t  flags_len;
663*ed775ee7SAntonio Huete Jimenez             nd_uint16_t svc_set_id;
664*ed775ee7SAntonio Huete Jimenez             nd_byte     pad;
665*ed775ee7SAntonio Huete Jimenez             nd_uint24_t dir_iif;
66641c99275SPeter Avalos         };
66741c99275SPeter Avalos         const struct juniper_services_header *sh;
66841c99275SPeter Avalos 
669*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_services";
670*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
67141c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_SERVICES;
672*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
673*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
674*ed775ee7SAntonio Huete Jimenez             return;
675*ed775ee7SAntonio Huete Jimenez         }
67641c99275SPeter Avalos 
67741c99275SPeter Avalos         p+=l2info.header_len;
678411677aeSAaron LI         sh = (const struct juniper_services_header *)p;
67941c99275SPeter Avalos 
680*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_SIZE(sh);
681411677aeSAaron LI         if (ndo->ndo_eflag)
682*ed775ee7SAntonio Huete Jimenez             ND_PRINT("service-id %u flags 0x%02x service-set-id 0x%04x iif %u: ",
683*ed775ee7SAntonio Huete Jimenez                    GET_U_1(sh->svc_id),
684*ed775ee7SAntonio Huete Jimenez                    GET_U_1(sh->flags_len),
685*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_2(sh->svc_set_id),
686*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_3(sh->dir_iif));
68741c99275SPeter Avalos 
68841c99275SPeter Avalos         /* no proto field - lets guess by first byte of IP header*/
689411677aeSAaron LI         ip_heuristic_guess (ndo, p, l2info.length);
69041c99275SPeter Avalos 
691*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
692*ed775ee7SAntonio Huete Jimenez         return;
693411677aeSAaron LI 
694411677aeSAaron LI trunc:
695*ed775ee7SAntonio Huete Jimenez         nd_print_trunc(ndo);
696*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
69741c99275SPeter Avalos }
69841c99275SPeter Avalos #endif
69941c99275SPeter Avalos 
70041c99275SPeter Avalos #ifdef DLT_JUNIPER_PPPOE
701*ed775ee7SAntonio Huete Jimenez void
juniper_pppoe_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)702*ed775ee7SAntonio Huete Jimenez juniper_pppoe_if_print(netdissect_options *ndo,
703*ed775ee7SAntonio Huete Jimenez                        const struct pcap_pkthdr *h, const u_char *p)
70441c99275SPeter Avalos {
70541c99275SPeter Avalos         struct juniper_l2info_t l2info;
70641c99275SPeter Avalos 
707*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_pppoe";
708*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
70941c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_PPPOE;
710*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
711*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
712*ed775ee7SAntonio Huete Jimenez             return;
713*ed775ee7SAntonio Huete Jimenez         }
71441c99275SPeter Avalos 
71541c99275SPeter Avalos         p+=l2info.header_len;
71641c99275SPeter Avalos         /* this DLT contains nothing but raw ethernet frames */
717411677aeSAaron LI         ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
718*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
71941c99275SPeter Avalos }
72041c99275SPeter Avalos #endif
72141c99275SPeter Avalos 
72241c99275SPeter Avalos #ifdef DLT_JUNIPER_ETHER
723*ed775ee7SAntonio Huete Jimenez void
juniper_ether_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)724*ed775ee7SAntonio Huete Jimenez juniper_ether_if_print(netdissect_options *ndo,
725*ed775ee7SAntonio Huete Jimenez                        const struct pcap_pkthdr *h, const u_char *p)
72641c99275SPeter Avalos {
72741c99275SPeter Avalos         struct juniper_l2info_t l2info;
72841c99275SPeter Avalos 
729*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_ether";
730*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
73141c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_ETHER;
732*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
733*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
734*ed775ee7SAntonio Huete Jimenez             return;
735*ed775ee7SAntonio Huete Jimenez         }
73641c99275SPeter Avalos 
73741c99275SPeter Avalos         p+=l2info.header_len;
73841c99275SPeter Avalos         /* this DLT contains nothing but raw Ethernet frames */
739*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len +=
740*ed775ee7SAntonio Huete Jimenez 		l2info.header_len +
741411677aeSAaron LI 		ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
74241c99275SPeter Avalos }
74341c99275SPeter Avalos #endif
74441c99275SPeter Avalos 
74541c99275SPeter Avalos #ifdef DLT_JUNIPER_PPP
746*ed775ee7SAntonio Huete Jimenez void
juniper_ppp_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)747*ed775ee7SAntonio Huete Jimenez juniper_ppp_if_print(netdissect_options *ndo,
748*ed775ee7SAntonio Huete Jimenez                      const struct pcap_pkthdr *h, const u_char *p)
74941c99275SPeter Avalos {
75041c99275SPeter Avalos         struct juniper_l2info_t l2info;
75141c99275SPeter Avalos 
752*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_ppp";
753*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
75441c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_PPP;
755*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
756*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
757*ed775ee7SAntonio Huete Jimenez             return;
758*ed775ee7SAntonio Huete Jimenez         }
75941c99275SPeter Avalos 
76041c99275SPeter Avalos         p+=l2info.header_len;
76141c99275SPeter Avalos         /* this DLT contains nothing but raw ppp frames */
762411677aeSAaron LI         ppp_print(ndo, p, l2info.length);
763*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
76441c99275SPeter Avalos }
76541c99275SPeter Avalos #endif
76641c99275SPeter Avalos 
76741c99275SPeter Avalos #ifdef DLT_JUNIPER_FRELAY
768*ed775ee7SAntonio Huete Jimenez void
juniper_frelay_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)769*ed775ee7SAntonio Huete Jimenez juniper_frelay_if_print(netdissect_options *ndo,
770*ed775ee7SAntonio Huete Jimenez                         const struct pcap_pkthdr *h, const u_char *p)
77141c99275SPeter Avalos {
77241c99275SPeter Avalos         struct juniper_l2info_t l2info;
77341c99275SPeter Avalos 
774*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_frelay";
775*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
77641c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_FRELAY;
777*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
778*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
779*ed775ee7SAntonio Huete Jimenez             return;
780*ed775ee7SAntonio Huete Jimenez         }
78141c99275SPeter Avalos 
78241c99275SPeter Avalos         p+=l2info.header_len;
78341c99275SPeter Avalos         /* this DLT contains nothing but raw frame-relay frames */
784411677aeSAaron LI         fr_print(ndo, p, l2info.length);
785*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
78641c99275SPeter Avalos }
78741c99275SPeter Avalos #endif
78841c99275SPeter Avalos 
78941c99275SPeter Avalos #ifdef DLT_JUNIPER_CHDLC
790*ed775ee7SAntonio Huete Jimenez void
juniper_chdlc_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)791*ed775ee7SAntonio Huete Jimenez juniper_chdlc_if_print(netdissect_options *ndo,
792*ed775ee7SAntonio Huete Jimenez                        const struct pcap_pkthdr *h, const u_char *p)
79341c99275SPeter Avalos {
79441c99275SPeter Avalos         struct juniper_l2info_t l2info;
79541c99275SPeter Avalos 
796*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_chdlc";
797*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
79841c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_CHDLC;
799*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
800*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
801*ed775ee7SAntonio Huete Jimenez             return;
802*ed775ee7SAntonio Huete Jimenez         }
80341c99275SPeter Avalos 
80441c99275SPeter Avalos         p+=l2info.header_len;
80541c99275SPeter Avalos         /* this DLT contains nothing but raw c-hdlc frames */
806411677aeSAaron LI         chdlc_print(ndo, p, l2info.length);
807*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
80841c99275SPeter Avalos }
80941c99275SPeter Avalos #endif
81041c99275SPeter Avalos 
81141c99275SPeter Avalos #ifdef DLT_JUNIPER_PPPOE_ATM
812*ed775ee7SAntonio Huete Jimenez void
juniper_pppoe_atm_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)813*ed775ee7SAntonio Huete Jimenez juniper_pppoe_atm_if_print(netdissect_options *ndo,
814*ed775ee7SAntonio Huete Jimenez                            const struct pcap_pkthdr *h, const u_char *p)
81541c99275SPeter Avalos {
81641c99275SPeter Avalos         struct juniper_l2info_t l2info;
817411677aeSAaron LI         uint16_t extracted_ethertype;
81841c99275SPeter Avalos 
819*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_pppoe_atm";
820*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
82141c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_PPPOE_ATM;
822*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
823*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
824*ed775ee7SAntonio Huete Jimenez             return;
825*ed775ee7SAntonio Huete Jimenez         }
82641c99275SPeter Avalos 
82741c99275SPeter Avalos         p+=l2info.header_len;
82841c99275SPeter Avalos 
829*ed775ee7SAntonio Huete Jimenez         extracted_ethertype = GET_BE_U_2(p);
83041c99275SPeter Avalos         /* this DLT contains nothing but raw PPPoE frames,
83141c99275SPeter Avalos          * prepended with a type field*/
832411677aeSAaron LI         if (ethertype_print(ndo, extracted_ethertype,
83341c99275SPeter Avalos                               p+ETHERTYPE_LEN,
83441c99275SPeter Avalos                               l2info.length-ETHERTYPE_LEN,
835411677aeSAaron LI                               l2info.caplen-ETHERTYPE_LEN,
836411677aeSAaron LI                               NULL, NULL) == 0)
83741c99275SPeter Avalos             /* ether_type not known, probably it wasn't one */
838*ed775ee7SAntonio Huete Jimenez             ND_PRINT("unknown ethertype 0x%04x", extracted_ethertype);
83941c99275SPeter Avalos 
840*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
84141c99275SPeter Avalos }
84241c99275SPeter Avalos #endif
84341c99275SPeter Avalos 
84441c99275SPeter Avalos #ifdef DLT_JUNIPER_MLPPP
845*ed775ee7SAntonio Huete Jimenez void
juniper_mlppp_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)846*ed775ee7SAntonio Huete Jimenez juniper_mlppp_if_print(netdissect_options *ndo,
847*ed775ee7SAntonio Huete Jimenez                        const struct pcap_pkthdr *h, const u_char *p)
84841c99275SPeter Avalos {
84941c99275SPeter Avalos         struct juniper_l2info_t l2info;
85041c99275SPeter Avalos 
851*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_mlppp";
852*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
85341c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_MLPPP;
854*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
855*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
856*ed775ee7SAntonio Huete Jimenez             return;
857*ed775ee7SAntonio Huete Jimenez         }
85841c99275SPeter Avalos 
85941c99275SPeter Avalos         /* suppress Bundle-ID if frame was captured on a child-link
86041c99275SPeter Avalos          * best indicator if the cookie looks like a proto */
861411677aeSAaron LI         if (ndo->ndo_eflag &&
862*ed775ee7SAntonio Huete Jimenez             /* use EXTRACT_, not GET_ (not packet buffer pointer) */
863*ed775ee7SAntonio Huete Jimenez             EXTRACT_BE_U_2(&l2info.cookie) != PPP_OSI &&
864*ed775ee7SAntonio Huete Jimenez             /* use EXTRACT_, not GET_ (not packet buffer pointer) */
865*ed775ee7SAntonio Huete Jimenez             EXTRACT_BE_U_2(&l2info.cookie) !=  (PPP_ADDRESS << 8 | PPP_CONTROL))
866*ed775ee7SAntonio Huete Jimenez             ND_PRINT("Bundle-ID %u: ", l2info.bundle);
86741c99275SPeter Avalos 
86841c99275SPeter Avalos         p+=l2info.header_len;
86941c99275SPeter Avalos 
87041c99275SPeter Avalos         /* first try the LSQ protos */
87141c99275SPeter Avalos         switch(l2info.proto) {
87241c99275SPeter Avalos         case JUNIPER_LSQ_L3_PROTO_IPV4:
87341c99275SPeter Avalos             /* IP traffic going to the RE would not have a cookie
87441c99275SPeter Avalos              * -> this must be incoming IS-IS over PPP
87541c99275SPeter Avalos              */
87641c99275SPeter Avalos             if (l2info.cookie[4] == (JUNIPER_LSQ_COOKIE_RE|JUNIPER_LSQ_COOKIE_DIR))
877411677aeSAaron LI                 ppp_print(ndo, p, l2info.length);
87841c99275SPeter Avalos             else
879411677aeSAaron LI                 ip_print(ndo, p, l2info.length);
880*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
881*ed775ee7SAntonio Huete Jimenez             return;
88241c99275SPeter Avalos         case JUNIPER_LSQ_L3_PROTO_IPV6:
883411677aeSAaron LI             ip6_print(ndo, p,l2info.length);
884*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
885*ed775ee7SAntonio Huete Jimenez             return;
88641c99275SPeter Avalos         case JUNIPER_LSQ_L3_PROTO_MPLS:
887411677aeSAaron LI             mpls_print(ndo, p, l2info.length);
888*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
889*ed775ee7SAntonio Huete Jimenez             return;
89041c99275SPeter Avalos         case JUNIPER_LSQ_L3_PROTO_ISO:
891411677aeSAaron LI             isoclns_print(ndo, p, l2info.length);
892*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
893*ed775ee7SAntonio Huete Jimenez             return;
89441c99275SPeter Avalos         default:
89541c99275SPeter Avalos             break;
89641c99275SPeter Avalos         }
89741c99275SPeter Avalos 
89841c99275SPeter Avalos         /* zero length cookie ? */
899*ed775ee7SAntonio Huete Jimenez         /* use EXTRACT_, not GET_ (not packet buffer pointer) */
900*ed775ee7SAntonio Huete Jimenez         switch (EXTRACT_BE_U_2(&l2info.cookie)) {
90141c99275SPeter Avalos         case PPP_OSI:
902411677aeSAaron LI             ppp_print(ndo, p - 2, l2info.length + 2);
90341c99275SPeter Avalos             break;
90441c99275SPeter Avalos         case (PPP_ADDRESS << 8 | PPP_CONTROL): /* fall through */
90541c99275SPeter Avalos         default:
906411677aeSAaron LI             ppp_print(ndo, p, l2info.length);
90741c99275SPeter Avalos             break;
90841c99275SPeter Avalos         }
90941c99275SPeter Avalos 
910*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
91141c99275SPeter Avalos }
91241c99275SPeter Avalos #endif
91341c99275SPeter Avalos 
91441c99275SPeter Avalos 
91541c99275SPeter Avalos #ifdef DLT_JUNIPER_MFR
916*ed775ee7SAntonio Huete Jimenez void
juniper_mfr_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)917*ed775ee7SAntonio Huete Jimenez juniper_mfr_if_print(netdissect_options *ndo,
918*ed775ee7SAntonio Huete Jimenez                      const struct pcap_pkthdr *h, const u_char *p)
91941c99275SPeter Avalos {
92041c99275SPeter Avalos         struct juniper_l2info_t l2info;
92141c99275SPeter Avalos 
922*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_mfr";
923411677aeSAaron LI         memset(&l2info, 0, sizeof(l2info));
92441c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_MFR;
925*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
926*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
927*ed775ee7SAntonio Huete Jimenez             return;
928*ed775ee7SAntonio Huete Jimenez         }
92941c99275SPeter Avalos 
93041c99275SPeter Avalos         p+=l2info.header_len;
93141c99275SPeter Avalos 
93241c99275SPeter Avalos         /* child-link ? */
93341c99275SPeter Avalos         if (l2info.cookie_len == 0) {
934411677aeSAaron LI             mfr_print(ndo, p, l2info.length);
935*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
936*ed775ee7SAntonio Huete Jimenez             return;
93741c99275SPeter Avalos         }
93841c99275SPeter Avalos 
93941c99275SPeter Avalos         /* first try the LSQ protos */
94041c99275SPeter Avalos         if (l2info.cookie_len == AS_PIC_COOKIE_LEN) {
94141c99275SPeter Avalos             switch(l2info.proto) {
94241c99275SPeter Avalos             case JUNIPER_LSQ_L3_PROTO_IPV4:
943411677aeSAaron LI                 ip_print(ndo, p, l2info.length);
944*ed775ee7SAntonio Huete Jimenez                 ndo->ndo_ll_hdr_len += l2info.header_len;
945*ed775ee7SAntonio Huete Jimenez                 return;
94641c99275SPeter Avalos             case JUNIPER_LSQ_L3_PROTO_IPV6:
947411677aeSAaron LI                 ip6_print(ndo, p,l2info.length);
948*ed775ee7SAntonio Huete Jimenez                 ndo->ndo_ll_hdr_len += l2info.header_len;
949*ed775ee7SAntonio Huete Jimenez                 return;
95041c99275SPeter Avalos             case JUNIPER_LSQ_L3_PROTO_MPLS:
951411677aeSAaron LI                 mpls_print(ndo, p, l2info.length);
952*ed775ee7SAntonio Huete Jimenez                 ndo->ndo_ll_hdr_len += l2info.header_len;
953*ed775ee7SAntonio Huete Jimenez                 return;
95441c99275SPeter Avalos             case JUNIPER_LSQ_L3_PROTO_ISO:
955411677aeSAaron LI                 isoclns_print(ndo, p, l2info.length);
956*ed775ee7SAntonio Huete Jimenez                 ndo->ndo_ll_hdr_len += l2info.header_len;
957*ed775ee7SAntonio Huete Jimenez                 return;
95841c99275SPeter Avalos             default:
95941c99275SPeter Avalos                 break;
96041c99275SPeter Avalos             }
961*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
962*ed775ee7SAntonio Huete Jimenez             return;
96341c99275SPeter Avalos         }
96441c99275SPeter Avalos 
96541c99275SPeter Avalos         /* suppress Bundle-ID if frame was captured on a child-link */
966*ed775ee7SAntonio Huete Jimenez         /* use EXTRACT_, not GET_ (not packet buffer pointer) */
967*ed775ee7SAntonio Huete Jimenez         if (ndo->ndo_eflag && EXTRACT_BE_U_4(l2info.cookie) != 1)
968*ed775ee7SAntonio Huete Jimenez             ND_PRINT("Bundle-ID %u, ", l2info.bundle);
96941c99275SPeter Avalos         switch (l2info.proto) {
97041c99275SPeter Avalos         case (LLCSAP_ISONS<<8 | LLCSAP_ISONS):
971411677aeSAaron LI             isoclns_print(ndo, p + 1, l2info.length - 1);
97241c99275SPeter Avalos             break;
97341c99275SPeter Avalos         case (LLC_UI<<8 | NLPID_Q933):
97441c99275SPeter Avalos         case (LLC_UI<<8 | NLPID_IP):
97541c99275SPeter Avalos         case (LLC_UI<<8 | NLPID_IP6):
97641c99275SPeter Avalos             /* pass IP{4,6} to the OSI layer for proper link-layer printing */
977411677aeSAaron LI             isoclns_print(ndo, p - 1, l2info.length + 1);
97841c99275SPeter Avalos             break;
97941c99275SPeter Avalos         default:
980*ed775ee7SAntonio Huete Jimenez             ND_PRINT("unknown protocol 0x%04x, length %u", l2info.proto, l2info.length);
98141c99275SPeter Avalos         }
98241c99275SPeter Avalos 
983*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
98441c99275SPeter Avalos }
98541c99275SPeter Avalos #endif
98641c99275SPeter Avalos 
98741c99275SPeter Avalos #ifdef DLT_JUNIPER_MLFR
988*ed775ee7SAntonio Huete Jimenez void
juniper_mlfr_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)989*ed775ee7SAntonio Huete Jimenez juniper_mlfr_if_print(netdissect_options *ndo,
990*ed775ee7SAntonio Huete Jimenez                       const struct pcap_pkthdr *h, const u_char *p)
99141c99275SPeter Avalos {
99241c99275SPeter Avalos         struct juniper_l2info_t l2info;
99341c99275SPeter Avalos 
994*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_mlfr";
995*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
99641c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_MLFR;
997*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
998*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
999*ed775ee7SAntonio Huete Jimenez             return;
1000*ed775ee7SAntonio Huete Jimenez         }
100141c99275SPeter Avalos 
100241c99275SPeter Avalos         p+=l2info.header_len;
100341c99275SPeter Avalos 
100441c99275SPeter Avalos         /* suppress Bundle-ID if frame was captured on a child-link */
1005*ed775ee7SAntonio Huete Jimenez         /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1006*ed775ee7SAntonio Huete Jimenez         if (ndo->ndo_eflag && EXTRACT_BE_U_4(l2info.cookie) != 1)
1007*ed775ee7SAntonio Huete Jimenez             ND_PRINT("Bundle-ID %u, ", l2info.bundle);
100841c99275SPeter Avalos         switch (l2info.proto) {
100941c99275SPeter Avalos         case (LLC_UI):
101041c99275SPeter Avalos         case (LLC_UI<<8):
1011411677aeSAaron LI             isoclns_print(ndo, p, l2info.length);
101241c99275SPeter Avalos             break;
101341c99275SPeter Avalos         case (LLC_UI<<8 | NLPID_Q933):
101441c99275SPeter Avalos         case (LLC_UI<<8 | NLPID_IP):
101541c99275SPeter Avalos         case (LLC_UI<<8 | NLPID_IP6):
101641c99275SPeter Avalos             /* pass IP{4,6} to the OSI layer for proper link-layer printing */
1017411677aeSAaron LI             isoclns_print(ndo, p - 1, l2info.length + 1);
101841c99275SPeter Avalos             break;
101941c99275SPeter Avalos         default:
1020*ed775ee7SAntonio Huete Jimenez             ND_PRINT("unknown protocol 0x%04x, length %u", l2info.proto, l2info.length);
102141c99275SPeter Avalos         }
102241c99275SPeter Avalos 
1023*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
102441c99275SPeter Avalos }
102541c99275SPeter Avalos #endif
102641c99275SPeter Avalos 
102741c99275SPeter Avalos /*
102841c99275SPeter Avalos  *     ATM1 PIC cookie format
102941c99275SPeter Avalos  *
103041c99275SPeter Avalos  *     +-----+-------------------------+-------------------------------+
103141c99275SPeter Avalos  *     |fmtid|     vc index            |  channel  ID                  |
103241c99275SPeter Avalos  *     +-----+-------------------------+-------------------------------+
103341c99275SPeter Avalos  */
103441c99275SPeter Avalos 
103541c99275SPeter Avalos #ifdef DLT_JUNIPER_ATM1
1036*ed775ee7SAntonio Huete Jimenez void
juniper_atm1_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)1037*ed775ee7SAntonio Huete Jimenez juniper_atm1_if_print(netdissect_options *ndo,
1038*ed775ee7SAntonio Huete Jimenez                       const struct pcap_pkthdr *h, const u_char *p)
103941c99275SPeter Avalos {
1040411677aeSAaron LI         int llc_hdrlen;
104141c99275SPeter Avalos 
104241c99275SPeter Avalos         struct juniper_l2info_t l2info;
104341c99275SPeter Avalos 
1044*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_atm1";
1045*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
104641c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_ATM1;
1047*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
1048*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1049*ed775ee7SAntonio Huete Jimenez             return;
1050*ed775ee7SAntonio Huete Jimenez         }
105141c99275SPeter Avalos 
105241c99275SPeter Avalos         p+=l2info.header_len;
105341c99275SPeter Avalos 
105441c99275SPeter Avalos         if (l2info.cookie[0] == 0x80) { /* OAM cell ? */
1055411677aeSAaron LI             oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
1056*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1057*ed775ee7SAntonio Huete Jimenez             return;
105841c99275SPeter Avalos         }
105941c99275SPeter Avalos 
1060*ed775ee7SAntonio Huete Jimenez         if (GET_BE_U_3(p) == 0xfefe03 || /* NLPID encaps ? */
1061*ed775ee7SAntonio Huete Jimenez             GET_BE_U_3(p) == 0xaaaa03) { /* SNAP encaps ? */
106241c99275SPeter Avalos 
1063411677aeSAaron LI             llc_hdrlen = llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
1064*ed775ee7SAntonio Huete Jimenez             if (llc_hdrlen > 0) {
1065*ed775ee7SAntonio Huete Jimenez                 ndo->ndo_ll_hdr_len += l2info.header_len;
1066*ed775ee7SAntonio Huete Jimenez                 return;
1067*ed775ee7SAntonio Huete Jimenez             }
106841c99275SPeter Avalos         }
106941c99275SPeter Avalos 
1070*ed775ee7SAntonio Huete Jimenez         if (GET_U_1(p) == 0x03) { /* Cisco style NLPID encaps ? */
1071411677aeSAaron LI             isoclns_print(ndo, p + 1, l2info.length - 1);
107241c99275SPeter Avalos             /* FIXME check if frame was recognized */
1073*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1074*ed775ee7SAntonio Huete Jimenez             return;
107541c99275SPeter Avalos         }
107641c99275SPeter Avalos 
1077*ed775ee7SAntonio Huete Jimenez         if (ip_heuristic_guess(ndo, p, l2info.length) != 0) { /* last try - vcmux encaps ? */
1078*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1079*ed775ee7SAntonio Huete Jimenez             return;
1080*ed775ee7SAntonio Huete Jimenez         }
108141c99275SPeter Avalos 
1082*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
108341c99275SPeter Avalos }
108441c99275SPeter Avalos #endif
108541c99275SPeter Avalos 
108641c99275SPeter Avalos /*
108741c99275SPeter Avalos  *     ATM2 PIC cookie format
108841c99275SPeter Avalos  *
108941c99275SPeter Avalos  *     +-------------------------------+---------+---+-----+-----------+
109041c99275SPeter Avalos  *     |     channel ID                |  reserv |AAL| CCRQ| gap cnt   |
109141c99275SPeter Avalos  *     +-------------------------------+---------+---+-----+-----------+
109241c99275SPeter Avalos  */
109341c99275SPeter Avalos 
109441c99275SPeter Avalos #ifdef DLT_JUNIPER_ATM2
1095*ed775ee7SAntonio Huete Jimenez void
juniper_atm2_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)1096*ed775ee7SAntonio Huete Jimenez juniper_atm2_if_print(netdissect_options *ndo,
1097*ed775ee7SAntonio Huete Jimenez                       const struct pcap_pkthdr *h, const u_char *p)
109841c99275SPeter Avalos {
1099411677aeSAaron LI         int llc_hdrlen;
110041c99275SPeter Avalos 
110141c99275SPeter Avalos         struct juniper_l2info_t l2info;
110241c99275SPeter Avalos 
1103*ed775ee7SAntonio Huete Jimenez         ndo->ndo_protocol = "juniper_atm2";
1104*ed775ee7SAntonio Huete Jimenez         memset(&l2info, 0, sizeof(l2info));
110541c99275SPeter Avalos         l2info.pictype = DLT_JUNIPER_ATM2;
1106*ed775ee7SAntonio Huete Jimenez         if (juniper_parse_header(ndo, p, h, &l2info) == 0) {
1107*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1108*ed775ee7SAntonio Huete Jimenez             return;
1109*ed775ee7SAntonio Huete Jimenez         }
111041c99275SPeter Avalos 
111141c99275SPeter Avalos         p+=l2info.header_len;
111241c99275SPeter Avalos 
111341c99275SPeter Avalos         if (l2info.cookie[7] & ATM2_PKT_TYPE_MASK) { /* OAM cell ? */
1114411677aeSAaron LI             oam_print(ndo, p, l2info.length, ATM_OAM_NOHEC);
1115*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1116*ed775ee7SAntonio Huete Jimenez             return;
111741c99275SPeter Avalos         }
111841c99275SPeter Avalos 
1119*ed775ee7SAntonio Huete Jimenez         if (GET_BE_U_3(p) == 0xfefe03 || /* NLPID encaps ? */
1120*ed775ee7SAntonio Huete Jimenez             GET_BE_U_3(p) == 0xaaaa03) { /* SNAP encaps ? */
112141c99275SPeter Avalos 
1122411677aeSAaron LI             llc_hdrlen = llc_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
1123*ed775ee7SAntonio Huete Jimenez             if (llc_hdrlen > 0) {
1124*ed775ee7SAntonio Huete Jimenez                 ndo->ndo_ll_hdr_len += l2info.header_len;
1125*ed775ee7SAntonio Huete Jimenez                 return;
1126*ed775ee7SAntonio Huete Jimenez             }
112741c99275SPeter Avalos         }
112841c99275SPeter Avalos 
112941c99275SPeter Avalos         if (l2info.direction != JUNIPER_BPF_PKT_IN && /* ether-over-1483 encaps ? */
1130*ed775ee7SAntonio Huete Jimenez             /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1131*ed775ee7SAntonio Huete Jimenez             (EXTRACT_BE_U_4(l2info.cookie) & ATM2_GAP_COUNT_MASK)) {
1132411677aeSAaron LI             ether_print(ndo, p, l2info.length, l2info.caplen, NULL, NULL);
1133*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1134*ed775ee7SAntonio Huete Jimenez             return;
113541c99275SPeter Avalos         }
113641c99275SPeter Avalos 
1137*ed775ee7SAntonio Huete Jimenez         if (GET_U_1(p) == 0x03) { /* Cisco style NLPID encaps ? */
1138411677aeSAaron LI             isoclns_print(ndo, p + 1, l2info.length - 1);
113941c99275SPeter Avalos             /* FIXME check if frame was recognized */
1140*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1141*ed775ee7SAntonio Huete Jimenez             return;
114241c99275SPeter Avalos         }
114341c99275SPeter Avalos 
1144*ed775ee7SAntonio Huete Jimenez         if(juniper_ppp_heuristic_guess(ndo, p, l2info.length) != 0) { /* PPPoA vcmux encaps ? */
1145*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1146*ed775ee7SAntonio Huete Jimenez             return;
114741c99275SPeter Avalos         }
114841c99275SPeter Avalos 
1149*ed775ee7SAntonio Huete Jimenez         if (ip_heuristic_guess(ndo, p, l2info.length) != 0) { /* last try - vcmux encaps ? */
1150*ed775ee7SAntonio Huete Jimenez             ndo->ndo_ll_hdr_len += l2info.header_len;
1151*ed775ee7SAntonio Huete Jimenez             return;
1152*ed775ee7SAntonio Huete Jimenez         }
1153*ed775ee7SAntonio Huete Jimenez 
1154*ed775ee7SAntonio Huete Jimenez         ndo->ndo_ll_hdr_len += l2info.header_len;
1155*ed775ee7SAntonio Huete Jimenez }
115641c99275SPeter Avalos 
115741c99275SPeter Avalos /* try to guess, based on all PPP protos that are supported in
115841c99275SPeter Avalos  * a juniper router if the payload data is encapsulated using PPP */
1159411677aeSAaron LI static int
juniper_ppp_heuristic_guess(netdissect_options * ndo,const u_char * p,u_int length)1160411677aeSAaron LI juniper_ppp_heuristic_guess(netdissect_options *ndo,
1161*ed775ee7SAntonio Huete Jimenez                             const u_char *p, u_int length)
1162411677aeSAaron LI {
1163*ed775ee7SAntonio Huete Jimenez     switch(GET_BE_U_2(p)) {
116441c99275SPeter Avalos     case PPP_IP :
116541c99275SPeter Avalos     case PPP_OSI :
116641c99275SPeter Avalos     case PPP_MPLS_UCAST :
116741c99275SPeter Avalos     case PPP_MPLS_MCAST :
116841c99275SPeter Avalos     case PPP_IPCP :
116941c99275SPeter Avalos     case PPP_OSICP :
117041c99275SPeter Avalos     case PPP_MPLSCP :
117141c99275SPeter Avalos     case PPP_LCP :
117241c99275SPeter Avalos     case PPP_PAP :
117341c99275SPeter Avalos     case PPP_CHAP :
117441c99275SPeter Avalos     case PPP_ML :
117541c99275SPeter Avalos     case PPP_IPV6 :
117641c99275SPeter Avalos     case PPP_IPV6CP :
1177411677aeSAaron LI         ppp_print(ndo, p, length);
117841c99275SPeter Avalos         break;
117941c99275SPeter Avalos 
118041c99275SPeter Avalos     default:
118141c99275SPeter Avalos         return 0; /* did not find a ppp header */
118241c99275SPeter Avalos         break;
118341c99275SPeter Avalos     }
118441c99275SPeter Avalos     return 1; /* we printed a ppp packet */
118541c99275SPeter Avalos }
1186*ed775ee7SAntonio Huete Jimenez #endif
118741c99275SPeter Avalos 
1188411677aeSAaron LI static int
ip_heuristic_guess(netdissect_options * ndo,const u_char * p,u_int length)1189411677aeSAaron LI ip_heuristic_guess(netdissect_options *ndo,
1190*ed775ee7SAntonio Huete Jimenez                    const u_char *p, u_int length)
1191411677aeSAaron LI {
1192*ed775ee7SAntonio Huete Jimenez     switch(GET_U_1(p)) {
119341c99275SPeter Avalos     case 0x45:
119441c99275SPeter Avalos     case 0x46:
119541c99275SPeter Avalos     case 0x47:
119641c99275SPeter Avalos     case 0x48:
119741c99275SPeter Avalos     case 0x49:
119841c99275SPeter Avalos     case 0x4a:
119941c99275SPeter Avalos     case 0x4b:
120041c99275SPeter Avalos     case 0x4c:
120141c99275SPeter Avalos     case 0x4d:
120241c99275SPeter Avalos     case 0x4e:
120341c99275SPeter Avalos     case 0x4f:
1204411677aeSAaron LI         ip_print(ndo, p, length);
120541c99275SPeter Avalos         break;
120641c99275SPeter Avalos     case 0x60:
120741c99275SPeter Avalos     case 0x61:
120841c99275SPeter Avalos     case 0x62:
120941c99275SPeter Avalos     case 0x63:
121041c99275SPeter Avalos     case 0x64:
121141c99275SPeter Avalos     case 0x65:
121241c99275SPeter Avalos     case 0x66:
121341c99275SPeter Avalos     case 0x67:
121441c99275SPeter Avalos     case 0x68:
121541c99275SPeter Avalos     case 0x69:
121641c99275SPeter Avalos     case 0x6a:
121741c99275SPeter Avalos     case 0x6b:
121841c99275SPeter Avalos     case 0x6c:
121941c99275SPeter Avalos     case 0x6d:
122041c99275SPeter Avalos     case 0x6e:
122141c99275SPeter Avalos     case 0x6f:
1222411677aeSAaron LI         ip6_print(ndo, p, length);
122341c99275SPeter Avalos         break;
122441c99275SPeter Avalos     default:
122541c99275SPeter Avalos         return 0; /* did not find a ip header */
122641c99275SPeter Avalos         break;
122741c99275SPeter Avalos     }
122841c99275SPeter Avalos     return 1; /* we printed an v4/v6 packet */
122941c99275SPeter Avalos }
123041c99275SPeter Avalos 
1231411677aeSAaron LI static int
juniper_read_tlv_value(netdissect_options * ndo,const u_char * p,u_int tlv_type,u_int tlv_len)1232*ed775ee7SAntonio Huete Jimenez juniper_read_tlv_value(netdissect_options *ndo,
1233*ed775ee7SAntonio Huete Jimenez 		       const u_char *p, u_int tlv_type, u_int tlv_len)
1234411677aeSAaron LI {
1235ea7b4bf5SPeter Avalos    int tlv_value;
1236ea7b4bf5SPeter Avalos 
1237ea7b4bf5SPeter Avalos    /* TLVs < 128 are little endian encoded */
1238ea7b4bf5SPeter Avalos    if (tlv_type < 128) {
1239ea7b4bf5SPeter Avalos        switch (tlv_len) {
1240ea7b4bf5SPeter Avalos        case 1:
1241*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_U_1(p);
1242ea7b4bf5SPeter Avalos            break;
1243ea7b4bf5SPeter Avalos        case 2:
1244*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_LE_U_2(p);
1245ea7b4bf5SPeter Avalos            break;
1246ea7b4bf5SPeter Avalos        case 3:
1247*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_LE_U_3(p);
1248ea7b4bf5SPeter Avalos            break;
1249ea7b4bf5SPeter Avalos        case 4:
1250*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_LE_U_4(p);
1251ea7b4bf5SPeter Avalos            break;
1252ea7b4bf5SPeter Avalos        default:
1253ea7b4bf5SPeter Avalos            tlv_value = -1;
1254ea7b4bf5SPeter Avalos            break;
1255ea7b4bf5SPeter Avalos        }
1256ea7b4bf5SPeter Avalos    } else {
1257ea7b4bf5SPeter Avalos        /* TLVs >= 128 are big endian encoded */
1258ea7b4bf5SPeter Avalos        switch (tlv_len) {
1259ea7b4bf5SPeter Avalos        case 1:
1260*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_U_1(p);
1261ea7b4bf5SPeter Avalos            break;
1262ea7b4bf5SPeter Avalos        case 2:
1263*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_BE_U_2(p);
1264ea7b4bf5SPeter Avalos            break;
1265ea7b4bf5SPeter Avalos        case 3:
1266*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_BE_U_3(p);
1267ea7b4bf5SPeter Avalos            break;
1268ea7b4bf5SPeter Avalos        case 4:
1269*ed775ee7SAntonio Huete Jimenez            tlv_value = GET_BE_U_4(p);
1270ea7b4bf5SPeter Avalos            break;
1271ea7b4bf5SPeter Avalos        default:
1272ea7b4bf5SPeter Avalos            tlv_value = -1;
1273ea7b4bf5SPeter Avalos            break;
1274ea7b4bf5SPeter Avalos        }
1275ea7b4bf5SPeter Avalos    }
1276ea7b4bf5SPeter Avalos    return tlv_value;
1277ea7b4bf5SPeter Avalos }
1278ea7b4bf5SPeter Avalos 
127941c99275SPeter Avalos static int
juniper_parse_header(netdissect_options * ndo,const u_char * p,const struct pcap_pkthdr * h,struct juniper_l2info_t * l2info)1280411677aeSAaron LI juniper_parse_header(netdissect_options *ndo,
1281411677aeSAaron LI                      const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info)
1282411677aeSAaron LI {
1283411677aeSAaron LI     const struct juniper_cookie_table_t *lp = juniper_cookie_table;
1284ea7b4bf5SPeter Avalos     u_int idx, jnx_ext_len, jnx_header_len = 0;
1285411677aeSAaron LI     uint8_t tlv_type,tlv_len;
1286*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ATM2
1287411677aeSAaron LI     uint32_t control_word;
1288*ed775ee7SAntonio Huete Jimenez #endif
1289ea7b4bf5SPeter Avalos     int tlv_value;
1290ea7b4bf5SPeter Avalos     const u_char *tptr;
1291ea7b4bf5SPeter Avalos 
129241c99275SPeter Avalos 
129341c99275SPeter Avalos     l2info->header_len = 0;
129441c99275SPeter Avalos     l2info->cookie_len = 0;
129541c99275SPeter Avalos     l2info->proto = 0;
129641c99275SPeter Avalos 
129741c99275SPeter Avalos 
129841c99275SPeter Avalos     l2info->length = h->len;
129941c99275SPeter Avalos     l2info->caplen = h->caplen;
1300*ed775ee7SAntonio Huete Jimenez     l2info->flags = GET_U_1(p + 3);
1301*ed775ee7SAntonio Huete Jimenez     l2info->direction = GET_U_1(p + 3) & JUNIPER_BPF_PKT_IN;
130241c99275SPeter Avalos 
1303*ed775ee7SAntonio Huete Jimenez     if (GET_BE_U_3(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */
1304*ed775ee7SAntonio Huete Jimenez         ND_PRINT("no magic-number found!");
130541c99275SPeter Avalos         return 0;
130641c99275SPeter Avalos     }
130741c99275SPeter Avalos 
1308411677aeSAaron LI     if (ndo->ndo_eflag) /* print direction */
1309*ed775ee7SAntonio Huete Jimenez         ND_PRINT("%3s ", tok2str(juniper_direction_values, "---", l2info->direction));
131041c99275SPeter Avalos 
1311ea7b4bf5SPeter Avalos     /* magic number + flags */
1312ea7b4bf5SPeter Avalos     jnx_header_len = 4;
131341c99275SPeter Avalos 
1314411677aeSAaron LI     if (ndo->ndo_vflag > 1)
1315*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\tJuniper PCAP Flags [%s]",
1316*ed775ee7SAntonio Huete Jimenez                bittok2str(jnx_flag_values, "none", l2info->flags));
1317ea7b4bf5SPeter Avalos 
1318ea7b4bf5SPeter Avalos     /* extensions present ?  - calculate how much bytes to skip */
1319ea7b4bf5SPeter Avalos     if ((l2info->flags & JUNIPER_BPF_EXT ) == JUNIPER_BPF_EXT ) {
1320ea7b4bf5SPeter Avalos 
1321ea7b4bf5SPeter Avalos         tptr = p+jnx_header_len;
1322ea7b4bf5SPeter Avalos 
1323ea7b4bf5SPeter Avalos         /* ok to read extension length ? */
1324*ed775ee7SAntonio Huete Jimenez         jnx_ext_len = GET_BE_U_2(tptr);
1325ea7b4bf5SPeter Avalos         jnx_header_len += 2;
1326ea7b4bf5SPeter Avalos         tptr +=2;
1327ea7b4bf5SPeter Avalos 
1328ea7b4bf5SPeter Avalos         /* nail up the total length -
1329ea7b4bf5SPeter Avalos          * just in case something goes wrong
1330ea7b4bf5SPeter Avalos          * with TLV parsing */
1331ea7b4bf5SPeter Avalos         jnx_header_len += jnx_ext_len;
1332ea7b4bf5SPeter Avalos 
1333411677aeSAaron LI         if (ndo->ndo_vflag > 1)
1334*ed775ee7SAntonio Huete Jimenez             ND_PRINT(", PCAP Extension(s) total length %u", jnx_ext_len);
1335ea7b4bf5SPeter Avalos 
1336*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, jnx_ext_len);
1337ea7b4bf5SPeter Avalos         while (jnx_ext_len > JUNIPER_EXT_TLV_OVERHEAD) {
1338*ed775ee7SAntonio Huete Jimenez             tlv_type = GET_U_1(tptr);
1339*ed775ee7SAntonio Huete Jimenez             tptr++;
1340*ed775ee7SAntonio Huete Jimenez             tlv_len = GET_U_1(tptr);
1341*ed775ee7SAntonio Huete Jimenez             tptr++;
1342ea7b4bf5SPeter Avalos             tlv_value = 0;
1343ea7b4bf5SPeter Avalos 
1344411677aeSAaron LI             /* sanity checks */
1345ea7b4bf5SPeter Avalos             if (tlv_type == 0 || tlv_len == 0)
1346ea7b4bf5SPeter Avalos                 break;
1347411677aeSAaron LI             if (tlv_len+JUNIPER_EXT_TLV_OVERHEAD > jnx_ext_len)
1348411677aeSAaron LI                 goto trunc;
1349ea7b4bf5SPeter Avalos 
1350411677aeSAaron LI             if (ndo->ndo_vflag > 1)
1351*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("\n\t  %s Extension TLV #%u, length %u, value ",
1352ea7b4bf5SPeter Avalos                        tok2str(jnx_ext_tlv_values,"Unknown",tlv_type),
1353ea7b4bf5SPeter Avalos                        tlv_type,
1354*ed775ee7SAntonio Huete Jimenez                        tlv_len);
1355ea7b4bf5SPeter Avalos 
1356*ed775ee7SAntonio Huete Jimenez             tlv_value = juniper_read_tlv_value(ndo, tptr, tlv_type, tlv_len);
1357ea7b4bf5SPeter Avalos             switch (tlv_type) {
1358ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_IFD_NAME:
1359ea7b4bf5SPeter Avalos                 /* FIXME */
1360ea7b4bf5SPeter Avalos                 break;
1361ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_IFD_MEDIATYPE:
1362ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE:
1363ea7b4bf5SPeter Avalos                 if (tlv_value != -1) {
1364411677aeSAaron LI                     if (ndo->ndo_vflag > 1)
1365*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s (%u)",
1366ea7b4bf5SPeter Avalos                                tok2str(juniper_ifmt_values, "Unknown", tlv_value),
1367*ed775ee7SAntonio Huete Jimenez                                tlv_value);
1368ea7b4bf5SPeter Avalos                 }
1369ea7b4bf5SPeter Avalos                 break;
1370ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_IFL_ENCAPS:
1371ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_TTP_IFL_ENCAPS:
1372ea7b4bf5SPeter Avalos                 if (tlv_value != -1) {
1373411677aeSAaron LI                     if (ndo->ndo_vflag > 1)
1374*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s (%u)",
1375ea7b4bf5SPeter Avalos                                tok2str(juniper_ifle_values, "Unknown", tlv_value),
1376*ed775ee7SAntonio Huete Jimenez                                tlv_value);
1377ea7b4bf5SPeter Avalos                 }
1378ea7b4bf5SPeter Avalos                 break;
1379ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_IFL_IDX: /* fall through */
1380ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_IFL_UNIT:
1381ea7b4bf5SPeter Avalos             case JUNIPER_EXT_TLV_IFD_IDX:
1382ea7b4bf5SPeter Avalos             default:
1383ea7b4bf5SPeter Avalos                 if (tlv_value != -1) {
1384411677aeSAaron LI                     if (ndo->ndo_vflag > 1)
1385*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%u", tlv_value);
1386ea7b4bf5SPeter Avalos                 }
1387ea7b4bf5SPeter Avalos                 break;
1388ea7b4bf5SPeter Avalos             }
1389ea7b4bf5SPeter Avalos 
1390ea7b4bf5SPeter Avalos             tptr+=tlv_len;
1391ea7b4bf5SPeter Avalos             jnx_ext_len -= tlv_len+JUNIPER_EXT_TLV_OVERHEAD;
1392ea7b4bf5SPeter Avalos         }
1393ea7b4bf5SPeter Avalos 
1394411677aeSAaron LI         if (ndo->ndo_vflag > 1)
1395*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t-----original packet-----\n\t");
1396ea7b4bf5SPeter Avalos     }
1397ea7b4bf5SPeter Avalos 
1398ea7b4bf5SPeter Avalos     if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {
1399411677aeSAaron LI         if (ndo->ndo_eflag)
1400*ed775ee7SAntonio Huete Jimenez             ND_PRINT("no-L2-hdr, ");
140141c99275SPeter Avalos 
140241c99275SPeter Avalos         /* there is no link-layer present -
140341c99275SPeter Avalos          * perform the v4/v6 heuristics
140441c99275SPeter Avalos          * to figure out what it is
140541c99275SPeter Avalos          */
1406*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_1(p + (jnx_header_len + 4));
1407411677aeSAaron LI         if (ip_heuristic_guess(ndo, p + jnx_header_len + 4,
1408411677aeSAaron LI                                l2info->length - (jnx_header_len + 4)) == 0)
1409*ed775ee7SAntonio Huete Jimenez             ND_PRINT("no IP-hdr found!");
141041c99275SPeter Avalos 
1411ea7b4bf5SPeter Avalos         l2info->header_len=jnx_header_len+4;
141241c99275SPeter Avalos         return 0; /* stop parsing the output further */
141341c99275SPeter Avalos 
141441c99275SPeter Avalos     }
1415ea7b4bf5SPeter Avalos     l2info->header_len = jnx_header_len;
141641c99275SPeter Avalos     p+=l2info->header_len;
141741c99275SPeter Avalos     l2info->length -= l2info->header_len;
141841c99275SPeter Avalos     l2info->caplen -= l2info->header_len;
141941c99275SPeter Avalos 
142041c99275SPeter Avalos     /* search through the cookie table and copy values matching for our PIC type */
1421*ed775ee7SAntonio Huete Jimenez     ND_TCHECK_1(p);
142241c99275SPeter Avalos     while (lp->s != NULL) {
142341c99275SPeter Avalos         if (lp->pictype == l2info->pictype) {
142441c99275SPeter Avalos 
142541c99275SPeter Avalos             l2info->cookie_len += lp->cookie_len;
142641c99275SPeter Avalos 
1427*ed775ee7SAntonio Huete Jimenez             switch (GET_U_1(p)) {
142841c99275SPeter Avalos             case LS_COOKIE_ID:
142941c99275SPeter Avalos                 l2info->cookie_type = LS_COOKIE_ID;
143041c99275SPeter Avalos                 l2info->cookie_len += 2;
143141c99275SPeter Avalos                 break;
143241c99275SPeter Avalos             case AS_COOKIE_ID:
143341c99275SPeter Avalos                 l2info->cookie_type = AS_COOKIE_ID;
143441c99275SPeter Avalos                 l2info->cookie_len = 8;
143541c99275SPeter Avalos                 break;
143641c99275SPeter Avalos 
143741c99275SPeter Avalos             default:
143841c99275SPeter Avalos                 l2info->bundle = l2info->cookie[0];
143941c99275SPeter Avalos                 break;
144041c99275SPeter Avalos             }
144141c99275SPeter Avalos 
144241c99275SPeter Avalos 
144341c99275SPeter Avalos #ifdef DLT_JUNIPER_MFR
144441c99275SPeter Avalos             /* MFR child links don't carry cookies */
144541c99275SPeter Avalos             if (l2info->pictype == DLT_JUNIPER_MFR &&
1446*ed775ee7SAntonio Huete Jimenez                 (GET_U_1(p) & MFR_BE_MASK) == MFR_BE_MASK) {
144741c99275SPeter Avalos                 l2info->cookie_len = 0;
144841c99275SPeter Avalos             }
144941c99275SPeter Avalos #endif
145041c99275SPeter Avalos 
145141c99275SPeter Avalos             l2info->header_len += l2info->cookie_len;
145241c99275SPeter Avalos             l2info->length -= l2info->cookie_len;
145341c99275SPeter Avalos             l2info->caplen -= l2info->cookie_len;
145441c99275SPeter Avalos 
1455411677aeSAaron LI             if (ndo->ndo_eflag)
1456*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s-PIC, cookie-len %u",
145741c99275SPeter Avalos                        lp->s,
1458*ed775ee7SAntonio Huete Jimenez                        l2info->cookie_len);
1459411677aeSAaron LI 
1460411677aeSAaron LI             if (l2info->cookie_len > 8) {
1461*ed775ee7SAntonio Huete Jimenez                 nd_print_invalid(ndo);
1462411677aeSAaron LI                 return 0;
1463411677aeSAaron LI             }
146441c99275SPeter Avalos 
146541c99275SPeter Avalos             if (l2info->cookie_len > 0) {
1466*ed775ee7SAntonio Huete Jimenez                 ND_TCHECK_LEN(p, l2info->cookie_len);
1467411677aeSAaron LI                 if (ndo->ndo_eflag)
1468*ed775ee7SAntonio Huete Jimenez                     ND_PRINT(", cookie 0x");
146941c99275SPeter Avalos                 for (idx = 0; idx < l2info->cookie_len; idx++) {
1470*ed775ee7SAntonio Huete Jimenez                     l2info->cookie[idx] = GET_U_1(p + idx); /* copy cookie data */
1471*ed775ee7SAntonio Huete Jimenez                     if (ndo->ndo_eflag) ND_PRINT("%02x", GET_U_1(p + idx));
147241c99275SPeter Avalos                 }
147341c99275SPeter Avalos             }
147441c99275SPeter Avalos 
1475*ed775ee7SAntonio Huete Jimenez             if (ndo->ndo_eflag) ND_PRINT(": "); /* print demarc b/w L2/L3*/
147641c99275SPeter Avalos 
147741c99275SPeter Avalos 
1478*ed775ee7SAntonio Huete Jimenez             l2info->proto = GET_BE_U_2(p + l2info->cookie_len);
147941c99275SPeter Avalos             break;
148041c99275SPeter Avalos         }
148141c99275SPeter Avalos         ++lp;
148241c99275SPeter Avalos     }
148341c99275SPeter Avalos     p+=l2info->cookie_len;
148441c99275SPeter Avalos 
148541c99275SPeter Avalos     /* DLT_ specific parsing */
148641c99275SPeter Avalos     switch(l2info->pictype) {
148741c99275SPeter Avalos #ifdef DLT_JUNIPER_MLPPP
148841c99275SPeter Avalos     case DLT_JUNIPER_MLPPP:
148941c99275SPeter Avalos         switch (l2info->cookie_type) {
149041c99275SPeter Avalos         case LS_COOKIE_ID:
149141c99275SPeter Avalos             l2info->bundle = l2info->cookie[1];
149241c99275SPeter Avalos             break;
149341c99275SPeter Avalos         case AS_COOKIE_ID:
1494*ed775ee7SAntonio Huete Jimenez             /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1495*ed775ee7SAntonio Huete Jimenez             l2info->bundle = (EXTRACT_BE_U_2(&l2info->cookie[6])>>3)&0xfff;
149641c99275SPeter Avalos             l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
149741c99275SPeter Avalos             break;
149841c99275SPeter Avalos         default:
149941c99275SPeter Avalos             l2info->bundle = l2info->cookie[0];
150041c99275SPeter Avalos             break;
150141c99275SPeter Avalos         }
150241c99275SPeter Avalos         break;
150341c99275SPeter Avalos #endif
150441c99275SPeter Avalos #ifdef DLT_JUNIPER_MLFR
150541c99275SPeter Avalos     case DLT_JUNIPER_MLFR:
150641c99275SPeter Avalos         switch (l2info->cookie_type) {
150741c99275SPeter Avalos         case LS_COOKIE_ID:
150841c99275SPeter Avalos             l2info->bundle = l2info->cookie[1];
1509*ed775ee7SAntonio Huete Jimenez             l2info->proto = GET_BE_U_2(p);
151041c99275SPeter Avalos             l2info->header_len += 2;
151141c99275SPeter Avalos             l2info->length -= 2;
151241c99275SPeter Avalos             l2info->caplen -= 2;
151341c99275SPeter Avalos             break;
151441c99275SPeter Avalos         case AS_COOKIE_ID:
1515*ed775ee7SAntonio Huete Jimenez             /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1516*ed775ee7SAntonio Huete Jimenez             l2info->bundle = (EXTRACT_BE_U_2(&l2info->cookie[6])>>3)&0xfff;
151741c99275SPeter Avalos             l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
151841c99275SPeter Avalos             break;
151941c99275SPeter Avalos         default:
152041c99275SPeter Avalos             l2info->bundle = l2info->cookie[0];
152141c99275SPeter Avalos             l2info->header_len += 2;
152241c99275SPeter Avalos             l2info->length -= 2;
152341c99275SPeter Avalos             l2info->caplen -= 2;
152441c99275SPeter Avalos             break;
152541c99275SPeter Avalos         }
152641c99275SPeter Avalos         break;
152741c99275SPeter Avalos #endif
152841c99275SPeter Avalos #ifdef DLT_JUNIPER_MFR
152941c99275SPeter Avalos     case DLT_JUNIPER_MFR:
153041c99275SPeter Avalos         switch (l2info->cookie_type) {
153141c99275SPeter Avalos         case LS_COOKIE_ID:
153241c99275SPeter Avalos             l2info->bundle = l2info->cookie[1];
1533*ed775ee7SAntonio Huete Jimenez             l2info->proto = GET_BE_U_2(p);
153441c99275SPeter Avalos             l2info->header_len += 2;
153541c99275SPeter Avalos             l2info->length -= 2;
153641c99275SPeter Avalos             l2info->caplen -= 2;
153741c99275SPeter Avalos             break;
153841c99275SPeter Avalos         case AS_COOKIE_ID:
1539*ed775ee7SAntonio Huete Jimenez             /* use EXTRACT_, not GET_ (not packet buffer pointer) */
1540*ed775ee7SAntonio Huete Jimenez             l2info->bundle = (EXTRACT_BE_U_2(&l2info->cookie[6])>>3)&0xfff;
154141c99275SPeter Avalos             l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;
154241c99275SPeter Avalos             break;
154341c99275SPeter Avalos         default:
154441c99275SPeter Avalos             l2info->bundle = l2info->cookie[0];
154541c99275SPeter Avalos             break;
154641c99275SPeter Avalos         }
154741c99275SPeter Avalos         break;
154841c99275SPeter Avalos #endif
154941c99275SPeter Avalos #ifdef DLT_JUNIPER_ATM2
155041c99275SPeter Avalos     case DLT_JUNIPER_ATM2:
1551*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_4(p);
155241c99275SPeter Avalos         /* ATM cell relay control word present ? */
155341c99275SPeter Avalos         if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {
1554*ed775ee7SAntonio Huete Jimenez             control_word = GET_BE_U_4(p);
155541c99275SPeter Avalos             /* some control word heuristics */
155641c99275SPeter Avalos             switch(control_word) {
155741c99275SPeter Avalos             case 0: /* zero control word */
155841c99275SPeter Avalos             case 0x08000000: /* < JUNOS 7.4 control-word */
155941c99275SPeter Avalos             case 0x08380000: /* cntl word plus cell length (56) >= JUNOS 7.4*/
156041c99275SPeter Avalos                 l2info->header_len += 4;
156141c99275SPeter Avalos                 break;
156241c99275SPeter Avalos             default:
156341c99275SPeter Avalos                 break;
156441c99275SPeter Avalos             }
156541c99275SPeter Avalos 
1566411677aeSAaron LI             if (ndo->ndo_eflag)
1567*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("control-word 0x%08x ", control_word);
156841c99275SPeter Avalos         }
156941c99275SPeter Avalos         break;
157041c99275SPeter Avalos #endif
1571ea7b4bf5SPeter Avalos #ifdef DLT_JUNIPER_GGSN
1572ea7b4bf5SPeter Avalos     case DLT_JUNIPER_GGSN:
1573ea7b4bf5SPeter Avalos         break;
1574ea7b4bf5SPeter Avalos #endif
157541c99275SPeter Avalos #ifdef DLT_JUNIPER_ATM1
157641c99275SPeter Avalos     case DLT_JUNIPER_ATM1:
157741c99275SPeter Avalos         break;
157841c99275SPeter Avalos #endif
157941c99275SPeter Avalos #ifdef DLT_JUNIPER_PPP
158041c99275SPeter Avalos     case DLT_JUNIPER_PPP:
158141c99275SPeter Avalos         break;
158241c99275SPeter Avalos #endif
158341c99275SPeter Avalos #ifdef DLT_JUNIPER_CHDLC
158441c99275SPeter Avalos     case DLT_JUNIPER_CHDLC:
158541c99275SPeter Avalos         break;
158641c99275SPeter Avalos #endif
158741c99275SPeter Avalos #ifdef DLT_JUNIPER_ETHER
158841c99275SPeter Avalos     case DLT_JUNIPER_ETHER:
158941c99275SPeter Avalos         break;
159041c99275SPeter Avalos #endif
159141c99275SPeter Avalos #ifdef DLT_JUNIPER_FRELAY
159241c99275SPeter Avalos     case DLT_JUNIPER_FRELAY:
159341c99275SPeter Avalos         break;
159441c99275SPeter Avalos #endif
159541c99275SPeter Avalos 
159641c99275SPeter Avalos     default:
1597*ed775ee7SAntonio Huete Jimenez         ND_PRINT("Unknown Juniper DLT_ type %u: ", l2info->pictype);
159841c99275SPeter Avalos         break;
159941c99275SPeter Avalos     }
160041c99275SPeter Avalos 
1601*ed775ee7SAntonio Huete Jimenez     if (ndo->ndo_eflag)
1602*ed775ee7SAntonio Huete Jimenez         ND_PRINT("hlen %u, proto 0x%04x, ", l2info->header_len, l2info->proto);
160341c99275SPeter Avalos 
160441c99275SPeter Avalos     return 1; /* everything went ok so far. continue parsing */
160541c99275SPeter Avalos trunc:
1606*ed775ee7SAntonio Huete Jimenez     nd_print_trunc(ndo);
160741c99275SPeter Avalos     return 0;
160841c99275SPeter Avalos }
1609*ed775ee7SAntonio Huete Jimenez #endif /* defined(DLT_JUNIPER_GGSN) || defined(DLT_JUNIPER_ES) || \
1610*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_MONITOR) || defined(DLT_JUNIPER_SERVICES) || \
1611*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_PPPOE) || defined(DLT_JUNIPER_ETHER) || \
1612*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_PPP) || defined(DLT_JUNIPER_FRELAY) || \
1613*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_CHDLC) || defined(DLT_JUNIPER_PPPOE_ATM) || \
1614*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_MLPPP) || defined(DLT_JUNIPER_MFR) || \
1615*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_MLFR) || defined(DLT_JUNIPER_ATM1) || \
1616*ed775ee7SAntonio Huete Jimenez           defined(DLT_JUNIPER_ATM2) */
1617