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_status_t; 96 97 /* 98 * option flags taken by the libipadm functions 99 * 100 * - IPADM_OPT_PERSIST: 101 * For all the create/delete/up/down/set/get functions, 102 * requests to persist the configuration so that it can be 103 * re-enabled or reapplied on boot. 104 * 105 * - IPADM_OPT_ACTIVE: 106 * Requests to apply configuration without persisting it and 107 * used by show-* subcommands to retrieve current values. 108 * 109 * - IPADM_OPT_DEFAULT: 110 * retrieves the default value for a given property 111 * 112 * - IPADM_OPT_PERM 113 * retrieves the permission for a given property 114 * 115 * - IPADM_OPT_POSSIBLE 116 * retrieves the range of values for a given property 117 * 118 * - IPADM_OPT_APPEND 119 * for multi-valued properties, appends a new value. 120 * 121 * - IPADM_OPT_REMOVE 122 * for multi-valued properties, removes the specified value 123 * 124 * - IPADM_OPT_IPMP 125 * Used in ipadm_create_if() to plumb ipmp interfaces. 126 * 127 * - IPADM_OPT_GENPPA 128 * Used in ipadm_create_if() to generate a ppa for the given interface. 129 * 130 * - IPADM_OPT_ZEROADDR 131 * return :: or INADDR_ANY 132 * 133 * - IPADM_OPT_RELEASE 134 * Used to release the lease on a dhcp address object 135 * 136 * - IPADM_OPT_INFORM 137 * Used to perform DHCP_INFORM on a specified static address object 138 * 139 * - IPADM_OPT_UP 140 * Used to bring up a static address on creation 141 */ 142 #define IPADM_OPT_PERSIST 0x00000001 143 #define IPADM_OPT_ACTIVE 0x00000002 144 #define IPADM_OPT_DEFAULT 0x00000004 145 #define IPADM_OPT_PERM 0x00000008 146 #define IPADM_OPT_POSSIBLE 0x00000010 147 #define IPADM_OPT_APPEND 0x00000020 148 #define IPADM_OPT_REMOVE 0x00000040 149 #define IPADM_OPT_IPMP 0x00000080 150 #define IPADM_OPT_GENPPA 0x00000100 151 #define IPADM_OPT_ZEROADDR 0x00000200 152 #define IPADM_OPT_RELEASE 0x00000400 153 #define IPADM_OPT_INFORM 0x00000800 154 #define IPADM_OPT_UP 0x00001000 155 156 /* IPADM property class */ 157 #define IPADMPROP_CLASS_MODULE 0x00000001 /* on 'protocol' only */ 158 #define IPADMPROP_CLASS_IF 0x00000002 /* on 'IP interface' only */ 159 #define IPADMPROP_CLASS_ADDR 0x00000004 /* on 'IP address' only */ 160 /* protocol property that can be applied on interface too */ 161 #define IPADMPROP_CLASS_MODIF (IPADMPROP_CLASS_MODULE | IPADMPROP_CLASS_IF) 162 163 /* opaque ipadm handle to libipadm functions */ 164 struct ipadm_handle; 165 typedef struct ipadm_handle *ipadm_handle_t; 166 167 /* ipadm_handle flags */ 168 #define IPH_VRRP 0x00000001 /* Caller is VRRP */ 169 #define IPH_LEGACY 0x00000002 /* Caller is legacy app */ 170 171 /* opaque address object structure */ 172 typedef struct ipadm_addrobj_s *ipadm_addrobj_t; 173 174 /* ipadm_if_info_t states */ 175 typedef enum { 176 IFIS_OK, /* Interface is usable */ 177 IFIS_DOWN, /* Interface has no UP addresses */ 178 IFIS_FAILED, /* Interface has failed. */ 179 IFIS_OFFLINE, /* Interface has been offlined */ 180 IFIS_DISABLED /* Interface has been disabled. */ 181 } ipadm_if_state_t; 182 183 typedef struct ipadm_if_info_s { 184 struct ipadm_if_info_s *ifi_next; 185 char ifi_name[LIFNAMSIZ]; /* interface name */ 186 ipadm_if_state_t ifi_state; /* see above */ 187 uint_t ifi_cflags; /* current flags */ 188 uint_t ifi_pflags; /* persistent flags */ 189 } ipadm_if_info_t; 190 191 /* ipadm_if_info_t flags */ 192 #define IFIF_BROADCAST 0x00000001 193 #define IFIF_MULTICAST 0x00000002 194 #define IFIF_POINTOPOINT 0x00000004 195 #define IFIF_VIRTUAL 0x00000008 196 #define IFIF_IPMP 0x00000010 197 #define IFIF_STANDBY 0x00000020 198 #define IFIF_INACTIVE 0x00000040 199 #define IFIF_VRRP 0x00000080 200 #define IFIF_NOACCEPT 0x00000100 201 #define IFIF_IPV4 0x00000200 202 #define IFIF_IPV6 0x00000400 203 204 /* ipadm_addr_info_t state */ 205 typedef enum { 206 IFA_DISABLED, /* Address not in active configuration. */ 207 IFA_DUPLICATE, /* DAD failed. */ 208 IFA_DOWN, /* Address is not IFF_UP */ 209 IFA_TENTATIVE, /* DAD verification initiated */ 210 IFA_OK, /* Address is usable */ 211 IFA_INACCESSIBLE /* Interface has failed */ 212 } ipadm_addr_state_t; 213 214 /* possible address types */ 215 typedef enum { 216 IPADM_ADDR_NONE, 217 IPADM_ADDR_STATIC, 218 IPADM_ADDR_IPV6_ADDRCONF, 219 IPADM_ADDR_DHCP 220 } ipadm_addr_type_t; 221 222 typedef struct ipadm_addr_info_s { 223 struct ifaddrs ia_ifa; /* list of addresses */ 224 char ia_sname[NI_MAXHOST]; /* local hostname */ 225 char ia_dname[NI_MAXHOST]; /* remote hostname */ 226 char ia_aobjname[IPADM_AOBJSIZ]; 227 uint_t ia_cflags; /* active flags */ 228 uint_t ia_pflags; /* persistent flags */ 229 ipadm_addr_type_t ia_atype; /* see above */ 230 ipadm_addr_state_t ia_state; /* see above */ 231 } ipadm_addr_info_t; 232 #define IA_NEXT(ia) ((ipadm_addr_info_t *)(ia->ia_ifa.ifa_next)) 233 234 /* ipadm_addr_info_t flags */ 235 #define IA_UP 0x00000001 236 #define IA_UNNUMBERED 0x00000002 237 #define IA_PRIVATE 0x00000004 238 #define IA_TEMPORARY 0x00000008 239 #define IA_DEPRECATED 0x00000010 240 241 /* open/close libipadm handle */ 242 extern ipadm_status_t ipadm_open(ipadm_handle_t *, uint32_t); 243 extern void ipadm_close(ipadm_handle_t); 244 245 /* Check authorization for network configuration */ 246 extern boolean_t ipadm_check_auth(void); 247 /* 248 * Interface mangement functions 249 */ 250 extern ipadm_status_t ipadm_create_if(ipadm_handle_t, char *, sa_family_t, 251 uint32_t); 252 extern ipadm_status_t ipadm_disable_if(ipadm_handle_t, const char *, 253 uint32_t); 254 extern ipadm_status_t ipadm_enable_if(ipadm_handle_t, const char *, uint32_t); 255 extern ipadm_status_t ipadm_if_info(ipadm_handle_t, const char *, 256 ipadm_if_info_t **, uint32_t, int64_t); 257 extern void ipadm_free_if_info(ipadm_if_info_t *); 258 extern ipadm_status_t ipadm_delete_if(ipadm_handle_t, const char *, 259 sa_family_t, uint32_t); 260 extern void ipadm_if_move(ipadm_handle_t, const char *); 261 262 /* 263 * Address management functions 264 */ 265 extern ipadm_status_t ipadm_create_addr(ipadm_handle_t, ipadm_addrobj_t, 266 uint32_t); 267 extern ipadm_status_t ipadm_disable_addr(ipadm_handle_t, const char *, 268 uint32_t); 269 extern ipadm_status_t ipadm_enable_addr(ipadm_handle_t, const char *, 270 uint32_t); 271 extern ipadm_status_t ipadm_addr_info(ipadm_handle_t, const char *, 272 ipadm_addr_info_t **, uint32_t, int64_t); 273 extern void ipadm_free_addr_info(ipadm_addr_info_t *); 274 extern ipadm_status_t ipadm_up_addr(ipadm_handle_t, const char *, 275 uint32_t); 276 extern ipadm_status_t ipadm_down_addr(ipadm_handle_t, const char *, 277 uint32_t); 278 extern ipadm_status_t ipadm_refresh_addr(ipadm_handle_t, const char *, 279 uint32_t); 280 extern ipadm_status_t ipadm_delete_addr(ipadm_handle_t, const char *, 281 uint32_t); 282 283 /* Functions related to creating/deleting/modifying opaque address object */ 284 extern ipadm_status_t ipadm_create_addrobj(ipadm_addr_type_t, const char *, 285 ipadm_addrobj_t *); 286 extern void ipadm_destroy_addrobj(ipadm_addrobj_t); 287 288 /* Functions to set fields in addrobj for static addresses */ 289 extern ipadm_status_t ipadm_set_addr(ipadm_addrobj_t, const char *, 290 sa_family_t); 291 extern ipadm_status_t ipadm_set_dst_addr(ipadm_addrobj_t, const char *, 292 sa_family_t); 293 294 /* Functions to set fields in addrobj for IPv6 addrconf */ 295 extern ipadm_status_t ipadm_set_interface_id(ipadm_addrobj_t, const char *); 296 extern ipadm_status_t ipadm_set_stateless(ipadm_addrobj_t, boolean_t); 297 extern ipadm_status_t ipadm_set_stateful(ipadm_addrobj_t, boolean_t); 298 299 /* Functions to set fields in addrobj for DHCP */ 300 extern ipadm_status_t ipadm_set_primary(ipadm_addrobj_t, boolean_t); 301 extern ipadm_status_t ipadm_set_wait_time(ipadm_addrobj_t, int32_t); 302 303 /* 304 * Property management functions 305 */ 306 /* call back function for the property walker */ 307 typedef boolean_t ipadm_prop_wfunc_t(void *, const char *, uint_t); 308 extern ipadm_status_t ipadm_walk_proptbl(uint_t, uint_t, ipadm_prop_wfunc_t *, 309 void *); 310 extern ipadm_status_t ipadm_walk_prop(const char *, uint_t, uint_t, 311 ipadm_prop_wfunc_t *, void *); 312 313 /* Interface property management - set, reset and get */ 314 extern ipadm_status_t ipadm_set_ifprop(ipadm_handle_t, const char *, 315 const char *, const char *, uint_t, uint_t); 316 extern ipadm_status_t ipadm_get_ifprop(ipadm_handle_t, const char *, 317 const char *, char *, uint_t *, uint_t, uint_t); 318 319 /* Address property management - set, reset and get */ 320 extern ipadm_status_t ipadm_set_addrprop(ipadm_handle_t, const char *, 321 const char *, const char *, uint_t); 322 extern ipadm_status_t ipadm_get_addrprop(ipadm_handle_t, const char *, char *, 323 uint_t *, const char *, uint_t); 324 325 /* Protoocl property management - set, reset and get */ 326 extern ipadm_status_t ipadm_set_prop(ipadm_handle_t, const char *, 327 const char *, uint_t, uint_t); 328 extern ipadm_status_t ipadm_get_prop(ipadm_handle_t, const char *, char *, 329 uint_t *, uint_t, uint_t); 330 extern ipadm_status_t ipadm_init_prop(void); 331 332 /* 333 * miscellaneous helper functions. 334 */ 335 extern const char *ipadm_status2str(ipadm_status_t); 336 extern int ipadm_str2nvlist(const char *, nvlist_t **, uint_t); 337 extern size_t ipadm_nvlist2str(nvlist_t *, char *, size_t); 338 extern char *ipadm_proto2str(uint_t); 339 extern uint_t ipadm_str2proto(const char *); 340 extern ipadm_status_t ipadm_open_arp_on_udp(const char *, int *); 341 342 #ifdef __cplusplus 343 } 344 #endif 345 346 #endif /* _LIBIPADM_H */ 347