1*0a0e9771SDarren Reed /* 2*0a0e9771SDarren Reed * CDDL HEADER START 3*0a0e9771SDarren Reed * 4*0a0e9771SDarren Reed * The contents of this file are subject to the terms of the 5*0a0e9771SDarren Reed * Common Development and Distribution License (the "License"). 6*0a0e9771SDarren Reed * You may not use this file except in compliance with the License. 7*0a0e9771SDarren Reed * 8*0a0e9771SDarren Reed * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*0a0e9771SDarren Reed * or http://www.opensolaris.org/os/licensing. 10*0a0e9771SDarren Reed * See the License for the specific language governing permissions 11*0a0e9771SDarren Reed * and limitations under the License. 12*0a0e9771SDarren Reed * 13*0a0e9771SDarren Reed * When distributing Covered Code, include this CDDL HEADER in each 14*0a0e9771SDarren Reed * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*0a0e9771SDarren Reed * If applicable, add the following below this CDDL HEADER, with the 16*0a0e9771SDarren Reed * fields enclosed by brackets "[]" replaced with your own identifying 17*0a0e9771SDarren Reed * information: Portions Copyright [yyyy] [name of copyright owner] 18*0a0e9771SDarren Reed * 19*0a0e9771SDarren Reed * CDDL HEADER END 20*0a0e9771SDarren Reed */ 21*0a0e9771SDarren Reed 22*0a0e9771SDarren Reed /* 23*0a0e9771SDarren Reed * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*0a0e9771SDarren Reed * Use is subject to license terms. 25*0a0e9771SDarren Reed */ 26*0a0e9771SDarren Reed 27*0a0e9771SDarren Reed #include <sys/types.h> 28*0a0e9771SDarren Reed #include <sys/dlpi.h> 29*0a0e9771SDarren Reed #include <net/if.h> 30*0a0e9771SDarren Reed #include <net/dlt.h> 31*0a0e9771SDarren Reed 32*0a0e9771SDarren Reed /* 33*0a0e9771SDarren Reed * This table provides a mapping of the DLPI data link types used in 34*0a0e9771SDarren Reed * Solaris to the BPF data link types. Providing this translation in 35*0a0e9771SDarren Reed * the kernel allows libpcap to be downloaded and used without any 36*0a0e9771SDarren Reed * need for change. 37*0a0e9771SDarren Reed * 38*0a0e9771SDarren Reed * Note that this table is not necessarily sorted. 39*0a0e9771SDarren Reed */ 40*0a0e9771SDarren Reed static uint_t dl_to_dlt[][3] = { 41*0a0e9771SDarren Reed { DL_CSMACD, DLT_EN10MB, 14 }, /* IEEE 802.3 CSMA/CD */ 42*0a0e9771SDarren Reed { DL_TPB, DLT_NULL, 0 }, /* IEEE 802.4 Token Bus */ 43*0a0e9771SDarren Reed { DL_TPR, DLT_IEEE802, 0 }, /* IEEE 802.5 Token Ring */ 44*0a0e9771SDarren Reed { DL_METRO, DLT_NULL, 0 }, /* IEEE 802.6 Metro Net */ 45*0a0e9771SDarren Reed { DL_ETHER, DLT_EN10MB, 14 }, /* Ethernet Bus */ 46*0a0e9771SDarren Reed { DL_HDLC, DLT_C_HDLC, 0 }, /* Cisco HDLC protocol */ 47*0a0e9771SDarren Reed { DL_CHAR, DLT_NULL, 0 }, /* Character Synchr. proto */ 48*0a0e9771SDarren Reed { DL_CTCA, DLT_NULL, 0 }, /* IBM Channel-to-Channel */ 49*0a0e9771SDarren Reed { DL_FDDI, DLT_FDDI, 24 }, /* Fiber Distributed data */ 50*0a0e9771SDarren Reed { DL_FC, DLT_NULL, 0 }, /* Fibre Channel interface */ 51*0a0e9771SDarren Reed { DL_ATM, DLT_SUNATM, 0 }, /* ATM */ 52*0a0e9771SDarren Reed { DL_IPATM, DLT_ATM_CLIP, 0 }, /* ATM CLIP */ 53*0a0e9771SDarren Reed { DL_X25, DLT_NULL, 0 }, /* X.25 LAPB interface */ 54*0a0e9771SDarren Reed { DL_ISDN, DLT_NULL, 0 }, /* ISDN interface */ 55*0a0e9771SDarren Reed { DL_HIPPI, DLT_HIPPI, 0 }, /* HIPPI interface */ 56*0a0e9771SDarren Reed { DL_100VG, DLT_EN10MB, 14 }, /* 100 Based VG Ethernet */ 57*0a0e9771SDarren Reed { DL_100VGTPR, DLT_IEEE802, 0 }, /* 100 Based VG Token Ring */ 58*0a0e9771SDarren Reed { DL_ETH_CSMA, DLT_EN10MB, 14 }, /* ISO 8802/3 and Ethernet */ 59*0a0e9771SDarren Reed { DL_100BT, DLT_EN10MB, 14 }, /* 100 Base T */ 60*0a0e9771SDarren Reed { DL_IB, DLT_IPOIB, 44 }, /* Solaris IPoIB (infini.) */ 61*0a0e9771SDarren Reed { DL_FRAME, DLT_FRELAY, 0 }, /* Frame Relay LAPF */ 62*0a0e9771SDarren Reed { DL_MPFRAME, DLT_NULL, 0 }, /* Multi-protocol Frame Relay */ 63*0a0e9771SDarren Reed { DL_ASYNC, DLT_NULL, 0 }, /* Character Asynch. Protocol */ 64*0a0e9771SDarren Reed { DL_IPX25, DLT_NULL, 0 }, /* X.25 Classical IP */ 65*0a0e9771SDarren Reed { DL_LOOP, DLT_NULL, 0 }, /* software loopback */ 66*0a0e9771SDarren Reed { DL_IPV4, DLT_RAW, 0 }, /* IPv4 Tunnel Link */ 67*0a0e9771SDarren Reed { DL_IPV6, DLT_RAW, 0 }, /* IPv6 Tunnel Link */ 68*0a0e9771SDarren Reed { SUNW_DL_VNI, DLT_NULL, 0 }, /* Virtual network interface */ 69*0a0e9771SDarren Reed { DL_WIFI, DLT_IEEE802_11, 0 }, /* IEEE 802.11 */ 70*0a0e9771SDarren Reed { DL_IPNET, DLT_IPNET, 24 }, /* Solaris IP Observability */ 71*0a0e9771SDarren Reed { DL_OTHER, DLT_NULL, 0 }, /* Mediums not listed above */ 72*0a0e9771SDarren Reed { 0, 0 } 73*0a0e9771SDarren Reed }; 74*0a0e9771SDarren Reed 75*0a0e9771SDarren Reed /* 76*0a0e9771SDarren Reed * Given a data link type number used with DLPI on Solaris, return 77*0a0e9771SDarren Reed * the equivalent data link type number for use with BPF. 78*0a0e9771SDarren Reed */ 79*0a0e9771SDarren Reed int 80*0a0e9771SDarren Reed bpf_dl_to_dlt(int dl) 81*0a0e9771SDarren Reed { 82*0a0e9771SDarren Reed int i; 83*0a0e9771SDarren Reed 84*0a0e9771SDarren Reed for (i = 0; i < sizeof (dl_to_dlt) / sizeof (dl_to_dlt[0]); i++) 85*0a0e9771SDarren Reed if (dl_to_dlt[i][0] == dl) 86*0a0e9771SDarren Reed return (dl_to_dlt[i][1]); 87*0a0e9771SDarren Reed return (0); 88*0a0e9771SDarren Reed } 89*0a0e9771SDarren Reed 90*0a0e9771SDarren Reed /* 91*0a0e9771SDarren Reed * Given a DLPI data link type for Solaris, return the expected header 92*0a0e9771SDarren Reed * size of the link layer. 93*0a0e9771SDarren Reed */ 94*0a0e9771SDarren Reed int 95*0a0e9771SDarren Reed bpf_dl_hdrsize(int dl) 96*0a0e9771SDarren Reed { 97*0a0e9771SDarren Reed int i; 98*0a0e9771SDarren Reed 99*0a0e9771SDarren Reed for (i = 0; i < sizeof (dl_to_dlt) / sizeof (dl_to_dlt[0]); i++) 100*0a0e9771SDarren Reed if (dl_to_dlt[i][0] == dl) 101*0a0e9771SDarren Reed return (dl_to_dlt[i][2]); 102*0a0e9771SDarren Reed return (0); 103*0a0e9771SDarren Reed } 104