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 */ 24 25 #ifndef _LIBIPADM_IMPL_H 26 #define _LIBIPADM_IMPL_H 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 #include <sys/socket.h> 33 #include <net/if.h> 34 #include <libipadm.h> 35 #include <libdladm.h> 36 #include <ipadm_ipmgmt.h> 37 #include <inet/tunables.h> 38 #include <netinet/in.h> 39 #include <pthread.h> 40 #include <libinetutil.h> 41 #include <libsocket_priv.h> 42 43 #define IPADM_STRSIZE 256 44 #define IPADM_ONSTR "on" 45 #define IPADM_OFFSTR "off" 46 #define ARP_MOD_NAME "arp" 47 #define IPADM_LOGICAL_SEP ':' 48 #define IPV6_MIN_MTU 1280 /* rfc2460 */ 49 50 /* mask for flags accepted by libipadm functions */ 51 #define IPADM_COMMON_OPT_MASK (IPADM_OPT_ACTIVE | IPADM_OPT_PERSIST) 52 53 /* Opaque library handle */ 54 struct ipadm_handle { 55 int iph_sock; /* socket to interface */ 56 int iph_sock6; /* socket to interface */ 57 int iph_door_fd; /* door descriptor to ipmgmtd */ 58 dladm_handle_t iph_dlh; /* handle to libdladm library */ 59 uint32_t iph_flags; /* internal flags */ 60 pthread_mutex_t iph_lock; /* lock to set door_fd */ 61 }; 62 63 /* 64 * Indicates that the operation being invoked is in 'init' context. This is 65 * a library private flag. 66 */ 67 #define IPH_INIT 0x10000000 68 69 struct ipadm_addrobj_s { 70 char ipadm_ifname[LIFNAMSIZ]; 71 int32_t ipadm_lifnum; 72 char ipadm_aobjname[IPADM_AOBJSIZ]; 73 ipadm_addr_type_t ipadm_atype; 74 uint32_t ipadm_flags; 75 sa_family_t ipadm_af; 76 union { 77 struct { 78 char ipadm_ahname[MAXNAMELEN]; 79 struct sockaddr_storage ipadm_addr; 80 uint32_t ipadm_prefixlen; 81 char ipadm_dhname[MAXNAMELEN]; 82 struct sockaddr_storage ipadm_dstaddr; 83 } ipadm_static_addr_s; 84 struct { 85 struct sockaddr_in6 ipadm_intfid; 86 uint32_t ipadm_intfidlen; 87 boolean_t ipadm_stateless; 88 boolean_t ipadm_stateful; 89 } ipadm_ipv6_intfid_s; 90 struct { 91 boolean_t ipadm_primary; 92 int32_t ipadm_wait; 93 } ipadm_dhcp_s; 94 } ipadm_addr_u; 95 }; 96 97 #define ipadm_static_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_addr 98 #define ipadm_static_aname ipadm_addr_u.ipadm_static_addr_s.ipadm_ahname 99 #define ipadm_static_prefixlen ipadm_addr_u.ipadm_static_addr_s.ipadm_prefixlen 100 #define ipadm_static_dst_addr ipadm_addr_u.ipadm_static_addr_s.ipadm_dstaddr 101 #define ipadm_static_dname ipadm_addr_u.ipadm_static_addr_s.ipadm_dhname 102 #define ipadm_intfid ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfid 103 #define ipadm_intfidlen ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_intfidlen 104 #define ipadm_stateless ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateless 105 #define ipadm_stateful ipadm_addr_u.ipadm_ipv6_intfid_s.ipadm_stateful 106 #define ipadm_primary ipadm_addr_u.ipadm_dhcp_s.ipadm_primary 107 #define ipadm_wait ipadm_addr_u.ipadm_dhcp_s.ipadm_wait 108 109 /* 110 * Data structures and callback functions related to property management 111 */ 112 struct ipadm_prop_desc; 113 typedef struct ipadm_prop_desc ipadm_prop_desc_t; 114 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); 118 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); 122 123 struct ipadm_prop_desc { 124 char *ipd_name; /* property name */ 125 uint_t ipd_class; /* prop. class - global/perif/both */ 126 uint_t ipd_proto; /* protocol to which property belongs */ 127 uint_t ipd_flags; /* see below */ 128 ipadm_pd_setf_t *ipd_set; /* set callback function */ 129 ipadm_pd_getf_t *ipd_get_range; /* get range callback function */ 130 ipadm_pd_getf_t *ipd_get; /* get value callback function */ 131 }; 132 133 /* ipd_flags values */ 134 #define IPADMPROP_MULVAL 0x00000001 /* property multi-valued */ 135 136 extern ipadm_prop_desc_t ipadm_addrprop_table[]; 137 extern ipadm_pd_getf_t i_ipadm_get_onoff; 138 139 /* libipadm.c */ 140 extern ipadm_status_t i_ipadm_get_flags(ipadm_handle_t, const char *, 141 sa_family_t, uint64_t *); 142 extern ipadm_status_t i_ipadm_set_flags(ipadm_handle_t, const char *, 143 sa_family_t, uint64_t, uint64_t); 144 extern ipadm_status_t i_ipadm_init_ifs(ipadm_handle_t, const char *, 145 nvlist_t **); 146 extern ipadm_status_t i_ipadm_init_ifobj(ipadm_handle_t, const char *, 147 nvlist_t *); 148 extern ipadm_status_t i_ipadm_init_addrobj(ipadm_handle_t, nvlist_t *); 149 extern ipadm_status_t i_ipadm_addr_persist(ipadm_handle_t, 150 const ipadm_addrobj_t, boolean_t, uint32_t); 151 extern ipadm_status_t i_ipadm_delete_addr(ipadm_handle_t, ipadm_addrobj_t); 152 extern int i_ipadm_strioctl(int, int, char *, int); 153 extern boolean_t i_ipadm_is_loopback(const char *); 154 extern boolean_t i_ipadm_is_vni(const char *); 155 extern boolean_t i_ipadm_is_ipmp(ipadm_handle_t, const char *); 156 extern boolean_t i_ipadm_is_under_ipmp(ipadm_handle_t, const char *); 157 extern boolean_t i_ipadm_is_6to4(ipadm_handle_t, char *); 158 extern boolean_t i_ipadm_validate_ifname(ipadm_handle_t, const char *); 159 extern ipadm_status_t ipadm_errno2status(int); 160 extern int ipadm_door_call(ipadm_handle_t, void *, size_t, void **, 161 size_t, boolean_t); 162 extern boolean_t ipadm_if_enabled(ipadm_handle_t, const char *, 163 sa_family_t); 164 165 /* ipadm_ndpd.c */ 166 extern ipadm_status_t i_ipadm_create_ipv6addrs(ipadm_handle_t, 167 ipadm_addrobj_t, uint32_t); 168 extern ipadm_status_t i_ipadm_delete_ipv6addrs(ipadm_handle_t, 169 ipadm_addrobj_t); 170 extern ipadm_status_t i_ipadm_disable_autoconf(const char *); 171 extern ipadm_status_t i_ipadm_enable_autoconf(const char *); 172 173 /* ipadm_persist.c */ 174 extern ipadm_status_t i_ipadm_add_ipaddr2nvl(nvlist_t *, ipadm_addrobj_t); 175 extern ipadm_status_t i_ipadm_add_ip6addr2nvl(nvlist_t *, ipadm_addrobj_t); 176 extern ipadm_status_t i_ipadm_add_intfid2nvl(nvlist_t *, ipadm_addrobj_t); 177 extern ipadm_status_t i_ipadm_add_dhcp2nvl(nvlist_t *, boolean_t, int32_t); 178 179 /* ipadm_prop.c */ 180 extern ipadm_status_t i_ipadm_persist_propval(ipadm_handle_t, 181 ipadm_prop_desc_t *, const char *, const void *, 182 uint_t); 183 extern ipadm_status_t i_ipadm_get_persist_propval(ipadm_handle_t, 184 ipadm_prop_desc_t *, char *, uint_t *, 185 const void *); 186 187 /* ipadm_addr.c */ 188 extern void i_ipadm_init_addr(ipadm_addrobj_t, const char *, 189 const char *, ipadm_addr_type_t); 190 extern ipadm_status_t i_ipadm_merge_prefixlen_from_nvl(nvlist_t *, nvlist_t *, 191 const char *); 192 extern ipadm_status_t i_ipadm_get_addrobj(ipadm_handle_t, ipadm_addrobj_t); 193 extern ipadm_status_t i_ipadm_enable_static(ipadm_handle_t, const char *, 194 nvlist_t *, sa_family_t); 195 extern ipadm_status_t i_ipadm_enable_dhcp(ipadm_handle_t, const char *, 196 nvlist_t *); 197 extern ipadm_status_t i_ipadm_enable_addrconf(ipadm_handle_t, const char *, 198 nvlist_t *); 199 extern void i_ipadm_addrobj2lifname(ipadm_addrobj_t, char *, int); 200 extern ipadm_status_t i_ipadm_nvl2in6_addr(nvlist_t *, char *, 201 in6_addr_t *); 202 extern ipadm_status_t i_ipadm_get_lif2addrobj(ipadm_handle_t, 203 ipadm_addrobj_t); 204 extern ipadm_status_t i_ipadm_lookupadd_addrobj(ipadm_handle_t, 205 ipadm_addrobj_t); 206 extern ipadm_status_t i_ipadm_setlifnum_addrobj(ipadm_handle_t, 207 ipadm_addrobj_t); 208 extern ipadm_status_t i_ipadm_do_addif(ipadm_handle_t, ipadm_addrobj_t); 209 extern ipadm_status_t i_ipadm_delete_addrobj(ipadm_handle_t, 210 const ipadm_addrobj_t, uint32_t); 211 extern boolean_t i_ipadm_name2atype(const char *, sa_family_t *, 212 ipadm_addr_type_t *); 213 214 /* ipadm_if.c */ 215 extern ipadm_status_t i_ipadm_create_if(ipadm_handle_t, char *, sa_family_t, 216 uint32_t); 217 extern ipadm_status_t i_ipadm_delete_if(ipadm_handle_t, const char *, 218 sa_family_t, uint32_t); 219 extern ipadm_status_t i_ipadm_plumb_if(ipadm_handle_t, char *, sa_family_t, 220 uint32_t); 221 extern ipadm_status_t i_ipadm_unplumb_if(ipadm_handle_t, const char *, 222 sa_family_t); 223 extern ipadm_status_t i_ipadm_if_pexists(ipadm_handle_t, const char *, 224 sa_family_t, boolean_t *); 225 extern ipadm_status_t i_ipadm_delete_ifobj(ipadm_handle_t, const char *, 226 sa_family_t, boolean_t); 227 extern int i_ipadm_get_lnum(const char *); 228 229 #ifdef __cplusplus 230 } 231 #endif 232 233 #endif /* _LIBIPADM_IMPL_H */ 234