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