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 /* 22*10639SDarren.Reed@Sun.COM * Copyright 2009 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" 57*10639SDarren.Reed@Sun.COM #define NH_OBSERVE "OBSERVING" 582958Sdr146992 592958Sdr146992 /* 602958Sdr146992 * Network NIC hardware checksum capability 612958Sdr146992 */ 622958Sdr146992 #define NET_HCK_NONE 0x00 632958Sdr146992 #define NET_HCK_L3_FULL 0x01 642958Sdr146992 #define NET_HCK_L3_PART 0x02 652958Sdr146992 #define NET_HCK_L4_FULL 0x10 662958Sdr146992 #define NET_HCK_L4_PART 0x20 672958Sdr146992 682958Sdr146992 #define NET_IS_HCK_L3_FULL(n, x) \ 692958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L3_FULL) == NET_HCK_L3_FULL) 702958Sdr146992 #define NET_IS_HCK_L3_PART(n, x) \ 712958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L3_PART) == NET_HCK_L3_PART) 722958Sdr146992 #define NET_IS_HCK_L4_FULL(n, x) \ 732958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L4_FULL) == NET_HCK_L4_FULL) 742958Sdr146992 #define NET_IS_HCK_L4_PART(n, x) \ 752958Sdr146992 ((net_ispartialchecksum(n, x) & NET_HCK_L4_PART) == NET_HCK_L4_PART) 762958Sdr146992 #define NET_IS_HCK_L34_FULL(n, x) \ 772958Sdr146992 ((net_ispartialchecksum(n, x) & (NET_HCK_L3_FULL|NET_HCK_L4_FULL)) \ 782958Sdr146992 == (NET_HCK_L3_FULL | NET_HCK_L4_FULL)) 792958Sdr146992 802958Sdr146992 typedef uintptr_t phy_if_t; 812958Sdr146992 typedef intptr_t lif_if_t; 822958Sdr146992 typedef uintptr_t net_ifdata_t; 837513SDarren.Reed@Sun.COM typedef id_t netid_t; 842958Sdr146992 852958Sdr146992 /* 862958Sdr146992 * Netinfo interface specification 872958Sdr146992 * 882958Sdr146992 * Netinfo provides an extensible and easy to use interface for 892958Sdr146992 * accessing data and functionality already embedded within network 902958Sdr146992 * code that exists within the kernel. 912958Sdr146992 */ 922958Sdr146992 typedef enum net_ifaddr { 932958Sdr146992 NA_ADDRESS = 1, 942958Sdr146992 NA_PEER, 952958Sdr146992 NA_BROADCAST, 962958Sdr146992 NA_NETMASK 972958Sdr146992 } net_ifaddr_t; 982958Sdr146992 992958Sdr146992 1002958Sdr146992 typedef enum inject { 1012958Sdr146992 NI_QUEUE_IN = 1, 1022958Sdr146992 NI_QUEUE_OUT, 1032958Sdr146992 NI_DIRECT_OUT 1042958Sdr146992 } inject_t; 1052958Sdr146992 1067513SDarren.Reed@Sun.COM /* 1077513SDarren.Reed@Sun.COM * net_inject - public interface 1087513SDarren.Reed@Sun.COM */ 1092958Sdr146992 typedef struct net_inject { 1107513SDarren.Reed@Sun.COM int ni_version; 1117513SDarren.Reed@Sun.COM netid_t ni_netid; 1122958Sdr146992 mblk_t *ni_packet; 1132958Sdr146992 struct sockaddr_storage ni_addr; 1142958Sdr146992 phy_if_t ni_physical; 1152958Sdr146992 } net_inject_t; 1162958Sdr146992 1177513SDarren.Reed@Sun.COM typedef struct net_data *net_handle_t; 1182958Sdr146992 1192958Sdr146992 /* 1207513SDarren.Reed@Sun.COM * net_protocol_t private interface 1212958Sdr146992 */ 1227513SDarren.Reed@Sun.COM struct net_protocol_s { 1237513SDarren.Reed@Sun.COM int netp_version; 1247513SDarren.Reed@Sun.COM char *netp_name; 1257513SDarren.Reed@Sun.COM int (*netp_getifname)(net_handle_t, phy_if_t, char *, 1267513SDarren.Reed@Sun.COM const size_t); 1277513SDarren.Reed@Sun.COM int (*netp_getmtu)(net_handle_t, phy_if_t, lif_if_t); 1287513SDarren.Reed@Sun.COM int (*netp_getpmtuenabled)(net_handle_t); 1297513SDarren.Reed@Sun.COM int (*netp_getlifaddr)(net_handle_t, phy_if_t, lif_if_t, 1307513SDarren.Reed@Sun.COM size_t, net_ifaddr_t [], void *); 1318023SPhil.Kirk@Sun.COM int (*neti_getlifzone)(net_handle_t, phy_if_t, lif_if_t, 1328023SPhil.Kirk@Sun.COM zoneid_t *); 1338023SPhil.Kirk@Sun.COM int (*neti_getlifflags)(net_handle_t, phy_if_t, lif_if_t, 1348023SPhil.Kirk@Sun.COM uint64_t *); 1357513SDarren.Reed@Sun.COM phy_if_t (*netp_phygetnext)(net_handle_t, phy_if_t); 1367513SDarren.Reed@Sun.COM phy_if_t (*netp_phylookup)(net_handle_t, const char *); 1377513SDarren.Reed@Sun.COM lif_if_t (*netp_lifgetnext)(net_handle_t, phy_if_t, lif_if_t); 1387513SDarren.Reed@Sun.COM int (*netp_inject)(net_handle_t, inject_t, net_inject_t *); 1397513SDarren.Reed@Sun.COM phy_if_t (*netp_routeto)(net_handle_t, struct sockaddr *, 1407513SDarren.Reed@Sun.COM struct sockaddr *); 1417513SDarren.Reed@Sun.COM int (*netp_ispartialchecksum)(net_handle_t, mblk_t *); 1427513SDarren.Reed@Sun.COM int (*netp_isvalidchecksum)(net_handle_t, mblk_t *); 1437513SDarren.Reed@Sun.COM }; 1447513SDarren.Reed@Sun.COM typedef struct net_protocol_s net_protocol_t; 1452958Sdr146992 1462958Sdr146992 1472958Sdr146992 /* 1482958Sdr146992 * Private data structures 1492958Sdr146992 */ 1502958Sdr146992 struct net_data { 1512958Sdr146992 LIST_ENTRY(net_data) netd_list; 1527513SDarren.Reed@Sun.COM net_protocol_t netd_info; 1532958Sdr146992 int netd_refcnt; 1542958Sdr146992 hook_family_int_t *netd_hooks; 1557513SDarren.Reed@Sun.COM struct neti_stack_s *netd_stack; 1567513SDarren.Reed@Sun.COM int netd_condemned; 1572958Sdr146992 }; 1582958Sdr146992 1592958Sdr146992 1602958Sdr146992 typedef struct injection_s { 1612958Sdr146992 net_inject_t inj_data; 1622958Sdr146992 boolean_t inj_isv6; 1633448Sdh155122 void * inj_ptr; 1642958Sdr146992 } injection_t; 1652958Sdr146992 1662958Sdr146992 /* 1672958Sdr146992 * The ipif_id space is [0,MAX) but this interface wants to return [1,MAX] as 1682958Sdr146992 * a valid range of logical interface numbers so that it can return 0 to mean 1692958Sdr146992 * "end of list" with net_lifgetnext. Changing ipif_id's to use the [1,MAX] 1702958Sdr146992 * space is something to be considered for the future, if it is worthwhile. 1712958Sdr146992 */ 1722958Sdr146992 #define MAP_IPIF_ID(x) ((x) + 1) 1732958Sdr146992 #define UNMAP_IPIF_ID(x) (((x) > 0) ? (x) - 1 : (x)) 1742958Sdr146992 1757513SDarren.Reed@Sun.COM struct net_instance_s { 1767513SDarren.Reed@Sun.COM int nin_version; 1777513SDarren.Reed@Sun.COM char *nin_name; 1787513SDarren.Reed@Sun.COM void *(*nin_create)(const netid_t); 1797513SDarren.Reed@Sun.COM void (*nin_destroy)(const netid_t, void *); 1807513SDarren.Reed@Sun.COM void (*nin_shutdown)(const netid_t, void *); 1817513SDarren.Reed@Sun.COM }; 1827513SDarren.Reed@Sun.COM typedef struct net_instance_s net_instance_t; 1837513SDarren.Reed@Sun.COM 1847513SDarren.Reed@Sun.COM struct net_instance_int_s { 1857513SDarren.Reed@Sun.COM LIST_ENTRY(net_instance_int_s) nini_next; 1867915SDarren.Reed@Sun.COM uint_t nini_ref; 1877513SDarren.Reed@Sun.COM void *nini_created; 1887513SDarren.Reed@Sun.COM struct net_instance_int_s *nini_parent; 1897513SDarren.Reed@Sun.COM net_instance_t *nini_instance; 1907513SDarren.Reed@Sun.COM hook_notify_t nini_notify; 1917513SDarren.Reed@Sun.COM uint32_t nini_flags; 1927513SDarren.Reed@Sun.COM kcondvar_t nini_cv; 1937915SDarren.Reed@Sun.COM boolean_t nini_condemned; 1947513SDarren.Reed@Sun.COM }; 1957513SDarren.Reed@Sun.COM typedef struct net_instance_int_s net_instance_int_t; 1967513SDarren.Reed@Sun.COM LIST_HEAD(nini_head_s, net_instance_int_s); 1977513SDarren.Reed@Sun.COM typedef struct nini_head_s nini_head_t; 1987513SDarren.Reed@Sun.COM 1997513SDarren.Reed@Sun.COM #define nini_version nini_instance->nin_version 2007513SDarren.Reed@Sun.COM #define nini_name nini_instance->nin_name 2017513SDarren.Reed@Sun.COM #define nini_create nini_instance->nin_create 2027513SDarren.Reed@Sun.COM #define nini_destroy nini_instance->nin_destroy 2037513SDarren.Reed@Sun.COM #define nini_shutdown nini_instance->nin_shutdown 2042958Sdr146992 2052958Sdr146992 /* 2067513SDarren.Reed@Sun.COM * netinfo stack instances 2073448Sdh155122 */ 2087513SDarren.Reed@Sun.COM struct neti_stack_s { 2097513SDarren.Reed@Sun.COM kmutex_t nts_lock; 2107513SDarren.Reed@Sun.COM LIST_ENTRY(neti_stack_s) nts_next; 2117513SDarren.Reed@Sun.COM netid_t nts_id; 2127513SDarren.Reed@Sun.COM zoneid_t nts_zoneid; 2137513SDarren.Reed@Sun.COM netstackid_t nts_stackid; 2147513SDarren.Reed@Sun.COM netstack_t *nts_netstack; 2157513SDarren.Reed@Sun.COM nini_head_t nts_instances; 2167513SDarren.Reed@Sun.COM uint32_t nts_flags; 2177513SDarren.Reed@Sun.COM kcondvar_t nts_cv; 2187513SDarren.Reed@Sun.COM /* list of net_handle_t */ 2193448Sdh155122 LIST_HEAD(netd_listhead, net_data) nts_netd_head; 2203448Sdh155122 }; 2217513SDarren.Reed@Sun.COM typedef struct neti_stack_s neti_stack_t; 2227513SDarren.Reed@Sun.COM LIST_HEAD(neti_stack_head_s, neti_stack_s); 2237513SDarren.Reed@Sun.COM typedef struct neti_stack_head_s neti_stack_head_t; 2243448Sdh155122 2253448Sdh155122 /* 2267513SDarren.Reed@Sun.COM * Internal functions that need to be exported within the module. 2272958Sdr146992 */ 2287513SDarren.Reed@Sun.COM extern void neti_init(void); 2297513SDarren.Reed@Sun.COM extern void neti_fini(void); 2307513SDarren.Reed@Sun.COM extern neti_stack_t *net_getnetistackbyid(netid_t); 2317513SDarren.Reed@Sun.COM extern netstackid_t net_getnetstackidbynetid(netid_t); 2327513SDarren.Reed@Sun.COM extern netid_t net_getnetidbynetstackid(netstackid_t); 2337513SDarren.Reed@Sun.COM extern netid_t net_zoneidtonetid(zoneid_t); 2347513SDarren.Reed@Sun.COM extern zoneid_t net_getzoneidbynetid(netid_t); 2352958Sdr146992 2362958Sdr146992 /* 2377513SDarren.Reed@Sun.COM * Functions available for public use. 2382958Sdr146992 */ 2397513SDarren.Reed@Sun.COM extern hook_event_token_t net_event_register(net_handle_t, hook_event_t *); 2407915SDarren.Reed@Sun.COM extern int net_event_shutdown(net_handle_t, hook_event_t *); 2417513SDarren.Reed@Sun.COM extern int net_event_unregister(net_handle_t, hook_event_t *); 2427513SDarren.Reed@Sun.COM extern int net_event_notify_register(net_handle_t, char *, 2437513SDarren.Reed@Sun.COM hook_notify_fn_t, void *); 2447513SDarren.Reed@Sun.COM extern int net_event_notify_unregister(net_handle_t, char *, hook_notify_fn_t); 2457513SDarren.Reed@Sun.COM 2467513SDarren.Reed@Sun.COM extern int net_family_register(net_handle_t, hook_family_t *); 2477915SDarren.Reed@Sun.COM extern int net_family_shutdown(net_handle_t, hook_family_t *); 2487513SDarren.Reed@Sun.COM extern int net_family_unregister(net_handle_t, hook_family_t *); 2497513SDarren.Reed@Sun.COM 2507513SDarren.Reed@Sun.COM extern int net_hook_register(net_handle_t, char *, hook_t *); 2517513SDarren.Reed@Sun.COM extern int net_hook_unregister(net_handle_t, char *, hook_t *); 2527513SDarren.Reed@Sun.COM 2537513SDarren.Reed@Sun.COM extern int net_inject(net_handle_t, inject_t, net_inject_t *); 2547513SDarren.Reed@Sun.COM extern net_inject_t *net_inject_alloc(const int); 2557513SDarren.Reed@Sun.COM extern void net_inject_free(net_inject_t *); 2567513SDarren.Reed@Sun.COM 2577513SDarren.Reed@Sun.COM extern net_instance_t *net_instance_alloc(const int version); 2587513SDarren.Reed@Sun.COM extern void net_instance_free(net_instance_t *); 2597513SDarren.Reed@Sun.COM extern int net_instance_register(net_instance_t *); 2607513SDarren.Reed@Sun.COM extern int net_instance_unregister(net_instance_t *); 2617513SDarren.Reed@Sun.COM extern int net_instance_notify_register(netid_t, hook_notify_fn_t, void *); 2627513SDarren.Reed@Sun.COM extern int net_instance_notify_unregister(netid_t netid, hook_notify_fn_t); 2637513SDarren.Reed@Sun.COM 2647513SDarren.Reed@Sun.COM extern kstat_t *net_kstat_create(netid_t, char *, int, char *, char *, 2657513SDarren.Reed@Sun.COM uchar_t, ulong_t, uchar_t); 2667513SDarren.Reed@Sun.COM extern void net_kstat_delete(netid_t, kstat_t *); 2677513SDarren.Reed@Sun.COM 2687513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_lookup(netid_t, const char *); 2697513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_register(netid_t, const net_protocol_t *); 2707513SDarren.Reed@Sun.COM extern int net_protocol_release(net_handle_t); 2717513SDarren.Reed@Sun.COM extern int net_protocol_unregister(net_handle_t); 2727513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_walk(netid_t, net_handle_t); 2737513SDarren.Reed@Sun.COM extern int net_protocol_notify_register(net_handle_t, hook_notify_fn_t, void *); 2747513SDarren.Reed@Sun.COM extern int net_protocol_notify_unregister(net_handle_t, hook_notify_fn_t); 2757513SDarren.Reed@Sun.COM 2767513SDarren.Reed@Sun.COM 2777513SDarren.Reed@Sun.COM extern int net_getifname(net_handle_t, phy_if_t, char *, const size_t); 2787513SDarren.Reed@Sun.COM extern int net_getmtu(net_handle_t, phy_if_t, lif_if_t); 2797513SDarren.Reed@Sun.COM extern int net_getpmtuenabled(net_handle_t); 2807513SDarren.Reed@Sun.COM extern int net_getlifaddr(net_handle_t, phy_if_t, lif_if_t, 2812958Sdr146992 int, net_ifaddr_t [], void *); 2828023SPhil.Kirk@Sun.COM extern zoneid_t net_getlifzone(net_handle_t, phy_if_t, lif_if_t, zoneid_t *); 2838023SPhil.Kirk@Sun.COM extern int net_getlifflags(net_handle_t, phy_if_t, lif_if_t, uint64_t *); 2847513SDarren.Reed@Sun.COM extern phy_if_t net_phygetnext(net_handle_t, phy_if_t); 2857513SDarren.Reed@Sun.COM extern phy_if_t net_phylookup(net_handle_t, const char *); 2867513SDarren.Reed@Sun.COM extern lif_if_t net_lifgetnext(net_handle_t, phy_if_t, lif_if_t); 2877513SDarren.Reed@Sun.COM extern phy_if_t net_routeto(net_handle_t, struct sockaddr *, 2887513SDarren.Reed@Sun.COM struct sockaddr *); 2897513SDarren.Reed@Sun.COM extern int net_ispartialchecksum(net_handle_t, mblk_t *); 2907513SDarren.Reed@Sun.COM extern int net_isvalidchecksum(net_handle_t, mblk_t *); 2912958Sdr146992 2922958Sdr146992 #ifdef __cplusplus 2932958Sdr146992 } 2942958Sdr146992 #endif 2952958Sdr146992 2962958Sdr146992 #endif /* _SYS_NETI_H */ 297