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) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 /*
  26  * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
  27  */
  28 
  29 #ifndef _LIBDLADM_IMPL_H
  30 #define _LIBDLADM_IMPL_H
  31 
  32 #include <sys/types.h>
  33 #include <sys/mac.h>
  34 #include <sys/mac_flow.h>
  35 #include <libdladm.h>
  36 #include <stdio.h>
  37 
  38 #ifdef  __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 #define MAXLINELEN              1024
  43 #define BUFLEN(lim, ptr)        (((lim) > (ptr)) ? ((lim) - (ptr)) : 0)
  44 #define V4_PART_OF_V6(v6)       ((v6)._S6_un._S6_u32[3])
  45 
  46 /*
  47  * The handle contains file descriptors to DLD_CONTROL_DEV and
  48  * DLMGMT_DOOR.  Rather than opening the file descriptor each time
  49  * it is required, the handle is opened by consumers of libdladm
  50  * (e.g., dladm) and then passed to libdladm.
  51  */
  52 struct dladm_handle {
  53         int dld_fd;     /* file descriptor to DLD_CONTROL_DEV */
  54         int door_fd;    /* file descriptor to DLMGMT_DOOR */
  55         kstat_ctl_t *dld_kcp;   /* for kstat consumers */
  56 };
  57 
  58 /* DLMGMT_DOOR can only be accessed by libdladm and dlmgmtd */
  59 extern dladm_status_t   dladm_door_fd(dladm_handle_t, int *);
  60 
  61 extern dladm_status_t   dladm_errno2status(int);
  62 extern dladm_status_t   i_dladm_rw_db(dladm_handle_t, const char *, mode_t,
  63                             dladm_status_t (*)(dladm_handle_t, void *, FILE *,
  64                             FILE *), void *, boolean_t);
  65 extern dladm_status_t   dladm_get_state(dladm_handle_t, datalink_id_t,
  66                             link_state_t *);
  67 extern void             dladm_find_setbits32(uint32_t, uint32_t *, uint32_t *);
  68 extern dladm_status_t   dladm_parse_args(char *, dladm_arg_list_t **,
  69                             boolean_t);
  70 extern void             dladm_free_args(dladm_arg_list_t *);
  71 
  72 /*
  73  * Link attributes persisted by dlmgmtd.
  74  */
  75 /*
  76  * Set for VLANs only
  77  */
  78 #define FVLANID         "vid"           /* uint64_t */
  79 #define FLINKOVER       "linkover"      /* uint64_t */
  80 
  81 /*
  82  * Set for AGGRs only
  83  */
  84 #define FKEY            "key"           /* uint64_t */
  85 #define FNPORTS         "nports"        /* uint64_t */
  86 #define FPORTS          "portnames"     /* string */
  87 #define FPOLICY         "policy"        /* uint64_t */
  88 #define FFIXMACADDR     "fix_macaddr"   /* boolean_t */
  89 #define FFORCE          "force"         /* boolean_t */
  90 #define FLACPMODE       "lacp_mode"     /* uint64_t */
  91 #define FLACPTIMER      "lacp_timer"    /* uint64_t */
  92 
  93 /*
  94  * Set for VNICs only
  95  */
  96 #define FMADDRTYPE      "maddrtype"     /* uint64_t */
  97 #define FMADDRLEN       "maddrlen"      /* uint64_t */
  98 #define FMADDRSLOT      "maddrslot"     /* uint64_t */
  99 #define FMADDRPREFIXLEN "maddrpreflen"  /* uint64_t */
 100 #define FVRID           "vrid"          /* uint64_t */
 101 #define FVRAF           "vraf"          /* uint64_t */
 102 
 103 /*
 104  * Set for simlinks only
 105  */
 106 #define FSIMNETTYPE     "simnettype"    /* uint64_t */
 107 #define FSIMNETPEER     "simnetpeer"    /* uint64_t */
 108 
 109 /*
 110  * Set for IB partitions only
 111  */
 112 #define FPORTPKEY       "pkey"          /* uint64_t */
 113 
 114 /*
 115  * Common fields
 116  */
 117 #define FMACADDR        "macaddr"       /* string */
 118 
 119 /*
 120  * List of all the above attributes.
 121  */
 122 #define DLADM_ATTR_NAMES        FVLANID, FLINKOVER, \
 123                                 FKEY, FNPORTS, FPORTS, FPOLICY, \
 124                                 FFIXMACADDR, FFORCE, FLACPMODE, FLACPTIMER, \
 125                                 FMADDRTYPE, FMADDRLEN, FMADDRSLOT, \
 126                                 FMADDRPREFIXLEN, FVRID, FVRAF,  \
 127                                 FMACADDR, FSIMNETTYPE, FSIMNETPEER
 128 
 129 /*
 130  * Data structures used for implementing temporary properties
 131  */
 132 
 133 typedef struct val_desc {
 134         char            *vd_name;
 135         uintptr_t       vd_val;
 136 } val_desc_t;
 137 
 138 #define VALCNT(vals)    (sizeof ((vals)) / sizeof (val_desc_t))
 139 
 140 extern dladm_status_t   dladm_link_proplist_extract(dladm_handle_t,
 141                             dladm_arg_list_t *, mac_resource_props_t *,
 142                             uint_t);
 143 
 144 extern dladm_status_t   dladm_flow_proplist_extract(dladm_arg_list_t *,
 145                             mac_resource_props_t *);
 146 
 147 /*
 148  * The prop extract() callback.
 149  *
 150  * rp_extract extracts the kernel structure from the val_desc_t created
 151  * by the pd_check function.
 152  */
 153 typedef dladm_status_t  rp_extractf_t(val_desc_t *, uint_t, void *);
 154 extern rp_extractf_t    extract_maxbw, extract_priority,
 155                         extract_cpus, extract_protection,
 156                         extract_allowedips, extract_allowedcids,
 157                         extract_rxrings, extract_txrings, extract_pool;
 158 
 159 typedef struct resource_prop_s {
 160         /*
 161          * resource property name
 162          */
 163         char            *rp_name;
 164 
 165         /*
 166          * callback to extract kernel structure
 167          */
 168         rp_extractf_t   *rp_extract;
 169 } resource_prop_t;
 170 
 171 /*
 172  * Set for bridged links only
 173  */
 174 #define FBRIDGE         "bridge"        /* string */
 175 
 176 #ifdef  __cplusplus
 177 }
 178 #endif
 179 
 180 #endif  /* _LIBDLADM_IMPL_H */