1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
*/
#ifndef _LIBIPADM_IMPL_H
#define _LIBIPADM_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/socket.h>
#include <net/if.h>
#include <libipadm.h>
#include <libdladm.h>
#include <ipadm_ipmgmt.h>
#include <inet/tunables.h>
#include <netinet/in.h>
#include <pthread.h>
#include <libinetutil.h>
#include <libsocket_priv.h>
#define IPADM_STRSIZE 256
#define IPADM_ONSTR "on"
#define IPADM_OFFSTR "off"
#define ARP_MOD_NAME "arp"
#define IPADM_LOGICAL_SEP ':'
#define IPV6_MIN_MTU 1280 /* rfc2460 */
/* mask for flags accepted by libipadm functions */
#define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST)
/* Opaque library handle */
struct ipadm_handle {
int iph_sock; /* socket to interface */
int iph_sock6; /* socket to interface */
int iph_door_fd; /* door descriptor to ipmgmtd */
int iph_rtsock; /* routing socket */
dladm_handle_t iph_dlh; /* handle to libdladm library */
uint32_t iph_flags; /* internal flags */
pthread_mutex_t iph_lock; /* lock to set door_fd */
zoneid_t iph_zoneid; /* zoneid where handle was opened */
};
struct ipadm_addrobj_s {
char ipadm_ifname[LIFNAMSIZ];
int32_t ipadm_lifnum;
char ipadm_aobjname[IPADM_AOBJSIZ];
ipadm_addr_type_t ipadm_atype;
uint32_t ipadm_flags;
sa_family_t ipadm_af;
union {
struct {
char ipadm_ahname[MAXNAMELEN];
struct sockaddr_storage ipadm_addr;
uint32_t ipadm_prefixlen;
char ipadm_dhname[MAXNAMELEN];
struct sockaddr_storage ipadm_dstaddr;
} ipadm_static_addr_s;
struct {
struct sockaddr_in6 ipadm_intfid;
uint32_t ipadm_intfidlen;
boolean_t ipadm_stateless;
boolean_t ipadm_stateful;
} ipadm_ipv6_intfid_s;
struct {
boolean_t ipadm_primary;
int32_t ipadm_wait;
char ipadm_reqhost[MAXNAMELEN];
} ipadm_dhcp_s;
} ipadm_addr_u;
};
#define ipadm_static_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_addr
#define ipadm_static_aname ipadm_addr_u.ipadm_static_addr_s.ipadm_ahname
#define ipadm_static_prefixlen ipadm_addr_u.ipadm_static_addr_s.ipadm_prefixlen
#define ipadm_static_dst_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_dstaddr
#define ipadm_static_dname ipadm_addr_u.ipadm_static_addr_s.ipadm_dhname
#define ipadm_intfid ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfid
#define ipadm_intfidlen ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfidlen
#define ipadm_stateless ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateless
#define ipadm_stateful ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateful
#define ipadm_primary ipadm_addr_u.ipadm_dhcp_s.ipadm_primary
#define ipadm_wait ipadm_addr_u.ipadm_dhcp_s.ipadm_wait
#define ipadm_reqhost ipadm_addr_u.ipadm_dhcp_s.ipadm_reqhost
/*
* Data structures and callback functions related to property management
*/
struct ipadm_prop_desc;
typedef struct ipadm_prop_desc ipadm_prop_desc_t;
/* property set() callback */
typedef ipadm_status_t ipadm_pd_setf_t(ipadm_handle_t, const void *,
ipadm_prop_desc_t *, const void *, uint_t, uint_t);
/* property get() callback */
typedef ipadm_status_t ipadm_pd_getf_t(ipadm_handle_t, const void *,
ipadm_prop_desc_t *, char *, uint_t *, uint_t, uint_t);
struct ipadm_prop_desc {
char *ipd_name; /* property name */
char *ipd_old_name; /* for backward compatibility */
uint_t ipd_class; /* prop. class - global/perif/both */
uint_t ipd_proto; /* protocol to which property belongs */
uint_t ipd_flags; /* see below */
ipadm_pd_setf_t *ipd_set; /* set callback function */
ipadm_pd_getf_t *ipd_get_range; /* get range callback function */
ipadm_pd_getf_t *ipd_get; /* get value callback function */
};
/* ipd_flags values */
#define IPADMPROP_MULVAL 0x00000001 /* property multi-valued */
extern ipadm_prop_desc_t ipadm_addrprop_table[];
extern ipadm_pd_getf_t i_ipadm_get_onoff;
/* libipadm.c */
extern ipadm_status_t i_ipadm_get_flags(ipadm_handle_t, const char *,
sa_family_t, uint64_t *);
extern ipadm_status_t i_ipadm_set_flags(ipadm_handle_t, const char *,
sa_family_t, uint64_t, uint64_t);
extern ipadm_status_t i_ipadm_init_ifs(ipadm_handle_t, const char *,
nvlist_t **);
extern ipadm_status_t i_ipadm_init_ifobj(ipadm_handle_t, const char *,
nvlist_t *);
extern ipadm_status_t i_ipadm_init_addrobj(ipadm_handle_t, nvlist_t *);
extern ipadm_status_t i_ipadm_addr_persist(ipadm_handle_t,
const ipadm_addrobj_t, boolean_t, uint32_t,
const char *);
extern ipadm_status_t i_ipadm_delete_addr(ipadm_handle_t, ipadm_addrobj_t);
extern int i_ipadm_strioctl(int, int, char *, int);
extern boolean_t i_ipadm_is_loopback(const char *);
extern boolean_t i_ipadm_is_vni(const char *);
extern boolean_t i_ipadm_is_ipmp(ipadm_handle_t, const char *);
extern boolean_t i_ipadm_is_under_ipmp(ipadm_handle_t, const char *);
extern boolean_t i_ipadm_is_6to4(ipadm_handle_t, char *);
extern boolean_t i_ipadm_validate_ifname(ipadm_handle_t, const char *);
extern ipadm_status_t ipadm_errno2status(int);
extern int ipadm_door_call(ipadm_handle_t, void *, size_t, void **,
size_t, boolean_t);
extern boolean_t ipadm_if_enabled(ipadm_handle_t, const char *,
sa_family_t);
/* ipadm_ndpd.c */
extern ipadm_status_t i_ipadm_create_ipv6addrs(ipadm_handle_t,
ipadm_addrobj_t, uint32_t);
extern ipadm_status_t i_ipadm_delete_ipv6addrs(ipadm_handle_t,
ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_disable_autoconf(const char *);
extern ipadm_status_t i_ipadm_enable_autoconf(const char *);
/* ipadm_persist.c */
extern ipadm_status_t i_ipadm_add_ipaddr2nvl(nvlist_t *, ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_add_ip6addr2nvl(nvlist_t *, ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_add_intfid2nvl(nvlist_t *, ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_add_dhcp2nvl(nvlist_t *, boolean_t, int32_t);
/* ipadm_prop.c */
extern ipadm_status_t i_ipadm_persist_propval(ipadm_handle_t,
ipadm_prop_desc_t *, const char *, const void *,
uint_t);
extern ipadm_status_t i_ipadm_get_persist_propval(ipadm_handle_t,
ipadm_prop_desc_t *, char *, uint_t *,
const void *);
/* ipadm_addr.c */
extern void i_ipadm_init_addr(ipadm_addrobj_t, const char *,
const char *, ipadm_addr_type_t);
extern ipadm_status_t i_ipadm_merge_addrprops_from_nvl(nvlist_t *, nvlist_t *,
const char *);
extern ipadm_status_t i_ipadm_get_addrobj(ipadm_handle_t, ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_enable_static(ipadm_handle_t, const char *,
nvlist_t *, sa_family_t);
extern ipadm_status_t i_ipadm_enable_dhcp(ipadm_handle_t, const char *,
nvlist_t *);
extern ipadm_status_t i_ipadm_enable_addrconf(ipadm_handle_t, const char *,
nvlist_t *);
extern void i_ipadm_addrobj2lifname(ipadm_addrobj_t, char *, int);
extern ipadm_status_t i_ipadm_nvl2in6_addr(nvlist_t *, char *,
in6_addr_t *);
extern ipadm_status_t i_ipadm_get_lif2addrobj(ipadm_handle_t,
ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_lookupadd_addrobj(ipadm_handle_t,
ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_setlifnum_addrobj(ipadm_handle_t,
ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_do_addif(ipadm_handle_t, ipadm_addrobj_t);
extern ipadm_status_t i_ipadm_delete_addrobj(ipadm_handle_t,
const ipadm_addrobj_t, uint32_t);
extern boolean_t i_ipadm_name2atype(const char *, sa_family_t *,
ipadm_addr_type_t *);
extern ipadm_status_t i_ipadm_resolve_addr(const char *, sa_family_t,
struct sockaddr_storage *);
/* ipadm_if.c */
extern ipadm_status_t i_ipadm_create_if(ipadm_handle_t, char *, sa_family_t,
uint32_t);
extern ipadm_status_t i_ipadm_delete_if(ipadm_handle_t, const char *,
sa_family_t, uint32_t);
extern ipadm_status_t i_ipadm_plumb_if(ipadm_handle_t, char *, sa_family_t,
uint32_t);
extern ipadm_status_t i_ipadm_unplumb_if(ipadm_handle_t, const char *,
sa_family_t);
extern ipadm_status_t i_ipadm_if_pexists(ipadm_handle_t, const char *,
sa_family_t, boolean_t *);
extern ipadm_status_t i_ipadm_delete_ifobj(ipadm_handle_t, const char *,
sa_family_t, boolean_t);
extern int i_ipadm_get_lnum(const char *);
#ifdef __cplusplus
}
#endif
#endif /* _LIBIPADM_IMPL_H */
|