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