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.
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.
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]
22 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
31 #include <sys/types.h>
32 #include <sys/socket.h>
36 #include <libnvpair.h>
37 #include <netinet/tcp.h>
38 #include <sys/stropts.h>
40 #define IPADM_AOBJ_USTRSIZ 32
41 #define IPADM_AOBJSIZ (LIFNAMSIZ + IPADM_AOBJ_USTRSIZ)
42 #define MAXPROPVALLEN 512
43 #define LOOPBACK_IF "lo0"
45 /* special timeout values for dhcp operations */
46 #define IPADM_DHCP_WAIT_DEFAULT (-1)
47 #define IPADM_DHCP_WAIT_FOREVER (-2)
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.
53 #define IPADM_NORVAL 0x00000001
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 */
99 * option flags taken by the libipadm functions
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.
106 * - IPADM_OPT_ACTIVE:
107 * Requests to apply configuration without persisting it and
108 * used by show-* subcommands to retrieve current values.
110 * - IPADM_OPT_DEFAULT:
111 * retrieves the default value for a given property
114 * retrieves the permission for a given property
116 * - IPADM_OPT_POSSIBLE
117 * retrieves the range of values for a given property
120 * for multi-valued properties, appends a new value.
123 * for multi-valued properties, removes the specified value
126 * Used in ipadm_create_if() to plumb ipmp interfaces.
129 * Used in ipadm_create_if() to generate a ppa for the given interface.
131 * - IPADM_OPT_ZEROADDR
132 * return :: or INADDR_ANY
134 * - IPADM_OPT_RELEASE
135 * Used to release the lease on a dhcp address object
138 * Used to perform DHCP_INFORM on a specified static address object
141 * Used to bring up a static address on creation
144 * Used to plumb both IPv4 and IPv6 interfaces by ipadm_create_addr()
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
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)
168 /* opaque ipadm handle to libipadm functions */
170 typedef struct ipadm_handle
*ipadm_handle_t
;
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 */
177 * Indicates that the operation being invoked is in 'init' context. This is
178 * a library private flag.
180 #define IPH_INIT 0x10000000
182 /* opaque address object structure */
183 typedef struct ipadm_addrobj_s
*ipadm_addrobj_t
;
185 /* ipadm_if_info_t states */
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. */
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 */
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
216 /* ipadm_addr_info_t state */
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
;
226 /* possible address types */
230 IPADM_ADDR_IPV6_ADDRCONF
,
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 */
244 #define IA_NEXT(ia) ((ipadm_addr_info_t *)(ia->ia_ifa.ifa_next))
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
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
);
257 /* Check authorization for network configuration */
258 extern boolean_t
ipadm_check_auth(void);
260 * Interface mangement functions
262 extern ipadm_status_t
ipadm_create_if(ipadm_handle_t
, char *, sa_family_t
,
264 extern ipadm_status_t
ipadm_disable_if(ipadm_handle_t
, const char *,
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 *);
275 * Address management functions
277 extern ipadm_status_t
ipadm_create_addr(ipadm_handle_t
, ipadm_addrobj_t
,
279 extern ipadm_status_t
ipadm_disable_addr(ipadm_handle_t
, const char *,
281 extern ipadm_status_t
ipadm_enable_addr(ipadm_handle_t
, const char *,
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 *,
288 extern ipadm_status_t
ipadm_down_addr(ipadm_handle_t
, const char *,
290 extern ipadm_status_t
ipadm_refresh_addr(ipadm_handle_t
, const char *,
292 extern ipadm_status_t
ipadm_delete_addr(ipadm_handle_t
, const char *,
295 /* Functions related to creating/deleting/modifying opaque address object */
296 extern ipadm_status_t
ipadm_create_addrobj(ipadm_addr_type_t
, const char *,
298 extern void ipadm_destroy_addrobj(ipadm_addrobj_t
);
299 extern ipadm_status_t
ipadm_get_aobjname(const ipadm_addrobj_t
, char *,
302 /* Functions to set fields in addrobj for static addresses */
303 extern ipadm_status_t
ipadm_set_addr(ipadm_addrobj_t
, const char *,
305 extern ipadm_status_t
ipadm_set_dst_addr(ipadm_addrobj_t
, const char *,
307 extern ipadm_status_t
ipadm_get_addr(const ipadm_addrobj_t
,
308 struct sockaddr_storage
*);
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
);
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);
320 * Property management functions
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
*,
326 extern ipadm_status_t
ipadm_walk_prop(const char *, uint_t
, uint_t
,
327 ipadm_prop_wfunc_t
*, void *);
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
);
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
);
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
);
348 * miscellaneous helper functions.
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 *,
358 extern int ipadm_new2legacy_propname(const char *, char *,
365 #endif /* _LIBIPADM_H */