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