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