2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A#ifndef _LIBIPADM_IMPL_H
2N/A#define _LIBIPADM_IMPL_H
2N/A
2N/A#ifdef __cplusplus
2N/Aextern "C" {
2N/A#endif
2N/A
2N/A#include <sys/socket.h>
2N/A#include <net/if.h>
2N/A#include <libipadm.h>
2N/A#include <libdladm.h>
2N/A#include <ipadm_ipmgmt.h>
2N/A#include <inet/tunables.h>
2N/A#include <netinet/in.h>
2N/A#include <pthread.h>
2N/A#include <libinetutil.h>
2N/A#include <libsocket_priv.h>
2N/A#include <libuutil.h>
2N/A
2N/A#define IPADM_STRSIZE 256
2N/A#define IPADM_ONSTR "on"
2N/A#define IPADM_OFFSTR "off"
2N/A#define IPADM_LOGICAL_SEP ':'
2N/A
2N/A#define IPADM_OTHER_AF(af) ((af) == AF_INET ? AF_INET6 : AF_INET)
2N/A#define IPADM_SOCK(iph, af) ((af) == AF_INET ? \
2N/A (iph)->ih_sock : (iph)->ih_sock6)
2N/A#define IPADM_IS_V4(flags) (((flags) & IFF_IPV4) ? B_TRUE : B_FALSE)
2N/A#define IPADM_IS_V6(flags) (((flags) & IFF_IPV6) ? B_TRUE : B_FALSE)
2N/A#define IPADM_IFF2AF(flags) (IPADM_IS_V4((flags)) ? AF_INET : \
2N/A (IPADM_IS_V6((flags)) ? AF_INET6 : \
2N/A AF_UNSPEC))
2N/A
2N/A/* mask for flags accepted by libipadm functions */
2N/A#define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST)
2N/A
2N/A/* Opaque library handle */
2N/Astruct ipadm_handle {
2N/A char ih_profile[MAXNAMELEN]; /* profile to work on */
2N/A int ih_sock; /* socket to interface */
2N/A int ih_sock6; /* socket to interface */
2N/A int ih_door_fd; /* door descriptor to ipmgmtd */
2N/A dladm_handle_t ih_dh; /* handle to libdladm library */
2N/A uint32_t ih_flags; /* internal flags */
2N/A pthread_mutex_t ih_lock; /* lock to set door_fd */
2N/A zoneid_t ih_zoneid; /* zoneid where handle was opened */
2N/A char ih_owner[IPADM_OWNERSIZ]; /* auto-gen name owner */
2N/A};
2N/A
2N/Astruct ipadm_addrobj_s {
2N/A char ipadm_ifname[LIFNAMSIZ];
2N/A int32_t ipadm_lifnum;
2N/A char ipadm_aobjname[IPADM_AOBJSIZ];
2N/A ipadm_addr_type_t ipadm_atype;
2N/A uint32_t ipadm_flags;
2N/A sa_family_t ipadm_af;
2N/A union {
2N/A struct {
2N/A char ipadm_ahname[MAXNAMELEN];
2N/A struct sockaddr_storage ipadm_addr;
2N/A uint32_t ipadm_prefixlen;
2N/A char ipadm_dhname[MAXNAMELEN];
2N/A struct sockaddr_storage ipadm_dstaddr;
2N/A } ipadm_static_addr_s;
2N/A struct {
2N/A struct sockaddr_in6 ipadm_intfid;
2N/A uint32_t ipadm_intfidlen;
2N/A struct sockaddr_in6 ipadm_dintfid;
2N/A boolean_t ipadm_stateless;
2N/A boolean_t ipadm_stateful;
2N/A } ipadm_ipv6_intfid_s;
2N/A struct {
2N/A boolean_t ipadm_primary;
2N/A int32_t ipadm_wait;
2N/A char ipadm_reqhost[MAXNAMELEN];
2N/A } ipadm_dhcp_s;
2N/A } ipadm_addr_u;
2N/A};
2N/A
2N/A#define ipadm_static_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_addr
2N/A#define ipadm_static_aname ipadm_addr_u.ipadm_static_addr_s.ipadm_ahname
2N/A#define ipadm_static_prefixlen ipadm_addr_u.ipadm_static_addr_s.ipadm_prefixlen
2N/A#define ipadm_static_dst_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_dstaddr
2N/A#define ipadm_static_dname ipadm_addr_u.ipadm_static_addr_s.ipadm_dhname
2N/A#define ipadm_intfid ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfid
2N/A#define ipadm_intfidlen ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfidlen
2N/A#define ipadm_dintfid ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_dintfid
2N/A#define ipadm_stateless ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateless
2N/A#define ipadm_stateful ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateful
2N/A#define ipadm_primary ipadm_addr_u.ipadm_dhcp_s.ipadm_primary
2N/A#define ipadm_wait ipadm_addr_u.ipadm_dhcp_s.ipadm_wait
2N/A#define ipadm_reqhost ipadm_addr_u.ipadm_dhcp_s.ipadm_reqhost
2N/A
2N/A/*
2N/A * Structure used when moving data address objects from underlying interface
2N/A * to an IPMP interface.
2N/A */
2N/Atypedef struct ipadm_migrate_addr_s {
2N/A /*
2N/A * im_link : link to adjacent objects in the list
2N/A */
2N/A list_node_t im_link;
2N/A /*
2N/A * im_aobjname : Address object name on underif to be removed.
2N/A */
2N/A char im_aobjname[IPADM_AOBJSIZ];
2N/A /*
2N/A * im_addr : Data address that was migrated from underif to ipmpif.
2N/A */
2N/A struct sockaddr_storage im_addr;
2N/A /*
2N/A * im_lifnum : Logical interface number on the underif from which
2N/A * the data address was moved.
2N/A */
2N/A uint32_t im_lifnum;
2N/A} ipadm_migrate_addr_t;
2N/A
2N/A/*
2N/A * Structure used while waiting for addresses that are externally managed
2N/A * by dhcpagent(1M) and in.ndpd(1M) to be removed from the underlying
2N/A * interfaces.
2N/A */
2N/Atypedef struct {
2N/A const char *ia_app;
2N/A uint64_t ia_flag;
2N/A ipadm_status_t ia_status;
2N/A uint_t ia_tries;
2N/A} ipadm_appflags_t;
2N/A
2N/A/*
2N/A * Operations on an IPMP interface object.
2N/A */
2N/Atypedef enum {
2N/A IPADM_IPMPOP_ADD,
2N/A IPADM_IPMPOP_REMOVE
2N/A} ipadm_ipmpop_t;
2N/A
2N/A/*
2N/A * Data structures and callback functions related to property management
2N/A */
2N/Astruct ipadm_prop_desc;
2N/Atypedef struct ipadm_prop_desc ipadm_prop_desc_t;
2N/A
2N/A/* property set() callback */
2N/Atypedef ipadm_status_t ipadm_pd_setf_t(ipadm_handle_t, const void *,
2N/A ipadm_prop_desc_t *, const void *, uint_t, uint_t);
2N/A
2N/A/* property get() callback */
2N/Atypedef ipadm_status_t ipadm_pd_getf_t(ipadm_handle_t, const void *,
2N/A ipadm_prop_desc_t *, char *, uint_t *, uint_t, uint_t);
2N/A
2N/Astruct ipadm_prop_desc {
2N/A char *ipd_name; /* property name */
2N/A uint_t ipd_class; /* prop. class - global/perif/both */
2N/A uint_t ipd_proto; /* protocol to which property belongs */
2N/A uint_t ipd_flags; /* see below */
2N/A ipadm_pd_setf_t *ipd_set; /* set callback function */
2N/A ipadm_pd_getf_t *ipd_get_range; /* get range callback function */
2N/A ipadm_pd_getf_t *ipd_get; /* get value callback function */
2N/A};
2N/A
2N/A/* ipd_flags values */
2N/A#define IPADMPROP_MULVAL 0x00000001 /* property multi-valued */
2N/A/*
2N/A * IPADMPROP_GETPERSIST: property has a separate function callback to get
2N/A * persistent value.
2N/A */
2N/A#define IPADMPROP_GETPERSIST 0x00000002
2N/A
2N/A/* property is persisted via SMF, rather than ipadm database */
2N/A#define IPADMPROP_SMFPERSIST 0x00000004
2N/A
2N/A/* property is not ncp-specific */
2N/A#define IPADMPROP_GLOBAL 0x00000008
2N/A
2N/A/* Internal flags for use in ipd_get_callback function */
2N/A#define MOD_PROP_PERSIST 0x80000000 /* get persistent value */
2N/A
2N/Aextern ipadm_prop_desc_t ipadm_addrprop_table[];
2N/Aextern ipadm_pd_getf_t i_ipadm_get_onoff;
2N/A
2N/A/* libipadm.c */
2N/Aextern ipadm_status_t i_ipadm_get_flags(ipadm_handle_t, const char *,
2N/A sa_family_t, uint64_t *);
2N/Aextern ipadm_status_t i_ipadm_set_flags(ipadm_handle_t, const char *,
2N/A sa_family_t, uint64_t, uint64_t);
2N/Aextern ipadm_status_t i_ipadm_enable_if(ipadm_handle_t, const char *,
2N/A nvlist_t *, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_persist_if(ipadm_handle_t, const char *,
2N/A sa_family_t, ipadm_if_class_t);
2N/Aextern ipadm_status_t i_ipadm_ngz_enable_if(ipadm_handle_t, const char *);
2N/Aextern ipadm_status_t i_ipadm_init_ifobj(ipadm_handle_t, const char *,
2N/A sa_family_t, const char *, nvlist_t *);
2N/Aextern ipadm_status_t i_ipadm_init_addrobj(ipadm_handle_t, nvlist_t *);
2N/Aextern ipadm_status_t i_ipadm_addr_persist(ipadm_handle_t,
2N/A const ipadm_addrobj_t, boolean_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_delete_addr(ipadm_handle_t, ipadm_addrobj_t);
2N/Aextern int i_ipadm_strioctl(int, int, char *, int);
2N/Aextern ipadm_status_t i_ipadm_get_groupname(ipadm_handle_t, const char *,
2N/A char *, size_t);
2N/Aextern boolean_t i_ipadm_is_6to4(ipadm_handle_t, const char *);
2N/Aextern boolean_t i_ipadm_validate_ifname(ipadm_handle_t, const char *);
2N/Aextern ipadm_status_t ipadm_errno2status(int);
2N/Aextern int ipadm_door_call(ipadm_handle_t, void *, size_t, void *,
2N/A size_t);
2N/Aextern int ipadm_door_dyncall(ipadm_handle_t, void *, size_t,
2N/A void **, size_t);
2N/Aextern boolean_t ipadm_if_enabled(ipadm_handle_t, const char *,
2N/A sa_family_t);
2N/Aextern boolean_t i_ipadm_is_legacy(ipadm_handle_t);
2N/Aextern sa_family_t i_ipadm_get_active_af(ipadm_handle_t, const char *);
2N/Aextern boolean_t i_ipadm_ifname_is_ip(ipadm_handle_t, const char *);
2N/Aextern uint_t i_ipadm_get_pflags(ipadm_handle_t, const char *);
2N/Aextern ipadm_status_t i_ipadm_validate_ifcreate(ipadm_handle_t, const char *,
2N/A sa_family_t, uint32_t);
2N/A
2N/A/* ipadm_ndpd.c */
2N/Aextern ipadm_status_t i_ipadm_create_linklocal(ipadm_handle_t,
2N/A ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_create_ipv6addrs(ipadm_handle_t,
2N/A ipadm_addrobj_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_delete_ipv6addrs(ipadm_handle_t,
2N/A ipadm_addrobj_t, boolean_t);
2N/Aextern ipadm_status_t i_ipadm_set_linklocal(ipadm_handle_t, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_disable_autoconf(const char *);
2N/Aextern ipadm_status_t i_ipadm_enable_autoconf(const char *);
2N/Aextern ipadm_status_t i_ipadm_send_ndpd_cmd(const char *,
2N/A const struct ipadm_addrobj_s *, int, const void *);
2N/A
2N/A/* ipadm_persist.c */
2N/Aextern ipadm_status_t i_ipadm_add_ipaddr2nvl(nvlist_t *, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_add_ip6addr2nvl(nvlist_t *, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_add_intfid2nvl(nvlist_t *, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_add_dhcp2nvl(nvlist_t *, boolean_t, int32_t);
2N/A
2N/A/* ipadm_prop.c */
2N/Aextern ipadm_status_t i_ipadm_persist_propval(ipadm_handle_t,
2N/A ipadm_prop_desc_t *, const char *, const void *,
2N/A uint_t);
2N/Aextern ipadm_status_t i_ipadm_get_persist_propval(ipadm_handle_t,
2N/A ipadm_prop_desc_t *, char *, uint_t *,
2N/A const void *);
2N/Aextern ipadm_status_t i_ipadm_getprop_common(ipadm_handle_t, const char *,
2N/A const char *, char *, uint_t *, uint_t, uint_t);
2N/A
2N/A/* ipadm_addr.c */
2N/Aextern void i_ipadm_init_addr(ipadm_addrobj_t, const char *,
2N/A const char *, ipadm_addr_type_t);
2N/Aextern ipadm_status_t i_ipadm_get_addrobj(ipadm_handle_t, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_enable_static(ipadm_handle_t, const char *,
2N/A nvlist_t *, sa_family_t);
2N/Aextern ipadm_status_t i_ipadm_enable_dhcp(ipadm_handle_t, const char *,
2N/A nvlist_t *);
2N/Aextern ipadm_status_t i_ipadm_enable_addrconf(ipadm_handle_t, const char *,
2N/A nvlist_t *);
2N/Aextern void i_ipadm_addrobj2lifname(ipadm_addrobj_t, char *, int);
2N/Aextern ipadm_status_t i_ipadm_nvl2in6_addr(nvlist_t *, char *,
2N/A in6_addr_t *);
2N/Aextern ipadm_status_t i_ipadm_get_lif2addrobj(ipadm_handle_t, const char *,
2N/A sa_family_t, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_lookupadd_addrobj(ipadm_handle_t,
2N/A ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_setlifnum_addrobj(ipadm_handle_t,
2N/A ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_do_addif(ipadm_handle_t, ipadm_addrobj_t);
2N/Aextern ipadm_status_t i_ipadm_delete_addrobj(ipadm_handle_t,
2N/A const ipadm_addrobj_t, uint32_t);
2N/Aextern boolean_t i_ipadm_name2atype(const char *, sa_family_t *,
2N/A ipadm_addr_type_t *);
2N/Aextern ipadm_status_t i_ipadm_resolve_addr(const char *, sa_family_t,
2N/A struct sockaddr *);
2N/Aextern ipadm_status_t i_ipadm_pd2permstr(ipadm_prop_desc_t *, char *,
2N/A uint_t *);
2N/Aextern ipadm_status_t i_ipadm_migrate_addrs(ipadm_handle_t, const char *,
2N/A list_t *, const char *);
2N/Aextern boolean_t i_ipadm_is_owner_valid(const char *);
2N/A
2N/A/* ipadm_if.c */
2N/Aextern ipadm_status_t i_ipadm_create_loopback(ipadm_handle_t, const char *,
2N/A sa_family_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_create_if(ipadm_handle_t, char *, sa_family_t,
2N/A ipadm_if_class_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_delete_if(ipadm_handle_t, const char *,
2N/A sa_family_t, ipadm_if_class_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_disable_if(ipadm_handle_t, const char *,
2N/A uint32_t);
2N/Aextern ipadm_status_t i_ipadm_plumb_if(ipadm_handle_t, char *, sa_family_t,
2N/A ipadm_if_class_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_plumb_lif(ipadm_handle_t, const char *,
2N/A sa_family_t, ipadm_if_class_t);
2N/Aextern ipadm_status_t i_ipadm_unplumb_if(ipadm_handle_t, const char *,
2N/A sa_family_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_unplumb_lif(ipadm_handle_t, const char *,
2N/A sa_family_t, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_persist_if(ipadm_handle_t, const char *,
2N/A sa_family_t, ipadm_if_class_t);
2N/A
2N/Aextern ipadm_status_t i_ipadm_get_db_if(ipadm_handle_t, const char *,
2N/A nvlist_t **);
2N/Aextern ipadm_status_t i_ipadm_persist_if_info(ipadm_handle_t, const char *,
2N/A list_t *);
2N/Aextern boolean_t i_ipadm_if_pexists_af(ipadm_handle_t, const char *,
2N/A boolean_t *, boolean_t *);
2N/Aextern boolean_t i_ipadm_if_pexists(ipadm_handle_t, const char *,
2N/A sa_family_t);
2N/Aextern int i_ipadm_get_lnum(const char *);
2N/Aextern void i_ipadm_get_ifname(const char *, char *, size_t);
2N/Aextern boolean_t i_ipadm_is_if_down(char *, struct ifaddrs *);
2N/Aextern ipadm_status_t i_ipadm_get_persist_ipmpif(ipadm_handle_t, const char *,
2N/A char *, size_t);
2N/Aextern ipadm_status_t i_ipadm_add_ipmp(ipadm_handle_t, const char *,
2N/A const char *, const char *, uint32_t);
2N/Aextern ipadm_status_t i_ipadm_add_ipmp_bringup_underif(ipadm_handle_t,
2N/A const char *);
2N/A
2N/A/* ipadm_cong.c */
2N/Aextern ipadm_status_t ipadm_cong_get_algs(char *, uint_t *, uint_t,
2N/A boolean_t);
2N/Aextern boolean_t ipadm_cong_is_privprop(const char *, char **);
2N/Aextern ipadm_status_t ipadm_cong_get_persist_propval(const char *,
2N/A const char *, char *, uint_t *, const char *);
2N/Aextern ipadm_status_t ipadm_cong_smf_set_state(const char *, uint_t, uint_t);
2N/Aextern void ipadm_cong_smf_disable_nondef(const char *, uint_t,
2N/A uint_t);
2N/Aextern void ipadm_cong_list_sort(char *);
2N/A
2N/A#ifdef __cplusplus
2N/A}
2N/A#endif
2N/A
2N/A#endif /* _LIBIPADM_IMPL_H */