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