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 /*
  23  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  * Copyright 2018 Joyent, Inc.  All rights reserved.
  26  */
  27 
  28 /*
  29  * This file captures the MAC client API definitions. It can be
  30  * included from any MAC clients.
  31  */
  32 
  33 #ifndef _SYS_MAC_CLIENT_H
  34 #define _SYS_MAC_CLIENT_H
  35 
  36 #include <sys/mac.h>
  37 #include <sys/mac_flow.h>
  38 
  39 #ifdef  __cplusplus
  40 extern "C" {
  41 #endif
  42 
  43 #ifdef  _KERNEL
  44 
  45 /*
  46  * MAC client interface.
  47  */
  48 
  49 typedef struct __mac_client_handle *mac_client_handle_t;
  50 typedef struct __mac_unicast_handle *mac_unicast_handle_t;
  51 typedef struct __mac_promisc_handle *mac_promisc_handle_t;
  52 typedef struct __mac_perim_handle *mac_perim_handle_t;
  53 typedef uintptr_t mac_tx_cookie_t;
  54 
  55 typedef void (*mac_tx_notify_t)(void *, mac_tx_cookie_t);
  56 
  57 typedef enum {
  58         MAC_DIAG_NONE,
  59         MAC_DIAG_MACADDR_NIC,
  60         MAC_DIAG_MACADDR_INUSE,
  61         MAC_DIAG_MACADDR_INVALID,
  62         MAC_DIAG_MACADDRLEN_INVALID,
  63         MAC_DIAG_MACFACTORYSLOTINVALID,
  64         MAC_DIAG_MACFACTORYSLOTUSED,
  65         MAC_DIAG_MACFACTORYSLOTALLUSED,
  66         MAC_DIAG_MACFACTORYNOTSUP,
  67         MAC_DIAG_MACPREFIX_INVALID,
  68         MAC_DIAG_MACPREFIXLEN_INVALID,
  69         MAC_DIAG_MACNO_HWRINGS
  70 } mac_diag_t;
  71 
  72 /*
  73  * These are used when MAC clients what to specify tx and rx rings
  74  * properties. MAC_RXRINGS_NONE/MAC_TXRINGS_NONE mean that we should
  75  * not reserve any rings while MAC_RXRINGS_DONTCARE/MAC_TXRINGS_DONTCARE
  76  * mean that the system can decide if it wants to reserve rings or
  77  * not.
  78  */
  79 #define MAC_RXRINGS_NONE        0
  80 #define MAC_TXRINGS_NONE        MAC_RXRINGS_NONE
  81 #define MAC_RXRINGS_DONTCARE    -1
  82 #define MAC_TXRINGS_DONTCARE    MAC_RXRINGS_DONTCARE
  83 
  84 typedef enum {
  85         MAC_CLIENT_PROMISC_ALL,
  86         MAC_CLIENT_PROMISC_FILTERED,
  87         MAC_CLIENT_PROMISC_MULTI
  88 } mac_client_promisc_type_t;
  89 
  90 /* flags passed to mac_unicast_add() */
  91 
  92 #define MAC_UNICAST_NODUPCHECK                  0x0001
  93 #define MAC_UNICAST_PRIMARY                     0x0002
  94 #define MAC_UNICAST_HW                          0x0004
  95 #define MAC_UNICAST_VNIC_PRIMARY                0x0008
  96 #define MAC_UNICAST_TAG_DISABLE                 0x0010
  97 #define MAC_UNICAST_STRIP_DISABLE               0x0020
  98 #define MAC_UNICAST_DISABLE_TX_VID_CHECK        0x0040
  99 
 100 /* flags passed to mac_client_open */
 101 #define MAC_OPEN_FLAGS_IS_VNIC                  0x0001
 102 #define MAC_OPEN_FLAGS_EXCLUSIVE                0x0002
 103 #define MAC_OPEN_FLAGS_IS_AGGR_PORT             0x0004
 104 #define MAC_OPEN_FLAGS_SHARES_DESIRED           0x0008
 105 #define MAC_OPEN_FLAGS_USE_DATALINK_NAME        0x0010
 106 #define MAC_OPEN_FLAGS_MULTI_PRIMARY            0x0020
 107 #define MAC_OPEN_FLAGS_NO_UNICAST_ADDR          0x0040
 108 
 109 /* flags passed to mac_client_close */
 110 #define MAC_CLOSE_FLAGS_IS_VNIC         0x0001
 111 #define MAC_CLOSE_FLAGS_EXCLUSIVE       0x0002
 112 #define MAC_CLOSE_FLAGS_IS_AGGR_PORT    0x0004
 113 
 114 /* flags passed to mac_promisc_add() */
 115 #define MAC_PROMISC_FLAGS_NO_TX_LOOP            0x0001
 116 #define MAC_PROMISC_FLAGS_NO_PHYS               0x0002
 117 #define MAC_PROMISC_FLAGS_VLAN_TAG_STRIP        0x0004
 118 #define MAC_PROMISC_FLAGS_NO_COPY               0x0008
 119 
 120 /* flags passed to mac_tx() */
 121 #define MAC_DROP_ON_NO_DESC     0x01 /* freemsg() if no tx descs */
 122 #define MAC_TX_NO_ENQUEUE       0x02 /* don't enqueue mblks if not xmit'ed */
 123 #define MAC_TX_NO_HOLD          0x04 /* don't bump the active Tx count */
 124 
 125 extern int mac_client_open(mac_handle_t, mac_client_handle_t *, char *,
 126     uint16_t);
 127 extern void mac_client_close(mac_client_handle_t, uint16_t);
 128 
 129 extern int mac_unicast_add(mac_client_handle_t, uint8_t *, uint16_t,
 130     mac_unicast_handle_t *, uint16_t, mac_diag_t *);
 131 extern int mac_unicast_add_set_rx(mac_client_handle_t, uint8_t *, uint16_t,
 132     mac_unicast_handle_t *, uint16_t, mac_diag_t *, mac_rx_t, void *);
 133 extern int mac_unicast_remove(mac_client_handle_t, mac_unicast_handle_t);
 134 
 135 extern int mac_multicast_add(mac_client_handle_t, const uint8_t *);
 136 extern void mac_multicast_remove(mac_client_handle_t, const uint8_t *);
 137 
 138 extern void mac_rx_set(mac_client_handle_t, mac_rx_t, void *);
 139 extern void mac_rx_clear(mac_client_handle_t);
 140 extern void mac_secondary_dup(mac_client_handle_t, mac_client_handle_t);
 141 extern void mac_secondary_cleanup(mac_client_handle_t);
 142 extern mac_tx_cookie_t mac_tx(mac_client_handle_t, mblk_t *,
 143     uintptr_t, uint16_t, mblk_t **);
 144 extern boolean_t mac_tx_is_flow_blocked(mac_client_handle_t, mac_tx_cookie_t);
 145 extern uint64_t mac_client_stat_get(mac_client_handle_t, uint_t);
 146 
 147 extern int mac_promisc_add(mac_client_handle_t, mac_client_promisc_type_t,
 148     mac_rx_t, void *, mac_promisc_handle_t *, uint16_t);
 149 extern void mac_promisc_remove(mac_promisc_handle_t);
 150 
 151 extern mac_notify_handle_t mac_notify_add(mac_handle_t, mac_notify_t, void *);
 152 extern int mac_notify_remove(mac_notify_handle_t, boolean_t);
 153 extern void mac_notify_remove_wait(mac_handle_t);
 154 extern int mac_rename_primary(mac_handle_t, const char *);
 155 extern  char *mac_client_name(mac_client_handle_t);
 156 
 157 extern int mac_open(const char *, mac_handle_t *);
 158 extern void mac_close(mac_handle_t);
 159 extern uint64_t mac_stat_get(mac_handle_t, uint_t);
 160 
 161 extern int mac_unicast_primary_set(mac_handle_t, const uint8_t *);
 162 extern void mac_unicast_primary_get(mac_handle_t, uint8_t *);
 163 extern void mac_unicast_primary_info(mac_handle_t, char *, boolean_t *);
 164 
 165 extern void mac_unicast_secondary_get(mac_client_handle_t, uint8_t *);
 166 
 167 extern boolean_t mac_dst_get(mac_handle_t, uint8_t *);
 168 
 169 extern int mac_addr_random(mac_client_handle_t, uint_t, uint8_t *,
 170     mac_diag_t *);
 171 
 172 extern int mac_addr_factory_reserve(mac_client_handle_t, int *);
 173 extern void mac_addr_factory_release(mac_client_handle_t, uint_t);
 174 extern void mac_addr_factory_value(mac_handle_t, int, uchar_t *, uint_t *,
 175     char *, boolean_t *);
 176 extern uint_t mac_addr_factory_num(mac_handle_t);
 177 
 178 extern mac_tx_notify_handle_t mac_client_tx_notify(mac_client_handle_t,
 179     mac_tx_notify_t, void *);
 180 
 181 extern int mac_client_set_resources(mac_client_handle_t,
 182     mac_resource_props_t *);
 183 extern void mac_client_get_resources(mac_client_handle_t,
 184     mac_resource_props_t *);
 185 extern void mac_client_get_eff_resources(mac_client_handle_t,
 186     mac_resource_props_t *);
 187 
 188 /* bridging-related interfaces */
 189 extern int mac_set_pvid(mac_handle_t, uint16_t);
 190 extern uint16_t mac_get_pvid(mac_handle_t);
 191 extern uint32_t mac_get_llimit(mac_handle_t);
 192 extern uint32_t mac_get_ldecay(mac_handle_t);
 193 
 194 extern int mac_share_capable(mac_handle_t);
 195 extern int mac_share_bind(mac_client_handle_t, uint64_t, uint64_t *);
 196 extern void mac_share_unbind(mac_client_handle_t);
 197 
 198 extern int mac_set_mtu(mac_handle_t, uint_t, uint_t *);
 199 
 200 extern void mac_client_set_rings(mac_client_handle_t, int, int);
 201 
 202 #endif  /* _KERNEL */
 203 
 204 #ifdef  __cplusplus
 205 }
 206 #endif
 207 
 208 #endif /* _SYS_MAC_CLIENT_H */