12958Sdr146992 /* 22958Sdr146992 * CDDL HEADER START 32958Sdr146992 * 42958Sdr146992 * The contents of this file are subject to the terms of the 52958Sdr146992 * Common Development and Distribution License (the "License"). 62958Sdr146992 * You may not use this file except in compliance with the License. 72958Sdr146992 * 82958Sdr146992 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 92958Sdr146992 * or http://www.opensolaris.org/os/licensing. 102958Sdr146992 * See the License for the specific language governing permissions 112958Sdr146992 * and limitations under the License. 122958Sdr146992 * 132958Sdr146992 * When distributing Covered Code, include this CDDL HEADER in each 142958Sdr146992 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 152958Sdr146992 * If applicable, add the following below this CDDL HEADER, with the 162958Sdr146992 * fields enclosed by brackets "[]" replaced with your own identifying 172958Sdr146992 * information: Portions Copyright [yyyy] [name of copyright owner] 182958Sdr146992 * 192958Sdr146992 * CDDL HEADER END 202958Sdr146992 */ 212958Sdr146992 /* 227513SDarren.Reed@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 232958Sdr146992 * Use is subject to license terms. 242958Sdr146992 */ 252958Sdr146992 262958Sdr146992 #ifndef _SYS_NETI_H 272958Sdr146992 #define _SYS_NETI_H 282958Sdr146992 292958Sdr146992 #include <netinet/in.h> 302958Sdr146992 #include <sys/int_types.h> 312958Sdr146992 #include <sys/queue.h> 322958Sdr146992 #include <sys/hook_impl.h> 333448Sdh155122 #include <sys/netstack.h> 342958Sdr146992 352958Sdr146992 #ifdef __cplusplus 362958Sdr146992 extern "C" { 372958Sdr146992 #endif 382958Sdr146992 392958Sdr146992 #define NETINFO_VERSION 1 402958Sdr146992 412958Sdr146992 /* 422958Sdr146992 * Network hooks framework stack protocol name 432958Sdr146992 */ 442958Sdr146992 #define NHF_INET "NHF_INET" 452958Sdr146992 #define NHF_INET6 "NHF_INET6" 462958Sdr146992 #define NHF_ARP "NHF_ARP" 472958Sdr146992 482958Sdr146992 /* 492958Sdr146992 * Event identification 502958Sdr146992 */ 512958Sdr146992 #define NH_PHYSICAL_IN "PHYSICAL_IN" 522958Sdr146992 #define NH_PHYSICAL_OUT "PHYSICAL_OUT" 532958Sdr146992 #define NH_FORWARDING "FORWARDING" 542958Sdr146992 #define NH_LOOPBACK_IN "LOOPBACK_IN" 552958Sdr146992 #define NH_LOOPBACK_OUT "LOOPBACK_OUT" 562958Sdr146992 #define NH_NIC_EVENTS "NIC_EVENTS" 572958Sdr146992 582958Sdr146992 /* 592958Sdr146992 * Network NIC hardware checksum capability 602958Sdr146992 */ 612958Sdr146992 #define NET_HCK_NONE 0x00 622958Sdr146992 #define NET_HCK_L3_FULL 0x01 632958Sdr146992 #define NET_HCK_L3_PART 0x02 642958Sdr146992 #define NET_HCK_L4_FULL 0x10 652958Sdr146992 #define NET_HCK_L4_PART 0x20 662958Sdr146992 672958Sdr146992 #define NET_IS_HCK_L3_FULL(n, x) \ 682958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L3_FULL) == NET_HCK_L3_FULL) 692958Sdr146992 #define NET_IS_HCK_L3_PART(n, x) \ 702958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L3_PART) == NET_HCK_L3_PART) 712958Sdr146992 #define NET_IS_HCK_L4_FULL(n, x) \ 722958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L4_FULL) == NET_HCK_L4_FULL) 732958Sdr146992 #define NET_IS_HCK_L4_PART(n, x) \ 742958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L4_PART) == NET_HCK_L4_PART) 752958Sdr146992 #define NET_IS_HCK_L34_FULL(n, x) \ 762958Sdr146992 ((net_ispartialchecksum(n, x) & (NET_HCK_L3_FULL|NET_HCK_L4_FULL)) \ 772958Sdr146992 == (NET_HCK_L3_FULL | NET_HCK_L4_FULL)) 782958Sdr146992 792958Sdr146992 typedef uintptr_t phy_if_t; 802958Sdr146992 typedef intptr_t lif_if_t; 812958Sdr146992 typedef uintptr_t net_ifdata_t; 827513SDarren.Reed@Sun.COM typedef id_t netid_t; 832958Sdr146992 842958Sdr146992 /* 852958Sdr146992 * Netinfo interface specification 862958Sdr146992 * 872958Sdr146992 * Netinfo provides an extensible and easy to use interface for 882958Sdr146992 * accessing data and functionality already embedded within network 892958Sdr146992 * code that exists within the kernel. 902958Sdr146992 */ 912958Sdr146992 typedef enum net_ifaddr { 922958Sdr146992 NA_ADDRESS = 1, 932958Sdr146992 NA_PEER, 942958Sdr146992 NA_BROADCAST, 952958Sdr146992 NA_NETMASK 962958Sdr146992 } net_ifaddr_t; 972958Sdr146992 982958Sdr146992 992958Sdr146992 typedef enum inject { 1002958Sdr146992 NI_QUEUE_IN = 1, 1012958Sdr146992 NI_QUEUE_OUT, 1022958Sdr146992 NI_DIRECT_OUT 1032958Sdr146992 } inject_t; 1042958Sdr146992 1057513SDarren.Reed@Sun.COM /* 1067513SDarren.Reed@Sun.COM * net_inject - public interface 1077513SDarren.Reed@Sun.COM */ 1082958Sdr146992 typedef struct net_inject { 1097513SDarren.Reed@Sun.COM int ni_version; 1107513SDarren.Reed@Sun.COM netid_t ni_netid; 1112958Sdr146992 mblk_t *ni_packet; 1122958Sdr146992 struct sockaddr_storage ni_addr; 1132958Sdr146992 phy_if_t ni_physical; 1142958Sdr146992 } net_inject_t; 1152958Sdr146992 1167513SDarren.Reed@Sun.COM typedef struct net_data *net_handle_t; 1172958Sdr146992 1182958Sdr146992 /* 1197513SDarren.Reed@Sun.COM * net_protocol_t private interface 1202958Sdr146992 */ 1217513SDarren.Reed@Sun.COM struct net_protocol_s { 1227513SDarren.Reed@Sun.COM int netp_version; 1237513SDarren.Reed@Sun.COM char *netp_name; 1247513SDarren.Reed@Sun.COM int (*netp_getifname)(net_handle_t, phy_if_t, char *, 1257513SDarren.Reed@Sun.COM const size_t); 1267513SDarren.Reed@Sun.COM int (*netp_getmtu)(net_handle_t, phy_if_t, lif_if_t); 1277513SDarren.Reed@Sun.COM int (*netp_getpmtuenabled)(net_handle_t); 1287513SDarren.Reed@Sun.COM int (*netp_getlifaddr)(net_handle_t, phy_if_t, lif_if_t, 1297513SDarren.Reed@Sun.COM size_t, net_ifaddr_t [], void *); 1307513SDarren.Reed@Sun.COM phy_if_t (*netp_phygetnext)(net_handle_t, phy_if_t); 1317513SDarren.Reed@Sun.COM phy_if_t (*netp_phylookup)(net_handle_t, const char *); 1327513SDarren.Reed@Sun.COM lif_if_t (*netp_lifgetnext)(net_handle_t, phy_if_t, lif_if_t); 1337513SDarren.Reed@Sun.COM int (*netp_inject)(net_handle_t, inject_t, net_inject_t *); 1347513SDarren.Reed@Sun.COM phy_if_t (*netp_routeto)(net_handle_t, struct sockaddr *, 1357513SDarren.Reed@Sun.COM struct sockaddr *); 1367513SDarren.Reed@Sun.COM int (*netp_ispartialchecksum)(net_handle_t, mblk_t *); 1377513SDarren.Reed@Sun.COM int (*netp_isvalidchecksum)(net_handle_t, mblk_t *); 1387513SDarren.Reed@Sun.COM }; 1397513SDarren.Reed@Sun.COM typedef struct net_protocol_s net_protocol_t; 1402958Sdr146992 1412958Sdr146992 1422958Sdr146992 /* 1432958Sdr146992 * Private data structures 1442958Sdr146992 */ 1452958Sdr146992 struct net_data { 1462958Sdr146992 LIST_ENTRY(net_data) netd_list; 1477513SDarren.Reed@Sun.COM net_protocol_t netd_info; 1482958Sdr146992 int netd_refcnt; 1492958Sdr146992 hook_family_int_t *netd_hooks; 1507513SDarren.Reed@Sun.COM struct neti_stack_s *netd_stack; 1517513SDarren.Reed@Sun.COM int netd_condemned; 1522958Sdr146992 }; 1532958Sdr146992 1542958Sdr146992 1552958Sdr146992 typedef struct injection_s { 1562958Sdr146992 net_inject_t inj_data; 1572958Sdr146992 boolean_t inj_isv6; 1583448Sdh155122 void * inj_ptr; 1592958Sdr146992 } injection_t; 1602958Sdr146992 1612958Sdr146992 /* 1622958Sdr146992 * The ipif_id space is [0,MAX) but this interface wants to return [1,MAX] as 1632958Sdr146992 * a valid range of logical interface numbers so that it can return 0 to mean 1642958Sdr146992 * "end of list" with net_lifgetnext. Changing ipif_id's to use the [1,MAX] 1652958Sdr146992 * space is something to be considered for the future, if it is worthwhile. 1662958Sdr146992 */ 1672958Sdr146992 #define MAP_IPIF_ID(x) ((x) + 1) 1682958Sdr146992 #define UNMAP_IPIF_ID(x) (((x) > 0) ? (x) - 1 : (x)) 1692958Sdr146992 1707513SDarren.Reed@Sun.COM struct net_instance_s { 1717513SDarren.Reed@Sun.COM int nin_version; 1727513SDarren.Reed@Sun.COM char *nin_name; 1737513SDarren.Reed@Sun.COM void *(*nin_create)(const netid_t); 1747513SDarren.Reed@Sun.COM void (*nin_destroy)(const netid_t, void *); 1757513SDarren.Reed@Sun.COM void (*nin_shutdown)(const netid_t, void *); 1767513SDarren.Reed@Sun.COM }; 1777513SDarren.Reed@Sun.COM typedef struct net_instance_s net_instance_t; 1787513SDarren.Reed@Sun.COM 1797513SDarren.Reed@Sun.COM struct net_instance_int_s { 1807513SDarren.Reed@Sun.COM LIST_ENTRY(net_instance_int_s) nini_next; 181*7915SDarren.Reed@Sun.COM uint_t nini_ref; 1827513SDarren.Reed@Sun.COM void *nini_created; 1837513SDarren.Reed@Sun.COM struct net_instance_int_s *nini_parent; 1847513SDarren.Reed@Sun.COM net_instance_t *nini_instance; 1857513SDarren.Reed@Sun.COM hook_notify_t nini_notify; 1867513SDarren.Reed@Sun.COM uint32_t nini_flags; 1877513SDarren.Reed@Sun.COM kcondvar_t nini_cv; 188*7915SDarren.Reed@Sun.COM boolean_t nini_condemned; 1897513SDarren.Reed@Sun.COM }; 1907513SDarren.Reed@Sun.COM typedef struct net_instance_int_s net_instance_int_t; 1917513SDarren.Reed@Sun.COM LIST_HEAD(nini_head_s, net_instance_int_s); 1927513SDarren.Reed@Sun.COM typedef struct nini_head_s nini_head_t; 1937513SDarren.Reed@Sun.COM 1947513SDarren.Reed@Sun.COM #define nini_version nini_instance->nin_version 1957513SDarren.Reed@Sun.COM #define nini_name nini_instance->nin_name 1967513SDarren.Reed@Sun.COM #define nini_create nini_instance->nin_create 1977513SDarren.Reed@Sun.COM #define nini_destroy nini_instance->nin_destroy 1987513SDarren.Reed@Sun.COM #define nini_shutdown nini_instance->nin_shutdown 1992958Sdr146992 2002958Sdr146992 /* 2017513SDarren.Reed@Sun.COM * netinfo stack instances 2023448Sdh155122 */ 2037513SDarren.Reed@Sun.COM struct neti_stack_s { 2047513SDarren.Reed@Sun.COM kmutex_t nts_lock; 2057513SDarren.Reed@Sun.COM LIST_ENTRY(neti_stack_s) nts_next; 2067513SDarren.Reed@Sun.COM netid_t nts_id; 2077513SDarren.Reed@Sun.COM zoneid_t nts_zoneid; 2087513SDarren.Reed@Sun.COM netstackid_t nts_stackid; 2097513SDarren.Reed@Sun.COM netstack_t *nts_netstack; 2107513SDarren.Reed@Sun.COM nini_head_t nts_instances; 2117513SDarren.Reed@Sun.COM uint32_t nts_flags; 2127513SDarren.Reed@Sun.COM kcondvar_t nts_cv; 2137513SDarren.Reed@Sun.COM /* list of net_handle_t */ 2143448Sdh155122 LIST_HEAD(netd_listhead, net_data) nts_netd_head; 2153448Sdh155122 }; 2167513SDarren.Reed@Sun.COM typedef struct neti_stack_s neti_stack_t; 2177513SDarren.Reed@Sun.COM LIST_HEAD(neti_stack_head_s, neti_stack_s); 2187513SDarren.Reed@Sun.COM typedef struct neti_stack_head_s neti_stack_head_t; 2193448Sdh155122 2203448Sdh155122 /* 2217513SDarren.Reed@Sun.COM * Internal functions that need to be exported within the module. 2222958Sdr146992 */ 2237513SDarren.Reed@Sun.COM extern void neti_init(void); 2247513SDarren.Reed@Sun.COM extern void neti_fini(void); 2257513SDarren.Reed@Sun.COM extern neti_stack_t *net_getnetistackbyid(netid_t); 2267513SDarren.Reed@Sun.COM extern netstackid_t net_getnetstackidbynetid(netid_t); 2277513SDarren.Reed@Sun.COM extern netid_t net_getnetidbynetstackid(netstackid_t); 2287513SDarren.Reed@Sun.COM extern netid_t net_zoneidtonetid(zoneid_t); 2297513SDarren.Reed@Sun.COM extern zoneid_t net_getzoneidbynetid(netid_t); 2302958Sdr146992 2312958Sdr146992 /* 2327513SDarren.Reed@Sun.COM * Functions available for public use. 2332958Sdr146992 */ 2347513SDarren.Reed@Sun.COM extern hook_event_token_t net_event_register(net_handle_t, hook_event_t *); 235*7915SDarren.Reed@Sun.COM extern int net_event_shutdown(net_handle_t, hook_event_t *); 2367513SDarren.Reed@Sun.COM extern int net_event_unregister(net_handle_t, hook_event_t *); 2377513SDarren.Reed@Sun.COM extern int net_event_notify_register(net_handle_t, char *, 2387513SDarren.Reed@Sun.COM hook_notify_fn_t, void *); 2397513SDarren.Reed@Sun.COM extern int net_event_notify_unregister(net_handle_t, char *, hook_notify_fn_t); 2407513SDarren.Reed@Sun.COM 2417513SDarren.Reed@Sun.COM extern int net_family_register(net_handle_t, hook_family_t *); 242*7915SDarren.Reed@Sun.COM extern int net_family_shutdown(net_handle_t, hook_family_t *); 2437513SDarren.Reed@Sun.COM extern int net_family_unregister(net_handle_t, hook_family_t *); 2447513SDarren.Reed@Sun.COM 2457513SDarren.Reed@Sun.COM extern int net_hook_register(net_handle_t, char *, hook_t *); 2467513SDarren.Reed@Sun.COM extern int net_hook_unregister(net_handle_t, char *, hook_t *); 2477513SDarren.Reed@Sun.COM 2487513SDarren.Reed@Sun.COM extern int net_inject(net_handle_t, inject_t, net_inject_t *); 2497513SDarren.Reed@Sun.COM extern net_inject_t *net_inject_alloc(const int); 2507513SDarren.Reed@Sun.COM extern void net_inject_free(net_inject_t *); 2517513SDarren.Reed@Sun.COM 2527513SDarren.Reed@Sun.COM extern net_instance_t *net_instance_alloc(const int version); 2537513SDarren.Reed@Sun.COM extern void net_instance_free(net_instance_t *); 2547513SDarren.Reed@Sun.COM extern int net_instance_register(net_instance_t *); 2557513SDarren.Reed@Sun.COM extern int net_instance_unregister(net_instance_t *); 2567513SDarren.Reed@Sun.COM extern int net_instance_notify_register(netid_t, hook_notify_fn_t, void *); 2577513SDarren.Reed@Sun.COM extern int net_instance_notify_unregister(netid_t netid, hook_notify_fn_t); 2587513SDarren.Reed@Sun.COM 2597513SDarren.Reed@Sun.COM extern kstat_t *net_kstat_create(netid_t, char *, int, char *, char *, 2607513SDarren.Reed@Sun.COM uchar_t, ulong_t, uchar_t); 2617513SDarren.Reed@Sun.COM extern void net_kstat_delete(netid_t, kstat_t *); 2627513SDarren.Reed@Sun.COM 2637513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_lookup(netid_t, const char *); 2647513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_register(netid_t, const net_protocol_t *); 2657513SDarren.Reed@Sun.COM extern int net_protocol_release(net_handle_t); 2667513SDarren.Reed@Sun.COM extern int net_protocol_unregister(net_handle_t); 2677513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_walk(netid_t, net_handle_t); 2687513SDarren.Reed@Sun.COM extern int net_protocol_notify_register(net_handle_t, hook_notify_fn_t, void *); 2697513SDarren.Reed@Sun.COM extern int net_protocol_notify_unregister(net_handle_t, hook_notify_fn_t); 2707513SDarren.Reed@Sun.COM 2717513SDarren.Reed@Sun.COM 2727513SDarren.Reed@Sun.COM extern int net_getifname(net_handle_t, phy_if_t, char *, const size_t); 2737513SDarren.Reed@Sun.COM extern int net_getmtu(net_handle_t, phy_if_t, lif_if_t); 2747513SDarren.Reed@Sun.COM extern int net_getpmtuenabled(net_handle_t); 2757513SDarren.Reed@Sun.COM extern int net_getlifaddr(net_handle_t, phy_if_t, lif_if_t, 2762958Sdr146992 int, net_ifaddr_t [], void *); 2777513SDarren.Reed@Sun.COM extern phy_if_t net_phygetnext(net_handle_t, phy_if_t); 2787513SDarren.Reed@Sun.COM extern phy_if_t net_phylookup(net_handle_t, const char *); 2797513SDarren.Reed@Sun.COM extern lif_if_t net_lifgetnext(net_handle_t, phy_if_t, lif_if_t); 2807513SDarren.Reed@Sun.COM extern phy_if_t net_routeto(net_handle_t, struct sockaddr *, 2817513SDarren.Reed@Sun.COM struct sockaddr *); 2827513SDarren.Reed@Sun.COM extern int net_ispartialchecksum(net_handle_t, mblk_t *); 2837513SDarren.Reed@Sun.COM extern int net_isvalidchecksum(net_handle_t, mblk_t *); 2842958Sdr146992 2852958Sdr146992 #ifdef __cplusplus 2862958Sdr146992 } 2872958Sdr146992 #endif 2882958Sdr146992 2892958Sdr146992 #endif /* _SYS_NETI_H */ 290