xref: /onnv-gate/usr/src/uts/common/sys/neti.h (revision 2958:98aa41c076f5)
1*2958Sdr146992 /*
2*2958Sdr146992  * CDDL HEADER START
3*2958Sdr146992  *
4*2958Sdr146992  * The contents of this file are subject to the terms of the
5*2958Sdr146992  * Common Development and Distribution License (the "License").
6*2958Sdr146992  * You may not use this file except in compliance with the License.
7*2958Sdr146992  *
8*2958Sdr146992  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*2958Sdr146992  * or http://www.opensolaris.org/os/licensing.
10*2958Sdr146992  * See the License for the specific language governing permissions
11*2958Sdr146992  * and limitations under the License.
12*2958Sdr146992  *
13*2958Sdr146992  * When distributing Covered Code, include this CDDL HEADER in each
14*2958Sdr146992  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*2958Sdr146992  * If applicable, add the following below this CDDL HEADER, with the
16*2958Sdr146992  * fields enclosed by brackets "[]" replaced with your own identifying
17*2958Sdr146992  * information: Portions Copyright [yyyy] [name of copyright owner]
18*2958Sdr146992  *
19*2958Sdr146992  * CDDL HEADER END
20*2958Sdr146992  */
21*2958Sdr146992 /*
22*2958Sdr146992  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23*2958Sdr146992  * Use is subject to license terms.
24*2958Sdr146992  */
25*2958Sdr146992 
26*2958Sdr146992 #ifndef _SYS_NETI_H
27*2958Sdr146992 #define	_SYS_NETI_H
28*2958Sdr146992 
29*2958Sdr146992 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*2958Sdr146992 
31*2958Sdr146992 #include <netinet/in.h>
32*2958Sdr146992 #include <sys/int_types.h>
33*2958Sdr146992 #include <sys/queue.h>
34*2958Sdr146992 #include <sys/hook_impl.h>
35*2958Sdr146992 
36*2958Sdr146992 #ifdef	__cplusplus
37*2958Sdr146992 extern "C" {
38*2958Sdr146992 #endif
39*2958Sdr146992 
40*2958Sdr146992 #define	NETINFO_VERSION 1
41*2958Sdr146992 
42*2958Sdr146992 /*
43*2958Sdr146992  * Network hooks framework stack protocol name
44*2958Sdr146992  */
45*2958Sdr146992 #define	NHF_INET	"NHF_INET"
46*2958Sdr146992 #define	NHF_INET6	"NHF_INET6"
47*2958Sdr146992 #define	NHF_ARP		"NHF_ARP"
48*2958Sdr146992 
49*2958Sdr146992 /*
50*2958Sdr146992  * Event identification
51*2958Sdr146992  */
52*2958Sdr146992 #define	NH_PHYSICAL_IN	"PHYSICAL_IN"
53*2958Sdr146992 #define	NH_PHYSICAL_OUT	"PHYSICAL_OUT"
54*2958Sdr146992 #define	NH_FORWARDING	"FORWARDING"
55*2958Sdr146992 #define	NH_LOOPBACK_IN	"LOOPBACK_IN"
56*2958Sdr146992 #define	NH_LOOPBACK_OUT	"LOOPBACK_OUT"
57*2958Sdr146992 #define	NH_NIC_EVENTS	"NIC_EVENTS"
58*2958Sdr146992 
59*2958Sdr146992 /*
60*2958Sdr146992  * Network NIC hardware checksum capability
61*2958Sdr146992  */
62*2958Sdr146992 #define	NET_HCK_NONE   	0x00
63*2958Sdr146992 #define	NET_HCK_L3_FULL	0x01
64*2958Sdr146992 #define	NET_HCK_L3_PART	0x02
65*2958Sdr146992 #define	NET_HCK_L4_FULL	0x10
66*2958Sdr146992 #define	NET_HCK_L4_PART	0x20
67*2958Sdr146992 
68*2958Sdr146992 #define	NET_IS_HCK_L3_FULL(n, x)                                             \
69*2958Sdr146992 	((net_ispartialchecksum(n, x) & NET_HCK_L3_FULL) == NET_HCK_L3_FULL)
70*2958Sdr146992 #define	NET_IS_HCK_L3_PART(n, x)                                             \
71*2958Sdr146992 	((net_ispartialchecksum(n, x) & NET_HCK_L3_PART) == NET_HCK_L3_PART)
72*2958Sdr146992 #define	NET_IS_HCK_L4_FULL(n, x)                                             \
73*2958Sdr146992 	((net_ispartialchecksum(n, x) & NET_HCK_L4_FULL) == NET_HCK_L4_FULL)
74*2958Sdr146992 #define	NET_IS_HCK_L4_PART(n, x)                                             \
75*2958Sdr146992 	((net_ispartialchecksum(n, x) & NET_HCK_L4_PART) == NET_HCK_L4_PART)
76*2958Sdr146992 #define	NET_IS_HCK_L34_FULL(n, x)                                            \
77*2958Sdr146992 	((net_ispartialchecksum(n, x) & (NET_HCK_L3_FULL|NET_HCK_L4_FULL))   \
78*2958Sdr146992 	    == (NET_HCK_L3_FULL | NET_HCK_L4_FULL))
79*2958Sdr146992 
80*2958Sdr146992 typedef uintptr_t	phy_if_t;
81*2958Sdr146992 typedef intptr_t	lif_if_t;
82*2958Sdr146992 typedef uintptr_t	net_ifdata_t;
83*2958Sdr146992 
84*2958Sdr146992 struct net_data;
85*2958Sdr146992 typedef struct net_data *net_data_t;
86*2958Sdr146992 
87*2958Sdr146992 /*
88*2958Sdr146992  * Netinfo interface specification
89*2958Sdr146992  *
90*2958Sdr146992  * Netinfo provides an extensible and easy to use interface for
91*2958Sdr146992  * accessing data and functionality already embedded within network
92*2958Sdr146992  * code that exists within the kernel.
93*2958Sdr146992  */
94*2958Sdr146992 typedef enum net_ifaddr {
95*2958Sdr146992 	NA_ADDRESS = 1,
96*2958Sdr146992 	NA_PEER,
97*2958Sdr146992 	NA_BROADCAST,
98*2958Sdr146992 	NA_NETMASK
99*2958Sdr146992 } net_ifaddr_t;
100*2958Sdr146992 
101*2958Sdr146992 
102*2958Sdr146992 typedef enum inject {
103*2958Sdr146992 	NI_QUEUE_IN = 1,
104*2958Sdr146992 	NI_QUEUE_OUT,
105*2958Sdr146992 	NI_DIRECT_OUT
106*2958Sdr146992 } inject_t;
107*2958Sdr146992 
108*2958Sdr146992 typedef struct net_inject {
109*2958Sdr146992 	mblk_t			*ni_packet;
110*2958Sdr146992 	struct sockaddr_storage	ni_addr;
111*2958Sdr146992 	phy_if_t		ni_physical;
112*2958Sdr146992 } net_inject_t;
113*2958Sdr146992 
114*2958Sdr146992 
115*2958Sdr146992 /*
116*2958Sdr146992  * net_info_t public interface
117*2958Sdr146992  */
118*2958Sdr146992 typedef struct net_info {
119*2958Sdr146992 	int		neti_version;
120*2958Sdr146992 	char		*neti_protocol;
121*2958Sdr146992 	int		(*neti_getifname)(phy_if_t, char *, const size_t);
122*2958Sdr146992 	int		(*neti_getmtu)(phy_if_t, lif_if_t);
123*2958Sdr146992 	int		(*neti_getpmtuenabled)(void);
124*2958Sdr146992 	int		(*neti_getlifaddr)(phy_if_t, lif_if_t, size_t,
125*2958Sdr146992 			    net_ifaddr_t [], void *);
126*2958Sdr146992 	phy_if_t	(*neti_phygetnext)(phy_if_t);
127*2958Sdr146992 	phy_if_t	(*neti_phylookup)(const char *);
128*2958Sdr146992 	lif_if_t	(*neti_lifgetnext)(phy_if_t, lif_if_t);
129*2958Sdr146992 	int		(*neti_inject)(inject_t, net_inject_t *);
130*2958Sdr146992 	phy_if_t	(*neti_routeto)(struct sockaddr *);
131*2958Sdr146992 	int		(*neti_ispartialchecksum)(mblk_t *);
132*2958Sdr146992 	int		(*neti_isvalidchecksum)(mblk_t *);
133*2958Sdr146992 } net_info_t;
134*2958Sdr146992 
135*2958Sdr146992 
136*2958Sdr146992 /*
137*2958Sdr146992  * Private data structures
138*2958Sdr146992  */
139*2958Sdr146992 struct net_data {
140*2958Sdr146992 	LIST_ENTRY(net_data)		netd_list;
141*2958Sdr146992 	net_info_t			netd_info;
142*2958Sdr146992 	int				netd_refcnt;
143*2958Sdr146992 	hook_family_int_t		*netd_hooks;
144*2958Sdr146992 };
145*2958Sdr146992 
146*2958Sdr146992 
147*2958Sdr146992 typedef struct injection_s {
148*2958Sdr146992 	net_inject_t	inj_data;
149*2958Sdr146992 	boolean_t	inj_isv6;
150*2958Sdr146992 } injection_t;
151*2958Sdr146992 
152*2958Sdr146992 /*
153*2958Sdr146992  * The ipif_id space is [0,MAX) but this interface wants to return [1,MAX] as
154*2958Sdr146992  * a valid range of logical interface numbers so that it can return 0 to mean
155*2958Sdr146992  * "end of list" with net_lifgetnext.  Changing ipif_id's to use the [1,MAX]
156*2958Sdr146992  * space is something to be considered for the future, if it is worthwhile.
157*2958Sdr146992  */
158*2958Sdr146992 #define	MAP_IPIF_ID(x)		((x) + 1)
159*2958Sdr146992 #define	UNMAP_IPIF_ID(x)	(((x) > 0) ? (x) - 1 : (x))
160*2958Sdr146992 
161*2958Sdr146992 
162*2958Sdr146992 /*
163*2958Sdr146992  * Data management functions
164*2958Sdr146992  */
165*2958Sdr146992 extern net_data_t net_register(const net_info_t *);
166*2958Sdr146992 extern int net_unregister(net_data_t);
167*2958Sdr146992 extern net_data_t net_lookup(const char *);
168*2958Sdr146992 extern int net_release(net_data_t);
169*2958Sdr146992 extern net_data_t net_walk(net_data_t);
170*2958Sdr146992 
171*2958Sdr146992 /*
172*2958Sdr146992  * Accessor functions
173*2958Sdr146992  */
174*2958Sdr146992 extern int net_register_family(net_data_t, hook_family_t *);
175*2958Sdr146992 extern int net_unregister_family(net_data_t, hook_family_t *);
176*2958Sdr146992 extern hook_event_token_t net_register_event(net_data_t, hook_event_t *);
177*2958Sdr146992 extern int net_unregister_event(net_data_t, hook_event_t *);
178*2958Sdr146992 extern int net_register_hook(net_data_t, char *, hook_t *);
179*2958Sdr146992 extern int net_unregister_hook(net_data_t, char *, hook_t *);
180*2958Sdr146992 extern int net_getifname(net_data_t, phy_if_t, char *, const size_t);
181*2958Sdr146992 extern int net_getmtu(net_data_t, phy_if_t, lif_if_t);
182*2958Sdr146992 extern int net_getpmtuenabled(net_data_t);
183*2958Sdr146992 extern int net_getlifaddr(net_data_t, phy_if_t, lif_if_t,
184*2958Sdr146992     int, net_ifaddr_t [], void *);
185*2958Sdr146992 extern phy_if_t net_phygetnext(net_data_t, phy_if_t);
186*2958Sdr146992 extern phy_if_t net_phylookup(net_data_t, const char *);
187*2958Sdr146992 extern lif_if_t net_lifgetnext(net_data_t, phy_if_t, lif_if_t);
188*2958Sdr146992 extern int net_inject(net_data_t, inject_t, net_inject_t *);
189*2958Sdr146992 extern phy_if_t net_routeto(net_data_t, struct sockaddr *);
190*2958Sdr146992 extern int net_ispartialchecksum(net_data_t, mblk_t *);
191*2958Sdr146992 extern int net_isvalidchecksum(net_data_t, mblk_t *);
192*2958Sdr146992 
193*2958Sdr146992 #ifdef	__cplusplus
194*2958Sdr146992 }
195*2958Sdr146992 #endif
196*2958Sdr146992 
197*2958Sdr146992 #endif /* _SYS_NETI_H */
198