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