1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 #ifndef _LIBIPADM_H
  25 #define _LIBIPADM_H
  26 
  27 #ifdef  __cplusplus
  28 extern "C" {
  29 #endif
  30 
  31 #include <sys/types.h>
  32 #include <sys/socket.h>
  33 #include <net/if.h>
  34 #include <netdb.h>
  35 #include <ifaddrs.h>
  36 #include <libnvpair.h>
  37 #include <netinet/tcp.h>
  38 #include <sys/stropts.h>
  39 
  40 #define IPADM_AOBJ_USTRSIZ      32
  41 #define IPADM_AOBJSIZ           (LIFNAMSIZ + IPADM_AOBJ_USTRSIZ)
  42 #define MAXPROPVALLEN           512
  43 #define LOOPBACK_IF             "lo0"
  44 
  45 /* special timeout values for dhcp operations */
  46 #define IPADM_DHCP_WAIT_DEFAULT (-1)
  47 #define IPADM_DHCP_WAIT_FOREVER (-2)
  48 
  49 /*
  50  * Specifies that the string passed to ipadm_str2nvlist() is a string of comma
  51  * separated names and that each name does not have values associated with it.
  52  */
  53 #define IPADM_NORVAL            0x00000001
  54 
  55 /* error codes */
  56 typedef enum {
  57         IPADM_SUCCESS,          /* No error occurred */
  58         IPADM_FAILURE,          /* Generic failure */
  59         IPADM_EAUTH,            /* Insufficient user authorizations */
  60         IPADM_EPERM,            /* Permission denied */
  61         IPADM_NO_BUFS,          /* No Buffer space available */
  62         IPADM_NO_MEMORY,        /* Insufficient memory */
  63         IPADM_BAD_ADDR,         /* Invalid address */
  64         IPADM_BAD_PROTOCOL,     /* Wrong protocol family for operation */
  65         IPADM_DAD_FOUND,        /* Duplicate address detected */
  66         IPADM_EXISTS,           /* Already exists */
  67         IPADM_IF_EXISTS,        /* Interface already exists */
  68         IPADM_ADDROBJ_EXISTS,   /* Address object already exists */
  69         IPADM_ADDRCONF_EXISTS,  /* Addrconf already in progress */
  70         IPADM_ENXIO,            /* Interface does not exist */
  71         IPADM_GRP_NOTEMPTY,     /* IPMP Group non-empty on unplumb */
  72         IPADM_INVALID_ARG,      /* Invalid argument */
  73         IPADM_INVALID_NAME,     /* Invalid name */
  74         IPADM_DLPI_FAILURE,     /* Could not open DLPI link */
  75         IPADM_DLADM_FAILURE,    /* DLADM error encountered */
  76         IPADM_PROP_UNKNOWN,     /* Unknown property */
  77         IPADM_ERANGE,           /* Value is outside the allowed range */
  78         IPADM_ESRCH,            /* Value does not exist */
  79         IPADM_EOVERFLOW,        /* Number of values exceed the allowed limit */
  80         IPADM_NOTFOUND,         /* Object not found */
  81         IPADM_IF_INUSE,         /* Interface already in use */
  82         IPADM_ADDR_INUSE,       /* Address alrelady in use */
  83         IPADM_BAD_HOSTNAME,     /* hostname maps to multiple IP addresses */
  84         IPADM_ADDR_NOTAVAIL,    /* Can't assign requested address */
  85         IPADM_ALL_ADDRS_NOT_ENABLED, /* All addresses could not be enabled */
  86         IPADM_NDPD_NOT_RUNNING, /* in.ndpd not running */
  87         IPADM_DHCP_START_ERROR, /* Cannot start dhcpagent */
  88         IPADM_DHCP_IPC_ERROR,   /* Cannot communicate with dhcpagent */
  89         IPADM_DHCP_IPC_TIMEOUT, /* Communication with dhcpagent timed out */
  90         IPADM_TEMPORARY_OBJ,    /* Permanent operation on temporary object */
  91         IPADM_IPC_ERROR,        /* Cannot communicate with ipmgmtd */
  92         IPADM_OP_DISABLE_OBJ,   /* Operation on disable object */
  93         IPADM_NOTSUP,           /* Operation not supported */
  94         IPADM_EBADE,            /* Invalid data exchange with ipmgmtd */
  95         IPADM_GZ_PERM           /* Operation not permitted on from-gz intf */
  96 } ipadm_status_t;
  97 
  98 /*
  99  * option flags taken by the libipadm functions
 100  *
 101  *  - IPADM_OPT_PERSIST:
 102  *      For all the create/delete/up/down/set/get functions,
 103  *      requests to persist the configuration so that it can be
 104  *      re-enabled or reapplied on boot.
 105  *
 106  *  - IPADM_OPT_ACTIVE:
 107  *      Requests to apply configuration without persisting it and
 108  *      used by show-* subcommands to retrieve current values.
 109  *
 110  *  - IPADM_OPT_DEFAULT:
 111  *      retrieves the default value for a given property
 112  *
 113  *  - IPADM_OPT_PERM
 114  *      retrieves the permission for a given property
 115  *
 116  *  - IPADM_OPT_POSSIBLE
 117  *      retrieves the range of values for a given property
 118  *
 119  *  - IPADM_OPT_APPEND
 120  *      for multi-valued properties, appends a new value.
 121  *
 122  *  - IPADM_OPT_REMOVE
 123  *      for multi-valued properties, removes the specified value
 124  *
 125  *  - IPADM_OPT_IPMP
 126  *      Used in ipadm_create_if() to plumb ipmp interfaces.
 127  *
 128  *  - IPADM_OPT_GENPPA
 129  *      Used in ipadm_create_if() to generate a ppa for the given interface.
 130  *
 131  *  - IPADM_OPT_ZEROADDR
 132  *      return :: or INADDR_ANY
 133  *
 134  *  - IPADM_OPT_RELEASE
 135  *      Used to release the lease on a dhcp address object
 136  *
 137  *  - IPADM_OPT_INFORM
 138  *      Used to perform DHCP_INFORM on a specified static address object
 139  *
 140  *  - IPADM_OPT_UP
 141  *      Used to bring up a static address on creation
 142  *
 143  *  - IPADM_OPT_V46
 144  *      Used to plumb both IPv4 and IPv6 interfaces by ipadm_create_addr()
 145  */
 146 #define IPADM_OPT_PERSIST       0x00000001
 147 #define IPADM_OPT_ACTIVE        0x00000002
 148 #define IPADM_OPT_DEFAULT       0x00000004
 149 #define IPADM_OPT_PERM          0x00000008
 150 #define IPADM_OPT_POSSIBLE      0x00000010
 151 #define IPADM_OPT_APPEND        0x00000020
 152 #define IPADM_OPT_REMOVE        0x00000040
 153 #define IPADM_OPT_IPMP          0x00000080
 154 #define IPADM_OPT_GENPPA        0x00000100
 155 #define IPADM_OPT_ZEROADDR      0x00000200
 156 #define IPADM_OPT_RELEASE       0x00000400
 157 #define IPADM_OPT_INFORM        0x00000800
 158 #define IPADM_OPT_UP            0x00001000
 159 #define IPADM_OPT_V46           0x00002000
 160 
 161 /* IPADM property class */
 162 #define IPADMPROP_CLASS_MODULE  0x00000001      /* on 'protocol' only */
 163 #define IPADMPROP_CLASS_IF      0x00000002      /* on 'IP interface' only */
 164 #define IPADMPROP_CLASS_ADDR    0x00000004      /* on 'IP address' only */
 165 /* protocol property that can be applied on interface too */
 166 #define IPADMPROP_CLASS_MODIF   (IPADMPROP_CLASS_MODULE | IPADMPROP_CLASS_IF)
 167 
 168 /* opaque ipadm handle to libipadm functions */
 169 struct ipadm_handle;
 170 typedef struct ipadm_handle     *ipadm_handle_t;
 171 
 172 /* ipadm_handle flags */
 173 #define IPH_VRRP                0x00000001      /* Caller is VRRP */
 174 #define IPH_LEGACY              0x00000002      /* Caller is legacy app */
 175 #define IPH_IPMGMTD             0x00000004      /* Caller is ipmgmtd itself */
 176 /*
 177  * Indicates that the operation being invoked is in 'init' context. This is
 178  * a library private flag.
 179  */
 180 #define IPH_INIT                0x10000000
 181 
 182 /* opaque address object structure */
 183 typedef struct ipadm_addrobj_s  *ipadm_addrobj_t;
 184 
 185 /* ipadm_if_info_t states */
 186 typedef enum {
 187         IFIS_OK,                /* Interface is usable */
 188         IFIS_DOWN,              /* Interface has no UP addresses */
 189         IFIS_FAILED,            /* Interface has failed. */
 190         IFIS_OFFLINE,           /* Interface has been offlined */
 191         IFIS_DISABLED           /* Interface has been disabled. */
 192 } ipadm_if_state_t;
 193 
 194 typedef struct ipadm_if_info_s {
 195         struct ipadm_if_info_s  *ifi_next;
 196         char                    ifi_name[LIFNAMSIZ];    /* interface name */
 197         ipadm_if_state_t        ifi_state;              /* see above */
 198         uint_t                  ifi_cflags;             /* current flags */
 199         uint_t                  ifi_pflags;             /* persistent flags */
 200 } ipadm_if_info_t;
 201 
 202 /* ipadm_if_info_t flags */
 203 #define IFIF_BROADCAST          0x00000001
 204 #define IFIF_MULTICAST          0x00000002
 205 #define IFIF_POINTOPOINT        0x00000004
 206 #define IFIF_VIRTUAL            0x00000008
 207 #define IFIF_IPMP               0x00000010
 208 #define IFIF_STANDBY            0x00000020
 209 #define IFIF_INACTIVE           0x00000040
 210 #define IFIF_VRRP               0x00000080
 211 #define IFIF_NOACCEPT           0x00000100
 212 #define IFIF_IPV4               0x00000200
 213 #define IFIF_IPV6               0x00000400
 214 #define IFIF_L3PROTECT          0x00000800
 215 
 216 /* ipadm_addr_info_t state */
 217 typedef enum {
 218         IFA_DISABLED,           /* Address not in active configuration. */
 219         IFA_DUPLICATE,          /* DAD failed. */
 220         IFA_DOWN,               /* Address is not IFF_UP */
 221         IFA_TENTATIVE,          /* DAD verification initiated */
 222         IFA_OK,                 /* Address is usable */
 223         IFA_INACCESSIBLE        /* Interface has failed */
 224 } ipadm_addr_state_t;
 225 
 226 /* possible address types */
 227 typedef enum  {
 228         IPADM_ADDR_NONE,
 229         IPADM_ADDR_STATIC,
 230         IPADM_ADDR_IPV6_ADDRCONF,
 231         IPADM_ADDR_DHCP
 232 } ipadm_addr_type_t;
 233 
 234 typedef struct ipadm_addr_info_s {
 235         struct ifaddrs          ia_ifa;         /* list of addresses */
 236         char                    ia_sname[NI_MAXHOST];   /* local hostname */
 237         char                    ia_dname[NI_MAXHOST];   /* remote hostname */
 238         char                    ia_aobjname[IPADM_AOBJSIZ];
 239         uint_t                  ia_cflags;      /* active flags */
 240         uint_t                  ia_pflags;      /* persistent flags */
 241         ipadm_addr_type_t       ia_atype;       /* see above */
 242         ipadm_addr_state_t      ia_state;       /* see above */
 243 } ipadm_addr_info_t;
 244 #define IA_NEXT(ia)             ((ipadm_addr_info_t *)(ia->ia_ifa.ifa_next))
 245 
 246 /* ipadm_addr_info_t flags */
 247 #define IA_UP                   0x00000001
 248 #define IA_UNNUMBERED           0x00000002
 249 #define IA_PRIVATE              0x00000004
 250 #define IA_TEMPORARY            0x00000008
 251 #define IA_DEPRECATED           0x00000010
 252 
 253 /* open/close libipadm handle */
 254 extern ipadm_status_t   ipadm_open(ipadm_handle_t *, uint32_t);
 255 extern void             ipadm_close(ipadm_handle_t);
 256 
 257 /* Check authorization for network configuration */
 258 extern boolean_t        ipadm_check_auth(void);
 259 /*
 260  * Interface mangement functions
 261  */
 262 extern ipadm_status_t   ipadm_create_if(ipadm_handle_t, char *, sa_family_t,
 263                             uint32_t);
 264 extern ipadm_status_t   ipadm_disable_if(ipadm_handle_t, const char *,
 265                             uint32_t);
 266 extern ipadm_status_t   ipadm_enable_if(ipadm_handle_t, const char *, uint32_t);
 267 extern ipadm_status_t   ipadm_if_info(ipadm_handle_t, const char *,
 268                             ipadm_if_info_t **, uint32_t, int64_t);
 269 extern void             ipadm_free_if_info(ipadm_if_info_t *);
 270 extern ipadm_status_t   ipadm_delete_if(ipadm_handle_t, const char *,
 271                             sa_family_t, uint32_t);
 272 extern void             ipadm_if_move(ipadm_handle_t, const char *);
 273 
 274 /*
 275  * Address management functions
 276  */
 277 extern ipadm_status_t   ipadm_create_addr(ipadm_handle_t, ipadm_addrobj_t,
 278                             uint32_t);
 279 extern ipadm_status_t   ipadm_disable_addr(ipadm_handle_t, const char *,
 280                             uint32_t);
 281 extern ipadm_status_t   ipadm_enable_addr(ipadm_handle_t, const char *,
 282                             uint32_t);
 283 extern ipadm_status_t   ipadm_addr_info(ipadm_handle_t, const char *,
 284                             ipadm_addr_info_t **, uint32_t, int64_t);
 285 extern void             ipadm_free_addr_info(ipadm_addr_info_t *);
 286 extern ipadm_status_t   ipadm_up_addr(ipadm_handle_t, const char *,
 287                             uint32_t);
 288 extern ipadm_status_t   ipadm_down_addr(ipadm_handle_t, const char *,
 289                             uint32_t);
 290 extern ipadm_status_t   ipadm_refresh_addr(ipadm_handle_t, const char *,
 291                             uint32_t);
 292 extern ipadm_status_t   ipadm_delete_addr(ipadm_handle_t, const char *,
 293                             uint32_t);
 294 
 295 /* Functions related to creating/deleting/modifying opaque address object */
 296 extern ipadm_status_t   ipadm_create_addrobj(ipadm_addr_type_t, const char *,
 297                             ipadm_addrobj_t *);
 298 extern void             ipadm_destroy_addrobj(ipadm_addrobj_t);
 299 extern ipadm_status_t   ipadm_get_aobjname(const ipadm_addrobj_t, char *,
 300                             size_t);
 301 
 302 /* Functions to set fields in addrobj for static addresses */
 303 extern ipadm_status_t   ipadm_set_addr(ipadm_addrobj_t, const char *,
 304                             sa_family_t);
 305 extern ipadm_status_t   ipadm_set_dst_addr(ipadm_addrobj_t, const char *,
 306                             sa_family_t);
 307 extern ipadm_status_t   ipadm_get_addr(const ipadm_addrobj_t,
 308                             struct sockaddr_storage *);
 309 
 310 /* Functions to set fields in addrobj for IPv6 addrconf */
 311 extern ipadm_status_t   ipadm_set_interface_id(ipadm_addrobj_t, const char *);
 312 extern ipadm_status_t   ipadm_set_stateless(ipadm_addrobj_t, boolean_t);
 313 extern ipadm_status_t   ipadm_set_stateful(ipadm_addrobj_t, boolean_t);
 314 
 315 /* Functions to set fields in addrobj for DHCP */
 316 extern ipadm_status_t   ipadm_set_primary(ipadm_addrobj_t, boolean_t);
 317 extern ipadm_status_t   ipadm_set_wait_time(ipadm_addrobj_t, int32_t);
 318 
 319 /*
 320  * Property management functions
 321  */
 322 /* call back function for the property walker */
 323 typedef boolean_t       ipadm_prop_wfunc_t(void *, const char *, uint_t);
 324 extern ipadm_status_t   ipadm_walk_proptbl(uint_t, uint_t, ipadm_prop_wfunc_t *,
 325                             void *);
 326 extern ipadm_status_t   ipadm_walk_prop(const char *, uint_t, uint_t,
 327                             ipadm_prop_wfunc_t *, void *);
 328 
 329 /* Interface property management - set, reset and get */
 330 extern ipadm_status_t   ipadm_set_ifprop(ipadm_handle_t, const char *,
 331                             const char *, const char *, uint_t, uint_t);
 332 extern ipadm_status_t   ipadm_get_ifprop(ipadm_handle_t, const char *,
 333                             const char *, char *, uint_t *, uint_t, uint_t);
 334 
 335 /* Address property management - set, reset and get */
 336 extern ipadm_status_t   ipadm_set_addrprop(ipadm_handle_t, const char *,
 337                             const char *, const char *, uint_t);
 338 extern ipadm_status_t   ipadm_get_addrprop(ipadm_handle_t, const char *, char *,
 339                             uint_t *, const char *, uint_t);
 340 
 341 /* Protoocl property management - set, reset and get */
 342 extern ipadm_status_t   ipadm_set_prop(ipadm_handle_t, const char *,
 343                             const char *, uint_t, uint_t);
 344 extern ipadm_status_t   ipadm_get_prop(ipadm_handle_t, const char *, char *,
 345                             uint_t *, uint_t, uint_t);
 346 
 347 /*
 348  * miscellaneous helper functions.
 349  */
 350 extern const char       *ipadm_status2str(ipadm_status_t);
 351 extern int              ipadm_str2nvlist(const char *, nvlist_t **, uint_t);
 352 extern size_t           ipadm_nvlist2str(nvlist_t *, char *, size_t);
 353 extern char             *ipadm_proto2str(uint_t);
 354 extern uint_t           ipadm_str2proto(const char *);
 355 extern ipadm_status_t   ipadm_open_arp_on_udp(const char *, int *);
 356 extern int              ipadm_legacy2new_propname(const char *, char *,
 357                             uint_t, uint_t *);
 358 extern int              ipadm_new2legacy_propname(const char *, char *,
 359                             uint_t, uint_t);
 360 
 361 #ifdef  __cplusplus
 362 }
 363 #endif
 364 
 365 #endif  /* _LIBIPADM_H */