xref: /titanic_50/usr/src/uts/common/io/bpf/bpf_dlt.c (revision 0a0e9771ca0211c15f3ac4466b661c145feeb9e4)
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