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 *); 130*8023SPhil.Kirk@Sun.COM int (*neti_getlifzone)(net_handle_t, phy_if_t, lif_if_t, 131*8023SPhil.Kirk@Sun.COM zoneid_t *); 132*8023SPhil.Kirk@Sun.COM int (*neti_getlifflags)(net_handle_t, phy_if_t, lif_if_t, 133*8023SPhil.Kirk@Sun.COM uint64_t *); 1347513SDarren.Reed@Sun.COM phy_if_t (*netp_phygetnext)(net_handle_t, phy_if_t); 1357513SDarren.Reed@Sun.COM phy_if_t (*netp_phylookup)(net_handle_t, const char *); 1367513SDarren.Reed@Sun.COM lif_if_t (*netp_lifgetnext)(net_handle_t, phy_if_t, lif_if_t); 1377513SDarren.Reed@Sun.COM int (*netp_inject)(net_handle_t, inject_t, net_inject_t *); 1387513SDarren.Reed@Sun.COM phy_if_t (*netp_routeto)(net_handle_t, struct sockaddr *, 1397513SDarren.Reed@Sun.COM struct sockaddr *); 1407513SDarren.Reed@Sun.COM int (*netp_ispartialchecksum)(net_handle_t, mblk_t *); 1417513SDarren.Reed@Sun.COM int (*netp_isvalidchecksum)(net_handle_t, mblk_t *); 1427513SDarren.Reed@Sun.COM }; 1437513SDarren.Reed@Sun.COM typedef struct net_protocol_s net_protocol_t; 1442958Sdr146992 1452958Sdr146992 1462958Sdr146992 /* 1472958Sdr146992 * Private data structures 1482958Sdr146992 */ 1492958Sdr146992 struct net_data { 1502958Sdr146992 LIST_ENTRY(net_data) netd_list; 1517513SDarren.Reed@Sun.COM net_protocol_t netd_info; 1522958Sdr146992 int netd_refcnt; 1532958Sdr146992 hook_family_int_t *netd_hooks; 1547513SDarren.Reed@Sun.COM struct neti_stack_s *netd_stack; 1557513SDarren.Reed@Sun.COM int netd_condemned; 1562958Sdr146992 }; 1572958Sdr146992 1582958Sdr146992 1592958Sdr146992 typedef struct injection_s { 1602958Sdr146992 net_inject_t inj_data; 1612958Sdr146992 boolean_t inj_isv6; 1623448Sdh155122 void * inj_ptr; 1632958Sdr146992 } injection_t; 1642958Sdr146992 1652958Sdr146992 /* 1662958Sdr146992 * The ipif_id space is [0,MAX) but this interface wants to return [1,MAX] as 1672958Sdr146992 * a valid range of logical interface numbers so that it can return 0 to mean 1682958Sdr146992 * "end of list" with net_lifgetnext. Changing ipif_id's to use the [1,MAX] 1692958Sdr146992 * space is something to be considered for the future, if it is worthwhile. 1702958Sdr146992 */ 1712958Sdr146992 #define MAP_IPIF_ID(x) ((x) + 1) 1722958Sdr146992 #define UNMAP_IPIF_ID(x) (((x) > 0) ? (x) - 1 : (x)) 1732958Sdr146992 1747513SDarren.Reed@Sun.COM struct net_instance_s { 1757513SDarren.Reed@Sun.COM int nin_version; 1767513SDarren.Reed@Sun.COM char *nin_name; 1777513SDarren.Reed@Sun.COM void *(*nin_create)(const netid_t); 1787513SDarren.Reed@Sun.COM void (*nin_destroy)(const netid_t, void *); 1797513SDarren.Reed@Sun.COM void (*nin_shutdown)(const netid_t, void *); 1807513SDarren.Reed@Sun.COM }; 1817513SDarren.Reed@Sun.COM typedef struct net_instance_s net_instance_t; 1827513SDarren.Reed@Sun.COM 1837513SDarren.Reed@Sun.COM struct net_instance_int_s { 1847513SDarren.Reed@Sun.COM LIST_ENTRY(net_instance_int_s) nini_next; 1857915SDarren.Reed@Sun.COM uint_t nini_ref; 1867513SDarren.Reed@Sun.COM void *nini_created; 1877513SDarren.Reed@Sun.COM struct net_instance_int_s *nini_parent; 1887513SDarren.Reed@Sun.COM net_instance_t *nini_instance; 1897513SDarren.Reed@Sun.COM hook_notify_t nini_notify; 1907513SDarren.Reed@Sun.COM uint32_t nini_flags; 1917513SDarren.Reed@Sun.COM kcondvar_t nini_cv; 1927915SDarren.Reed@Sun.COM boolean_t nini_condemned; 1937513SDarren.Reed@Sun.COM }; 1947513SDarren.Reed@Sun.COM typedef struct net_instance_int_s net_instance_int_t; 1957513SDarren.Reed@Sun.COM LIST_HEAD(nini_head_s, net_instance_int_s); 1967513SDarren.Reed@Sun.COM typedef struct nini_head_s nini_head_t; 1977513SDarren.Reed@Sun.COM 1987513SDarren.Reed@Sun.COM #define nini_version nini_instance->nin_version 1997513SDarren.Reed@Sun.COM #define nini_name nini_instance->nin_name 2007513SDarren.Reed@Sun.COM #define nini_create nini_instance->nin_create 2017513SDarren.Reed@Sun.COM #define nini_destroy nini_instance->nin_destroy 2027513SDarren.Reed@Sun.COM #define nini_shutdown nini_instance->nin_shutdown 2032958Sdr146992 2042958Sdr146992 /* 2057513SDarren.Reed@Sun.COM * netinfo stack instances 2063448Sdh155122 */ 2077513SDarren.Reed@Sun.COM struct neti_stack_s { 2087513SDarren.Reed@Sun.COM kmutex_t nts_lock; 2097513SDarren.Reed@Sun.COM LIST_ENTRY(neti_stack_s) nts_next; 2107513SDarren.Reed@Sun.COM netid_t nts_id; 2117513SDarren.Reed@Sun.COM zoneid_t nts_zoneid; 2127513SDarren.Reed@Sun.COM netstackid_t nts_stackid; 2137513SDarren.Reed@Sun.COM netstack_t *nts_netstack; 2147513SDarren.Reed@Sun.COM nini_head_t nts_instances; 2157513SDarren.Reed@Sun.COM uint32_t nts_flags; 2167513SDarren.Reed@Sun.COM kcondvar_t nts_cv; 2177513SDarren.Reed@Sun.COM /* list of net_handle_t */ 2183448Sdh155122 LIST_HEAD(netd_listhead, net_data) nts_netd_head; 2193448Sdh155122 }; 2207513SDarren.Reed@Sun.COM typedef struct neti_stack_s neti_stack_t; 2217513SDarren.Reed@Sun.COM LIST_HEAD(neti_stack_head_s, neti_stack_s); 2227513SDarren.Reed@Sun.COM typedef struct neti_stack_head_s neti_stack_head_t; 2233448Sdh155122 2243448Sdh155122 /* 2257513SDarren.Reed@Sun.COM * Internal functions that need to be exported within the module. 2262958Sdr146992 */ 2277513SDarren.Reed@Sun.COM extern void neti_init(void); 2287513SDarren.Reed@Sun.COM extern void neti_fini(void); 2297513SDarren.Reed@Sun.COM extern neti_stack_t *net_getnetistackbyid(netid_t); 2307513SDarren.Reed@Sun.COM extern netstackid_t net_getnetstackidbynetid(netid_t); 2317513SDarren.Reed@Sun.COM extern netid_t net_getnetidbynetstackid(netstackid_t); 2327513SDarren.Reed@Sun.COM extern netid_t net_zoneidtonetid(zoneid_t); 2337513SDarren.Reed@Sun.COM extern zoneid_t net_getzoneidbynetid(netid_t); 2342958Sdr146992 2352958Sdr146992 /* 2367513SDarren.Reed@Sun.COM * Functions available for public use. 2372958Sdr146992 */ 2387513SDarren.Reed@Sun.COM extern hook_event_token_t net_event_register(net_handle_t, hook_event_t *); 2397915SDarren.Reed@Sun.COM extern int net_event_shutdown(net_handle_t, hook_event_t *); 2407513SDarren.Reed@Sun.COM extern int net_event_unregister(net_handle_t, hook_event_t *); 2417513SDarren.Reed@Sun.COM extern int net_event_notify_register(net_handle_t, char *, 2427513SDarren.Reed@Sun.COM hook_notify_fn_t, void *); 2437513SDarren.Reed@Sun.COM extern int net_event_notify_unregister(net_handle_t, char *, hook_notify_fn_t); 2447513SDarren.Reed@Sun.COM 2457513SDarren.Reed@Sun.COM extern int net_family_register(net_handle_t, hook_family_t *); 2467915SDarren.Reed@Sun.COM extern int net_family_shutdown(net_handle_t, hook_family_t *); 2477513SDarren.Reed@Sun.COM extern int net_family_unregister(net_handle_t, hook_family_t *); 2487513SDarren.Reed@Sun.COM 2497513SDarren.Reed@Sun.COM extern int net_hook_register(net_handle_t, char *, hook_t *); 2507513SDarren.Reed@Sun.COM extern int net_hook_unregister(net_handle_t, char *, hook_t *); 2517513SDarren.Reed@Sun.COM 2527513SDarren.Reed@Sun.COM extern int net_inject(net_handle_t, inject_t, net_inject_t *); 2537513SDarren.Reed@Sun.COM extern net_inject_t *net_inject_alloc(const int); 2547513SDarren.Reed@Sun.COM extern void net_inject_free(net_inject_t *); 2557513SDarren.Reed@Sun.COM 2567513SDarren.Reed@Sun.COM extern net_instance_t *net_instance_alloc(const int version); 2577513SDarren.Reed@Sun.COM extern void net_instance_free(net_instance_t *); 2587513SDarren.Reed@Sun.COM extern int net_instance_register(net_instance_t *); 2597513SDarren.Reed@Sun.COM extern int net_instance_unregister(net_instance_t *); 2607513SDarren.Reed@Sun.COM extern int net_instance_notify_register(netid_t, hook_notify_fn_t, void *); 2617513SDarren.Reed@Sun.COM extern int net_instance_notify_unregister(netid_t netid, hook_notify_fn_t); 2627513SDarren.Reed@Sun.COM 2637513SDarren.Reed@Sun.COM extern kstat_t *net_kstat_create(netid_t, char *, int, char *, char *, 2647513SDarren.Reed@Sun.COM uchar_t, ulong_t, uchar_t); 2657513SDarren.Reed@Sun.COM extern void net_kstat_delete(netid_t, kstat_t *); 2667513SDarren.Reed@Sun.COM 2677513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_lookup(netid_t, const char *); 2687513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_register(netid_t, const net_protocol_t *); 2697513SDarren.Reed@Sun.COM extern int net_protocol_release(net_handle_t); 2707513SDarren.Reed@Sun.COM extern int net_protocol_unregister(net_handle_t); 2717513SDarren.Reed@Sun.COM extern net_handle_t net_protocol_walk(netid_t, net_handle_t); 2727513SDarren.Reed@Sun.COM extern int net_protocol_notify_register(net_handle_t, hook_notify_fn_t, void *); 2737513SDarren.Reed@Sun.COM extern int net_protocol_notify_unregister(net_handle_t, hook_notify_fn_t); 2747513SDarren.Reed@Sun.COM 2757513SDarren.Reed@Sun.COM 2767513SDarren.Reed@Sun.COM extern int net_getifname(net_handle_t, phy_if_t, char *, const size_t); 2777513SDarren.Reed@Sun.COM extern int net_getmtu(net_handle_t, phy_if_t, lif_if_t); 2787513SDarren.Reed@Sun.COM extern int net_getpmtuenabled(net_handle_t); 2797513SDarren.Reed@Sun.COM extern int net_getlifaddr(net_handle_t, phy_if_t, lif_if_t, 2802958Sdr146992 int, net_ifaddr_t [], void *); 281*8023SPhil.Kirk@Sun.COM extern zoneid_t net_getlifzone(net_handle_t, phy_if_t, lif_if_t, zoneid_t *); 282*8023SPhil.Kirk@Sun.COM extern int net_getlifflags(net_handle_t, phy_if_t, lif_if_t, uint64_t *); 2837513SDarren.Reed@Sun.COM extern phy_if_t net_phygetnext(net_handle_t, phy_if_t); 2847513SDarren.Reed@Sun.COM extern phy_if_t net_phylookup(net_handle_t, const char *); 2857513SDarren.Reed@Sun.COM extern lif_if_t net_lifgetnext(net_handle_t, phy_if_t, lif_if_t); 2867513SDarren.Reed@Sun.COM extern phy_if_t net_routeto(net_handle_t, struct sockaddr *, 2877513SDarren.Reed@Sun.COM struct sockaddr *); 2887513SDarren.Reed@Sun.COM extern int net_ispartialchecksum(net_handle_t, mblk_t *); 2897513SDarren.Reed@Sun.COM extern int net_isvalidchecksum(net_handle_t, mblk_t *); 2902958Sdr146992 2912958Sdr146992 #ifdef __cplusplus 2922958Sdr146992 } 2932958Sdr146992 #endif 2942958Sdr146992 2952958Sdr146992 #endif /* _SYS_NETI_H */ 296