1381a2a9aSdr146992 /* 2381a2a9aSdr146992 * CDDL HEADER START 3381a2a9aSdr146992 * 4381a2a9aSdr146992 * The contents of this file are subject to the terms of the 5381a2a9aSdr146992 * Common Development and Distribution License (the "License"). 6381a2a9aSdr146992 * You may not use this file except in compliance with the License. 7381a2a9aSdr146992 * 8381a2a9aSdr146992 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9381a2a9aSdr146992 * or http://www.opensolaris.org/os/licensing. 10381a2a9aSdr146992 * See the License for the specific language governing permissions 11381a2a9aSdr146992 * and limitations under the License. 12381a2a9aSdr146992 * 13381a2a9aSdr146992 * When distributing Covered Code, include this CDDL HEADER in each 14381a2a9aSdr146992 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15381a2a9aSdr146992 * If applicable, add the following below this CDDL HEADER, with the 16381a2a9aSdr146992 * fields enclosed by brackets "[]" replaced with your own identifying 17381a2a9aSdr146992 * information: Portions Copyright [yyyy] [name of copyright owner] 18381a2a9aSdr146992 * 19381a2a9aSdr146992 * CDDL HEADER END 20381a2a9aSdr146992 */ 21381a2a9aSdr146992 /* 22*7ddc9b1aSDarren Reed * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23381a2a9aSdr146992 * Use is subject to license terms. 24381a2a9aSdr146992 */ 25381a2a9aSdr146992 26381a2a9aSdr146992 #ifndef _SYS_NETI_H 27381a2a9aSdr146992 #define _SYS_NETI_H 28381a2a9aSdr146992 29381a2a9aSdr146992 #include <netinet/in.h> 30381a2a9aSdr146992 #include <sys/int_types.h> 31381a2a9aSdr146992 #include <sys/queue.h> 32381a2a9aSdr146992 #include <sys/hook_impl.h> 33f4b3ec61Sdh155122 #include <sys/netstack.h> 34381a2a9aSdr146992 35381a2a9aSdr146992 #ifdef __cplusplus 36381a2a9aSdr146992 extern "C" { 37381a2a9aSdr146992 #endif 38381a2a9aSdr146992 39381a2a9aSdr146992 #define NETINFO_VERSION 1 40381a2a9aSdr146992 41381a2a9aSdr146992 /* 42381a2a9aSdr146992 * Network hooks framework stack protocol name 43381a2a9aSdr146992 */ 44381a2a9aSdr146992 #define NHF_INET "NHF_INET" 45381a2a9aSdr146992 #define NHF_INET6 "NHF_INET6" 46381a2a9aSdr146992 #define NHF_ARP "NHF_ARP" 47381a2a9aSdr146992 48381a2a9aSdr146992 /* 49381a2a9aSdr146992 * Event identification 50381a2a9aSdr146992 */ 51381a2a9aSdr146992 #define NH_PHYSICAL_IN "PHYSICAL_IN" 52381a2a9aSdr146992 #define NH_PHYSICAL_OUT "PHYSICAL_OUT" 53381a2a9aSdr146992 #define NH_FORWARDING "FORWARDING" 54381a2a9aSdr146992 #define NH_LOOPBACK_IN "LOOPBACK_IN" 55381a2a9aSdr146992 #define NH_LOOPBACK_OUT "LOOPBACK_OUT" 56381a2a9aSdr146992 #define NH_NIC_EVENTS "NIC_EVENTS" 57381a2a9aSdr146992 58381a2a9aSdr146992 /* 59381a2a9aSdr146992 * Network NIC hardware checksum capability 60381a2a9aSdr146992 */ 61381a2a9aSdr146992 #define NET_HCK_NONE 0x00 62381a2a9aSdr146992 #define NET_HCK_L3_FULL 0x01 63381a2a9aSdr146992 #define NET_HCK_L3_PART 0x02 64381a2a9aSdr146992 #define NET_HCK_L4_FULL 0x10 65381a2a9aSdr146992 #define NET_HCK_L4_PART 0x20 66381a2a9aSdr146992 67381a2a9aSdr146992 #define NET_IS_HCK_L3_FULL(n, x) \ 68381a2a9aSdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L3_FULL) == NET_HCK_L3_FULL) 69381a2a9aSdr146992 #define NET_IS_HCK_L3_PART(n, x) \ 70381a2a9aSdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L3_PART) == NET_HCK_L3_PART) 71381a2a9aSdr146992 #define NET_IS_HCK_L4_FULL(n, x) \ 72381a2a9aSdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L4_FULL) == NET_HCK_L4_FULL) 73381a2a9aSdr146992 #define NET_IS_HCK_L4_PART(n, x) \ 74381a2a9aSdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L4_PART) == NET_HCK_L4_PART) 75381a2a9aSdr146992 #define NET_IS_HCK_L34_FULL(n, x) \ 76381a2a9aSdr146992 ((net_ispartialchecksum(n, x) & (NET_HCK_L3_FULL|NET_HCK_L4_FULL)) \ 77381a2a9aSdr146992 == (NET_HCK_L3_FULL | NET_HCK_L4_FULL)) 78381a2a9aSdr146992 79381a2a9aSdr146992 typedef uintptr_t phy_if_t; 80381a2a9aSdr146992 typedef intptr_t lif_if_t; 81381a2a9aSdr146992 typedef uintptr_t net_ifdata_t; 82*7ddc9b1aSDarren Reed typedef id_t netid_t; 83381a2a9aSdr146992 84381a2a9aSdr146992 /* 85381a2a9aSdr146992 * Netinfo interface specification 86381a2a9aSdr146992 * 87381a2a9aSdr146992 * Netinfo provides an extensible and easy to use interface for 88381a2a9aSdr146992 * accessing data and functionality already embedded within network 89381a2a9aSdr146992 * code that exists within the kernel. 90381a2a9aSdr146992 */ 91381a2a9aSdr146992 typedef enum net_ifaddr { 92381a2a9aSdr146992 NA_ADDRESS = 1, 93381a2a9aSdr146992 NA_PEER, 94381a2a9aSdr146992 NA_BROADCAST, 95381a2a9aSdr146992 NA_NETMASK 96381a2a9aSdr146992 } net_ifaddr_t; 97381a2a9aSdr146992 98381a2a9aSdr146992 99381a2a9aSdr146992 typedef enum inject { 100381a2a9aSdr146992 NI_QUEUE_IN = 1, 101381a2a9aSdr146992 NI_QUEUE_OUT, 102381a2a9aSdr146992 NI_DIRECT_OUT 103381a2a9aSdr146992 } inject_t; 104381a2a9aSdr146992 105*7ddc9b1aSDarren Reed /* 106*7ddc9b1aSDarren Reed * net_inject - public interface 107*7ddc9b1aSDarren Reed */ 108381a2a9aSdr146992 typedef struct net_inject { 109*7ddc9b1aSDarren Reed int ni_version; 110*7ddc9b1aSDarren Reed netid_t ni_netid; 111381a2a9aSdr146992 mblk_t *ni_packet; 112381a2a9aSdr146992 struct sockaddr_storage ni_addr; 113381a2a9aSdr146992 phy_if_t ni_physical; 114381a2a9aSdr146992 } net_inject_t; 115381a2a9aSdr146992 116*7ddc9b1aSDarren Reed typedef struct net_data *net_handle_t; 117381a2a9aSdr146992 118381a2a9aSdr146992 /* 119*7ddc9b1aSDarren Reed * net_protocol_t private interface 120381a2a9aSdr146992 */ 121*7ddc9b1aSDarren Reed struct net_protocol_s { 122*7ddc9b1aSDarren Reed int netp_version; 123*7ddc9b1aSDarren Reed char *netp_name; 124*7ddc9b1aSDarren Reed int (*netp_getifname)(net_handle_t, phy_if_t, char *, 125*7ddc9b1aSDarren Reed const size_t); 126*7ddc9b1aSDarren Reed int (*netp_getmtu)(net_handle_t, phy_if_t, lif_if_t); 127*7ddc9b1aSDarren Reed int (*netp_getpmtuenabled)(net_handle_t); 128*7ddc9b1aSDarren Reed int (*netp_getlifaddr)(net_handle_t, phy_if_t, lif_if_t, 129*7ddc9b1aSDarren Reed size_t, net_ifaddr_t [], void *); 130*7ddc9b1aSDarren Reed phy_if_t (*netp_phygetnext)(net_handle_t, phy_if_t); 131*7ddc9b1aSDarren Reed phy_if_t (*netp_phylookup)(net_handle_t, const char *); 132*7ddc9b1aSDarren Reed lif_if_t (*netp_lifgetnext)(net_handle_t, phy_if_t, lif_if_t); 133*7ddc9b1aSDarren Reed int (*netp_inject)(net_handle_t, inject_t, net_inject_t *); 134*7ddc9b1aSDarren Reed phy_if_t (*netp_routeto)(net_handle_t, struct sockaddr *, 135*7ddc9b1aSDarren Reed struct sockaddr *); 136*7ddc9b1aSDarren Reed int (*netp_ispartialchecksum)(net_handle_t, mblk_t *); 137*7ddc9b1aSDarren Reed int (*netp_isvalidchecksum)(net_handle_t, mblk_t *); 138*7ddc9b1aSDarren Reed }; 139*7ddc9b1aSDarren Reed typedef struct net_protocol_s net_protocol_t; 140381a2a9aSdr146992 141381a2a9aSdr146992 142381a2a9aSdr146992 /* 143381a2a9aSdr146992 * Private data structures 144381a2a9aSdr146992 */ 145381a2a9aSdr146992 struct net_data { 146381a2a9aSdr146992 LIST_ENTRY(net_data) netd_list; 147*7ddc9b1aSDarren Reed net_protocol_t netd_info; 148381a2a9aSdr146992 int netd_refcnt; 149381a2a9aSdr146992 hook_family_int_t *netd_hooks; 150*7ddc9b1aSDarren Reed struct neti_stack_s *netd_stack; 151*7ddc9b1aSDarren Reed int netd_condemned; 152381a2a9aSdr146992 }; 153381a2a9aSdr146992 154381a2a9aSdr146992 155381a2a9aSdr146992 typedef struct injection_s { 156381a2a9aSdr146992 net_inject_t inj_data; 157381a2a9aSdr146992 boolean_t inj_isv6; 158f4b3ec61Sdh155122 void * inj_ptr; 159381a2a9aSdr146992 } injection_t; 160381a2a9aSdr146992 161381a2a9aSdr146992 /* 162381a2a9aSdr146992 * The ipif_id space is [0,MAX) but this interface wants to return [1,MAX] as 163381a2a9aSdr146992 * a valid range of logical interface numbers so that it can return 0 to mean 164381a2a9aSdr146992 * "end of list" with net_lifgetnext. Changing ipif_id's to use the [1,MAX] 165381a2a9aSdr146992 * space is something to be considered for the future, if it is worthwhile. 166381a2a9aSdr146992 */ 167381a2a9aSdr146992 #define MAP_IPIF_ID(x) ((x) + 1) 168381a2a9aSdr146992 #define UNMAP_IPIF_ID(x) (((x) > 0) ? (x) - 1 : (x)) 169381a2a9aSdr146992 170*7ddc9b1aSDarren Reed struct net_instance_s { 171*7ddc9b1aSDarren Reed int nin_version; 172*7ddc9b1aSDarren Reed char *nin_name; 173*7ddc9b1aSDarren Reed void *(*nin_create)(const netid_t); 174*7ddc9b1aSDarren Reed void (*nin_destroy)(const netid_t, void *); 175*7ddc9b1aSDarren Reed void (*nin_shutdown)(const netid_t, void *); 176f4b3ec61Sdh155122 }; 177*7ddc9b1aSDarren Reed typedef struct net_instance_s net_instance_t; 178f4b3ec61Sdh155122 179*7ddc9b1aSDarren Reed struct net_instance_int_s { 180*7ddc9b1aSDarren Reed LIST_ENTRY(net_instance_int_s) nini_next; 181*7ddc9b1aSDarren Reed int nini_ref; 182*7ddc9b1aSDarren Reed void *nini_created; 183*7ddc9b1aSDarren Reed struct net_instance_int_s *nini_parent; 184*7ddc9b1aSDarren Reed net_instance_t *nini_instance; 185*7ddc9b1aSDarren Reed hook_notify_t nini_notify; 186*7ddc9b1aSDarren Reed uint32_t nini_flags; 187*7ddc9b1aSDarren Reed kcondvar_t nini_cv; 188*7ddc9b1aSDarren Reed }; 189*7ddc9b1aSDarren Reed typedef struct net_instance_int_s net_instance_int_t; 190*7ddc9b1aSDarren Reed LIST_HEAD(nini_head_s, net_instance_int_s); 191*7ddc9b1aSDarren Reed typedef struct nini_head_s nini_head_t; 192*7ddc9b1aSDarren Reed 193*7ddc9b1aSDarren Reed #define nini_version nini_instance->nin_version 194*7ddc9b1aSDarren Reed #define nini_name nini_instance->nin_name 195*7ddc9b1aSDarren Reed #define nini_create nini_instance->nin_create 196*7ddc9b1aSDarren Reed #define nini_destroy nini_instance->nin_destroy 197*7ddc9b1aSDarren Reed #define nini_shutdown nini_instance->nin_shutdown 198f4b3ec61Sdh155122 199f4b3ec61Sdh155122 /* 200*7ddc9b1aSDarren Reed * netinfo stack instances 201381a2a9aSdr146992 */ 202*7ddc9b1aSDarren Reed struct neti_stack_s { 203*7ddc9b1aSDarren Reed kmutex_t nts_lock; 204*7ddc9b1aSDarren Reed LIST_ENTRY(neti_stack_s) nts_next; 205*7ddc9b1aSDarren Reed netid_t nts_id; 206*7ddc9b1aSDarren Reed zoneid_t nts_zoneid; 207*7ddc9b1aSDarren Reed netstackid_t nts_stackid; 208*7ddc9b1aSDarren Reed netstack_t *nts_netstack; 209*7ddc9b1aSDarren Reed nini_head_t nts_instances; 210*7ddc9b1aSDarren Reed uint32_t nts_flags; 211*7ddc9b1aSDarren Reed kcondvar_t nts_cv; 212*7ddc9b1aSDarren Reed /* list of net_handle_t */ 213*7ddc9b1aSDarren Reed LIST_HEAD(netd_listhead, net_data) nts_netd_head; 214*7ddc9b1aSDarren Reed }; 215*7ddc9b1aSDarren Reed typedef struct neti_stack_s neti_stack_t; 216*7ddc9b1aSDarren Reed LIST_HEAD(neti_stack_head_s, neti_stack_s); 217*7ddc9b1aSDarren Reed typedef struct neti_stack_head_s neti_stack_head_t; 218381a2a9aSdr146992 219381a2a9aSdr146992 /* 220*7ddc9b1aSDarren Reed * Internal functions that need to be exported within the module. 221381a2a9aSdr146992 */ 222*7ddc9b1aSDarren Reed extern void neti_init(void); 223*7ddc9b1aSDarren Reed extern void neti_fini(void); 224*7ddc9b1aSDarren Reed extern neti_stack_t *net_getnetistackbyid(netid_t); 225*7ddc9b1aSDarren Reed extern netstackid_t net_getnetstackidbynetid(netid_t); 226*7ddc9b1aSDarren Reed extern netid_t net_getnetidbynetstackid(netstackid_t); 227*7ddc9b1aSDarren Reed extern netid_t net_zoneidtonetid(zoneid_t); 228*7ddc9b1aSDarren Reed extern zoneid_t net_getzoneidbynetid(netid_t); 229*7ddc9b1aSDarren Reed 230*7ddc9b1aSDarren Reed /* 231*7ddc9b1aSDarren Reed * Functions available for public use. 232*7ddc9b1aSDarren Reed */ 233*7ddc9b1aSDarren Reed extern hook_event_token_t net_event_register(net_handle_t, hook_event_t *); 234*7ddc9b1aSDarren Reed extern int net_event_unregister(net_handle_t, hook_event_t *); 235*7ddc9b1aSDarren Reed extern int net_event_notify_register(net_handle_t, char *, 236*7ddc9b1aSDarren Reed hook_notify_fn_t, void *); 237*7ddc9b1aSDarren Reed extern int net_event_notify_unregister(net_handle_t, char *, hook_notify_fn_t); 238*7ddc9b1aSDarren Reed 239*7ddc9b1aSDarren Reed extern int net_family_register(net_handle_t, hook_family_t *); 240*7ddc9b1aSDarren Reed extern int net_family_unregister(net_handle_t, hook_family_t *); 241*7ddc9b1aSDarren Reed 242*7ddc9b1aSDarren Reed extern int net_hook_register(net_handle_t, char *, hook_t *); 243*7ddc9b1aSDarren Reed extern int net_hook_unregister(net_handle_t, char *, hook_t *); 244*7ddc9b1aSDarren Reed 245*7ddc9b1aSDarren Reed extern int net_inject(net_handle_t, inject_t, net_inject_t *); 246*7ddc9b1aSDarren Reed extern net_inject_t *net_inject_alloc(const int); 247*7ddc9b1aSDarren Reed extern void net_inject_free(net_inject_t *); 248*7ddc9b1aSDarren Reed 249*7ddc9b1aSDarren Reed extern net_instance_t *net_instance_alloc(const int version); 250*7ddc9b1aSDarren Reed extern void net_instance_free(net_instance_t *); 251*7ddc9b1aSDarren Reed extern int net_instance_register(net_instance_t *); 252*7ddc9b1aSDarren Reed extern int net_instance_unregister(net_instance_t *); 253*7ddc9b1aSDarren Reed extern int net_instance_notify_register(netid_t, hook_notify_fn_t, void *); 254*7ddc9b1aSDarren Reed extern int net_instance_notify_unregister(netid_t netid, hook_notify_fn_t); 255*7ddc9b1aSDarren Reed 256*7ddc9b1aSDarren Reed extern kstat_t *net_kstat_create(netid_t, char *, int, char *, char *, 257*7ddc9b1aSDarren Reed uchar_t, ulong_t, uchar_t); 258*7ddc9b1aSDarren Reed extern void net_kstat_delete(netid_t, kstat_t *); 259*7ddc9b1aSDarren Reed 260*7ddc9b1aSDarren Reed extern net_handle_t net_protocol_lookup(netid_t, const char *); 261*7ddc9b1aSDarren Reed extern net_handle_t net_protocol_register(netid_t, const net_protocol_t *); 262*7ddc9b1aSDarren Reed extern int net_protocol_release(net_handle_t); 263*7ddc9b1aSDarren Reed extern int net_protocol_unregister(net_handle_t); 264*7ddc9b1aSDarren Reed extern net_handle_t net_protocol_walk(netid_t, net_handle_t); 265*7ddc9b1aSDarren Reed extern int net_protocol_notify_register(net_handle_t, hook_notify_fn_t, void *); 266*7ddc9b1aSDarren Reed extern int net_protocol_notify_unregister(net_handle_t, hook_notify_fn_t); 267*7ddc9b1aSDarren Reed 268*7ddc9b1aSDarren Reed 269*7ddc9b1aSDarren Reed extern int net_getifname(net_handle_t, phy_if_t, char *, const size_t); 270*7ddc9b1aSDarren Reed extern int net_getmtu(net_handle_t, phy_if_t, lif_if_t); 271*7ddc9b1aSDarren Reed extern int net_getpmtuenabled(net_handle_t); 272*7ddc9b1aSDarren Reed extern int net_getlifaddr(net_handle_t, phy_if_t, lif_if_t, 273381a2a9aSdr146992 int, net_ifaddr_t [], void *); 274*7ddc9b1aSDarren Reed extern phy_if_t net_phygetnext(net_handle_t, phy_if_t); 275*7ddc9b1aSDarren Reed extern phy_if_t net_phylookup(net_handle_t, const char *); 276*7ddc9b1aSDarren Reed extern lif_if_t net_lifgetnext(net_handle_t, phy_if_t, lif_if_t); 277*7ddc9b1aSDarren Reed extern phy_if_t net_routeto(net_handle_t, struct sockaddr *, 278*7ddc9b1aSDarren Reed struct sockaddr *); 279*7ddc9b1aSDarren Reed extern int net_ispartialchecksum(net_handle_t, mblk_t *); 280*7ddc9b1aSDarren Reed extern int net_isvalidchecksum(net_handle_t, mblk_t *); 281381a2a9aSdr146992 282381a2a9aSdr146992 #ifdef __cplusplus 283381a2a9aSdr146992 } 284381a2a9aSdr146992 #endif 285381a2a9aSdr146992 286381a2a9aSdr146992 #endif /* _SYS_NETI_H */ 287