summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/sockmods/netpacket/packet.h
blob: ba49076ab2d2caad8906740468a8d75392cc8936 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 * Copyright 2015 Joyent, Inc. All rights reserved.
 */

#ifndef _PACKET_H
#define	_PACKET_H

#include <sys/socket_impl.h>
#include <net/if_arp.h>
#include <net/bpf.h>

/*
 * With which we do the reverse of what it libpcap does....
 */
#define	PACKET_OUTGOING		LINUX_SLL_OUTGOING
#define	PACKET_HOST		LINUX_SLL_HOST
#define	PACKET_BROADCAST	LINUX_SLL_BROADCAST
#define	PACKET_MULTICAST	LINUX_SLL_MULTICAST
#define	PACKET_OTHERHOST	LINUX_SLL_OTHERHOST

#define	PACKET_STATISTICS_SHORT	1
#define	PACKET_ADD_MEMBERSHIP	2
#define	PACKET_DROP_MEMBERSHIP	3
#define	PACKET_AUXDATA		4
#define	PACKET_STATISTICS	5


struct packet_mreq {
	uint32_t	mr_ifindex;
	uint16_t	mr_type;
	uint16_t	mr_alen;
	uint8_t		mr_address[8];
};

#define	PACKET_MR_MULTICAST	1
#define	PACKET_MR_PROMISC	2
#define	PACKET_MR_ALLMULTI	3

typedef enum tpkt_status_e {
	TP_STATUS_KERNEL,
	TP_STATUS_USER,
	TP_STATUS_COPY,
	TP_STATUS_LOSING,
	TP_STATUS_CSUMNOTREADY
} tpkt_status_t;

struct tpacket_auxdata {		/* tp_macoff/tp_netoff ?? */
	tpkt_status_t	tp_status;
	uint32_t	tp_len;
	uint32_t	tp_snaplen;
	uint16_t	tp_macoff;
	uint16_t	tp_netoff;
	uint16_t	tp_vlan_vci;
};

struct tpacket_hdr {			/* tp_macoff/tp_netoff ?? */
	uint64_t	tp_status;
	uint32_t	tp_len;
	uint32_t	tp_snaplen;
	uint16_t	tp_macoff;
	uint16_t	tp_netoff;
	uint32_t	tp_sec;
	uint32_t	tp_usec;
};

struct tpacket2_hdr {			/* tp_macoff/tp_netoff ?? */
	tpkt_status_t	tp_status;
	uint32_t	tp_len;
	uint32_t	tp_snaplen;
	uint16_t	tp_macoff;
	uint16_t	tp_netoff;
	uint32_t	tp_sec;
	uint32_t	tp_nsec;
	uint16_t	tp_vlan_tci;
};

struct tpacket_stats {
	uint32_t	tp_packets;
	uint32_t	tp_drops;
};

struct tpacket_stats_short {
	uint16_t	tp_packets;
	uint16_t	tp_drops;
};

struct sock_filter {			/* Fields named from bpf_insn */
	uint16_t	code;
	uint8_t		jt;
	uint8_t		jf;
	uint32_t	k;
};

struct sock_fprog {
	uint16_t		len;
	struct sock_filter	*filter;
};

/*
 * Linux ARPHRD_ symbols needed...
 *
 * The numbers above 50000 are because their real value is unknown from
 * libpcap's source, so a number has been chosen that is unlikely to be
 * confused with the real one on Linux. Those that are already found in
 * Solaris inside <net/if_arp.h> may have a different value to that found
 * in Linux but it should be used instead as the Solaris value originates
 * from the IANA whereas the Linux values seem to ignore it.
 */
/* ARPHRD_AX25				see <net/if_arp.h> */
/* ARPHRD_CHAOS				see <net/if_arp.h> */
#define	ARPHRD_CSLIP			50005
#define	ARPHRD_CSLIP6			50006
#define	ARPHRD_DLCI			15
/* ARPHRD_EETHER			see <net/if_arp.h> */
/* ARPHRD_ETHER				see <net/if_arp.h> */
#define	ARPHRD_FCAL			785
#define	ARPHRD_FCFABRIC			787
#define	ARPHRD_FCPL			786
#define	ARPHRD_FCPP			784
#define	ARPHRD_FRAD			770
#define	ARPHRD_FDDI			774
/* ARPHRD_IEEE802			see <net/if_arp.h> */
#define	ARPHRD_IEEE802_TR		800
#define	ARPHRD_IEEE80211		801
#define	ARPHRD_IEEE80211_PRISM		802
#define	ARPHRD_IEEE80211_RADIOTAP	803
#define	ARPHRD_IRDA			783
#define	ARPHRD_LAPD			8445
#define	ARPHRD_LOCALTLK			50010
#define	ARPHRD_LOOPBACK			50011
/* ARPHRD_METRICOM			see <net/if_arp.h> */
#define	ARPHRD_PRONET			50013
#define	ARPHRD_PPP			50014
#define	ARPHRD_RAWHDLC			518
#define	ARPHRD_SIT			776
#define	ARPHRD_SLIP6			50015
#define	ARPHRD_SLIP			50016
/* ARPHRD_TUNNEL			see <net/if_arp.h> */

#define	ETH_P_ALL			0
#define	ETH_P_802_2			0xaa	/* LSAP_SAP */
#define	ETH_P_803_3			0
#define	ETH_P_IP			0x800
#define	ETH_P_ARP			0x806
#define	ETH_P_IPV6			0x86dd

#ifdef _KERNEL
/*
 * PFP socket structure.
 */
typedef struct pfpsock {
	struct bpf_program		ps_bpf;
	krwlock_t			ps_bpflock;
	sock_upper_handle_t		ps_upper;
	sock_upcalls_t			*ps_upcalls;
	mac_handle_t			ps_mh;
	mac_client_handle_t		ps_mch;
	mac_promisc_handle_t		ps_phd;
	int				ps_type;
	int				ps_proto;
	uint_t				ps_max_sdu;
	boolean_t			ps_bound;
	mac_client_promisc_type_t	ps_promisc;
	boolean_t			ps_auxdata;
	struct tpacket_stats		ps_stats;
	struct sockaddr_ll		ps_sock;
	datalink_id_t			ps_linkid;
	kmutex_t			ps_lock;
	boolean_t			ps_flow_ctrld;
	ulong_t				ps_flow_ctrl_drops;
	timespec_t			ps_timestamp;
	size_t				ps_rcvbuf;
} pfpsock_t;

typedef struct pfp_kstats_s {
	kstat_named_t	kp_recv_mac_hdr_fail;
	kstat_named_t	kp_recv_bad_proto;
	kstat_named_t	kp_recv_alloc_fail;
	kstat_named_t	kp_recv_ok;
	kstat_named_t	kp_recv_fail;
	kstat_named_t	kp_recv_filtered;
	kstat_named_t	kp_recv_flow_cntrld;
	kstat_named_t	kp_send_unbound;
	kstat_named_t	kp_send_failed;
	kstat_named_t	kp_send_too_big;
	kstat_named_t	kp_send_alloc_fail;
	kstat_named_t	kp_send_uiomove_fail;
	kstat_named_t	kp_send_no_memory;
	kstat_named_t	kp_send_open_fail;
	kstat_named_t	kp_send_wrong_family;
	kstat_named_t	kp_send_short_msg;
	kstat_named_t	kp_send_ok;
} pfp_kstats_t;
#endif /* _KERNEL */

#endif /* _PACKET_H */