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) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 #ifndef _DLS_MGMT_H
  26 #define _DLS_MGMT_H
  27 
  28 #include <sys/types.h>
  29 #include <sys/param.h>
  30 #include <sys/zone.h>
  31 
  32 /*
  33  * Data-Link Services Module
  34  */
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 typedef enum {
  41         DATALINK_CLASS_PHYS             = 0x01,
  42         DATALINK_CLASS_VLAN             = 0x02,
  43         DATALINK_CLASS_AGGR             = 0x04,
  44         DATALINK_CLASS_VNIC             = 0x08,
  45         DATALINK_CLASS_ETHERSTUB        = 0x10,
  46         DATALINK_CLASS_SIMNET           = 0x20,
  47         DATALINK_CLASS_BRIDGE           = 0x40,
  48         DATALINK_CLASS_IPTUN            = 0x80,
  49         DATALINK_CLASS_PART             = 0x100
  50 } datalink_class_t;
  51 
  52 #define DATALINK_CLASS_ALL      (DATALINK_CLASS_PHYS |  \
  53         DATALINK_CLASS_VLAN | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC | \
  54         DATALINK_CLASS_ETHERSTUB | DATALINK_CLASS_SIMNET | \
  55         DATALINK_CLASS_BRIDGE | DATALINK_CLASS_IPTUN | DATALINK_CLASS_PART)
  56 
  57 /*
  58  * A combination of flags and media.
  59  *   flags is the higher 32 bits, and if it is 0x01, it indicates all media
  60  *   types can be accepted; otherwise, only the given media type (specified
  61  *   in the lower 32 bits) is accepted.
  62  */
  63 typedef uint64_t        datalink_media_t;
  64 
  65 #define DATALINK_ANY_MEDIATYPE          \
  66         ((datalink_media_t)(((datalink_media_t)0x01) << 32))
  67 
  68 #define DATALINK_MEDIA_ACCEPTED(dmedia, media)                          \
  69         (((uint32_t)(((dmedia) >> 32) & 0xfffffffful) & 0x01) ?           \
  70         B_TRUE : ((uint32_t)((dmedia) & 0xfffffffful) == (media)))
  71 
  72 #define MAXLINKATTRLEN          32
  73 #define MAXLINKATTRVALLEN       1024
  74 
  75 /*
  76  * Link attributes used by the kernel.
  77  */
  78 /*
  79  * The major number and instance number of the underlying physical device
  80  * are kept as FPHYMAJ and FPHYINST (major, instance + 1).
  81  *
  82  * Set for physical links only.
  83  */
  84 #define FPHYMAJ         "phymaj"        /* uint64_t */
  85 #define FPHYINST        "phyinst"       /* uint64_t */
  86 
  87 /*
  88  * The devname of the physical link. For example, bge0, ce1. Set for physical
  89  * links only.
  90  */
  91 #define FDEVNAME        "devname"       /* string */
  92 
  93 /*
  94  * The door file for the dlmgmtd (data-link management) daemon.
  95  */
  96 #define DLMGMT_TMPFS_DIR        "/etc/svc/volatile/dladm"
  97 #define DLMGMT_DOOR             DLMGMT_TMPFS_DIR "/dlmgmt_door"
  98 
  99 /*
 100  * Door upcall commands.
 101  */
 102 #define DLMGMT_CMD_DLS_CREATE           1
 103 #define DLMGMT_CMD_DLS_GETATTR          2
 104 #define DLMGMT_CMD_DLS_DESTROY          3
 105 #define DLMGMT_CMD_GETNAME              4
 106 #define DLMGMT_CMD_GETLINKID            5
 107 #define DLMGMT_CMD_GETNEXT              6
 108 #define DLMGMT_CMD_DLS_UPDATE           7
 109 #define DLMGMT_CMD_LINKPROP_INIT        8
 110 #define DLMGMT_CMD_SETZONEID            9
 111 #define DLMGMT_CMD_BASE                 128
 112 
 113 /*
 114  * Indicate the link mapping is active or persistent
 115  */
 116 #define DLMGMT_ACTIVE           0x01
 117 #define DLMGMT_PERSIST          0x02
 118 
 119 /* upcall argument */
 120 typedef struct dlmgmt_door_arg {
 121         uint_t                  ld_cmd;
 122 } dlmgmt_door_arg_t;
 123 
 124 typedef struct dlmgmt_upcall_arg_create {
 125         int                     ld_cmd;
 126         datalink_class_t        ld_class;
 127         uint32_t                ld_media;
 128         boolean_t               ld_persist;
 129         uint64_t                ld_phymaj;
 130         uint64_t                ld_phyinst;
 131         char                    ld_devname[MAXNAMELEN];
 132 } dlmgmt_upcall_arg_create_t;
 133 
 134 /*
 135  * Note: ld_padding is necessary to keep the size of the structure the
 136  * same on amd64 and i386.  The same note applies to other ld_padding
 137  * and lr_paddding fields in structures throughout this file.
 138  */
 139 typedef struct dlmgmt_upcall_arg_destroy {
 140         int                     ld_cmd;
 141         datalink_id_t           ld_linkid;
 142         boolean_t               ld_persist;
 143         int                     ld_padding;
 144 } dlmgmt_upcall_arg_destroy_t;
 145 
 146 typedef struct dlmgmt_upcall_arg_update {
 147         int                     ld_cmd;
 148         boolean_t               ld_novanity;
 149         uint32_t                ld_media;
 150         uint32_t                ld_padding;
 151         char                    ld_devname[MAXNAMELEN];
 152 } dlmgmt_upcall_arg_update_t;
 153 
 154 typedef struct dlmgmt_upcall_arg_getattr {
 155         int                     ld_cmd;
 156         datalink_id_t           ld_linkid;
 157         char                    ld_attr[MAXLINKATTRLEN];
 158 } dlmgmt_upcall_arg_getattr_t;
 159 
 160 typedef struct dlmgmt_door_getname {
 161         int                     ld_cmd;
 162         datalink_id_t           ld_linkid;
 163 } dlmgmt_door_getname_t;
 164 
 165 typedef struct dlmgmt_door_getlinkid {
 166         int                     ld_cmd;
 167         char                    ld_link[MAXLINKNAMELEN];
 168 } dlmgmt_door_getlinkid_t;
 169 
 170 typedef struct dlmgmt_door_getnext_s {
 171         int                     ld_cmd;
 172         datalink_id_t           ld_linkid;
 173         datalink_class_t        ld_class;
 174         uint32_t                ld_flags;
 175         datalink_media_t        ld_dmedia;
 176 } dlmgmt_door_getnext_t;
 177 
 178 typedef struct dlmgmt_door_linkprop_init {
 179         int                     ld_cmd;
 180         datalink_id_t           ld_linkid;
 181 } dlmgmt_door_linkprop_init_t;
 182 
 183 typedef struct dlmgmt_door_setzoneid {
 184         int                     ld_cmd;
 185         datalink_id_t           ld_linkid;
 186         zoneid_t                ld_zoneid;
 187 } dlmgmt_door_setzoneid_t;
 188 
 189 /* upcall return value */
 190 typedef struct dlmgmt_retval_s {
 191         uint_t                  lr_err; /* return error code */
 192 } dlmgmt_retval_t;
 193 
 194 typedef dlmgmt_retval_t dlmgmt_destroy_retval_t,
 195                         dlmgmt_linkprop_init_retval_t,
 196                         dlmgmt_setzoneid_retval_t;
 197 
 198 struct dlmgmt_linkid_retval_s {
 199         uint_t                  lr_err;
 200         datalink_id_t           lr_linkid;
 201         uint32_t                lr_flags;
 202         datalink_class_t        lr_class;
 203         uint32_t                lr_media;
 204         uint32_t                lr_padding;
 205 };
 206 
 207 typedef struct dlmgmt_linkid_retval_s   dlmgmt_create_retval_t,
 208                                         dlmgmt_update_retval_t,
 209                                         dlmgmt_getlinkid_retval_t,
 210                                         dlmgmt_getnext_retval_t;
 211 
 212 typedef struct dlmgmt_getname_retval_s {
 213         uint_t                  lr_err;
 214         char                    lr_link[MAXLINKNAMELEN];
 215         datalink_class_t        lr_class;
 216         uint32_t                lr_media;
 217         uint32_t                lr_flags;
 218 } dlmgmt_getname_retval_t;
 219 
 220 typedef struct dlmgmt_getattr_retval_s {
 221         uint_t                  lr_err;
 222         uint_t                  lr_type;
 223         uint_t                  lr_attrsz;
 224         uint_t                  lr_padding;
 225         char                    lr_attrval[MAXLINKATTRVALLEN];
 226 } dlmgmt_getattr_retval_t;
 227 
 228 #ifdef  __cplusplus
 229 }
 230 #endif
 231 
 232 #endif  /* _DLS_MGMT_H */