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
bpf_dl_to_dlt(int dl)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
bpf_dl_hdrsize(int dl)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