author | yz147064 |
Thu, 20 Dec 2007 19:52:58 -0800 | |
changeset 5733 | df23d322484c |
parent 5084 | 7d838c5c0eed |
child 5895 | f251acdd9bdc |
permissions | -rw-r--r-- |
0 | 1 |
/* |
2 |
* CDDL HEADER START |
|
3 |
* |
|
4 |
* The contents of this file are subject to the terms of the |
|
2311 | 5 |
* Common Development and Distribution License (the "License"). |
6 |
* You may not use this file except in compliance with the License. |
|
0 | 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 |
/* |
|
3448 | 22 |
* Copyright 2007 Sun Microsystems, Inc. All rights reserved. |
0 | 23 |
* Use is subject to license terms. |
24 |
*/ |
|
25 |
||
26 |
#ifndef _SYS_MAC_H |
|
27 |
#define _SYS_MAC_H |
|
28 |
||
29 |
#pragma ident "%Z%%M% %I% %E% SMI" |
|
30 |
||
2760 | 31 |
#include <sys/types.h> |
0 | 32 |
#include <sys/ddi.h> |
33 |
#include <sys/sunddi.h> |
|
34 |
#include <sys/stream.h> |
|
35 |
||
36 |
/* |
|
37 |
* MAC Services Module |
|
38 |
*/ |
|
39 |
||
40 |
#ifdef __cplusplus |
|
41 |
extern "C" { |
|
42 |
#endif |
|
43 |
||
44 |
/* |
|
45 |
* MAC Information (text emitted by modinfo(1m)) |
|
46 |
*/ |
|
47 |
#define MAC_INFO "MAC Services v%I%" |
|
48 |
||
49 |
/* |
|
2311 | 50 |
* MAC version identifier. This is used by mac_alloc() mac_register() to |
51 |
* verify that incompatible drivers don't register. |
|
52 |
*/ |
|
53 |
#define MAC_VERSION 0x1 |
|
54 |
||
55 |
/* |
|
56 |
* MAC-Type version identifier. This is used by mactype_alloc() and |
|
57 |
* mactype_register() to verify that incompatible MAC-Type plugins don't |
|
58 |
* register. |
|
59 |
*/ |
|
60 |
#define MACTYPE_VERSION 0x1 |
|
61 |
||
62 |
/* |
|
0 | 63 |
* Statistics |
64 |
*/ |
|
65 |
||
66 |
#define XCVR_UNDEFINED 0 |
|
67 |
#define XCVR_NONE 1 |
|
68 |
#define XCVR_10 2 |
|
69 |
#define XCVR_100T4 3 |
|
70 |
#define XCVR_100X 4 |
|
71 |
#define XCVR_100T2 5 |
|
72 |
#define XCVR_1000X 6 |
|
73 |
#define XCVR_1000T 7 |
|
74 |
||
75 |
typedef enum { |
|
76 |
LINK_STATE_UNKNOWN = -1, |
|
77 |
LINK_STATE_DOWN, |
|
78 |
LINK_STATE_UP |
|
79 |
} link_state_t; |
|
80 |
||
81 |
typedef enum { |
|
82 |
LINK_DUPLEX_UNKNOWN = 0, |
|
83 |
LINK_DUPLEX_HALF, |
|
84 |
LINK_DUPLEX_FULL |
|
85 |
} link_duplex_t; |
|
86 |
||
5084 | 87 |
/* |
88 |
* Maximum MAC address length |
|
89 |
*/ |
|
90 |
#define MAXMACADDRLEN 20 |
|
91 |
||
0 | 92 |
#ifdef _KERNEL |
93 |
||
2311 | 94 |
typedef struct mac_stat_info_s { |
95 |
uint_t msi_stat; |
|
96 |
char *msi_name; |
|
97 |
uint_t msi_type; /* as defined in kstat_named_init(9F) */ |
|
98 |
uint64_t msi_default; |
|
99 |
} mac_stat_info_t; |
|
100 |
||
101 |
/* |
|
102 |
* There are three ranges of statistics values. 0 to 1 - MAC_STAT_MIN are |
|
103 |
* interface statistics maintained by the mac module. MAC_STAT_MIN to 1 - |
|
104 |
* MACTYPE_STAT_MIN are common MAC statistics defined by the mac module and |
|
105 |
* maintained by each driver. MACTYPE_STAT_MIN and above are statistics |
|
106 |
* defined by MAC-Type plugins and maintained by each driver. |
|
107 |
*/ |
|
108 |
#define MAC_STAT_MIN 1000 |
|
109 |
#define MACTYPE_STAT_MIN 2000 |
|
110 |
||
111 |
#define IS_MAC_STAT(stat) \ |
|
112 |
(stat >= MAC_STAT_MIN && stat < MACTYPE_STAT_MIN) |
|
113 |
#define IS_MACTYPE_STAT(stat) (stat >= MACTYPE_STAT_MIN) |
|
114 |
||
4089 | 115 |
/* |
116 |
* Do not reorder, and add only to the end of this list. |
|
117 |
*/ |
|
2311 | 118 |
enum mac_driver_stat { |
119 |
/* MIB-II stats (RFC 1213 and RFC 1573) */ |
|
120 |
MAC_STAT_IFSPEED = MAC_STAT_MIN, |
|
0 | 121 |
MAC_STAT_MULTIRCV, |
122 |
MAC_STAT_BRDCSTRCV, |
|
123 |
MAC_STAT_MULTIXMT, |
|
124 |
MAC_STAT_BRDCSTXMT, |
|
125 |
MAC_STAT_NORCVBUF, |
|
126 |
MAC_STAT_IERRORS, |
|
127 |
MAC_STAT_UNKNOWNS, |
|
128 |
MAC_STAT_NOXMTBUF, |
|
129 |
MAC_STAT_OERRORS, |
|
130 |
MAC_STAT_COLLISIONS, |
|
131 |
MAC_STAT_RBYTES, |
|
132 |
MAC_STAT_IPACKETS, |
|
133 |
MAC_STAT_OBYTES, |
|
4089 | 134 |
MAC_STAT_OPACKETS, |
135 |
MAC_STAT_UNDERFLOWS, |
|
136 |
MAC_STAT_OVERFLOWS |
|
2311 | 137 |
}; |
0 | 138 |
|
4089 | 139 |
#define MAC_NSTAT (MAC_STAT_OVERFLOWS - MAC_STAT_IFSPEED + 1) |
0 | 140 |
|
2311 | 141 |
#define MAC_STAT_ISACOUNTER(_stat) ( \ |
142 |
(_stat) == MAC_STAT_MULTIRCV || \ |
|
143 |
(_stat) == MAC_STAT_BRDCSTRCV || \ |
|
144 |
(_stat) == MAC_STAT_MULTIXMT || \ |
|
145 |
(_stat) == MAC_STAT_BRDCSTXMT || \ |
|
146 |
(_stat) == MAC_STAT_NORCVBUF || \ |
|
147 |
(_stat) == MAC_STAT_IERRORS || \ |
|
148 |
(_stat) == MAC_STAT_UNKNOWNS || \ |
|
149 |
(_stat) == MAC_STAT_NOXMTBUF || \ |
|
150 |
(_stat) == MAC_STAT_OERRORS || \ |
|
151 |
(_stat) == MAC_STAT_COLLISIONS || \ |
|
152 |
(_stat) == MAC_STAT_RBYTES || \ |
|
153 |
(_stat) == MAC_STAT_IPACKETS || \ |
|
154 |
(_stat) == MAC_STAT_OBYTES || \ |
|
4089 | 155 |
(_stat) == MAC_STAT_OPACKETS || \ |
156 |
(_stat) == MAC_STAT_UNDERFLOWS || \ |
|
157 |
(_stat) == MAC_STAT_OVERFLOWS) |
|
0 | 158 |
|
159 |
/* |
|
160 |
* Immutable information. (This may not be modified after registration). |
|
161 |
*/ |
|
162 |
typedef struct mac_info_s { |
|
163 |
uint_t mi_media; |
|
3147 | 164 |
uint_t mi_nativemedia; |
0 | 165 |
uint_t mi_sdu_min; |
166 |
uint_t mi_sdu_max; |
|
167 |
uint_t mi_addr_length; |
|
2311 | 168 |
uint8_t *mi_unicst_addr; |
169 |
uint8_t *mi_brdcst_addr; |
|
0 | 170 |
} mac_info_t; |
171 |
||
172 |
/* |
|
3115 | 173 |
* LSO capability |
174 |
*/ |
|
175 |
typedef struct lso_basic_tcp_ipv4_s { |
|
176 |
t_uscalar_t lso_max; /* maximum payload */ |
|
177 |
} lso_basic_tcp_ipv4_t; |
|
178 |
||
179 |
/* |
|
180 |
* Future LSO capabilities can be added at the end of the mac_capab_lso_t. |
|
181 |
* When such capability is added to the GLDv3 framework, the size of the |
|
182 |
* mac_capab_lso_t it allocates and passes to the drivers increases. Older |
|
183 |
* drivers wil access only the (upper) sections of that structure, that is the |
|
184 |
* sections carrying the capabilities they understand. This ensures the |
|
185 |
* interface can be safely extended in a binary compatible way. |
|
186 |
*/ |
|
187 |
typedef struct mac_capab_lso_s { |
|
188 |
t_uscalar_t lso_flags; |
|
189 |
lso_basic_tcp_ipv4_t lso_basic_tcp_ipv4; |
|
190 |
/* Add future lso capabilities here */ |
|
191 |
} mac_capab_lso_t; |
|
192 |
||
193 |
/* |
|
2311 | 194 |
* MAC layer capabilities. These capabilities are handled by the drivers' |
195 |
* mc_capab_get() callbacks. Some capabilities require the driver to fill |
|
196 |
* in a given data structure, and others are simply boolean capabilities. |
|
197 |
* Note that capability values must be powers of 2 so that consumers and |
|
198 |
* providers of this interface can keep track of which capabilities they |
|
199 |
* care about by keeping a bitfield of these things around somewhere. |
|
0 | 200 |
*/ |
2311 | 201 |
typedef enum { |
202 |
MAC_CAPAB_HCKSUM = 0x01, /* data is a uint32_t for the txflags */ |
|
2331 | 203 |
MAC_CAPAB_POLL = 0x02, /* boolean only, no data */ |
3115 | 204 |
MAC_CAPAB_MULTIADDRESS = 0x04, /* data is multiaddress_capab_t */ |
205 |
MAC_CAPAB_LSO = 0x08 /* data is mac_capab_lso_t */ |
|
2311 | 206 |
/* add new capabilities here */ |
207 |
} mac_capab_t; |
|
0 | 208 |
|
2331 | 209 |
typedef int mac_addr_slot_t; |
210 |
||
211 |
/* mma_flags values */ |
|
212 |
#define MMAC_SLOT_USED 0x1 /* address slot used */ |
|
213 |
#define MMAC_SLOT_UNUSED 0x2 /* free address slot */ |
|
214 |
#define MMAC_VENDOR_ADDR 0x4 /* address returned is vendor supplied */ |
|
215 |
||
216 |
typedef struct mac_multi_address_s { |
|
217 |
mac_addr_slot_t mma_slot; /* slot for add/remove/get/set */ |
|
218 |
uint_t mma_addrlen; |
|
219 |
uint8_t mma_addr[MAXMACADDRLEN]; |
|
220 |
uint_t mma_flags; |
|
221 |
} mac_multi_addr_t; |
|
222 |
||
223 |
typedef int (*maddr_reserve_t)(void *, mac_multi_addr_t *); |
|
224 |
typedef int (*maddr_add_t)(void *, mac_multi_addr_t *); |
|
225 |
typedef int (*maddr_remove_t)(void *, mac_addr_slot_t); |
|
226 |
typedef int (*maddr_modify_t)(void *, mac_multi_addr_t *); |
|
227 |
typedef int (*maddr_get_t)(void *, mac_multi_addr_t *); |
|
228 |
||
229 |
/* maddr_flag values */ |
|
230 |
#define MADDR_VENDOR_ADDR 0x01 /* addr returned is vendor supplied */ |
|
231 |
||
232 |
/* multiple mac address: add/remove/set/get mac address */ |
|
233 |
typedef struct multiaddress_capab_s { |
|
234 |
int maddr_naddr; /* total addresses */ |
|
235 |
int maddr_naddrfree; /* free address slots */ |
|
236 |
uint_t maddr_flag; /* MADDR_VENDOR_ADDR bit can be set */ |
|
237 |
/* driver entry points */ |
|
238 |
void *maddr_handle; /* cookie to be used for the calls */ |
|
239 |
maddr_reserve_t maddr_reserve; /* reserve a factory address */ |
|
240 |
maddr_add_t maddr_add; /* add a new unicst address */ |
|
241 |
maddr_remove_t maddr_remove; /* remove an added address */ |
|
242 |
maddr_modify_t maddr_modify; /* modify an added address */ |
|
243 |
maddr_get_t maddr_get; /* get address from specified slot */ |
|
244 |
} multiaddress_capab_t; |
|
245 |
||
0 | 246 |
/* |
247 |
* MAC driver entry point types. |
|
248 |
*/ |
|
2311 | 249 |
typedef int (*mac_getstat_t)(void *, uint_t, uint64_t *); |
0 | 250 |
typedef int (*mac_start_t)(void *); |
251 |
typedef void (*mac_stop_t)(void *); |
|
2311 | 252 |
typedef int (*mac_setpromisc_t)(void *, boolean_t); |
0 | 253 |
typedef int (*mac_multicst_t)(void *, boolean_t, const uint8_t *); |
254 |
typedef int (*mac_unicst_t)(void *, const uint8_t *); |
|
2311 | 255 |
typedef void (*mac_ioctl_t)(void *, queue_t *, mblk_t *); |
0 | 256 |
typedef void (*mac_resources_t)(void *); |
257 |
typedef mblk_t *(*mac_tx_t)(void *, mblk_t *); |
|
2311 | 258 |
typedef boolean_t (*mac_getcapab_t)(void *, mac_capab_t, void *); |
0 | 259 |
|
260 |
/* |
|
2311 | 261 |
* Drivers must set all of these callbacks except for mc_resources, |
262 |
* mc_ioctl, and mc_getcapab, which are optional. If any of these optional |
|
263 |
* callbacks are set, their appropriate flags must be set in mc_callbacks. |
|
264 |
* Any future additions to this list must also be accompanied by an |
|
265 |
* associated mc_callbacks flag so that the framework can grow without |
|
266 |
* affecting the binary compatibility of the interface. |
|
0 | 267 |
*/ |
2311 | 268 |
typedef struct mac_callbacks_s { |
269 |
uint_t mc_callbacks; /* Denotes which callbacks are set */ |
|
270 |
mac_getstat_t mc_getstat; /* Get the value of a statistic */ |
|
271 |
mac_start_t mc_start; /* Start the device */ |
|
272 |
mac_stop_t mc_stop; /* Stop the device */ |
|
273 |
mac_setpromisc_t mc_setpromisc; /* Enable or disable promiscuous mode */ |
|
274 |
mac_multicst_t mc_multicst; /* Enable or disable a multicast addr */ |
|
275 |
mac_unicst_t mc_unicst; /* Set the unicast MAC address */ |
|
276 |
mac_tx_t mc_tx; /* Transmit a packet */ |
|
277 |
mac_resources_t mc_resources; /* Get the device resources */ |
|
278 |
mac_ioctl_t mc_ioctl; /* Process an unknown ioctl */ |
|
279 |
mac_getcapab_t mc_getcapab; /* Get capability information */ |
|
280 |
} mac_callbacks_t; |
|
0 | 281 |
|
282 |
/* |
|
2311 | 283 |
* Flags for mc_callbacks. Requiring drivers to set the flags associated |
284 |
* with optional callbacks initialized in the structure allows the mac |
|
285 |
* module to add optional callbacks in the future without requiring drivers |
|
286 |
* to recompile. |
|
0 | 287 |
*/ |
2311 | 288 |
#define MC_RESOURCES 0x001 |
289 |
#define MC_IOCTL 0x002 |
|
290 |
#define MC_GETCAPAB 0x004 |
|
291 |
||
292 |
typedef struct mac_register_s { |
|
293 |
uint_t m_version; /* set by mac_alloc() */ |
|
294 |
const char *m_type_ident; |
|
295 |
void *m_driver; /* Driver private data */ |
|
296 |
dev_info_t *m_dip; |
|
297 |
uint_t m_instance; |
|
298 |
uint8_t *m_src_addr; |
|
299 |
uint8_t *m_dst_addr; |
|
300 |
mac_callbacks_t *m_callbacks; |
|
301 |
uint_t m_min_sdu; |
|
302 |
uint_t m_max_sdu; |
|
303 |
void *m_pdata; |
|
304 |
size_t m_pdata_size; |
|
305 |
} mac_register_t; |
|
0 | 306 |
|
307 |
/* |
|
308 |
* Opaque handle types. |
|
309 |
*/ |
|
2311 | 310 |
typedef struct mac_t *mac_handle_t; |
0 | 311 |
typedef struct __mac_notify_handle *mac_notify_handle_t; |
312 |
typedef struct __mac_rx_handle *mac_rx_handle_t; |
|
313 |
typedef struct __mac_txloop_handle *mac_txloop_handle_t; |
|
314 |
typedef struct __mac_resource_handle *mac_resource_handle_t; |
|
315 |
||
316 |
/* |
|
317 |
* MAC interface callback types. |
|
318 |
*/ |
|
319 |
typedef enum { |
|
320 |
MAC_NOTE_LINK, |
|
321 |
MAC_NOTE_PROMISC, |
|
322 |
MAC_NOTE_UNICST, |
|
323 |
MAC_NOTE_TX, |
|
324 |
MAC_NOTE_RESOURCE, |
|
325 |
MAC_NOTE_DEVPROMISC, |
|
2311 | 326 |
MAC_NOTE_FASTPATH_FLUSH, |
5084 | 327 |
MAC_NOTE_VNIC, |
0 | 328 |
MAC_NNOTE /* must be the last entry */ |
329 |
} mac_notify_type_t; |
|
330 |
||
331 |
typedef void (*mac_notify_t)(void *, mac_notify_type_t); |
|
332 |
typedef void (*mac_rx_t)(void *, mac_resource_handle_t, mblk_t *); |
|
333 |
typedef void (*mac_txloop_t)(void *, mblk_t *); |
|
334 |
typedef void (*mac_blank_t)(void *, time_t, uint_t); |
|
335 |
||
336 |
/* |
|
337 |
* MAC promiscuous types |
|
338 |
*/ |
|
339 |
typedef enum { |
|
340 |
MAC_PROMISC = 0x01, /* MAC instance is promiscuous */ |
|
341 |
MAC_DEVPROMISC = 0x02 /* Device is promiscuous */ |
|
342 |
} mac_promisc_type_t; |
|
343 |
||
344 |
/* |
|
345 |
* MAC resource types |
|
346 |
*/ |
|
347 |
typedef enum { |
|
348 |
MAC_RX_FIFO = 1 |
|
349 |
} mac_resource_type_t; |
|
350 |
||
351 |
typedef struct mac_rx_fifo_s { |
|
352 |
mac_resource_type_t mrf_type; /* MAC_RX_FIFO */ |
|
353 |
mac_blank_t mrf_blank; |
|
354 |
void *mrf_arg; |
|
355 |
time_t mrf_normal_blank_time; |
|
356 |
uint_t mrf_normal_pkt_count; |
|
357 |
} mac_rx_fifo_t; |
|
358 |
||
56 | 359 |
typedef struct mac_txinfo_s { |
360 |
mac_tx_t mt_fn; |
|
361 |
void *mt_arg; |
|
362 |
} mac_txinfo_t; |
|
363 |
||
0 | 364 |
typedef union mac_resource_u { |
365 |
mac_resource_type_t mr_type; |
|
366 |
mac_rx_fifo_t mr_fifo; |
|
367 |
} mac_resource_t; |
|
368 |
||
369 |
typedef mac_resource_handle_t (*mac_resource_add_t)(void *, mac_resource_t *); |
|
370 |
||
2311 | 371 |
typedef enum { |
372 |
MAC_ADDRTYPE_UNICAST, |
|
373 |
MAC_ADDRTYPE_MULTICAST, |
|
374 |
MAC_ADDRTYPE_BROADCAST |
|
375 |
} mac_addrtype_t; |
|
376 |
||
377 |
typedef struct mac_header_info_s { |
|
378 |
size_t mhi_hdrsize; |
|
379 |
size_t mhi_pktsize; |
|
380 |
const uint8_t *mhi_daddr; |
|
381 |
const uint8_t *mhi_saddr; |
|
382 |
uint32_t mhi_origsap; |
|
383 |
uint32_t mhi_bindsap; |
|
384 |
mac_addrtype_t mhi_dsttype; |
|
2760 | 385 |
boolean_t mhi_istagged; |
386 |
uint16_t mhi_tci; |
|
2311 | 387 |
} mac_header_info_t; |
388 |
||
389 |
/* |
|
390 |
* MAC-Type plugin interfaces |
|
391 |
*/ |
|
392 |
||
393 |
typedef int (*mtops_addr_verify_t)(const void *, void *); |
|
394 |
typedef boolean_t (*mtops_sap_verify_t)(uint32_t, uint32_t *, void *); |
|
395 |
typedef mblk_t *(*mtops_header_t)(const void *, const void *, |
|
396 |
uint32_t, void *, mblk_t *, size_t); |
|
397 |
typedef int (*mtops_header_info_t)(mblk_t *, void *, |
|
398 |
mac_header_info_t *); |
|
399 |
typedef boolean_t (*mtops_pdata_verify_t)(void *, size_t); |
|
400 |
typedef mblk_t *(*mtops_header_modify_t)(mblk_t *, void *); |
|
4403 | 401 |
typedef void (*mtops_link_details_t)(char *, size_t, mac_handle_t, |
402 |
void *); |
|
2311 | 403 |
|
404 |
typedef struct mactype_ops_s { |
|
405 |
uint_t mtops_ops; |
|
406 |
/* |
|
407 |
* mtops_unicst_verify() returns 0 if the given address is a valid |
|
408 |
* unicast address, or a non-zero errno otherwise. |
|
409 |
*/ |
|
410 |
mtops_addr_verify_t mtops_unicst_verify; |
|
411 |
/* |
|
412 |
* mtops_multicst_verify() returns 0 if the given address is a |
|
413 |
* valid multicast address, or a non-zero errno otherwise. If the |
|
414 |
* media doesn't support multicast, ENOTSUP should be returned (for |
|
415 |
* example). |
|
416 |
*/ |
|
417 |
mtops_addr_verify_t mtops_multicst_verify; |
|
418 |
/* |
|
419 |
* mtops_sap_verify() returns B_TRUE if the given SAP is a valid |
|
420 |
* SAP value, or B_FALSE otherwise. |
|
421 |
*/ |
|
422 |
mtops_sap_verify_t mtops_sap_verify; |
|
423 |
/* |
|
424 |
* mtops_header() is used to allocate and construct a MAC header. |
|
425 |
*/ |
|
426 |
mtops_header_t mtops_header; |
|
427 |
/* |
|
428 |
* mtops_header_info() is used to gather information on a given MAC |
|
429 |
* header. |
|
430 |
*/ |
|
431 |
mtops_header_info_t mtops_header_info; |
|
432 |
/* |
|
433 |
* mtops_pdata_verify() is used to verify the validity of MAC |
|
434 |
* plugin data. It is called by mac_register() if the driver has |
|
435 |
* supplied MAC plugin data, and also by mac_pdata_update() when |
|
436 |
* drivers update the data. |
|
437 |
*/ |
|
438 |
mtops_pdata_verify_t mtops_pdata_verify; |
|
439 |
/* |
|
440 |
* mtops_header_cook() is an optional callback that converts (or |
|
441 |
* "cooks") the given raw header (as sent by a raw DLPI consumer) |
|
442 |
* into one that is appropriate to send down to the MAC driver. |
|
443 |
* Following the example above, an Ethernet header sent down by a |
|
444 |
* DLPI consumer would be converted to whatever header the MAC |
|
445 |
* driver expects. |
|
446 |
*/ |
|
447 |
mtops_header_modify_t mtops_header_cook; |
|
448 |
/* |
|
449 |
* mtops_header_uncook() is an optional callback that does the |
|
450 |
* opposite of mtops_header_cook(). It "uncooks" a given MAC |
|
451 |
* header (as received from the driver) for consumption by raw DLPI |
|
452 |
* consumers. For example, for a non-Ethernet plugin that wants |
|
453 |
* raw DLPI consumers to be fooled into thinking that the device |
|
454 |
* provides Ethernet access, this callback would modify the given |
|
455 |
* mblk_t such that the MAC header is converted to an Ethernet |
|
456 |
* header. |
|
457 |
*/ |
|
458 |
mtops_header_modify_t mtops_header_uncook; |
|
4403 | 459 |
/* |
460 |
* mtops_link_details() is an optional callback that provides |
|
461 |
* extended information about the link state. Its primary purpose |
|
462 |
* is to provide type-specific support for syslog contents on |
|
463 |
* link up events. If no implementation is provided, then a default |
|
464 |
* implementation will be used. |
|
465 |
*/ |
|
466 |
mtops_link_details_t mtops_link_details; |
|
2311 | 467 |
} mactype_ops_t; |
468 |
||
469 |
/* |
|
470 |
* mtops_ops exists for the plugin to enumerate the optional callback |
|
471 |
* entrypoints it has defined. This allows the mac module to define |
|
472 |
* additional plugin entrypoints in mactype_ops_t without breaking backward |
|
473 |
* compatibility with old plugins. |
|
474 |
*/ |
|
475 |
#define MTOPS_PDATA_VERIFY 0x001 |
|
476 |
#define MTOPS_HEADER_COOK 0x002 |
|
477 |
#define MTOPS_HEADER_UNCOOK 0x004 |
|
4403 | 478 |
#define MTOPS_LINK_DETAILS 0x008 |
2311 | 479 |
|
480 |
typedef struct mactype_register_s { |
|
481 |
uint_t mtr_version; /* set by mactype_alloc() */ |
|
482 |
const char *mtr_ident; |
|
483 |
mactype_ops_t *mtr_ops; |
|
484 |
uint_t mtr_mactype; |
|
3147 | 485 |
uint_t mtr_nativetype; |
2311 | 486 |
uint_t mtr_addrlen; |
487 |
uint8_t *mtr_brdcst_addr; |
|
488 |
mac_stat_info_t *mtr_stats; |
|
489 |
size_t mtr_statcount; |
|
490 |
} mactype_register_t; |
|
491 |
||
0 | 492 |
/* |
493 |
* Client interface functions. |
|
494 |
*/ |
|
5733 | 495 |
extern int mac_open(const char *, mac_handle_t *); |
0 | 496 |
extern void mac_close(mac_handle_t); |
497 |
extern const mac_info_t *mac_info(mac_handle_t); |
|
269
7ed63f24aa15
PSARC 2005/365 Nemo drivers interface simplification
ericheng
parents:
56
diff
changeset
|
498 |
extern boolean_t mac_info_get(const char *, mac_info_t *); |
2311 | 499 |
extern uint64_t mac_stat_get(mac_handle_t, uint_t); |
0 | 500 |
extern int mac_start(mac_handle_t); |
501 |
extern void mac_stop(mac_handle_t); |
|
502 |
extern int mac_promisc_set(mac_handle_t, boolean_t, |
|
503 |
mac_promisc_type_t); |
|
504 |
extern boolean_t mac_promisc_get(mac_handle_t, |
|
505 |
mac_promisc_type_t); |
|
506 |
extern int mac_multicst_add(mac_handle_t, const uint8_t *); |
|
507 |
extern int mac_multicst_remove(mac_handle_t, |
|
508 |
const uint8_t *); |
|
2331 | 509 |
extern boolean_t mac_unicst_verify(mac_handle_t, |
510 |
const uint8_t *, uint_t); |
|
0 | 511 |
extern int mac_unicst_set(mac_handle_t, const uint8_t *); |
512 |
extern void mac_unicst_get(mac_handle_t, uint8_t *); |
|
2311 | 513 |
extern void mac_dest_get(mac_handle_t, uint8_t *); |
0 | 514 |
extern void mac_resources(mac_handle_t); |
515 |
extern void mac_ioctl(mac_handle_t, queue_t *, mblk_t *); |
|
56 | 516 |
extern const mac_txinfo_t *mac_tx_get(mac_handle_t); |
5084 | 517 |
extern const mac_txinfo_t *mac_vnic_tx_get(mac_handle_t); |
0 | 518 |
extern link_state_t mac_link_get(mac_handle_t); |
519 |
extern mac_notify_handle_t mac_notify_add(mac_handle_t, mac_notify_t, |
|
520 |
void *); |
|
521 |
extern void mac_notify_remove(mac_handle_t, |
|
522 |
mac_notify_handle_t); |
|
523 |
extern void mac_notify(mac_handle_t); |
|
524 |
extern mac_rx_handle_t mac_rx_add(mac_handle_t, mac_rx_t, void *); |
|
5084 | 525 |
extern mac_rx_handle_t mac_active_rx_add(mac_handle_t, mac_rx_t, |
526 |
void *); |
|
4913
8d95fa5f1def
6489144 mi_rx_lock shouldn't be held across callbacks
ethindra
parents:
4403
diff
changeset
|
527 |
extern void mac_rx_remove(mac_handle_t, mac_rx_handle_t, |
8d95fa5f1def
6489144 mi_rx_lock shouldn't be held across callbacks
ethindra
parents:
4403
diff
changeset
|
528 |
boolean_t); |
8d95fa5f1def
6489144 mi_rx_lock shouldn't be held across callbacks
ethindra
parents:
4403
diff
changeset
|
529 |
extern void mac_rx_remove_wait(mac_handle_t); |
0 | 530 |
extern mblk_t *mac_txloop(void *, mblk_t *); |
531 |
extern mac_txloop_handle_t mac_txloop_add(mac_handle_t, mac_txloop_t, |
|
532 |
void *); |
|
533 |
extern void mac_txloop_remove(mac_handle_t, |
|
534 |
mac_txloop_handle_t); |
|
535 |
extern boolean_t mac_active_set(mac_handle_t); |
|
5084 | 536 |
extern boolean_t mac_active_shareable_set(mac_handle_t); |
0 | 537 |
extern void mac_active_clear(mac_handle_t); |
5084 | 538 |
extern void mac_active_rx(void *, mac_resource_handle_t, |
539 |
mblk_t *); |
|
540 |
extern boolean_t mac_vnic_set(mac_handle_t, mac_txinfo_t *, |
|
541 |
mac_getcapab_t, void *); |
|
542 |
extern void mac_vnic_clear(mac_handle_t); |
|
0 | 543 |
extern void mac_resource_set(mac_handle_t, |
544 |
mac_resource_add_t, void *); |
|
269
7ed63f24aa15
PSARC 2005/365 Nemo drivers interface simplification
ericheng
parents:
56
diff
changeset
|
545 |
extern dev_info_t *mac_devinfo_get(mac_handle_t); |
2311 | 546 |
extern boolean_t mac_capab_get(mac_handle_t, mac_capab_t, |
547 |
void *); |
|
5084 | 548 |
extern boolean_t mac_vnic_capab_get(mac_handle_t, mac_capab_t, |
549 |
void *); |
|
2311 | 550 |
extern boolean_t mac_sap_verify(mac_handle_t, uint32_t, |
551 |
uint32_t *); |
|
552 |
extern mblk_t *mac_header(mac_handle_t, const uint8_t *, |
|
553 |
uint32_t, mblk_t *, size_t); |
|
554 |
extern int mac_header_info(mac_handle_t, mblk_t *, |
|
555 |
mac_header_info_t *); |
|
556 |
extern mblk_t *mac_header_cook(mac_handle_t, mblk_t *); |
|
557 |
extern mblk_t *mac_header_uncook(mac_handle_t, mblk_t *); |
|
0 | 558 |
|
559 |
/* |
|
560 |
* Driver interface functions. |
|
561 |
*/ |
|
2311 | 562 |
extern mac_register_t *mac_alloc(uint_t); |
563 |
extern void mac_free(mac_register_t *); |
|
564 |
extern int mac_register(mac_register_t *, mac_handle_t *); |
|
5084 | 565 |
extern int mac_disable(mac_handle_t); |
2311 | 566 |
extern int mac_unregister(mac_handle_t); |
567 |
extern void mac_rx(mac_handle_t, mac_resource_handle_t, |
|
0 | 568 |
mblk_t *); |
2311 | 569 |
extern void mac_link_update(mac_handle_t, link_state_t); |
570 |
extern void mac_unicst_update(mac_handle_t, |
|
571 |
const uint8_t *); |
|
572 |
extern void mac_tx_update(mac_handle_t); |
|
573 |
extern void mac_resource_update(mac_handle_t); |
|
574 |
extern mac_resource_handle_t mac_resource_add(mac_handle_t, |
|
575 |
mac_resource_t *); |
|
576 |
extern int mac_pdata_update(mac_handle_t, void *, |
|
577 |
size_t); |
|
578 |
extern void mac_multicst_refresh(mac_handle_t, |
|
579 |
mac_multicst_t, void *, boolean_t); |
|
580 |
extern void mac_unicst_refresh(mac_handle_t, mac_unicst_t, |
|
0 | 581 |
void *); |
2311 | 582 |
extern void mac_promisc_refresh(mac_handle_t, |
583 |
mac_setpromisc_t, void *); |
|
269
7ed63f24aa15
PSARC 2005/365 Nemo drivers interface simplification
ericheng
parents:
56
diff
changeset
|
584 |
extern void mac_init_ops(struct dev_ops *, const char *); |
7ed63f24aa15
PSARC 2005/365 Nemo drivers interface simplification
ericheng
parents:
56
diff
changeset
|
585 |
extern void mac_fini_ops(struct dev_ops *); |
2311 | 586 |
extern mactype_register_t *mactype_alloc(uint_t); |
587 |
extern void mactype_free(mactype_register_t *); |
|
588 |
extern int mactype_register(mactype_register_t *); |
|
589 |
extern int mactype_unregister(const char *); |
|
3448 | 590 |
extern int mac_vlan_create(mac_handle_t, const char *, |
591 |
minor_t); |
|
592 |
extern void mac_vlan_remove(mac_handle_t, const char *); |
|
0 | 593 |
|
594 |
#endif /* _KERNEL */ |
|
595 |
||
596 |
#ifdef __cplusplus |
|
597 |
} |
|
598 |
#endif |
|
599 |
||
600 |
#endif /* _SYS_MAC_H */ |