#ifndef _LIBIPADM_H
#define _LIBIPADM_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <libnvpair.h>
#include <netinet/tcp.h>
#include <sys/stropts.h>
#include <sys/list.h>
#include <stddef.h>
#define IPADM_AOBJ_USTRSIZ 32
#define IPADM_AOBJSIZ (LIFNAMSIZ + IPADM_AOBJ_USTRSIZ)
#define MAXPROPVALLEN 512
#define LOOPBACK_IF "lo0"
#define IPADM_DHCP_WAIT_DEFAULT (-1)
#define IPADM_DHCP_WAIT_FOREVER (-2)
#define IPADM_NORVAL 0x00000001
typedef enum {
IPADM_SUCCESS,
IPADM_FAILURE,
IPADM_EAUTH,
IPADM_EPERM,
IPADM_NO_BUFS,
IPADM_NO_MEMORY,
IPADM_BAD_ADDR,
IPADM_BAD_PROTOCOL,
IPADM_DAD_FOUND,
IPADM_EXISTS,
IPADM_IF_EXISTS,
IPADM_ADDROBJ_EXISTS,
IPADM_ADDRCONF_EXISTS,
IPADM_ENXIO,
IPADM_GRP_NOTEMPTY,
IPADM_INVALID_ARG,
IPADM_INVALID_NAME,
IPADM_DLPI_FAILURE,
IPADM_DLADM_FAILURE,
IPADM_PROP_UNKNOWN,
IPADM_ERANGE,
IPADM_ESRCH,
IPADM_EOVERFLOW,
IPADM_NOTFOUND,
IPADM_IF_INUSE,
IPADM_ADDR_INUSE,
IPADM_BAD_HOSTNAME,
IPADM_ADDR_NOTAVAIL,
IPADM_ALL_ADDRS_NOT_ENABLED,
IPADM_NDPD_NOT_RUNNING,
IPADM_DHCP_START_ERROR,
IPADM_DHCP_IPC_ERROR,
IPADM_DHCP_IPC_TIMEOUT,
IPADM_TEMPORARY_OBJ,
IPADM_IPC_ERROR,
IPADM_OP_DISABLE_OBJ,
IPADM_NOTSUP,
IPADM_EBADE,
IPADM_GZ_PERM
} ipadm_status_t;
#define IPADM_OPT_PERSIST 0x00000001
#define IPADM_OPT_ACTIVE 0x00000002
#define IPADM_OPT_DEFAULT 0x00000004
#define IPADM_OPT_PERM 0x00000008
#define IPADM_OPT_POSSIBLE 0x00000010
#define IPADM_OPT_APPEND 0x00000020
#define IPADM_OPT_REMOVE 0x00000040
#define IPADM_OPT_IPMP 0x00000080
#define IPADM_OPT_GENPPA 0x00000100
#define IPADM_OPT_ZEROADDR 0x00000200
#define IPADM_OPT_RELEASE 0x00000400
#define IPADM_OPT_INFORM 0x00000800
#define IPADM_OPT_UP 0x00001000
#define IPADM_OPT_V46 0x00002000
#define IPADM_OPT_SET_PROPS 0x00004000
#define IPADM_OPT_PERSIST_PROPS 0x00008000
#define IPADMPROP_CLASS_MODULE 0x00000001
#define IPADMPROP_CLASS_IF 0x00000002
#define IPADMPROP_CLASS_ADDR 0x00000004
#define IPADMPROP_CLASS_MODIF (IPADMPROP_CLASS_MODULE | IPADMPROP_CLASS_IF)
struct ipadm_handle;
typedef struct ipadm_handle *ipadm_handle_t;
#define IPH_VRRP 0x00000001
#define IPH_LEGACY 0x00000002
#define IPH_IPMGMTD 0x00000004
#define IPH_INIT 0x10000000
typedef struct ipadm_addrobj_s *ipadm_addrobj_t;
typedef enum {
IFIS_OK,
IFIS_DOWN,
IFIS_FAILED,
IFIS_OFFLINE,
IFIS_DISABLED
} ipadm_if_state_t;
typedef list_t ipadm_ipmp_members_t;
typedef struct {
list_node_t node;
char if_name[LIFNAMSIZ];
} ipadm_ipmp_member_t;
typedef enum {
IPADM_IF_CLASS_REGULAR,
IPADM_IF_CLASS_IPMP,
IPADM_IF_CLASS_VIRTUAL,
IPADM_IF_CLASS_UNKNOWN
} ipadm_if_class_t;
typedef struct ipadm_if_info_s {
struct ipadm_if_info_s *ifi_next;
char ifi_name[LIFNAMSIZ];
ipadm_if_class_t ifi_class;
ipadm_if_state_t ifi_state;
uint_t ifi_cflags;
uint_t ifi_pflags;
ipadm_ipmp_members_t ifi_ipmp_cmembers;
ipadm_ipmp_members_t ifi_ipmp_pmembers;
} ipadm_if_info_t;
#define IFIF_BROADCAST 0x00000001
#define IFIF_MULTICAST 0x00000002
#define IFIF_POINTOPOINT 0x00000004
#define IFIF_VIRTUAL 0x00000008
#define IFIF_IPMP 0x00000010
#define IFIF_STANDBY 0x00000020
#define IFIF_INACTIVE 0x00000040
#define IFIF_VRRP 0x00000080
#define IFIF_NOACCEPT 0x00000100
#define IFIF_IPV4 0x00000200
#define IFIF_IPV6 0x00000400
#define IFIF_L3PROTECT 0x00000800
typedef enum {
IFA_DISABLED,
IFA_DUPLICATE,
IFA_DOWN,
IFA_TENTATIVE,
IFA_OK,
IFA_INACCESSIBLE
} ipadm_addr_state_t;
typedef enum {
IPADM_ADDR_NONE,
IPADM_ADDR_STATIC,
IPADM_ADDR_IPV6_ADDRCONF,
IPADM_ADDR_DHCP
} ipadm_addr_type_t;
typedef struct ipadm_addr_info_s {
struct ifaddrs ia_ifa;
char ia_sname[NI_MAXHOST];
char ia_dname[NI_MAXHOST];
char ia_aobjname[IPADM_AOBJSIZ];
uint_t ia_cflags;
uint_t ia_pflags;
ipadm_addr_type_t ia_atype;
ipadm_addr_state_t ia_state;
} ipadm_addr_info_t;
#define IA_NEXT(ia) ((ipadm_addr_info_t *)(ia->ia_ifa.ifa_next))
#define IA_UP 0x00000001
#define IA_UNNUMBERED 0x00000002
#define IA_PRIVATE 0x00000004
#define IA_TEMPORARY 0x00000008
#define IA_DEPRECATED 0x00000010
extern ipadm_status_t ipadm_open(ipadm_handle_t *, uint32_t);
extern void ipadm_close(ipadm_handle_t);
extern boolean_t ipadm_check_auth(void);
extern ipadm_status_t ipadm_create_if(ipadm_handle_t, char *, sa_family_t,
uint32_t);
extern ipadm_status_t ipadm_disable_if(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_enable_if(ipadm_handle_t, const char *, uint32_t);
extern ipadm_status_t ipadm_if_info(ipadm_handle_t, const char *,
ipadm_if_info_t **, uint32_t, int64_t);
extern void ipadm_free_if_info(ipadm_if_info_t *);
extern ipadm_status_t ipadm_delete_if(ipadm_handle_t, const char *,
sa_family_t, uint32_t);
extern void ipadm_if_move(ipadm_handle_t, const char *);
extern ipadm_status_t ipadm_add_ipmp_member(ipadm_handle_t, const char *,
const char *, uint32_t);
extern ipadm_status_t ipadm_remove_ipmp_member(ipadm_handle_t, const char *,
const char *, uint32_t);
extern ipadm_status_t ipadm_create_addr(ipadm_handle_t, ipadm_addrobj_t,
uint32_t);
extern ipadm_status_t ipadm_disable_addr(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_enable_addr(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_addr_info(ipadm_handle_t, const char *,
ipadm_addr_info_t **, uint32_t, int64_t);
extern void ipadm_free_addr_info(ipadm_addr_info_t *);
extern ipadm_status_t ipadm_up_addr(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_down_addr(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_refresh_addr(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_delete_addr(ipadm_handle_t, const char *,
uint32_t);
extern ipadm_status_t ipadm_create_addrobj(ipadm_addr_type_t, const char *,
ipadm_addrobj_t *);
extern void ipadm_destroy_addrobj(ipadm_addrobj_t);
extern ipadm_status_t ipadm_get_aobjname(const ipadm_addrobj_t, char *,
size_t);
extern ipadm_status_t ipadm_set_addr(ipadm_addrobj_t, const char *,
sa_family_t);
extern ipadm_status_t ipadm_set_dst_addr(ipadm_addrobj_t, const char *,
sa_family_t);
extern ipadm_status_t ipadm_get_addr(const ipadm_addrobj_t,
struct sockaddr_storage *);
extern ipadm_status_t ipadm_set_interface_id(ipadm_addrobj_t, const char *);
extern ipadm_status_t ipadm_set_stateless(ipadm_addrobj_t, boolean_t);
extern ipadm_status_t ipadm_set_stateful(ipadm_addrobj_t, boolean_t);
extern ipadm_status_t ipadm_set_primary(ipadm_addrobj_t, boolean_t);
extern ipadm_status_t ipadm_set_wait_time(ipadm_addrobj_t, int32_t);
extern ipadm_status_t ipadm_set_reqhost(ipadm_addrobj_t, const char *);
typedef boolean_t ipadm_prop_wfunc_t(void *, const char *, uint_t);
extern ipadm_status_t ipadm_walk_proptbl(uint_t, uint_t, ipadm_prop_wfunc_t *,
void *);
extern ipadm_status_t ipadm_walk_prop(const char *, uint_t, uint_t,
ipadm_prop_wfunc_t *, void *);
extern ipadm_status_t ipadm_set_ifprop(ipadm_handle_t, const char *,
const char *, const char *, uint_t, uint_t);
extern ipadm_status_t ipadm_get_ifprop(ipadm_handle_t, const char *,
const char *, char *, uint_t *, uint_t, uint_t);
extern ipadm_status_t ipadm_set_addrprop(ipadm_handle_t, const char *,
const char *, const char *, uint_t);
extern ipadm_status_t ipadm_get_addrprop(ipadm_handle_t, const char *, char *,
uint_t *, const char *, uint_t);
extern ipadm_status_t ipadm_set_prop(ipadm_handle_t, const char *,
const char *, uint_t, uint_t);
extern ipadm_status_t ipadm_get_prop(ipadm_handle_t, const char *, char *,
uint_t *, uint_t, uint_t);
extern const char *ipadm_status2str(ipadm_status_t);
extern ipadm_status_t ipadm_str2nvlist(const char *, nvlist_t **, uint_t);
extern size_t ipadm_nvlist2str(nvlist_t *, char *, size_t);
extern char *ipadm_proto2str(uint_t);
extern uint_t ipadm_str2proto(const char *);
extern ipadm_status_t ipadm_open_arp_on_udp(const char *, int *);
extern int ipadm_legacy2new_propname(const char *, char *,
uint_t, uint_t *);
extern int ipadm_new2legacy_propname(const char *, char *,
uint_t, uint_t);
extern boolean_t ipadm_is_valid_hostname(const char *hostname);
extern boolean_t ipadm_is_nil_hostname(const char *hostname);
#ifdef __cplusplus
}
#endif
#endif