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