xref: /illumos-gate/usr/src/uts/common/inet/sockmods/netpacket/packet.h (revision 67a4bb8f9ad4c49e9aa9e21e2114a7c093c3a73a)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright 2015 Joyent, Inc. All rights reserved.
25  */
26 
27 #ifndef _PACKET_H
28 #define	_PACKET_H
29 
30 #include <sys/socket_impl.h>
31 #include <net/if_arp.h>
32 #include <net/bpf.h>
33 
34 /*
35  * With which we do the reverse of what it libpcap does....
36  */
37 #define	PACKET_OUTGOING		LINUX_SLL_OUTGOING
38 #define	PACKET_HOST		LINUX_SLL_HOST
39 #define	PACKET_BROADCAST	LINUX_SLL_BROADCAST
40 #define	PACKET_MULTICAST	LINUX_SLL_MULTICAST
41 #define	PACKET_OTHERHOST	LINUX_SLL_OTHERHOST
42 
43 #define	PACKET_STATISTICS_SHORT	1
44 #define	PACKET_ADD_MEMBERSHIP	2
45 #define	PACKET_DROP_MEMBERSHIP	3
46 #define	PACKET_AUXDATA		4
47 #define	PACKET_STATISTICS	5
48 
49 
50 struct packet_mreq {
51 	uint32_t	mr_ifindex;
52 	uint16_t	mr_type;
53 	uint16_t	mr_alen;
54 	uint8_t		mr_address[8];
55 };
56 
57 #define	PACKET_MR_MULTICAST	1
58 #define	PACKET_MR_PROMISC	2
59 #define	PACKET_MR_ALLMULTI	3
60 
61 typedef enum tpkt_status_e {
62 	TP_STATUS_KERNEL,
63 	TP_STATUS_USER,
64 	TP_STATUS_COPY,
65 	TP_STATUS_LOSING,
66 	TP_STATUS_CSUMNOTREADY
67 } tpkt_status_t;
68 
69 struct tpacket_auxdata {		/* tp_macoff/tp_netoff ?? */
70 	tpkt_status_t	tp_status;
71 	uint32_t	tp_len;
72 	uint32_t	tp_snaplen;
73 	uint16_t	tp_macoff;
74 	uint16_t	tp_netoff;
75 	uint16_t	tp_vlan_vci;
76 };
77 
78 struct tpacket_hdr {			/* tp_macoff/tp_netoff ?? */
79 	uint64_t	tp_status;
80 	uint32_t	tp_len;
81 	uint32_t	tp_snaplen;
82 	uint16_t	tp_macoff;
83 	uint16_t	tp_netoff;
84 	uint32_t	tp_sec;
85 	uint32_t	tp_usec;
86 };
87 
88 struct tpacket2_hdr {			/* tp_macoff/tp_netoff ?? */
89 	tpkt_status_t	tp_status;
90 	uint32_t	tp_len;
91 	uint32_t	tp_snaplen;
92 	uint16_t	tp_macoff;
93 	uint16_t	tp_netoff;
94 	uint32_t	tp_sec;
95 	uint32_t	tp_nsec;
96 	uint16_t	tp_vlan_tci;
97 };
98 
99 struct tpacket_stats {
100 	uint32_t	tp_packets;
101 	uint32_t	tp_drops;
102 };
103 
104 struct tpacket_stats_short {
105 	uint16_t	tp_packets;
106 	uint16_t	tp_drops;
107 };
108 
109 struct sock_filter {			/* Fields named from bpf_insn */
110 	uint16_t	code;
111 	uint8_t		jt;
112 	uint8_t		jf;
113 	uint32_t	k;
114 };
115 
116 struct sock_fprog {
117 	uint16_t		len;
118 	struct sock_filter	*filter;
119 };
120 
121 /*
122  * Linux ARPHRD_ symbols needed...
123  *
124  * The numbers above 50000 are because their real value is unknown from
125  * libpcap's source, so a number has been chosen that is unlikely to be
126  * confused with the real one on Linux. Those that are already found in
127  * Solaris inside <net/if_arp.h> may have a different value to that found
128  * in Linux but it should be used instead as the Solaris value originates
129  * from the IANA whereas the Linux values seem to ignore it.
130  */
131 /* ARPHRD_AX25				see <net/if_arp.h> */
132 /* ARPHRD_CHAOS				see <net/if_arp.h> */
133 #define	ARPHRD_CSLIP			50005
134 #define	ARPHRD_CSLIP6			50006
135 #define	ARPHRD_DLCI			15
136 /* ARPHRD_EETHER			see <net/if_arp.h> */
137 /* ARPHRD_ETHER				see <net/if_arp.h> */
138 #define	ARPHRD_FCAL			785
139 #define	ARPHRD_FCFABRIC			787
140 #define	ARPHRD_FCPL			786
141 #define	ARPHRD_FCPP			784
142 #define	ARPHRD_FRAD			770
143 #define	ARPHRD_FDDI			774
144 /* ARPHRD_IEEE802			see <net/if_arp.h> */
145 #define	ARPHRD_IEEE802_TR		800
146 #define	ARPHRD_IEEE80211		801
147 #define	ARPHRD_IEEE80211_PRISM		802
148 #define	ARPHRD_IEEE80211_RADIOTAP	803
149 #define	ARPHRD_IRDA			783
150 #define	ARPHRD_LAPD			8445
151 #define	ARPHRD_LOCALTLK			50010
152 #define	ARPHRD_LOOPBACK			50011
153 /* ARPHRD_METRICOM			see <net/if_arp.h> */
154 #define	ARPHRD_PRONET			50013
155 #define	ARPHRD_PPP			50014
156 #define	ARPHRD_RAWHDLC			518
157 #define	ARPHRD_SIT			776
158 #define	ARPHRD_SLIP6			50015
159 #define	ARPHRD_SLIP			50016
160 /* ARPHRD_TUNNEL			see <net/if_arp.h> */
161 
162 #define	ETH_P_ALL			0
163 #define	ETH_P_802_2			0xaa	/* LSAP_SAP */
164 #define	ETH_P_803_3			0
165 #define	ETH_P_IP			0x800
166 #define	ETH_P_ARP			0x806
167 #define	ETH_P_IPV6			0x86dd
168 
169 #ifdef _KERNEL
170 /*
171  * PFP socket structure.
172  */
173 typedef struct pfpsock {
174 	struct bpf_program		ps_bpf;
175 	krwlock_t			ps_bpflock;
176 	sock_upper_handle_t		ps_upper;
177 	sock_upcalls_t			*ps_upcalls;
178 	mac_handle_t			ps_mh;
179 	mac_client_handle_t		ps_mch;
180 	mac_promisc_handle_t		ps_phd;
181 	int				ps_type;
182 	int				ps_proto;
183 	uint_t				ps_max_sdu;
184 	boolean_t			ps_bound;
185 	mac_client_promisc_type_t	ps_promisc;
186 	boolean_t			ps_auxdata;
187 	struct tpacket_stats		ps_stats;
188 	struct sockaddr			ps_sock;
189 	datalink_id_t			ps_linkid;
190 	kmutex_t			ps_lock;
191 	boolean_t			ps_flow_ctrld;
192 	ulong_t				ps_flow_ctrl_drops;
193 	timespec_t			ps_timestamp;
194 	size_t				ps_rcvbuf;
195 } pfpsock_t;
196 
197 typedef struct pfp_kstats_s {
198 	kstat_named_t	kp_recv_mac_hdr_fail;
199 	kstat_named_t	kp_recv_bad_proto;
200 	kstat_named_t	kp_recv_alloc_fail;
201 	kstat_named_t	kp_recv_ok;
202 	kstat_named_t	kp_recv_fail;
203 	kstat_named_t	kp_recv_filtered;
204 	kstat_named_t	kp_recv_flow_cntrld;
205 	kstat_named_t	kp_send_unbound;
206 	kstat_named_t	kp_send_failed;
207 	kstat_named_t	kp_send_too_big;
208 	kstat_named_t	kp_send_alloc_fail;
209 	kstat_named_t	kp_send_uiomove_fail;
210 	kstat_named_t	kp_send_no_memory;
211 	kstat_named_t	kp_send_open_fail;
212 	kstat_named_t	kp_send_wrong_family;
213 	kstat_named_t	kp_send_short_msg;
214 	kstat_named_t	kp_send_ok;
215 } pfp_kstats_t;
216 #endif /* _KERNEL */
217 
218 #endif /* _PACKET_H */
219