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.
  26  */
  27 
  28 /*
  29  * This file contains *private* MAC API definitions. This header file
  30  * should only be included by kernel components which are part of the
  31  * GLDv3 stack (dld, dls, aggr, softmac).
  32  */
  33 
  34 #ifndef _SYS_MAC_CLIENT_PRIV_H
  35 #define _SYS_MAC_CLIENT_PRIV_H
  36 
  37 #include <sys/mac.h>
  38 #include <sys/mac_flow.h>
  39 
  40 #ifdef  __cplusplus
  41 extern "C" {
  42 #endif
  43 
  44 #ifdef  _KERNEL
  45 
  46 #ifdef DEBUG
  47 #define MAC_PERIM_HELD(mph)             mac_perim_held(mph)
  48 #else
  49 #define MAC_PERIM_HELD(mph)
  50 #endif
  51 
  52 extern boolean_t mac_rx_bypass_set(mac_client_handle_t, mac_direct_rx_t,
  53     void *);
  54 extern void mac_rx_bypass_enable(mac_client_handle_t);
  55 extern void mac_rx_bypass_disable(mac_client_handle_t);
  56 
  57 extern const mac_info_t *mac_info(mac_handle_t);
  58 extern boolean_t mac_info_get(const char *, mac_info_t *);
  59 extern boolean_t mac_promisc_get(mac_handle_t);
  60 
  61 extern int mac_start(mac_handle_t);
  62 extern void mac_stop(mac_handle_t);
  63 
  64 extern void mac_ioctl(mac_handle_t, queue_t *, mblk_t *);
  65 extern link_state_t mac_link_get(mac_handle_t);
  66 extern void mac_resource_set(mac_client_handle_t, mac_resource_add_t, void *);
  67 extern dev_info_t *mac_devinfo_get(mac_handle_t);
  68 extern void *mac_driver(mac_handle_t);
  69 extern boolean_t mac_capab_get(mac_handle_t, mac_capab_t, void *);
  70 extern boolean_t mac_sap_verify(mac_handle_t, uint32_t, uint32_t *);
  71 extern mblk_t *mac_header(mac_handle_t, const uint8_t *, uint32_t, mblk_t *,
  72     size_t);
  73 extern int mac_header_info(mac_handle_t, mblk_t *, mac_header_info_t *);
  74 extern int mac_vlan_header_info(mac_handle_t, mblk_t *, mac_header_info_t *);
  75 extern mblk_t *mac_header_cook(mac_handle_t, mblk_t *);
  76 extern mblk_t *mac_header_uncook(mac_handle_t, mblk_t *);
  77 
  78 extern void mac_resource_set_common(mac_client_handle_t,
  79     mac_resource_add_t, mac_resource_remove_t, mac_resource_quiesce_t,
  80     mac_resource_restart_t, mac_resource_bind_t, void *);
  81 
  82 extern  void mac_perim_enter_by_mh(mac_handle_t, mac_perim_handle_t *);
  83 extern  int mac_perim_enter_by_macname(const char *, mac_perim_handle_t *);
  84 extern  int mac_perim_enter_by_linkid(datalink_id_t, mac_perim_handle_t *);
  85 extern  void mac_perim_exit(mac_perim_handle_t);
  86 extern  boolean_t mac_perim_held(mac_handle_t);
  87 
  88 extern  uint16_t mac_client_vid(mac_client_handle_t);
  89 extern int mac_vnic_unicast_set(mac_client_handle_t, const uint8_t *);
  90 extern boolean_t mac_client_is_vlan_vnic(mac_client_handle_t);
  91 
  92 extern void mac_client_poll_enable(mac_client_handle_t);
  93 extern void mac_client_poll_disable(mac_client_handle_t);
  94 
  95 /*
  96  * Flow-related APIs for MAC clients.
  97  */
  98 
  99 extern void mac_link_init_flows(mac_client_handle_t);
 100 extern void mac_link_release_flows(mac_client_handle_t);
 101 extern int mac_link_flow_add(datalink_id_t, char *, flow_desc_t *,
 102     mac_resource_props_t *);
 103 extern int mac_link_flow_remove(char *);
 104 extern int mac_link_flow_modify(char *, mac_resource_props_t *);
 105 extern boolean_t mac_link_has_flows(mac_client_handle_t);
 106 
 107 typedef struct {
 108         char                    fi_flow_name[MAXFLOWNAMELEN];
 109         datalink_id_t           fi_link_id;
 110         flow_desc_t             fi_flow_desc;
 111         mac_resource_props_t    fi_resource_props;
 112 } mac_flowinfo_t;
 113 
 114 extern int mac_link_flow_walk(datalink_id_t,
 115     int (*)(mac_flowinfo_t *, void *), void *);
 116 extern int mac_link_flow_info(char *, mac_flowinfo_t *);
 117 
 118 extern void mac_rx_client_quiesce(mac_client_handle_t);
 119 extern void mac_rx_client_restart(mac_client_handle_t);
 120 extern void mac_tx_client_quiesce(mac_client_handle_t);
 121 extern void mac_tx_client_condemn(mac_client_handle_t);
 122 extern void mac_tx_client_restart(mac_client_handle_t);
 123 extern void mac_srs_perm_quiesce(mac_client_handle_t, boolean_t);
 124 extern uint_t mac_hwrings_idx_get(mac_handle_t, uint_t, mac_group_handle_t *,
 125     mac_ring_handle_t *, mac_ring_type_t);
 126 extern int mac_hwrings_get(mac_client_handle_t, mac_group_handle_t *,
 127     mac_ring_handle_t *, mac_ring_type_t);
 128 extern uint_t mac_hwring_getinfo(mac_ring_handle_t);
 129 extern void mac_hwring_set_passthru(mac_ring_handle_t, mac_rx_t, void *,
 130     mac_resource_handle_t);
 131 extern void mac_hwring_clear_passthru(mac_ring_handle_t);
 132 extern void mac_client_set_flow_cb(mac_client_handle_t, mac_rx_t, void *);
 133 extern void mac_client_clear_flow_cb(mac_client_handle_t);
 134 
 135 extern void mac_hwring_setup(mac_ring_handle_t, mac_resource_handle_t,
 136     mac_ring_handle_t);
 137 extern void mac_hwring_teardown(mac_ring_handle_t);
 138 extern int mac_hwring_disable_intr(mac_ring_handle_t);
 139 extern int mac_hwring_enable_intr(mac_ring_handle_t);
 140 extern int mac_hwring_start(mac_ring_handle_t);
 141 extern void mac_hwring_stop(mac_ring_handle_t);
 142 extern int mac_hwring_activate(mac_ring_handle_t);
 143 extern void mac_hwring_quiesce(mac_ring_handle_t);
 144 extern mblk_t *mac_hwring_poll(mac_ring_handle_t, int);
 145 extern mblk_t *mac_hwring_tx(mac_ring_handle_t, mblk_t *);
 146 extern int mac_hwring_getstat(mac_ring_handle_t, uint_t, uint64_t *);
 147 extern mblk_t *mac_hwring_send_priv(mac_client_handle_t,
 148     mac_ring_handle_t, mblk_t *);
 149 extern void mac_hwring_set_default(mac_handle_t, mac_ring_handle_t);
 150 
 151 #define MAC_HWRING_POLL(ring, bytes)                    \
 152         (((ring)->mr_info.mri_poll)                  \
 153         ((ring)->mr_info.mri_driver, (bytes)))
 154 
 155 extern int mac_hwgroup_addmac(mac_group_handle_t, const uint8_t *);
 156 extern int mac_hwgroup_remmac(mac_group_handle_t, const uint8_t *);
 157 extern int mac_hwgroup_addvlan(mac_group_handle_t, uint16_t);
 158 extern int mac_hwgroup_remvlan(mac_group_handle_t, uint16_t);
 159 
 160 extern boolean_t mac_has_hw_vlan(mac_handle_t);
 161 
 162 extern uint_t mac_get_num_rx_groups(mac_handle_t);
 163 extern int mac_set_promisc(mac_handle_t, boolean_t);
 164 
 165 extern void mac_set_upper_mac(mac_client_handle_t, mac_handle_t,
 166     mac_resource_props_t *);
 167 
 168 extern int mac_mark_exclusive(mac_handle_t);
 169 extern void mac_unmark_exclusive(mac_handle_t);
 170 
 171 extern uint_t mac_hwgrp_num(mac_handle_t, int);
 172 extern void mac_get_hwrxgrp_info(mac_handle_t, int, uint_t *, uint_t *,
 173     uint_t *, uint_t *, uint_t *, char *);
 174 extern void mac_get_hwtxgrp_info(mac_handle_t, int, uint_t *, uint_t *,
 175     uint_t *, uint_t *, uint_t *, char *);
 176 
 177 extern uint_t mac_txavail_get(mac_handle_t);
 178 extern uint_t mac_rxavail_get(mac_handle_t);
 179 extern uint_t mac_txrsvd_get(mac_handle_t);
 180 extern uint_t mac_rxrsvd_get(mac_handle_t);
 181 extern uint_t mac_rxhwlnksavail_get(mac_handle_t);
 182 extern uint_t mac_rxhwlnksrsvd_get(mac_handle_t);
 183 extern uint_t mac_txhwlnksavail_get(mac_handle_t);
 184 extern uint_t mac_txhwlnksrsvd_get(mac_handle_t);
 185 
 186 extern int32_t mac_client_intr_cpu(mac_client_handle_t);
 187 extern void mac_client_set_intr_cpu(void *, mac_client_handle_t, int32_t);
 188 extern void *mac_get_devinfo(mac_handle_t);
 189 
 190 extern boolean_t mac_is_vnic(mac_handle_t);
 191 extern uint32_t mac_no_notification(mac_handle_t);
 192 
 193 extern int mac_set_prop(mac_handle_t, mac_prop_id_t, char *, void *, uint_t);
 194 extern int mac_get_prop(mac_handle_t, mac_prop_id_t, char *, void *, uint_t);
 195 extern int mac_prop_info(mac_handle_t, mac_prop_id_t, char *, void *,
 196     uint_t, mac_propval_range_t *, uint_t *);
 197 extern boolean_t mac_prop_check_size(mac_prop_id_t, uint_t, boolean_t);
 198 
 199 extern uint64_t mac_pseudo_rx_ring_stat_get(mac_ring_handle_t, uint_t);
 200 extern uint64_t mac_pseudo_tx_ring_stat_get(mac_ring_handle_t, uint_t);
 201 
 202 #endif  /* _KERNEL */
 203 
 204 #ifdef  __cplusplus
 205 }
 206 #endif
 207 
 208 #endif /* _SYS_MAC_CLIENT_PRIV_H */