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