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 * Copyright (c) 2013 by Delphix. All rights reserved.
24 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
25 */
26
27 #ifndef _LIBIPADM_IMPL_H
28 #define _LIBIPADM_IMPL_H
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #include <sys/socket.h>
35 #include <net/if.h>
36 #include <libipadm.h>
37 #include <libdladm.h>
38 #include <ipadm_ipmgmt.h>
39 #include <inet/tunables.h>
40 #include <netinet/in.h>
41 #include <pthread.h>
42 #include <libinetutil.h>
43 #include <libsocket_priv.h>
44
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 */
51
52 /* mask for flags accepted by libipadm functions */
53 #define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST)
54
55 /* Opaque library handle */
56 struct ipadm_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 */
65 };
66
67 struct ipadm_addrobj_s {
68 char ipadm_ifname[LIFNAMSIZ];
69 int32_t ipadm_lifnum;
70 char ipadm_aobjname[IPADM_AOBJSIZ];
71 ipadm_addr_type_t ipadm_atype;
72 uint32_t ipadm_flags;
73 sa_family_t ipadm_af;
74 union {
137 extern ipadm_prop_desc_t ipadm_addrprop_table[];
138 extern ipadm_pd_getf_t i_ipadm_get_onoff;
139
140 /* libipadm.c */
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 *,
146 nvlist_t **);
147 extern ipadm_status_t i_ipadm_init_ifobj(ipadm_handle_t, const char *,
148 nvlist_t *);
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,
152 const char *);
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 **,
163 size_t, boolean_t);
164 extern boolean_t ipadm_if_enabled(ipadm_handle_t, const char *,
165 sa_family_t);
166
167 /* ipadm_ndpd.c */
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,
171 ipadm_addrobj_t);
172 extern ipadm_status_t i_ipadm_disable_autoconf(const char *);
173 extern ipadm_status_t i_ipadm_enable_autoconf(const char *);
174
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);
180
181 /* ipadm_prop.c */
182 extern ipadm_status_t i_ipadm_persist_propval(ipadm_handle_t,
183 ipadm_prop_desc_t *, const char *, const void *,
184 uint_t);
185 extern ipadm_status_t i_ipadm_get_persist_propval(ipadm_handle_t,
186 ipadm_prop_desc_t *, char *, uint_t *,
187 const void *);
188
189 /* ipadm_addr.c */
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 *,
193 const char *);
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 *,
198 nvlist_t *);
199 extern ipadm_status_t i_ipadm_enable_addrconf(ipadm_handle_t, const char *,
200 nvlist_t *);
201 extern void i_ipadm_addrobj2lifname(ipadm_addrobj_t, char *, int);
202 extern ipadm_status_t i_ipadm_nvl2in6_addr(nvlist_t *, char *,
203 in6_addr_t *);
204 extern ipadm_status_t i_ipadm_get_lif2addrobj(ipadm_handle_t,
205 ipadm_addrobj_t);
206 extern ipadm_status_t i_ipadm_lookupadd_addrobj(ipadm_handle_t,
207 ipadm_addrobj_t);
208 extern ipadm_status_t i_ipadm_setlifnum_addrobj(ipadm_handle_t,
209 ipadm_addrobj_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 *);
217
218 /* ipadm_if.c */
219 extern ipadm_status_t i_ipadm_create_if(ipadm_handle_t, char *, sa_family_t,
220 uint32_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,
224 uint32_t);
225 extern ipadm_status_t i_ipadm_unplumb_if(ipadm_handle_t, const char *,
226 sa_family_t);
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 *);
232
233 #ifdef __cplusplus
234 }
235 #endif
236
237 #endif /* _LIBIPADM_IMPL_H */
|
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 /*
23 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright (c) 2013 by Delphix. All rights reserved.
25 * Copyright 2016 Nexenta Systems, Inc.
26 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
27 */
28
29 #ifndef _LIBIPADM_IMPL_H
30 #define _LIBIPADM_IMPL_H
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #include <sys/socket.h>
37 #include <sys/list.h>
38 #include <net/if.h>
39 #include <libipadm.h>
40 #include <libdladm.h>
41 #include <ipadm_ipmgmt.h>
42 #include <inet/tunables.h>
43 #include <netinet/in.h>
44 #include <pthread.h>
45 #include <libinetutil.h>
46 #include <libsocket_priv.h>
47
48 #define IPADM_STRSIZE 256
49 #define IPADM_ONSTR "on"
50 #define IPADM_OFFSTR "off"
51 #define ARP_MOD_NAME "arp"
52 #define IPADM_LOGICAL_SEP ':'
53 #define IPV6_MIN_MTU 1280 /* rfc2460 */
54
55 /* mask for flags accepted by libipadm functions */
56 #define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST)
57
58 typedef enum {
59 IPADM_ADD_IPMP,
60 IPADM_REMOVE_IPMP
61 } ipadm_ipmp_op_t;
62
63 /* Opaque library handle */
64 struct ipadm_handle {
65 int iph_sock; /* socket to interface */
66 int iph_sock6; /* socket to interface */
67 int iph_door_fd; /* door descriptor to ipmgmtd */
68 int iph_rtsock; /* routing socket */
69 dladm_handle_t iph_dlh; /* handle to libdladm library */
70 uint32_t iph_flags; /* internal flags */
71 pthread_mutex_t iph_lock; /* lock to set door_fd */
72 zoneid_t iph_zoneid; /* zoneid where handle was opened */
73 };
74
75 struct ipadm_addrobj_s {
76 char ipadm_ifname[LIFNAMSIZ];
77 int32_t ipadm_lifnum;
78 char ipadm_aobjname[IPADM_AOBJSIZ];
79 ipadm_addr_type_t ipadm_atype;
80 uint32_t ipadm_flags;
81 sa_family_t ipadm_af;
82 union {
145 extern ipadm_prop_desc_t ipadm_addrprop_table[];
146 extern ipadm_pd_getf_t i_ipadm_get_onoff;
147
148 /* libipadm.c */
149 extern ipadm_status_t i_ipadm_get_flags(ipadm_handle_t, const char *,
150 sa_family_t, uint64_t *);
151 extern ipadm_status_t i_ipadm_set_flags(ipadm_handle_t, const char *,
152 sa_family_t, uint64_t, uint64_t);
153 extern ipadm_status_t i_ipadm_init_ifs(ipadm_handle_t, const char *,
154 nvlist_t **);
155 extern ipadm_status_t i_ipadm_init_ifobj(ipadm_handle_t, const char *,
156 nvlist_t *);
157 extern ipadm_status_t i_ipadm_init_addrobj(ipadm_handle_t, nvlist_t *);
158 extern ipadm_status_t i_ipadm_addr_persist(ipadm_handle_t,
159 const ipadm_addrobj_t, boolean_t, uint32_t,
160 const char *);
161 extern ipadm_status_t i_ipadm_delete_addr(ipadm_handle_t, ipadm_addrobj_t);
162 extern int i_ipadm_strioctl(int, int, char *, int);
163 extern boolean_t i_ipadm_is_loopback(const char *);
164 extern boolean_t i_ipadm_is_vni(const char *);
165 extern boolean_t i_ipadm_is_6to4(ipadm_handle_t, char *);
166 extern boolean_t i_ipadm_validate_ifname(ipadm_handle_t, const char *);
167 extern ipadm_status_t ipadm_errno2status(int);
168 extern int ipadm_door_call(ipadm_handle_t, void *, size_t, void **,
169 size_t, boolean_t);
170 extern boolean_t ipadm_if_enabled(ipadm_handle_t, const char *,
171 sa_family_t);
172 extern ipadm_status_t i_ipadm_call_ipmgmtd(ipadm_handle_t, void *,
173 size_t, nvlist_t **);
174
175 /* ipadm_ndpd.c */
176 extern ipadm_status_t i_ipadm_create_ipv6addrs(ipadm_handle_t,
177 ipadm_addrobj_t, uint32_t);
178 extern ipadm_status_t i_ipadm_delete_ipv6addrs(ipadm_handle_t,
179 ipadm_addrobj_t);
180 extern ipadm_status_t i_ipadm_disable_autoconf(const char *);
181 extern ipadm_status_t i_ipadm_enable_autoconf(const char *);
182
183 /* ipadm_persist.c */
184 extern ipadm_status_t i_ipadm_add_ipaddr2nvl(nvlist_t *, ipadm_addrobj_t);
185 extern ipadm_status_t i_ipadm_add_ip6addr2nvl(nvlist_t *, ipadm_addrobj_t);
186 extern ipadm_status_t i_ipadm_add_intfid2nvl(nvlist_t *, ipadm_addrobj_t);
187 extern ipadm_status_t i_ipadm_add_dhcp2nvl(nvlist_t *, boolean_t, int32_t);
188
189 /* ipadm_prop.c */
190 extern ipadm_status_t i_ipadm_persist_propval(ipadm_handle_t,
191 ipadm_prop_desc_t *, const char *, const void *,
192 uint_t);
193 extern ipadm_status_t i_ipadm_get_persist_propval(ipadm_handle_t,
194 ipadm_prop_desc_t *, char *, uint_t *,
195 const void *);
196
197 /* ipadm_addr.c */
198 extern ipadm_status_t i_ipadm_active_addr_info(ipadm_handle_t, const char *,
199 ipadm_addr_info_t **, uint32_t, int64_t);
200 extern void i_ipadm_init_addr(ipadm_addrobj_t, const char *,
201 const char *, ipadm_addr_type_t);
202 extern ipadm_status_t i_ipadm_merge_addrprops_from_nvl(nvlist_t *, nvlist_t *,
203 const char *);
204 extern ipadm_status_t i_ipadm_get_addrobj(ipadm_handle_t, ipadm_addrobj_t);
205 extern ipadm_status_t i_ipadm_enable_static(ipadm_handle_t, const char *,
206 nvlist_t *, sa_family_t);
207 extern ipadm_status_t i_ipadm_enable_dhcp(ipadm_handle_t, const char *,
208 nvlist_t *);
209 extern ipadm_status_t i_ipadm_enable_addrconf(ipadm_handle_t, const char *,
210 nvlist_t *);
211 extern void i_ipadm_addrobj2lifname(ipadm_addrobj_t, char *, int);
212 extern ipadm_status_t i_ipadm_nvl2in6_addr(nvlist_t *, char *,
213 in6_addr_t *);
214 extern ipadm_status_t i_ipadm_get_lif2addrobj(ipadm_handle_t,
215 ipadm_addrobj_t);
216 extern ipadm_status_t i_ipadm_lookupadd_addrobj(ipadm_handle_t,
217 ipadm_addrobj_t);
218 extern ipadm_status_t i_ipadm_setlifnum_addrobj(ipadm_handle_t,
219 ipadm_addrobj_t);
223 extern boolean_t i_ipadm_name2atype(const char *, sa_family_t *,
224 ipadm_addr_type_t *);
225 extern ipadm_status_t i_ipadm_resolve_addr(const char *, sa_family_t,
226 struct sockaddr_storage *);
227
228 /* ipadm_if.c */
229 extern ipadm_status_t i_ipadm_create_if(ipadm_handle_t, char *, sa_family_t,
230 uint32_t);
231 extern ipadm_status_t i_ipadm_delete_if(ipadm_handle_t, const char *,
232 sa_family_t, uint32_t);
233 extern ipadm_status_t i_ipadm_plumb_if(ipadm_handle_t, char *, sa_family_t,
234 uint32_t);
235 extern ipadm_status_t i_ipadm_unplumb_if(ipadm_handle_t, const char *,
236 sa_family_t);
237 extern ipadm_status_t i_ipadm_if_pexists(ipadm_handle_t, const char *,
238 sa_family_t, boolean_t *);
239 extern ipadm_status_t i_ipadm_delete_ifobj(ipadm_handle_t, const char *,
240 sa_family_t, boolean_t);
241 extern int i_ipadm_get_lnum(const char *);
242
243 extern ipadm_status_t i_ipadm_set_groupname_active(ipadm_handle_t,
244 const char *, const char *);
245 extern ipadm_status_t i_ipadm_get_groupname_active(ipadm_handle_t,
246 const char *, char *, size_t);
247 extern boolean_t i_ipadm_is_under_ipmp(ipadm_handle_t, const char *);
248 extern boolean_t i_ipadm_is_ipmp(ipadm_handle_t, const char *);
249 #ifdef __cplusplus
250 }
251 #endif
252
253 #endif /* _LIBIPADM_IMPL_H */
|