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.
23 * Copyright (c) 2013 by Delphix. All rights reserved.
24 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
27 #ifndef _LIBIPADM_IMPL_H
28 #define _LIBIPADM_IMPL_H
34 #include <sys/socket.h>
38 #include <ipadm_ipmgmt.h>
39 #include <inet/tunables.h>
40 #include <netinet/in.h>
42 #include <libinetutil.h>
43 #include <libsocket_priv.h>
45 #define IPADM_STRSIZE 256
46 #define IPADM_ONSTR "on"
47 #define IPADM_OFFSTR "off"
48 #define ARP_MOD_NAME "arp"
49 #define IPADM_LOGICAL_SEP ':'
50 #define IPV6_MIN_MTU 1280 /* rfc2460 */
52 /* mask for flags accepted by libipadm functions */
53 #define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST)
55 /* Opaque library handle */
57 int iph_sock
; /* socket to interface */
58 int iph_sock6
; /* socket to interface */
59 int iph_door_fd
; /* door descriptor to ipmgmtd */
60 int iph_rtsock
; /* routing socket */
61 dladm_handle_t iph_dlh
; /* handle to libdladm library */
62 uint32_t iph_flags
; /* internal flags */
63 pthread_mutex_t iph_lock
; /* lock to set door_fd */
64 zoneid_t iph_zoneid
; /* zoneid where handle was opened */
67 struct ipadm_addrobj_s
{
68 char ipadm_ifname
[LIFNAMSIZ
];
70 char ipadm_aobjname
[IPADM_AOBJSIZ
];
71 ipadm_addr_type_t ipadm_atype
;
76 char ipadm_ahname
[MAXNAMELEN
];
77 struct sockaddr_storage ipadm_addr
;
78 uint32_t ipadm_prefixlen
;
79 char ipadm_dhname
[MAXNAMELEN
];
80 struct sockaddr_storage ipadm_dstaddr
;
81 } ipadm_static_addr_s
;
83 struct sockaddr_in6 ipadm_intfid
;
84 uint32_t ipadm_intfidlen
;
85 boolean_t ipadm_stateless
;
86 boolean_t ipadm_stateful
;
87 } ipadm_ipv6_intfid_s
;
89 boolean_t ipadm_primary
;
91 char ipadm_reqhost
[MAXNAMELEN
];
96 #define ipadm_static_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_addr
97 #define ipadm_static_aname ipadm_addr_u.ipadm_static_addr_s.ipadm_ahname
98 #define ipadm_static_prefixlen ipadm_addr_u.ipadm_static_addr_s.ipadm_prefixlen
99 #define ipadm_static_dst_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_dstaddr
100 #define ipadm_static_dname ipadm_addr_u.ipadm_static_addr_s.ipadm_dhname
101 #define ipadm_intfid ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfid
102 #define ipadm_intfidlen ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfidlen
103 #define ipadm_stateless ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateless
104 #define ipadm_stateful ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateful
105 #define ipadm_primary ipadm_addr_u.ipadm_dhcp_s.ipadm_primary
106 #define ipadm_wait ipadm_addr_u.ipadm_dhcp_s.ipadm_wait
107 #define ipadm_reqhost ipadm_addr_u.ipadm_dhcp_s.ipadm_reqhost
110 * Data structures and callback functions related to property management
112 struct ipadm_prop_desc
;
113 typedef struct ipadm_prop_desc ipadm_prop_desc_t
;
115 /* property set() callback */
116 typedef ipadm_status_t
ipadm_pd_setf_t(ipadm_handle_t
, const void *,
117 ipadm_prop_desc_t
*, const void *, uint_t
, uint_t
);
119 /* property get() callback */
120 typedef ipadm_status_t
ipadm_pd_getf_t(ipadm_handle_t
, const void *,
121 ipadm_prop_desc_t
*, char *, uint_t
*, uint_t
, uint_t
);
123 struct ipadm_prop_desc
{
124 char *ipd_name
; /* property name */
125 char *ipd_old_name
; /* for backward compatibility */
126 uint_t ipd_class
; /* prop. class - global/perif/both */
127 uint_t ipd_proto
; /* protocol to which property belongs */
128 uint_t ipd_flags
; /* see below */
129 ipadm_pd_setf_t
*ipd_set
; /* set callback function */
130 ipadm_pd_getf_t
*ipd_get_range
; /* get range callback function */
131 ipadm_pd_getf_t
*ipd_get
; /* get value callback function */
134 /* ipd_flags values */
135 #define IPADMPROP_MULVAL 0x00000001 /* property multi-valued */
137 extern ipadm_prop_desc_t ipadm_addrprop_table
[];
138 extern ipadm_pd_getf_t i_ipadm_get_onoff
;
141 extern ipadm_status_t
i_ipadm_get_flags(ipadm_handle_t
, const char *,
142 sa_family_t
, uint64_t *);
143 extern ipadm_status_t
i_ipadm_set_flags(ipadm_handle_t
, const char *,
144 sa_family_t
, uint64_t, uint64_t);
145 extern ipadm_status_t
i_ipadm_init_ifs(ipadm_handle_t
, const char *,
147 extern ipadm_status_t
i_ipadm_init_ifobj(ipadm_handle_t
, const char *,
149 extern ipadm_status_t
i_ipadm_init_addrobj(ipadm_handle_t
, nvlist_t
*);
150 extern ipadm_status_t
i_ipadm_addr_persist(ipadm_handle_t
,
151 const ipadm_addrobj_t
, boolean_t
, uint32_t,
153 extern ipadm_status_t
i_ipadm_delete_addr(ipadm_handle_t
, ipadm_addrobj_t
);
154 extern int i_ipadm_strioctl(int, int, char *, int);
155 extern boolean_t
i_ipadm_is_loopback(const char *);
156 extern boolean_t
i_ipadm_is_vni(const char *);
157 extern boolean_t
i_ipadm_is_ipmp(ipadm_handle_t
, const char *);
158 extern boolean_t
i_ipadm_is_under_ipmp(ipadm_handle_t
, const char *);
159 extern boolean_t
i_ipadm_is_6to4(ipadm_handle_t
, char *);
160 extern boolean_t
i_ipadm_validate_ifname(ipadm_handle_t
, const char *);
161 extern ipadm_status_t
ipadm_errno2status(int);
162 extern int ipadm_door_call(ipadm_handle_t
, void *, size_t, void **,
164 extern boolean_t
ipadm_if_enabled(ipadm_handle_t
, const char *,
168 extern ipadm_status_t
i_ipadm_create_ipv6addrs(ipadm_handle_t
,
169 ipadm_addrobj_t
, uint32_t);
170 extern ipadm_status_t
i_ipadm_delete_ipv6addrs(ipadm_handle_t
,
172 extern ipadm_status_t
i_ipadm_disable_autoconf(const char *);
173 extern ipadm_status_t
i_ipadm_enable_autoconf(const char *);
175 /* ipadm_persist.c */
176 extern ipadm_status_t
i_ipadm_add_ipaddr2nvl(nvlist_t
*, ipadm_addrobj_t
);
177 extern ipadm_status_t
i_ipadm_add_ip6addr2nvl(nvlist_t
*, ipadm_addrobj_t
);
178 extern ipadm_status_t
i_ipadm_add_intfid2nvl(nvlist_t
*, ipadm_addrobj_t
);
179 extern ipadm_status_t
i_ipadm_add_dhcp2nvl(nvlist_t
*, boolean_t
, int32_t);
182 extern ipadm_status_t
i_ipadm_persist_propval(ipadm_handle_t
,
183 ipadm_prop_desc_t
*, const char *, const void *,
185 extern ipadm_status_t
i_ipadm_get_persist_propval(ipadm_handle_t
,
186 ipadm_prop_desc_t
*, char *, uint_t
*,
190 extern void i_ipadm_init_addr(ipadm_addrobj_t
, const char *,
191 const char *, ipadm_addr_type_t
);
192 extern ipadm_status_t
i_ipadm_merge_addrprops_from_nvl(nvlist_t
*, nvlist_t
*,
194 extern ipadm_status_t
i_ipadm_get_addrobj(ipadm_handle_t
, ipadm_addrobj_t
);
195 extern ipadm_status_t
i_ipadm_enable_static(ipadm_handle_t
, const char *,
196 nvlist_t
*, sa_family_t
);
197 extern ipadm_status_t
i_ipadm_enable_dhcp(ipadm_handle_t
, const char *,
199 extern ipadm_status_t
i_ipadm_enable_addrconf(ipadm_handle_t
, const char *,
201 extern void i_ipadm_addrobj2lifname(ipadm_addrobj_t
, char *, int);
202 extern ipadm_status_t
i_ipadm_nvl2in6_addr(nvlist_t
*, char *,
204 extern ipadm_status_t
i_ipadm_get_lif2addrobj(ipadm_handle_t
,
206 extern ipadm_status_t
i_ipadm_lookupadd_addrobj(ipadm_handle_t
,
208 extern ipadm_status_t
i_ipadm_setlifnum_addrobj(ipadm_handle_t
,
210 extern ipadm_status_t
i_ipadm_do_addif(ipadm_handle_t
, ipadm_addrobj_t
);
211 extern ipadm_status_t
i_ipadm_delete_addrobj(ipadm_handle_t
,
212 const ipadm_addrobj_t
, uint32_t);
213 extern boolean_t
i_ipadm_name2atype(const char *, sa_family_t
*,
214 ipadm_addr_type_t
*);
215 extern ipadm_status_t
i_ipadm_resolve_addr(const char *, sa_family_t
,
216 struct sockaddr_storage
*);
219 extern ipadm_status_t
i_ipadm_create_if(ipadm_handle_t
, char *, sa_family_t
,
221 extern ipadm_status_t
i_ipadm_delete_if(ipadm_handle_t
, const char *,
222 sa_family_t
, uint32_t);
223 extern ipadm_status_t
i_ipadm_plumb_if(ipadm_handle_t
, char *, sa_family_t
,
225 extern ipadm_status_t
i_ipadm_unplumb_if(ipadm_handle_t
, const char *,
227 extern ipadm_status_t
i_ipadm_if_pexists(ipadm_handle_t
, const char *,
228 sa_family_t
, boolean_t
*);
229 extern ipadm_status_t
i_ipadm_delete_ifobj(ipadm_handle_t
, const char *,
230 sa_family_t
, boolean_t
);
231 extern int i_ipadm_get_lnum(const char *);
237 #endif /* _LIBIPADM_IMPL_H */