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) 2016, Chris Fraire <cfraire@me.com>. 24 * Copyright 2021, Tintri by DDN. All rights reserved. 25 */ 26 27 #ifndef _IPADM_IPMGMT_H 28 #define _IPADM_IPMGMT_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 #include <sys/types.h> 34 #include <sys/stat.h> 35 #include <fcntl.h> 36 #include <sys/mman.h> 37 #include <door.h> 38 #include <libipadm.h> 39 #include <inet/tunables.h> 40 41 /* 42 * Function declarations and data structures shared by libipadm.so and 43 * the IP management daemon. 44 */ 45 46 /* Authorization required to configure network interfaces */ 47 #define NETWORK_INTERFACE_CONFIG_AUTH "solaris.network.interface.config" 48 49 /* 50 * Data store read/write utilities related declarations. 51 */ 52 /* 53 * For more information on these definitions please refer to the top of 54 * ipadm_persist.c. These are the name of the nvpairs which hold the 55 * respective values. All nvpairs private to ipadm have names that begin 56 * with "_". Note below that 'prefixlen' and 'reqhost' are address 57 * properties and therefore not a private nvpair name. 58 */ 59 #define IPADM_NVP_PROTONAME "_protocol" /* protocol name */ 60 #define IPADM_NVP_IFNAME "_ifname" /* interface name */ 61 #define IPADM_NVP_AOBJNAME "_aobjname" /* addrobj name */ 62 #define IPADM_NVP_FAMILY "_family" /* address family */ 63 #define IPADM_NVP_IPV4ADDR "_ipv4addr" /* name of IPv4 addr nvlist */ 64 #define IPADM_NVP_IPNUMADDR "_addr" /* local address */ 65 #define IPADM_NVP_IPADDRHNAME "_aname" /* local hostname */ 66 #define IPADM_NVP_IPDADDRHNAME "_dname" /* remote hostname */ 67 #define IPADM_NVP_PREFIXLEN "prefixlen" /* prefixlen */ 68 #define IPADM_NVP_REQHOST "reqhost" /* requested hostname */ 69 #define IPADM_NVP_IPV6ADDR "_ipv6addr" /* name of IPv6 addr nvlist */ 70 #define IPADM_NVP_DHCP "_dhcp" /* name of DHCP nvlist */ 71 #define IPADM_NVP_WAIT "_wait" /* DHCP timeout value */ 72 #define IPADM_NVP_PRIMARY "_primary" /* DHCP primary interface */ 73 #define IPADM_NVP_LIFNUM "_lifnum" /* logical interface number */ 74 #define IPADM_NVP_INTFID "_intfid" /* name of IPv6 intfid nvlist */ 75 #define IPADM_NVP_STATELESS "_stateless" /* IPv6 autoconf stateless */ 76 #define IPADM_NVP_STATEFUL "_stateful" /* IPv6 autoconf dhcpv6 */ 77 78 #define IPADM_PRIV_NVP(s) ((s)[0] == '_' && (s)[1] != '_') 79 80 /* 81 * All protocol properties that are private to ipadm are stored in the 82 * ipadm datastore with "__" as prefix. This is to ensure there 83 * is no collision of namespace between ipadm private nvpair names and 84 * the private protocol property names. 85 */ 86 #define IPADM_PERSIST_PRIVPROP_PREFIX "__" 87 88 /* data-store operations */ 89 typedef enum { 90 IPADM_DB_WRITE = 0, /* Writes to DB */ 91 IPADM_DB_DELETE, /* Deletes an entry from DB */ 92 IPADM_DB_READ /* Read from DB */ 93 } ipadm_db_op_t; 94 95 /* 96 * callback arg used by db_wfunc_t that writes to DB. The contents to be 97 * written to DB are captured in `dbw_nvl'. 98 */ 99 typedef struct ipadm_dbwrite_cbarg_s { 100 nvlist_t *dbw_nvl; 101 uint_t dbw_flags; 102 } ipadm_dbwrite_cbarg_t; 103 104 /* 105 * door related function declarations and data structures. 106 */ 107 108 /* The door file for the ipmgmt (ip-interface management) daemon */ 109 #define IPMGMT_DOOR "/etc/svc/volatile/ipadm/ipmgmt_door" 110 #define MAXPROTONAMELEN 32 111 112 /* door call command type */ 113 typedef enum { 114 IPMGMT_CMD_SETPROP = 1, /* persist property */ 115 IPMGMT_CMD_SETIF, /* persist interface */ 116 IPMGMT_CMD_SETADDR, /* persist address */ 117 IPMGMT_CMD_GETPROP, /* retrieve persisted property value */ 118 IPMGMT_CMD_GETIF, /* retrieve persisted interface conf. */ 119 IPMGMT_CMD_GETADDR, /* retrieve persisted addresses */ 120 IPMGMT_CMD_RESETIF, /* purge interface configuration */ 121 IPMGMT_CMD_RESETADDR, /* purge address configuration */ 122 IPMGMT_CMD_RESETPROP, /* purge property configuration */ 123 IPMGMT_CMD_INITIF, /* retrieve interfaces to initialize */ 124 IPMGMT_CMD_ADDROBJ_LOOKUPADD, /* addr. object lookup & add */ 125 IPMGMT_CMD_ADDROBJ_SETLIFNUM, /* set lifnum on the addrobj */ 126 IPMGMT_CMD_ADDROBJ_ADD, /* add addr. object to addrobj map */ 127 IPMGMT_CMD_LIF2ADDROBJ, /* lifname to addrobj mapping */ 128 IPMGMT_CMD_AOBJNAME2ADDROBJ /* aobjname to addrobj mapping */ 129 } ipmgmt_door_cmd_type_t; 130 131 /* 132 * Note: We need to keep the size of the structure the same on amd64 and i386 133 * for all door_call arguments and door_return structures. 134 */ 135 /* door_call argument */ 136 typedef struct ipmgmt_arg { 137 ipmgmt_door_cmd_type_t ia_cmd; 138 } ipmgmt_arg_t; 139 140 /* IPMGMT_CMD_{SETPROP|GETPROP|RESETPROP} door_call argument */ 141 typedef struct ipmgmt_prop_arg_s { 142 ipmgmt_door_cmd_type_t ia_cmd; 143 uint32_t ia_flags; 144 char ia_ifname[LIFNAMSIZ]; 145 char ia_aobjname[IPADM_AOBJSIZ]; 146 char ia_module[MAXPROTONAMELEN]; 147 char ia_pname[MAXPROPNAMELEN]; 148 char ia_pval[MAXPROPVALLEN]; 149 } ipmgmt_prop_arg_t; 150 /* 151 * ia_flags used in ipmgmt_prop_arg_t. 152 * - APPEND updates the multi-valued property entry with a new value 153 * - REDUCE updates the multi-valued property entry by removing a value 154 */ 155 #define IPMGMT_APPEND 0x00000001 156 #define IPMGMT_REMOVE 0x00000002 157 158 /* 159 * ipadm_addr_type_t-specific values that are cached in ipmgmtd and can 160 * make a round-trip back to client programs 161 */ 162 typedef union { 163 struct { 164 boolean_t ipmgmt_linklocal; 165 struct sockaddr_in6 ipmgmt_ifid; 166 } ipmgmt_ipv6_cache_s; 167 struct { 168 char ipmgmt_reqhost[MAXNAMELEN]; 169 } ipmgmt_dhcp_cache_s; 170 } ipmgmt_addr_type_cache_u; 171 172 /* IPMGMT_CMD_GETIF door_call argument structure */ 173 typedef struct ipmgmt_getif_arg_s { 174 ipmgmt_door_cmd_type_t ia_cmd; 175 uint32_t ia_flags; 176 char ia_ifname[LIFNAMSIZ]; 177 } ipmgmt_getif_arg_t; 178 179 /* IPMGMT_CMD_RESETIF, IPMGMT_CMD_SETIF door_call argument structure */ 180 typedef struct ipmgmt_if_arg_s { 181 ipmgmt_door_cmd_type_t ia_cmd; 182 uint32_t ia_flags; 183 char ia_ifname[LIFNAMSIZ]; 184 sa_family_t ia_family; 185 } ipmgmt_if_arg_t; 186 187 /* IPMGMT_CMD_INITIF door_call argument structure */ 188 typedef struct ipmgmt_initif_arg_s { 189 ipmgmt_door_cmd_type_t ia_cmd; 190 uint32_t ia_flags; 191 sa_family_t ia_family; 192 size_t ia_nvlsize; 193 /* packed nvl follows */ 194 } ipmgmt_initif_arg_t; 195 196 /* IPMGMT_CMD_SETADDR door_call argument */ 197 typedef struct ipmgmt_setaddr_arg_s { 198 ipmgmt_door_cmd_type_t ia_cmd; 199 uint32_t ia_flags; 200 size_t ia_nvlsize; 201 /* packed nvl follows */ 202 } ipmgmt_setaddr_arg_t; 203 204 /* IPMGMT_CMD_GETADDR door_call argument */ 205 typedef struct ipmgmt_getaddr_arg_s { 206 ipmgmt_door_cmd_type_t ia_cmd; 207 uint32_t ia_flags; 208 char ia_ifname[LIFNAMSIZ]; 209 sa_family_t ia_family; 210 char ia_aobjname[IPADM_AOBJSIZ]; 211 } ipmgmt_getaddr_arg_t; 212 213 /* IPMGMT_CMD_RESETADDR door_call argument */ 214 typedef struct ipmgmt_addr_arg_s { 215 ipmgmt_door_cmd_type_t ia_cmd; 216 uint32_t ia_flags; 217 char ia_aobjname[IPADM_AOBJSIZ]; 218 int32_t ia_lnum; 219 } ipmgmt_addr_arg_t; 220 221 /* 222 * IPMGMT_CMD_{ADDROBJ_ADD|ADDROBJ_LOOKUPADD|LIFNUM2ADDROBJ| 223 * ADDROBJ2LIFNUM} door_call argument. 224 */ 225 typedef struct ipmgmt_aobjop_arg_s { 226 ipmgmt_door_cmd_type_t ia_cmd; 227 uint32_t ia_flags; 228 char ia_aobjname[IPADM_AOBJSIZ]; 229 char ia_ifname[LIFNAMSIZ]; 230 int32_t ia_lnum; 231 sa_family_t ia_family; 232 ipadm_addr_type_t ia_atype; 233 } ipmgmt_aobjop_arg_t; 234 235 /* 236 * ia_flags used inside the arguments for interface/address commands 237 * - ACTIVE updates the running configuration 238 * - PERSIST updates the permanent data store 239 * - INIT indicates that operation being performed is under init 240 * context 241 * - PROPS_ONLY indicates the update changes the running configuration of 242 * "props" data on the interface/address object. The props are 243 * cached there on the parent, so a PROPS_ONLY change does not 244 * affect the ACTIVE/PERSIST state of the parent. 245 */ 246 #define IPMGMT_ACTIVE 0x00000001 247 #define IPMGMT_PERSIST 0x00000002 248 #define IPMGMT_INIT 0x00000004 249 #define IPMGMT_PROPS_ONLY 0x00000008 250 251 /* door call return value */ 252 typedef struct ipmgmt_retval_s { 253 int32_t ir_err; 254 } ipmgmt_retval_t; 255 256 /* IPMGMT_CMD_GETADDR door_return value */ 257 typedef struct ipmgmt_get_rval_s { 258 int32_t ir_err; 259 uint32_t ir_nvlsize; 260 /* packed nvl follows */ 261 } ipmgmt_get_rval_t; 262 263 /* IPMGMT_CMD_GETPROP door_return value */ 264 typedef struct ipmgmt_getprop_rval_s { 265 int32_t ir_err; 266 char ir_pval[MAXPROPVALLEN]; 267 } ipmgmt_getprop_rval_t; 268 269 /* IPMGMT_CMD_GETIF door_return value */ 270 typedef struct ipmgmt_getif_rval_s { 271 int32_t ir_err; 272 uint32_t ir_ifcnt; 273 ipadm_if_info_t ir_ifinfo[1]; 274 } ipmgmt_getif_rval_t; 275 276 /* IPMGMT_CMD_{LOOKUPADD|LIFNUM2ADDROBJ|ADDROBJ2LIFNUM} door_return value */ 277 typedef struct ipmgmt_aobjop_rval_s { 278 int32_t ir_err; 279 char ir_aobjname[IPADM_AOBJSIZ]; 280 char ir_ifname[LIFNAMSIZ]; 281 int32_t ir_lnum; 282 sa_family_t ir_family; 283 uint32_t ir_flags; 284 ipadm_addr_type_t ir_atype; 285 ipmgmt_addr_type_cache_u ir_atype_cache; 286 } ipmgmt_aobjop_rval_t; 287 288 #define ipmgmt_ir_intfid ir_atype_cache. \ 289 ipmgmt_ipv6_cache_s.ipmgmt_ifid 290 #define ipmgmt_ir_reqhost ir_atype_cache. \ 291 ipmgmt_dhcp_cache_s.ipmgmt_reqhost 292 293 /* DB walk callback functions */ 294 typedef boolean_t db_wfunc_t(void *, nvlist_t *, char *, size_t, int *); 295 extern int ipadm_rw_db(db_wfunc_t *, void *, const char *, mode_t, 296 ipadm_db_op_t); 297 298 /* zone related functions */ 299 /* 300 * callback function to persist an interface in ipmgmtd data store 301 */ 302 typedef void (*persist_cb_t)(char *, boolean_t, boolean_t); 303 /* 304 * ipmgmtd/libipadm network initialization interface. 305 */ 306 extern ipadm_status_t ipadm_init_net_from_gz(ipadm_handle_t, char *, 307 persist_cb_t); 308 309 #ifdef __cplusplus 310 } 311 #endif 312 313 #endif /* _IPADM_IPMGMT_H */ 314