xref: /onnv-gate/usr/src/uts/common/inet/sockmods/netpacket/packet.h (revision 13095:eb7af425d949)
110639SDarren.Reed@Sun.COM /*
210639SDarren.Reed@Sun.COM  * CDDL HEADER START
310639SDarren.Reed@Sun.COM  *
410639SDarren.Reed@Sun.COM  * The contents of this file are subject to the terms of the
510639SDarren.Reed@Sun.COM  * Common Development and Distribution License (the "License").
610639SDarren.Reed@Sun.COM  * You may not use this file except in compliance with the License.
710639SDarren.Reed@Sun.COM  *
810639SDarren.Reed@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910639SDarren.Reed@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010639SDarren.Reed@Sun.COM  * See the License for the specific language governing permissions
1110639SDarren.Reed@Sun.COM  * and limitations under the License.
1210639SDarren.Reed@Sun.COM  *
1310639SDarren.Reed@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410639SDarren.Reed@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510639SDarren.Reed@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610639SDarren.Reed@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710639SDarren.Reed@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810639SDarren.Reed@Sun.COM  *
1910639SDarren.Reed@Sun.COM  * CDDL HEADER END
2010639SDarren.Reed@Sun.COM  */
2110639SDarren.Reed@Sun.COM 
2210639SDarren.Reed@Sun.COM /*
23*13095SDarren.Reed@Oracle.COM  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2410639SDarren.Reed@Sun.COM  */
2510639SDarren.Reed@Sun.COM 
2610639SDarren.Reed@Sun.COM #ifndef _PACKET_H
2710639SDarren.Reed@Sun.COM #define	_PACKET_H
2810639SDarren.Reed@Sun.COM 
2910639SDarren.Reed@Sun.COM #include <sys/socket_impl.h>
30*13095SDarren.Reed@Oracle.COM #include <net/if_arp.h>
3110639SDarren.Reed@Sun.COM #include <net/bpf.h>
3210639SDarren.Reed@Sun.COM 
3310639SDarren.Reed@Sun.COM /*
3410639SDarren.Reed@Sun.COM  * With which we do the reverse of what it libpcap does....
3510639SDarren.Reed@Sun.COM  */
3610639SDarren.Reed@Sun.COM #define	PACKET_OUTGOING		LINUX_SLL_OUTGOING
3710639SDarren.Reed@Sun.COM #define	PACKET_HOST		LINUX_SLL_HOST
3810639SDarren.Reed@Sun.COM #define	PACKET_BROADCAST	LINUX_SLL_BROADCAST
3910639SDarren.Reed@Sun.COM #define	PACKET_MULTICAST	LINUX_SLL_MULTICAST
4010639SDarren.Reed@Sun.COM #define	PACKET_OTHERHOST	LINUX_SLL_OTHERHOST
4110639SDarren.Reed@Sun.COM 
4210639SDarren.Reed@Sun.COM #define	PACKET_STATISTICS	1
4310639SDarren.Reed@Sun.COM #define	PACKET_ADD_MEMBERSHIP	2
4410639SDarren.Reed@Sun.COM #define	PACKET_DROP_MEMBERSHIP	3
4510639SDarren.Reed@Sun.COM #define	PACKET_AUXDATA		4
4610639SDarren.Reed@Sun.COM 
4710639SDarren.Reed@Sun.COM 
4810639SDarren.Reed@Sun.COM struct packet_mreq {
4910639SDarren.Reed@Sun.COM 	uint32_t	mr_ifindex;
5010639SDarren.Reed@Sun.COM 	uint16_t	mr_type;
5110639SDarren.Reed@Sun.COM 	uint16_t	mr_alen;
5210639SDarren.Reed@Sun.COM 	uint8_t		mr_address[8];
5310639SDarren.Reed@Sun.COM };
5410639SDarren.Reed@Sun.COM 
5510639SDarren.Reed@Sun.COM #define	PACKET_MR_MULTICAST	1
5610639SDarren.Reed@Sun.COM #define	PACKET_MR_PROMISC	2
5710639SDarren.Reed@Sun.COM #define	PACKET_MR_ALLMULTI	3
5810639SDarren.Reed@Sun.COM 
5910639SDarren.Reed@Sun.COM typedef enum tpkt_status_e {
6010639SDarren.Reed@Sun.COM 	TP_STATUS_KERNEL,
6110639SDarren.Reed@Sun.COM 	TP_STATUS_USER,
6210639SDarren.Reed@Sun.COM 	TP_STATUS_COPY,
6310639SDarren.Reed@Sun.COM 	TP_STATUS_LOSING,
6410639SDarren.Reed@Sun.COM 	TP_STATUS_CSUMNOTREADY
6510639SDarren.Reed@Sun.COM } tpkt_status_t;
6610639SDarren.Reed@Sun.COM 
6710639SDarren.Reed@Sun.COM struct tpacket_auxdata {		/* tp_macoff/tp_netoff ?? */
6810639SDarren.Reed@Sun.COM 	tpkt_status_t	tp_status;
6910639SDarren.Reed@Sun.COM 	uint32_t	tp_len;
7010639SDarren.Reed@Sun.COM 	uint32_t	tp_snaplen;
7110639SDarren.Reed@Sun.COM 	uint16_t	tp_macoff;
7210639SDarren.Reed@Sun.COM 	uint16_t	tp_netoff;
7310639SDarren.Reed@Sun.COM 	uint16_t	tp_vlan_vci;
7410639SDarren.Reed@Sun.COM };
7510639SDarren.Reed@Sun.COM 
7610639SDarren.Reed@Sun.COM struct tpacket_hdr {			/* tp_macoff/tp_netoff ?? */
7710639SDarren.Reed@Sun.COM 	uint64_t	tp_status;
7810639SDarren.Reed@Sun.COM 	uint32_t	tp_len;
7910639SDarren.Reed@Sun.COM 	uint32_t	tp_snaplen;
8010639SDarren.Reed@Sun.COM 	uint16_t	tp_macoff;
8110639SDarren.Reed@Sun.COM 	uint16_t	tp_netoff;
8210639SDarren.Reed@Sun.COM 	uint32_t	tp_sec;
8310639SDarren.Reed@Sun.COM 	uint32_t	tp_usec;
8410639SDarren.Reed@Sun.COM };
8510639SDarren.Reed@Sun.COM 
8610639SDarren.Reed@Sun.COM struct tpacket2_hdr {			/* tp_macoff/tp_netoff ?? */
8710639SDarren.Reed@Sun.COM 	tpkt_status_t	tp_status;
8810639SDarren.Reed@Sun.COM 	uint32_t	tp_len;
8910639SDarren.Reed@Sun.COM 	uint32_t	tp_snaplen;
9010639SDarren.Reed@Sun.COM 	uint16_t	tp_macoff;
9110639SDarren.Reed@Sun.COM 	uint16_t	tp_netoff;
9210639SDarren.Reed@Sun.COM 	uint32_t	tp_sec;
9310639SDarren.Reed@Sun.COM 	uint32_t	tp_nsec;
9410639SDarren.Reed@Sun.COM 	uint16_t	tp_vlan_tci;
9510639SDarren.Reed@Sun.COM };
9610639SDarren.Reed@Sun.COM 
9710639SDarren.Reed@Sun.COM struct tpacket_stats {
9810639SDarren.Reed@Sun.COM 	uint16_t	tp_packets;
9910639SDarren.Reed@Sun.COM 	uint16_t	tp_drops;
10010639SDarren.Reed@Sun.COM };
10110639SDarren.Reed@Sun.COM 
10210639SDarren.Reed@Sun.COM struct sock_filter {			/* Fields named from bpf_insn */
10310639SDarren.Reed@Sun.COM 	uint16_t	code;
10410639SDarren.Reed@Sun.COM 	uint8_t		jt;
10510639SDarren.Reed@Sun.COM 	uint8_t		jf;
10610639SDarren.Reed@Sun.COM 	uint32_t	k;
10710639SDarren.Reed@Sun.COM };
10810639SDarren.Reed@Sun.COM 
10910639SDarren.Reed@Sun.COM struct sock_fprog {
11010639SDarren.Reed@Sun.COM 	uint16_t		len;
11110639SDarren.Reed@Sun.COM 	struct sock_filter	*filter;
11210639SDarren.Reed@Sun.COM };
11310639SDarren.Reed@Sun.COM 
11410639SDarren.Reed@Sun.COM /*
11510639SDarren.Reed@Sun.COM  * Linux ARPHRD_ symbols needed...
11610639SDarren.Reed@Sun.COM  *
11710639SDarren.Reed@Sun.COM  * The numbers above 50000 are because their real value is unknown from
11810639SDarren.Reed@Sun.COM  * libpcap's source, so a number has been chosen that is unlikely to be
119*13095SDarren.Reed@Oracle.COM  * confused with the real one on Linux. Those that are already found in
120*13095SDarren.Reed@Oracle.COM  * Solaris inside <net/if_arp.h> may have a different value to that found
121*13095SDarren.Reed@Oracle.COM  * in Linux but it should be used instead as the Solaris value originates
122*13095SDarren.Reed@Oracle.COM  * from the IANA whereas the Linux values seem to ignore it.
12310639SDarren.Reed@Sun.COM  */
124*13095SDarren.Reed@Oracle.COM /* ARPHRD_AX25				see <net/if_arp.h> */
125*13095SDarren.Reed@Oracle.COM /* ARPHRD_CHAOS				see <net/if_arp.h> */
12610639SDarren.Reed@Sun.COM #define	ARPHRD_CSLIP			50005
12710639SDarren.Reed@Sun.COM #define	ARPHRD_CSLIP6			50006
12810639SDarren.Reed@Sun.COM #define	ARPHRD_DLCI			15
129*13095SDarren.Reed@Oracle.COM /* ARPHRD_EETHER			see <net/if_arp.h> */
130*13095SDarren.Reed@Oracle.COM /* ARPHRD_ETHER				see <net/if_arp.h> */
13110639SDarren.Reed@Sun.COM #define	ARPHRD_FCAL			785
13210639SDarren.Reed@Sun.COM #define	ARPHRD_FCFABRIC			787
13310639SDarren.Reed@Sun.COM #define	ARPHRD_FCPL			786
13410639SDarren.Reed@Sun.COM #define	ARPHRD_FCPP			784
13510639SDarren.Reed@Sun.COM #define	ARPHRD_FRAD			770
13610639SDarren.Reed@Sun.COM #define	ARPHRD_FDDI			774
137*13095SDarren.Reed@Oracle.COM /* ARPHRD_IEEE802			see <net/if_arp.h> */
13810639SDarren.Reed@Sun.COM #define	ARPHRD_IEEE802_TR		800
13910639SDarren.Reed@Sun.COM #define	ARPHRD_IEEE80211		801
14010639SDarren.Reed@Sun.COM #define	ARPHRD_IEEE80211_PRISM		802
14110639SDarren.Reed@Sun.COM #define	ARPHRD_IEEE80211_RADIOTAP	803
14210639SDarren.Reed@Sun.COM #define	ARPHRD_IRDA			783
14310639SDarren.Reed@Sun.COM #define	ARPHRD_LAPD			8445
14410639SDarren.Reed@Sun.COM #define	ARPHRD_LOCALTLK			50010
14510639SDarren.Reed@Sun.COM #define	ARPHRD_LOOPBACK			50011
146*13095SDarren.Reed@Oracle.COM /* ARPHRD_METRICOM			see <net/if_arp.h> */
14710639SDarren.Reed@Sun.COM #define	ARPHRD_PRONET			50013
14810639SDarren.Reed@Sun.COM #define	ARPHRD_PPP			50014
14910639SDarren.Reed@Sun.COM #define	ARPHRD_RAWHDLC			518
15010639SDarren.Reed@Sun.COM #define	ARPHRD_SIT			776
15110639SDarren.Reed@Sun.COM #define	ARPHRD_SLIP6			50015
15210639SDarren.Reed@Sun.COM #define	ARPHRD_SLIP			50016
153*13095SDarren.Reed@Oracle.COM /* ARPHRD_TUNNEL			see <net/if_arp.h> */
154*13095SDarren.Reed@Oracle.COM 
155*13095SDarren.Reed@Oracle.COM #define	ETH_P_ALL			0
156*13095SDarren.Reed@Oracle.COM #define	ETH_P_802_2			0xaa	/* LSAP_SAP */
157*13095SDarren.Reed@Oracle.COM #define	ETH_P_803_3			0
158*13095SDarren.Reed@Oracle.COM #define	ETH_P_IP			0x800
159*13095SDarren.Reed@Oracle.COM #define	ETH_P_ARP			0x806
160*13095SDarren.Reed@Oracle.COM #define	ETH_P_IPV6			0x86dd
16110639SDarren.Reed@Sun.COM 
16210639SDarren.Reed@Sun.COM #ifdef _KERNEL
16310639SDarren.Reed@Sun.COM /*
16410639SDarren.Reed@Sun.COM  * PFP socket structure.
16510639SDarren.Reed@Sun.COM  */
16610639SDarren.Reed@Sun.COM typedef struct pfpsock {
16710639SDarren.Reed@Sun.COM 	struct bpf_program		ps_bpf;
16810639SDarren.Reed@Sun.COM 	krwlock_t			ps_bpflock;
16910639SDarren.Reed@Sun.COM 	sock_upper_handle_t		ps_upper;
17010639SDarren.Reed@Sun.COM 	sock_upcalls_t			*ps_upcalls;
17110639SDarren.Reed@Sun.COM 	mac_handle_t			ps_mh;
17210639SDarren.Reed@Sun.COM 	mac_client_handle_t		ps_mch;
17310639SDarren.Reed@Sun.COM 	mac_promisc_handle_t		ps_phd;
17410639SDarren.Reed@Sun.COM 	int				ps_type;
17510639SDarren.Reed@Sun.COM 	int				ps_proto;
17610639SDarren.Reed@Sun.COM 	uint_t				ps_max_sdu;
17710639SDarren.Reed@Sun.COM 	boolean_t			ps_bound;
17810639SDarren.Reed@Sun.COM 	mac_client_promisc_type_t	ps_promisc;
17910639SDarren.Reed@Sun.COM 	boolean_t			ps_auxdata;
18010639SDarren.Reed@Sun.COM 	struct tpacket_stats		ps_stats;
18110639SDarren.Reed@Sun.COM 	struct sockaddr			ps_sock;
18210639SDarren.Reed@Sun.COM 	datalink_id_t			ps_linkid;
18310639SDarren.Reed@Sun.COM 	kmutex_t			ps_lock;
18410639SDarren.Reed@Sun.COM 	boolean_t			ps_flow_ctrld;
18510639SDarren.Reed@Sun.COM 	ulong_t				ps_flow_ctrl_drops;
18610639SDarren.Reed@Sun.COM } pfpsock_t;
18710639SDarren.Reed@Sun.COM 
18810639SDarren.Reed@Sun.COM typedef struct pfp_kstats_s {
18910639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_mac_hdr_fail;
19010639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_bad_proto;
19110639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_alloc_fail;
19210639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_ok;
19310639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_fail;
19410639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_filtered;
19510639SDarren.Reed@Sun.COM 	kstat_named_t	kp_recv_flow_cntrld;
19610639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_unbound;
19710639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_failed;
19810639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_too_big;
19910639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_alloc_fail;
20010639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_uiomove_fail;
20110639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_no_memory;
20210639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_open_fail;
20310639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_wrong_family;
20410639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_short_msg;
20510639SDarren.Reed@Sun.COM 	kstat_named_t	kp_send_ok;
20610639SDarren.Reed@Sun.COM } pfp_kstats_t;
20710639SDarren.Reed@Sun.COM #endif /* _KERNEL */
20810639SDarren.Reed@Sun.COM 
20910639SDarren.Reed@Sun.COM #endif /* _PACKET_H */
210