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