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 2013 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 #define MAC_UNICAST_NODUPCHECK 0x0001 92 #define MAC_UNICAST_PRIMARY 0x0002 93 #define MAC_UNICAST_HW 0x0004 94 #define MAC_UNICAST_VNIC_PRIMARY 0x0008 95 #define MAC_UNICAST_TAG_DISABLE 0x0010 96 #define MAC_UNICAST_STRIP_DISABLE 0x0020 97 #define MAC_UNICAST_DISABLE_TX_VID_CHECK 0x0040 98 99 /* flags passed to mac_client_open */ 100 #define MAC_OPEN_FLAGS_IS_VNIC 0x0001 101 #define MAC_OPEN_FLAGS_EXCLUSIVE 0x0002 102 #define MAC_OPEN_FLAGS_IS_AGGR_PORT 0x0004 103 #define MAC_OPEN_FLAGS_SHARES_DESIRED 0x0008 104 #define MAC_OPEN_FLAGS_USE_DATALINK_NAME 0x0010 105 #define MAC_OPEN_FLAGS_MULTI_PRIMARY 0x0020 106 #define MAC_OPEN_FLAGS_NO_UNICAST_ADDR 0x0040 107 108 /* flags passed to mac_client_close */ 109 #define MAC_CLOSE_FLAGS_IS_VNIC 0x0001 110 #define MAC_CLOSE_FLAGS_EXCLUSIVE 0x0002 111 #define MAC_CLOSE_FLAGS_IS_AGGR_PORT 0x0004 112 113 /* flags passed to mac_promisc_add() */ 114 #define MAC_PROMISC_FLAGS_NO_TX_LOOP 0x0001 115 #define MAC_PROMISC_FLAGS_NO_PHYS 0x0002 116 #define MAC_PROMISC_FLAGS_VLAN_TAG_STRIP 0x0004 117 #define MAC_PROMISC_FLAGS_NO_COPY 0x0008 118 119 /* flags passed to mac_tx() */ 120 #define MAC_DROP_ON_NO_DESC 0x01 /* freemsg() if no tx descs */ 121 #define MAC_TX_NO_ENQUEUE 0x02 /* don't enqueue mblks if not xmit'ed */ 122 #define MAC_TX_NO_HOLD 0x04 /* don't bump the active Tx count */ 123 124 extern int mac_client_open(mac_handle_t, mac_client_handle_t *, char *, 125 uint16_t); 126 extern void mac_client_close(mac_client_handle_t, uint16_t); 127 128 extern int mac_unicast_add(mac_client_handle_t, uint8_t *, uint16_t, 129 mac_unicast_handle_t *, uint16_t, mac_diag_t *); 130 extern int mac_unicast_add_set_rx(mac_client_handle_t, uint8_t *, uint16_t, 131 mac_unicast_handle_t *, uint16_t, mac_diag_t *, mac_rx_t, void *); 132 extern int mac_unicast_remove(mac_client_handle_t, mac_unicast_handle_t); 133 134 extern int mac_multicast_add(mac_client_handle_t, const uint8_t *); 135 extern void mac_multicast_remove(mac_client_handle_t, const uint8_t *); 136 137 extern void mac_rx_set(mac_client_handle_t, mac_rx_t, void *); 138 extern void mac_rx_clear(mac_client_handle_t); 139 extern void mac_secondary_dup(mac_client_handle_t, mac_client_handle_t); 140 extern void mac_secondary_cleanup(mac_client_handle_t); 141 extern mac_tx_cookie_t mac_tx(mac_client_handle_t, mblk_t *, 142 uintptr_t, uint16_t, mblk_t **); 143 extern boolean_t mac_tx_is_flow_blocked(mac_client_handle_t, mac_tx_cookie_t); 144 extern uint64_t mac_client_stat_get(mac_client_handle_t, uint_t); 145 146 extern int mac_promisc_add(mac_client_handle_t, mac_client_promisc_type_t, 147 mac_rx_t, void *, mac_promisc_handle_t *, uint16_t); 148 extern void mac_promisc_remove(mac_promisc_handle_t); 149 150 extern mac_notify_handle_t mac_notify_add(mac_handle_t, mac_notify_t, void *); 151 extern int mac_notify_remove(mac_notify_handle_t, boolean_t); 152 extern void mac_notify_remove_wait(mac_handle_t); 153 extern int mac_rename_primary(mac_handle_t, const char *); 154 extern char *mac_client_name(mac_client_handle_t); 155 156 extern int mac_open(const char *, mac_handle_t *); 157 extern void mac_close(mac_handle_t); 158 extern uint64_t mac_stat_get(mac_handle_t, uint_t); 159 160 extern int mac_unicast_primary_set(mac_handle_t, const uint8_t *); 161 extern void mac_unicast_primary_get(mac_handle_t, uint8_t *); 162 extern void mac_unicast_primary_info(mac_handle_t, char *, boolean_t *); 163 164 extern void mac_unicast_secondary_get(mac_client_handle_t, uint8_t *); 165 166 extern boolean_t mac_dst_get(mac_handle_t, uint8_t *); 167 168 extern int mac_addr_random(mac_client_handle_t, uint_t, uint8_t *, 169 mac_diag_t *); 170 171 extern int mac_addr_factory_reserve(mac_client_handle_t, int *); 172 extern void mac_addr_factory_release(mac_client_handle_t, uint_t); 173 extern void mac_addr_factory_value(mac_handle_t, int, uchar_t *, uint_t *, 174 char *, boolean_t *); 175 extern uint_t mac_addr_factory_num(mac_handle_t); 176 177 extern mac_tx_notify_handle_t mac_client_tx_notify(mac_client_handle_t, 178 mac_tx_notify_t, void *); 179 180 extern int mac_client_set_resources(mac_client_handle_t, 181 mac_resource_props_t *); 182 extern void mac_client_get_resources(mac_client_handle_t, 183 mac_resource_props_t *); 184 extern void mac_client_get_eff_resources(mac_client_handle_t, 185 mac_resource_props_t *); 186 187 /* bridging-related interfaces */ 188 extern int mac_set_pvid(mac_handle_t, uint16_t); 189 extern uint16_t mac_get_pvid(mac_handle_t); 190 extern uint32_t mac_get_llimit(mac_handle_t); 191 extern uint32_t mac_get_ldecay(mac_handle_t); 192 193 extern int mac_share_capable(mac_handle_t); 194 extern int mac_share_bind(mac_client_handle_t, uint64_t, uint64_t *); 195 extern void mac_share_unbind(mac_client_handle_t); 196 197 extern int mac_set_mtu(mac_handle_t, uint_t, uint_t *); 198 199 extern void mac_client_set_rings(mac_client_handle_t, int, int); 200 201 #endif /* _KERNEL */ 202 203 #ifdef __cplusplus 204 } 205 #endif 206 207 #endif /* _SYS_MAC_CLIENT_H */