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