16e91bba0SGirish Moodalbail /* 26e91bba0SGirish Moodalbail * CDDL HEADER START 36e91bba0SGirish Moodalbail * 46e91bba0SGirish Moodalbail * The contents of this file are subject to the terms of the 56e91bba0SGirish Moodalbail * Common Development and Distribution License (the "License"). 66e91bba0SGirish Moodalbail * You may not use this file except in compliance with the License. 76e91bba0SGirish Moodalbail * 86e91bba0SGirish Moodalbail * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96e91bba0SGirish Moodalbail * or http://www.opensolaris.org/os/licensing. 106e91bba0SGirish Moodalbail * See the License for the specific language governing permissions 116e91bba0SGirish Moodalbail * and limitations under the License. 126e91bba0SGirish Moodalbail * 136e91bba0SGirish Moodalbail * When distributing Covered Code, include this CDDL HEADER in each 146e91bba0SGirish Moodalbail * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156e91bba0SGirish Moodalbail * If applicable, add the following below this CDDL HEADER, with the 166e91bba0SGirish Moodalbail * fields enclosed by brackets "[]" replaced with your own identifying 176e91bba0SGirish Moodalbail * information: Portions Copyright [yyyy] [name of copyright owner] 186e91bba0SGirish Moodalbail * 196e91bba0SGirish Moodalbail * CDDL HEADER END 206e91bba0SGirish Moodalbail */ 21a73be61aSHans Rosenfeld 226e91bba0SGirish Moodalbail /* 238b88711aSGirish Moodalbail * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24299625c6SSebastien Roy * Copyright (c) 2013 by Delphix. All rights reserved. 25b31320a7SChris Fraire * Copyright (c) 2016, Chris Fraire <cfraire@me.com>. 26a73be61aSHans Rosenfeld * Copyright 2021 Tintri by DDN, Inc. All rights reserved. 27*c8152f8fSAndy Fiddaman * Copyright 2023 Oxide Computer Company 286e91bba0SGirish Moodalbail */ 296e91bba0SGirish Moodalbail 306e91bba0SGirish Moodalbail #ifndef _LIBIPADM_IMPL_H 316e91bba0SGirish Moodalbail #define _LIBIPADM_IMPL_H 326e91bba0SGirish Moodalbail 336e91bba0SGirish Moodalbail #ifdef __cplusplus 346e91bba0SGirish Moodalbail extern "C" { 356e91bba0SGirish Moodalbail #endif 366e91bba0SGirish Moodalbail 376e91bba0SGirish Moodalbail #include <sys/socket.h> 38a73be61aSHans Rosenfeld #include <sys/list.h> 396e91bba0SGirish Moodalbail #include <net/if.h> 406e91bba0SGirish Moodalbail #include <libipadm.h> 416e91bba0SGirish Moodalbail #include <libdladm.h> 426e91bba0SGirish Moodalbail #include <ipadm_ipmgmt.h> 436e91bba0SGirish Moodalbail #include <inet/tunables.h> 446e91bba0SGirish Moodalbail #include <netinet/in.h> 456e91bba0SGirish Moodalbail #include <pthread.h> 466e91bba0SGirish Moodalbail #include <libinetutil.h> 476e91bba0SGirish Moodalbail #include <libsocket_priv.h> 486e91bba0SGirish Moodalbail 496e91bba0SGirish Moodalbail #define IPADM_STRSIZE 256 506e91bba0SGirish Moodalbail #define IPADM_ONSTR "on" 516e91bba0SGirish Moodalbail #define IPADM_OFFSTR "off" 526e91bba0SGirish Moodalbail #define ARP_MOD_NAME "arp" 536e91bba0SGirish Moodalbail #define IPADM_LOGICAL_SEP ':' 546e91bba0SGirish Moodalbail #define IPV6_MIN_MTU 1280 /* rfc2460 */ 556e91bba0SGirish Moodalbail 566e91bba0SGirish Moodalbail /* mask for flags accepted by libipadm functions */ 576e91bba0SGirish Moodalbail #define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST) 586e91bba0SGirish Moodalbail 59a73be61aSHans Rosenfeld typedef enum { 60a73be61aSHans Rosenfeld IPADM_ADD_IPMP, 61a73be61aSHans Rosenfeld IPADM_REMOVE_IPMP 62a73be61aSHans Rosenfeld } ipadm_ipmp_op_t; 63a73be61aSHans Rosenfeld 646e91bba0SGirish Moodalbail /* Opaque library handle */ 656e91bba0SGirish Moodalbail struct ipadm_handle { 666e91bba0SGirish Moodalbail int iph_sock; /* socket to interface */ 676e91bba0SGirish Moodalbail int iph_sock6; /* socket to interface */ 686e91bba0SGirish Moodalbail int iph_door_fd; /* door descriptor to ipmgmtd */ 69550b6e40SSowmini Varadhan int iph_rtsock; /* routing socket */ 706e91bba0SGirish Moodalbail dladm_handle_t iph_dlh; /* handle to libdladm library */ 716e91bba0SGirish Moodalbail uint32_t iph_flags; /* internal flags */ 726e91bba0SGirish Moodalbail pthread_mutex_t iph_lock; /* lock to set door_fd */ 73550b6e40SSowmini Varadhan zoneid_t iph_zoneid; /* zoneid where handle was opened */ 746e91bba0SGirish Moodalbail }; 756e91bba0SGirish Moodalbail 766e91bba0SGirish Moodalbail struct ipadm_addrobj_s { 77a73be61aSHans Rosenfeld char ipadm_ifname[LIFNAMSIZ]; 786e91bba0SGirish Moodalbail int32_t ipadm_lifnum; 796e91bba0SGirish Moodalbail char ipadm_aobjname[IPADM_AOBJSIZ]; 806e91bba0SGirish Moodalbail ipadm_addr_type_t ipadm_atype; 816e91bba0SGirish Moodalbail uint32_t ipadm_flags; 826e91bba0SGirish Moodalbail sa_family_t ipadm_af; 836e91bba0SGirish Moodalbail union { 846e91bba0SGirish Moodalbail struct { 856e91bba0SGirish Moodalbail char ipadm_ahname[MAXNAMELEN]; 866e91bba0SGirish Moodalbail struct sockaddr_storage ipadm_addr; 876e91bba0SGirish Moodalbail uint32_t ipadm_prefixlen; 886e91bba0SGirish Moodalbail char ipadm_dhname[MAXNAMELEN]; 896e91bba0SGirish Moodalbail struct sockaddr_storage ipadm_dstaddr; 906e91bba0SGirish Moodalbail } ipadm_static_addr_s; 916e91bba0SGirish Moodalbail struct { 926e91bba0SGirish Moodalbail struct sockaddr_in6 ipadm_intfid; 936e91bba0SGirish Moodalbail uint32_t ipadm_intfidlen; 946e91bba0SGirish Moodalbail boolean_t ipadm_stateless; 956e91bba0SGirish Moodalbail boolean_t ipadm_stateful; 966e91bba0SGirish Moodalbail } ipadm_ipv6_intfid_s; 976e91bba0SGirish Moodalbail struct { 986e91bba0SGirish Moodalbail boolean_t ipadm_primary; 996e91bba0SGirish Moodalbail int32_t ipadm_wait; 100b31320a7SChris Fraire char ipadm_reqhost[MAXNAMELEN]; 1016e91bba0SGirish Moodalbail } ipadm_dhcp_s; 1026e91bba0SGirish Moodalbail } ipadm_addr_u; 1036e91bba0SGirish Moodalbail }; 1046e91bba0SGirish Moodalbail 1056e91bba0SGirish Moodalbail #define ipadm_static_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_addr 1066e91bba0SGirish Moodalbail #define ipadm_static_aname ipadm_addr_u.ipadm_static_addr_s.ipadm_ahname 1076e91bba0SGirish Moodalbail #define ipadm_static_prefixlen ipadm_addr_u.ipadm_static_addr_s.ipadm_prefixlen 1086e91bba0SGirish Moodalbail #define ipadm_static_dst_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_dstaddr 1096e91bba0SGirish Moodalbail #define ipadm_static_dname ipadm_addr_u.ipadm_static_addr_s.ipadm_dhname 1106e91bba0SGirish Moodalbail #define ipadm_intfid ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfid 1116e91bba0SGirish Moodalbail #define ipadm_intfidlen ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfidlen 1126e91bba0SGirish Moodalbail #define ipadm_stateless ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateless 1136e91bba0SGirish Moodalbail #define ipadm_stateful ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateful 1146e91bba0SGirish Moodalbail #define ipadm_primary ipadm_addr_u.ipadm_dhcp_s.ipadm_primary 1156e91bba0SGirish Moodalbail #define ipadm_wait ipadm_addr_u.ipadm_dhcp_s.ipadm_wait 116b31320a7SChris Fraire #define ipadm_reqhost ipadm_addr_u.ipadm_dhcp_s.ipadm_reqhost 1176e91bba0SGirish Moodalbail 1186e91bba0SGirish Moodalbail /* 1196e91bba0SGirish Moodalbail * Data structures and callback functions related to property management 1206e91bba0SGirish Moodalbail */ 1216e91bba0SGirish Moodalbail struct ipadm_prop_desc; 1226e91bba0SGirish Moodalbail typedef struct ipadm_prop_desc ipadm_prop_desc_t; 1236e91bba0SGirish Moodalbail 1246e91bba0SGirish Moodalbail /* property set() callback */ 1256e91bba0SGirish Moodalbail typedef ipadm_status_t ipadm_pd_setf_t(ipadm_handle_t, const void *, 1266e91bba0SGirish Moodalbail ipadm_prop_desc_t *, const void *, uint_t, uint_t); 1276e91bba0SGirish Moodalbail 1286e91bba0SGirish Moodalbail /* property get() callback */ 1296e91bba0SGirish Moodalbail typedef ipadm_status_t ipadm_pd_getf_t(ipadm_handle_t, const void *, 1306e91bba0SGirish Moodalbail ipadm_prop_desc_t *, char *, uint_t *, uint_t, uint_t); 1316e91bba0SGirish Moodalbail 1326e91bba0SGirish Moodalbail struct ipadm_prop_desc { 1336e91bba0SGirish Moodalbail char *ipd_name; /* property name */ 134299625c6SSebastien Roy char *ipd_old_name; /* for backward compatibility */ 135299625c6SSebastien Roy uint_t ipd_class; /* prop. class - global/perif/both */ 1366e91bba0SGirish Moodalbail uint_t ipd_proto; /* protocol to which property belongs */ 1378b88711aSGirish Moodalbail uint_t ipd_flags; /* see below */ 1386e91bba0SGirish Moodalbail ipadm_pd_setf_t *ipd_set; /* set callback function */ 1396e91bba0SGirish Moodalbail ipadm_pd_getf_t *ipd_get_range; /* get range callback function */ 1406e91bba0SGirish Moodalbail ipadm_pd_getf_t *ipd_get; /* get value callback function */ 1416e91bba0SGirish Moodalbail }; 1426e91bba0SGirish Moodalbail 1438b88711aSGirish Moodalbail /* ipd_flags values */ 1448b88711aSGirish Moodalbail #define IPADMPROP_MULVAL 0x00000001 /* property multi-valued */ 1458b88711aSGirish Moodalbail 1466e91bba0SGirish Moodalbail extern ipadm_prop_desc_t ipadm_addrprop_table[]; 1476e91bba0SGirish Moodalbail extern ipadm_pd_getf_t i_ipadm_get_onoff; 1486e91bba0SGirish Moodalbail 1496e91bba0SGirish Moodalbail /* libipadm.c */ 1506e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_get_flags(ipadm_handle_t, const char *, 1516e91bba0SGirish Moodalbail sa_family_t, uint64_t *); 1526e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_set_flags(ipadm_handle_t, const char *, 1536e91bba0SGirish Moodalbail sa_family_t, uint64_t, uint64_t); 1546e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_init_ifs(ipadm_handle_t, const char *, 1556e91bba0SGirish Moodalbail nvlist_t **); 1566e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_init_ifobj(ipadm_handle_t, const char *, 1576e91bba0SGirish Moodalbail nvlist_t *); 1586e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_init_addrobj(ipadm_handle_t, nvlist_t *); 1596e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_addr_persist(ipadm_handle_t, 160b31320a7SChris Fraire const ipadm_addrobj_t, boolean_t, uint32_t, 161b31320a7SChris Fraire const char *); 1626e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_delete_addr(ipadm_handle_t, ipadm_addrobj_t); 1636e91bba0SGirish Moodalbail extern int i_ipadm_strioctl(int, int, char *, int); 1646e91bba0SGirish Moodalbail extern boolean_t i_ipadm_is_loopback(const char *); 1656e91bba0SGirish Moodalbail extern boolean_t i_ipadm_is_vni(const char *); 1666e91bba0SGirish Moodalbail extern boolean_t i_ipadm_is_6to4(ipadm_handle_t, char *); 1676e91bba0SGirish Moodalbail extern boolean_t i_ipadm_validate_ifname(ipadm_handle_t, const char *); 1686e91bba0SGirish Moodalbail extern ipadm_status_t ipadm_errno2status(int); 1696e91bba0SGirish Moodalbail extern int ipadm_door_call(ipadm_handle_t, void *, size_t, void **, 1706e91bba0SGirish Moodalbail size_t, boolean_t); 171a73be61aSHans Rosenfeld extern boolean_t ipadm_if_enabled(ipadm_handle_t, const char *, 1726e91bba0SGirish Moodalbail sa_family_t); 173a73be61aSHans Rosenfeld extern ipadm_status_t i_ipadm_call_ipmgmtd(ipadm_handle_t, void *, 174a73be61aSHans Rosenfeld size_t, nvlist_t **); 1756e91bba0SGirish Moodalbail 1766e91bba0SGirish Moodalbail /* ipadm_ndpd.c */ 1776e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_create_ipv6addrs(ipadm_handle_t, 1786e91bba0SGirish Moodalbail ipadm_addrobj_t, uint32_t); 1796e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_delete_ipv6addrs(ipadm_handle_t, 1806e91bba0SGirish Moodalbail ipadm_addrobj_t); 1816e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_disable_autoconf(const char *); 1826e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_enable_autoconf(const char *); 1836e91bba0SGirish Moodalbail 1846e91bba0SGirish Moodalbail /* ipadm_persist.c */ 1856e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_add_ipaddr2nvl(nvlist_t *, ipadm_addrobj_t); 1866e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_add_ip6addr2nvl(nvlist_t *, ipadm_addrobj_t); 1876e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_add_intfid2nvl(nvlist_t *, ipadm_addrobj_t); 1886e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_add_dhcp2nvl(nvlist_t *, boolean_t, int32_t); 1896e91bba0SGirish Moodalbail 1906e91bba0SGirish Moodalbail /* ipadm_prop.c */ 1916e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_persist_propval(ipadm_handle_t, 1926e91bba0SGirish Moodalbail ipadm_prop_desc_t *, const char *, const void *, 1936e91bba0SGirish Moodalbail uint_t); 1946e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_get_persist_propval(ipadm_handle_t, 1956e91bba0SGirish Moodalbail ipadm_prop_desc_t *, char *, uint_t *, 1966e91bba0SGirish Moodalbail const void *); 1976e91bba0SGirish Moodalbail 1986e91bba0SGirish Moodalbail /* ipadm_addr.c */ 199a73be61aSHans Rosenfeld extern ipadm_status_t i_ipadm_active_addr_info(ipadm_handle_t, const char *, 200a73be61aSHans Rosenfeld ipadm_addr_info_t **, uint32_t, int64_t); 2016e91bba0SGirish Moodalbail extern void i_ipadm_init_addr(ipadm_addrobj_t, const char *, 2026e91bba0SGirish Moodalbail const char *, ipadm_addr_type_t); 203b31320a7SChris Fraire extern ipadm_status_t i_ipadm_merge_addrprops_from_nvl(nvlist_t *, nvlist_t *, 2046e91bba0SGirish Moodalbail const char *); 2056e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_get_addrobj(ipadm_handle_t, ipadm_addrobj_t); 2066e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_enable_static(ipadm_handle_t, const char *, 2076e91bba0SGirish Moodalbail nvlist_t *, sa_family_t); 2086e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_enable_dhcp(ipadm_handle_t, const char *, 2096e91bba0SGirish Moodalbail nvlist_t *); 2106e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_enable_addrconf(ipadm_handle_t, const char *, 2116e91bba0SGirish Moodalbail nvlist_t *); 2126e91bba0SGirish Moodalbail extern void i_ipadm_addrobj2lifname(ipadm_addrobj_t, char *, int); 2136e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_nvl2in6_addr(nvlist_t *, char *, 2146e91bba0SGirish Moodalbail in6_addr_t *); 2156e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_get_lif2addrobj(ipadm_handle_t, 2166e91bba0SGirish Moodalbail ipadm_addrobj_t); 2176e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_lookupadd_addrobj(ipadm_handle_t, 2186e91bba0SGirish Moodalbail ipadm_addrobj_t); 219ec3706caSVasumathi Sundaram extern ipadm_status_t i_ipadm_setlifnum_addrobj(ipadm_handle_t, 220ec3706caSVasumathi Sundaram ipadm_addrobj_t); 221*c8152f8fSAndy Fiddaman extern ipadm_status_t i_ipadm_do_addif(ipadm_handle_t, ipadm_addrobj_t, 222*c8152f8fSAndy Fiddaman boolean_t *); 2236e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_delete_addrobj(ipadm_handle_t, 2246e91bba0SGirish Moodalbail const ipadm_addrobj_t, uint32_t); 2256e91bba0SGirish Moodalbail extern boolean_t i_ipadm_name2atype(const char *, sa_family_t *, 2266e91bba0SGirish Moodalbail ipadm_addr_type_t *); 227550b6e40SSowmini Varadhan extern ipadm_status_t i_ipadm_resolve_addr(const char *, sa_family_t, 228550b6e40SSowmini Varadhan struct sockaddr_storage *); 2296e91bba0SGirish Moodalbail 2306e91bba0SGirish Moodalbail /* ipadm_if.c */ 2316e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_create_if(ipadm_handle_t, char *, sa_family_t, 2326e91bba0SGirish Moodalbail uint32_t); 2336e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_delete_if(ipadm_handle_t, const char *, 2346e91bba0SGirish Moodalbail sa_family_t, uint32_t); 2356e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_plumb_if(ipadm_handle_t, char *, sa_family_t, 2366e91bba0SGirish Moodalbail uint32_t); 2376e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_unplumb_if(ipadm_handle_t, const char *, 2386e91bba0SGirish Moodalbail sa_family_t); 2396e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_if_pexists(ipadm_handle_t, const char *, 2406e91bba0SGirish Moodalbail sa_family_t, boolean_t *); 2416e91bba0SGirish Moodalbail extern ipadm_status_t i_ipadm_delete_ifobj(ipadm_handle_t, const char *, 2426e91bba0SGirish Moodalbail sa_family_t, boolean_t); 2436e91bba0SGirish Moodalbail extern int i_ipadm_get_lnum(const char *); 2446e91bba0SGirish Moodalbail 245a73be61aSHans Rosenfeld extern ipadm_status_t i_ipadm_set_groupname_active(ipadm_handle_t, 246a73be61aSHans Rosenfeld const char *, const char *); 247a73be61aSHans Rosenfeld extern ipadm_status_t i_ipadm_get_groupname_active(ipadm_handle_t, 248a73be61aSHans Rosenfeld const char *, char *, size_t); 249a73be61aSHans Rosenfeld extern boolean_t i_ipadm_is_under_ipmp(ipadm_handle_t, const char *); 250a73be61aSHans Rosenfeld extern boolean_t i_ipadm_is_ipmp(ipadm_handle_t, const char *); 2516e91bba0SGirish Moodalbail #ifdef __cplusplus 2526e91bba0SGirish Moodalbail } 2536e91bba0SGirish Moodalbail #endif 2546e91bba0SGirish Moodalbail 2556e91bba0SGirish Moodalbail #endif /* _LIBIPADM_IMPL_H */ 256