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.
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.
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]
23 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright (c) 2018, Joyent, Inc.
25 * Copyright 2020 RackTop Systems, Inc.
26 * Copyright 2023 Oxide Computer Company
29 #ifndef _SYS_MAC_PROVIDER_H
30 #define _SYS_MAC_PROVIDER_H
32 #include <sys/types.h>
34 #include <sys/sunddi.h>
35 #include <sys/stream.h>
36 #include <sys/mkdev.h>
38 #include <sys/mac_flow.h>
41 * MAC Provider Interface
49 * MAC version identifiers. Drivers compiled against the stable V1 version
50 * of the API should register with MAC_VERSION_V1. ON drivers should use
51 * MAC_VERSION. This is used by mac_alloc() mac_register() to
52 * verify that incompatible drivers don't register.
54 #define MAC_VERSION_V1 0x1
55 #define MAC_VERSION MAC_VERSION_V1
58 * Possible values for ETHER_STAT_XCVR_INUSE statistic.
61 #define XCVR_UNDEFINED 0
73 * Definitions for MAC Drivers Capabilities
76 * MAC layer capabilities. These capabilities are handled by the drivers'
77 * mc_capab_get() callbacks. Some capabilities require the driver to fill
78 * in a given data structure, and others are simply boolean capabilities.
79 * Note that capability values must be powers of 2 so that consumers and
80 * providers of this interface can keep track of which capabilities they
81 * care about by keeping a bitfield of these things around somewhere.
85 * Public Capabilities (MAC_VERSION_V1)
87 MAC_CAPAB_HCKSUM
= 0x00000001, /* data is a uint32_t */
88 MAC_CAPAB_LSO
= 0x00000008, /* data is mac_capab_lso_t */
91 * Reserved capabilities, do not use
93 MAC_CAPAB_RESERVED1
= 0x00000002,
94 MAC_CAPAB_RESERVED2
= 0x00000004,
97 * Private driver capabilities
99 MAC_CAPAB_RINGS
= 0x00000010, /* data is mac_capab_rings_t */
100 MAC_CAPAB_SHARES
= 0x00000020, /* data is mac_capab_share_t */
101 MAC_CAPAB_MULTIFACTADDR
= 0x00000040, /* mac_data_multifactaddr_t */
104 * Private driver capabilities for use by the GLDv3 framework only
106 MAC_CAPAB_VNIC
= 0x00010000, /* data is mac_capab_vnic_t */
107 MAC_CAPAB_ANCHOR_VNIC
= 0x00020000, /* boolean only, no data */
108 MAC_CAPAB_AGGR
= 0x00040000, /* data is mac_capab_aggr_t */
109 MAC_CAPAB_NO_NATIVEVLAN
= 0x00080000, /* boolean only, no data */
110 MAC_CAPAB_NO_ZCOPY
= 0x00100000, /* boolean only, no data */
111 MAC_CAPAB_LEGACY
= 0x00200000, /* data is mac_capab_legacy_t */
112 MAC_CAPAB_VRRP
= 0x00400000, /* data is mac_capab_vrrp_t */
113 MAC_CAPAB_OVERLAY
= 0x00800000, /* boolean only, no data */
114 MAC_CAPAB_TRANSCEIVER
= 0x01000000, /* mac_capab_transceiver_t */
115 MAC_CAPAB_LED
= 0x02000000 /* data is mac_capab_led_t */
121 typedef struct lso_basic_tcp_ipv4_s
{
122 t_uscalar_t lso_max
; /* maximum payload */
123 } lso_basic_tcp_ipv4_t
;
125 typedef struct lso_basic_tcp_ipv6_s
{
126 t_uscalar_t lso_max
; /* maximum payload */
127 } lso_basic_tcp_ipv6_t
;
130 * Currently supported flags for LSO.
132 #define LSO_TX_BASIC_TCP_IPV4 0x01 /* TCPv4 LSO capability */
133 #define LSO_TX_BASIC_TCP_IPV6 0x02 /* TCPv6 LSO capability */
136 * Future LSO capabilities can be added at the end of the mac_capab_lso_t.
137 * When such capability is added to the GLDv3 framework, the size of the
138 * mac_capab_lso_t it allocates and passes to the drivers increases. Older
139 * drivers wil access only the (upper) sections of that structure, that is the
140 * sections carrying the capabilities they understand. This ensures the
141 * interface can be safely extended in a binary compatible way.
143 typedef struct mac_capab_lso_s
{
144 t_uscalar_t lso_flags
;
145 lso_basic_tcp_ipv4_t lso_basic_tcp_ipv4
;
146 lso_basic_tcp_ipv6_t lso_basic_tcp_ipv6
;
147 /* Add future lso capabilities here */
151 * Multiple Factory MAC Addresses Capability
153 typedef struct mac_capab_multifactaddr_s
{
155 * Number of factory addresses
160 * Callbacks to query all the factory addresses.
162 void (*mcm_getaddr
)(void *, uint_t
, uint8_t *);
163 } mac_capab_multifactaddr_t
;
166 * Info and callbacks of legacy devices.
168 typedef struct mac_capab_legacy_s
{
170 * Notifications that the legacy device does not support.
172 uint32_t ml_unsup_note
;
174 * dev_t of the legacy device; can be held to force attach.
177 boolean_t (*ml_active_set
)(void *);
178 void (*ml_active_clear
)(void *);
179 int (*ml_fastpath_disable
)(void *);
180 void (*ml_fastpath_enable
)(void *);
181 } mac_capab_legacy_t
;
183 typedef struct __mac_prop_info_handle
*mac_prop_info_handle_t
;
186 * MAC driver entry point types.
188 typedef int (*mac_getstat_t
)(void *, uint_t
, uint64_t *);
189 typedef int (*mac_start_t
)(void *);
190 typedef void (*mac_stop_t
)(void *);
191 typedef int (*mac_setpromisc_t
)(void *, boolean_t
);
192 typedef int (*mac_multicst_t
)(void *, boolean_t
, const uint8_t *);
193 typedef int (*mac_unicst_t
)(void *, const uint8_t *);
194 typedef void (*mac_ioctl_t
)(void *, queue_t
*, mblk_t
*);
195 typedef void (*mac_resources_t
)(void *);
196 typedef mblk_t
*(*mac_tx_t
)(void *, mblk_t
*);
197 typedef boolean_t (*mac_getcapab_t
)(void *, mac_capab_t
, void *);
198 typedef int (*mac_open_t
)(void *);
199 typedef void (*mac_close_t
)(void *);
200 typedef int (*mac_set_prop_t
)(void *, const char *, mac_prop_id_t
,
201 uint_t
, const void *);
202 typedef int (*mac_get_prop_t
)(void *, const char *, mac_prop_id_t
,
204 typedef void (*mac_prop_info_t
)(void *, const char *, mac_prop_id_t
,
205 mac_prop_info_handle_t
);
208 * Driver callbacks. The following capabilities are optional, and if
209 * implemented by the driver, must have a corresponding MC_ flag set
210 * in the mc_callbacks field.
212 * Any future additions to this list must also be accompanied by an
213 * associated mc_callbacks flag so that the framework can grow without
214 * affecting the binary compatibility of the interface.
216 typedef struct mac_callbacks_s
{
217 uint_t mc_callbacks
; /* Denotes which callbacks are set */
218 mac_getstat_t mc_getstat
; /* Get the value of a statistic */
219 mac_start_t mc_start
; /* Start the device */
220 mac_stop_t mc_stop
; /* Stop the device */
221 mac_setpromisc_t mc_setpromisc
; /* Enable or disable promiscuous mode */
222 mac_multicst_t mc_multicst
; /* Enable or disable a multicast addr */
223 mac_unicst_t mc_unicst
; /* Set the unicast MAC address */
224 mac_tx_t mc_tx
; /* Transmit a packet */
225 void *mc_reserved
; /* Reserved, do not use */
226 mac_ioctl_t mc_ioctl
; /* Process an unknown ioctl */
227 mac_getcapab_t mc_getcapab
; /* Get capability information */
228 mac_open_t mc_open
; /* Open the device */
229 mac_close_t mc_close
; /* Close the device */
230 mac_set_prop_t mc_setprop
;
231 mac_get_prop_t mc_getprop
;
232 mac_prop_info_t mc_propinfo
;
236 * Flags for mc_callbacks. Requiring drivers to set the flags associated
237 * with optional callbacks initialized in the structure allows the mac
238 * module to add optional callbacks in the future without requiring drivers
241 #define MC_RESERVED 0x0001
242 #define MC_IOCTL 0x0002
243 #define MC_GETCAPAB 0x0004
244 #define MC_OPEN 0x0008
245 #define MC_CLOSE 0x0010
246 #define MC_SETPROP 0x0020
247 #define MC_GETPROP 0x0040
248 #define MC_PROPINFO 0x0080
249 #define MC_PROPERTIES (MC_SETPROP | MC_GETPROP | MC_PROPINFO)
252 * Virtualization Capabilities
256 * The type of ring classification. This is used by MAC to determine
257 * what, if any, processing it has to do upon receiving traffic on a
258 * particular Rx ring.
262 * No classification has been set. No traffic should cross an Rx
263 * ring in this state.
267 * The driver delivers traffic for multiple clients to this ring.
268 * All traffic must be software classified by MAC to guarantee
269 * delivery to the correct client. This classification type may
270 * be chosen for several reasons.
272 * o The driver provides only one group and there are multiple
273 * clients using the MAC.
275 * o The driver provides some hardware filtering but not enough
276 * to fully classify the traffic. E.g., a VLAN VNIC requires L2
277 * unicast address filtering as well as VLAN filtering, but
278 * some drivers may only support the former.
280 * o The ring belongs to the default group. The default group
281 * acts as a spillover for all clients that can't reserve an
282 * exclusive group. It also handles multicast traffic for all
283 * clients. For these reasons, the default group's rings are
284 * always software classified.
288 * The driver delivers traffic for a single MAC client across
289 * this ring. With this guarantee, MAC can simply pass the
290 * traffic up the stack or even allow polling of the ring.
292 * MAC_PASSTHRU_CLASSIFIER
294 * The ring is in "passthru" mode. In this mode we bypass all of
295 * the typical MAC processing and pass the traffic directly to
296 * the mr_pt_fn callback, see mac_rx_common(). This is used in
297 * cases where there is another module acting as MAC provider on
298 * behalf of the driver. E.g., link aggregations use this mode to
299 * take full control of the port's rings; allowing it to enforce
300 * LACP protocols and aggregate rings across discrete drivers.
303 MAC_NO_CLASSIFIER
= 0,
306 MAC_PASSTHRU_CLASSIFIER
307 } mac_classify_type_t
;
309 typedef void (*mac_rx_func_t
)(void *, mac_resource_handle_t
, mblk_t
*,
313 * The virtualization level conveys the extent of the NIC hardware assistance
314 * for traffic steering employed for virtualization:
316 * MAC_VIRT_NONE: No assist for v12n.
318 * MAC_VIRT_LEVEL1: Multiple Rx rings with MAC address level
319 * classification between groups of rings.
320 * Requires the support of the MAC_CAPAB_RINGS
323 * MAC_VIRT_HIO: Hybrid I/O capable MAC. Require the support
324 * of the MAC_CAPAB_SHARES capability.
326 #define MAC_VIRT_NONE 0x0
327 #define MAC_VIRT_LEVEL1 0x1
328 #define MAC_VIRT_HIO 0x2
331 MAC_RING_TYPE_RX
= 1, /* Receive ring */
332 MAC_RING_TYPE_TX
/* Transmit ring */
336 * The value VLAN_ID_NONE (VID 0) means a client does not have
337 * membership to any VLAN. However, this statement is true for both
338 * untagged packets and priority tagged packets leading to confusion
339 * over what semantic is intended. To the provider, VID 0 is a valid
340 * VID when priority tagging is in play. To MAC and everything above
341 * VLAN_ID_NONE almost universally implies untagged traffic. Thus, we
342 * convert VLAN_ID_NONE to a sentinel value (MAC_VLAN_UNTAGGED) at the
343 * border between MAC and MAC provider. This informs the provider that
344 * the client is interested in untagged traffic and the provider
345 * should set any relevant bits to receive such traffic.
347 * Currently, the API between MAC and the provider passes the VID as a
348 * unit16_t. In the future this could actually be the entire TCI mask
349 * (PCP, DEI, and VID). This current scheme is safe in that potential
350 * future world as well; as 0xFFFF is not a valid TCI (the 0xFFF VID
351 * is reserved and never transmitted across networks).
353 #define MAC_VLAN_UNTAGGED UINT16_MAX
354 #define MAC_VLAN_UNTAGGED_VID(vid) \
355 (((vid) == VLAN_ID_NONE) ? MAC_VLAN_UNTAGGED : (vid))
358 * Grouping type of a ring group
360 * MAC_GROUP_TYPE_STATIC: The ring group can not be re-grouped.
361 * MAC_GROUP_TYPE_DYNAMIC: The ring group support dynamic re-grouping
364 MAC_GROUP_TYPE_STATIC
= 1, /* Static ring group */
365 MAC_GROUP_TYPE_DYNAMIC
/* Dynamic ring group */
368 typedef struct __mac_ring_driver
*mac_ring_driver_t
;
369 typedef struct __mac_group_driver
*mac_group_driver_t
;
371 typedef struct mac_ring_info_s mac_ring_info_t
;
372 typedef struct mac_group_info_s mac_group_info_t
;
374 typedef void (*mac_get_ring_t
)(void *, mac_ring_type_t
, const int, const int,
375 mac_ring_info_t
*, mac_ring_handle_t
);
376 typedef void (*mac_get_group_t
)(void *, mac_ring_type_t
, const int,
377 mac_group_info_t
*, mac_group_handle_t
);
379 typedef void (*mac_group_add_ring_t
)(mac_group_driver_t
,
380 mac_ring_driver_t
, mac_ring_type_t
);
381 typedef void (*mac_group_rem_ring_t
)(mac_group_driver_t
,
382 mac_ring_driver_t
, mac_ring_type_t
);
385 * Multiple Rings Capability
387 typedef struct mac_capab_rings_s
{
388 mac_ring_type_t mr_type
; /* Ring type: Rx vs Tx */
389 mac_group_type_t mr_group_type
; /* Dynamic vs static grouping */
390 uint_t mr_rnum
; /* Number of rings */
391 uint_t mr_gnum
; /* Number of ring groups */
392 mac_get_ring_t mr_rget
; /* Get ring from driver */
393 mac_get_group_t mr_gget
; /* Get ring group from driver */
394 mac_group_add_ring_t mr_gaddring
; /* Add ring into a group */
395 mac_group_rem_ring_t mr_gremring
; /* Remove ring from a group */
399 * Common ring functions and driver interfaces
401 typedef int (*mac_ring_start_t
)(mac_ring_driver_t
, uint64_t);
402 typedef void (*mac_ring_stop_t
)(mac_ring_driver_t
);
404 typedef mblk_t
*(*mac_ring_send_t
)(void *, mblk_t
*);
405 typedef mblk_t
*(*mac_ring_poll_t
)(void *, int);
407 typedef int (*mac_ring_stat_t
)(mac_ring_driver_t
, uint_t
, uint64_t *);
409 typedef struct mac_ring_info_s
{
410 mac_ring_driver_t mri_driver
;
411 mac_ring_start_t mri_start
;
412 mac_ring_stop_t mri_stop
;
415 mac_ring_send_t send
;
416 mac_ring_poll_t poll
;
418 mac_ring_stat_t mri_stat
;
421 * mri_flags will have some bits set to indicate some special
422 * property/feature of a ring like serialization needed for a
423 * Tx ring or packets should always need enqueuing on Rx side,
429 #define mri_tx mrfunion.send
430 #define mri_poll mrfunion.poll
433 * #defines for mri_flags. The flags are temporary flags that are provided
434 * only to workaround issues in specific drivers, and they will be
435 * removed in the future.
437 * These are consumed only by sun4v and neptune (nxge).
439 #define MAC_RING_TX_SERIALIZE 0x1
440 #define MAC_RING_RX_ENQUEUE 0x2
442 typedef int (*mac_group_start_t
)(mac_group_driver_t
);
443 typedef void (*mac_group_stop_t
)(mac_group_driver_t
);
444 typedef int (*mac_add_mac_addr_t
)(void *, const uint8_t *);
445 typedef int (*mac_rem_mac_addr_t
)(void *, const uint8_t *);
446 typedef int (*mac_add_vlan_filter_t
)(mac_group_driver_t
, uint16_t);
447 typedef int (*mac_rem_vlan_filter_t
)(mac_group_driver_t
, uint16_t);
449 struct mac_group_info_s
{
450 mac_group_driver_t mgi_driver
; /* Driver reference */
451 mac_group_start_t mgi_start
; /* Start the group */
452 mac_group_stop_t mgi_stop
; /* Stop the group */
453 uint_t mgi_count
; /* Count of rings */
454 mac_intr_t mgi_intr
; /* Optional per-group intr */
456 /* Only used for Rx groups */
457 mac_add_mac_addr_t mgi_addmac
; /* Add a MAC address */
458 mac_rem_mac_addr_t mgi_remmac
; /* Remove a MAC address */
459 mac_add_vlan_filter_t mgi_addvlan
; /* Add a VLAN filter */
460 mac_rem_vlan_filter_t mgi_remvlan
; /* Remove a VLAN filter */
464 * Share management functions.
466 typedef uint64_t mac_share_handle_t
;
469 * Allocate and free a share. Returns ENOSPC if all shares have been
470 * previously allocated.
472 typedef int (*mac_alloc_share_t
)(void *, mac_share_handle_t
*);
473 typedef void (*mac_free_share_t
)(mac_share_handle_t
);
476 * Bind and unbind a share. Binding a share allows a domain
477 * to have direct access to the groups and rings associated with
480 typedef int (*mac_bind_share_t
)(mac_share_handle_t
, uint64_t, uint64_t *);
481 typedef void (*mac_unbind_share_t
)(mac_share_handle_t
);
484 * Return information on about a share.
486 typedef void (*mac_share_query_t
)(mac_share_handle_t
, mac_ring_type_t
,
487 mac_ring_handle_t
*, uint_t
*);
490 * Basic idea, bind previously created ring groups to shares
491 * for them to be exported (or shared) by another domain.
492 * These interfaces bind/unbind the ring group to a share.
493 * The groups and their rings will be shared with the guest
494 * as soon as the share is bound.
496 typedef int (*mac_share_add_group_t
)(mac_share_handle_t
,
498 typedef int (*mac_share_rem_group_t
)(mac_share_handle_t
,
501 typedef struct mac_capab_share_s
{
502 uint_t ms_snum
; /* Number of shares (vr's) */
503 void *ms_handle
; /* Handle to driver. */
504 mac_alloc_share_t ms_salloc
; /* Get a share from driver. */
505 mac_free_share_t ms_sfree
; /* Return a share to driver. */
506 mac_share_add_group_t ms_sadd
; /* Add a group to the share. */
507 mac_share_rem_group_t ms_sremove
; /* Remove group from share. */
508 mac_share_query_t ms_squery
; /* Query share constraints */
509 mac_bind_share_t ms_sbind
; /* Bind a share */
510 mac_unbind_share_t ms_sunbind
; /* Unbind a share */
513 typedef struct mac_capab_vrrp_s
{
519 * Transceiver capability
521 typedef struct mac_transceiver_info mac_transceiver_info_t
;
523 typedef struct mac_capab_transceiver
{
525 uint_t mct_ntransceivers
;
526 int (*mct_info
)(void *, uint_t
, mac_transceiver_info_t
*);
527 int (*mct_read
)(void *, uint_t
, uint_t
, void *, size_t, off_t
,
529 } mac_capab_transceiver_t
;
534 typedef struct mac_capab_led
{
536 mac_led_mode_t mcl_modes
;
537 int (*mcl_set
)(void *, mac_led_mode_t
, uint_t
);
541 * MAC registration interface
543 typedef struct mac_register_s
{
544 uint_t m_version
; /* set by mac_alloc() */
545 const char *m_type_ident
;
546 void *m_driver
; /* Driver private data */
551 mac_callbacks_t
*m_callbacks
;
558 uint32_t m_v12n
; /* Virtualization level */
559 uint_t m_multicast_sdu
;
563 * Driver interface functions.
565 extern mac_protect_t
*mac_protect_get(mac_handle_t
);
566 extern void mac_sdu_get(mac_handle_t
, uint_t
*, uint_t
*);
567 extern void mac_sdu_get2(mac_handle_t
, uint_t
*, uint_t
*,
569 extern int mac_maxsdu_update(mac_handle_t
, uint_t
);
570 extern int mac_maxsdu_update2(mac_handle_t
, uint_t
,
573 extern mac_register_t
*mac_alloc(uint_t
);
574 extern void mac_free(mac_register_t
*);
575 extern int mac_register(mac_register_t
*, mac_handle_t
*);
576 extern int mac_disable_nowait(mac_handle_t
);
577 extern int mac_disable(mac_handle_t
);
578 extern int mac_unregister(mac_handle_t
);
579 extern void mac_rx(mac_handle_t
, mac_resource_handle_t
,
581 extern void mac_rx_ring(mac_handle_t
, mac_ring_handle_t
,
583 extern void mac_link_update(mac_handle_t
, link_state_t
);
584 extern void mac_link_redo(mac_handle_t
, link_state_t
);
585 extern void mac_unicst_update(mac_handle_t
,
587 extern void mac_dst_update(mac_handle_t
, const uint8_t *);
588 extern void mac_tx_update(mac_handle_t
);
589 extern void mac_tx_ring_update(mac_handle_t
,
591 extern void mac_capab_update(mac_handle_t
);
592 extern int mac_pdata_update(mac_handle_t
, void *,
594 extern void mac_multicast_refresh(mac_handle_t
,
595 mac_multicst_t
, void *, boolean_t
);
596 extern void mac_unicst_refresh(mac_handle_t
, mac_unicst_t
,
598 extern void mac_promisc_refresh(mac_handle_t
,
599 mac_setpromisc_t
, void *);
600 extern boolean_t
mac_margin_update(mac_handle_t
, uint32_t);
601 extern void mac_margin_get(mac_handle_t
, uint32_t *);
602 extern int mac_margin_remove(mac_handle_t
, uint32_t);
603 extern int mac_margin_add(mac_handle_t
, uint32_t *,
605 extern void mac_init_ops(struct dev_ops
*, const char *);
606 extern void mac_fini_ops(struct dev_ops
*);
607 extern int mac_devt_to_instance(dev_t
);
608 extern int mac_getinfo(dev_info_t
*, ddi_info_cmd_t
,
610 extern minor_t
mac_private_minor(void);
611 extern void mac_ring_intr_set(mac_ring_handle_t
,
615 extern mactype_register_t
*mactype_alloc(uint_t
);
616 extern void mactype_free(mactype_register_t
*);
617 extern int mactype_register(mactype_register_t
*);
618 extern int mactype_unregister(const char *);
620 extern boolean_t
mac_unicst_verify(mac_handle_t
,
621 const uint8_t *, uint_t
);
623 extern int mac_group_add_ring(mac_group_handle_t
, int);
624 extern void mac_group_rem_ring(mac_group_handle_t
,
626 extern mac_ring_handle_t
mac_find_ring(mac_group_handle_t
, int);
628 extern void mac_prop_info_set_default_uint8(
629 mac_prop_info_handle_t
, uint8_t);
630 extern void mac_prop_info_set_default_str(
631 mac_prop_info_handle_t
, const char *);
632 extern void mac_prop_info_set_default_uint64(
633 mac_prop_info_handle_t
, uint64_t);
634 extern void mac_prop_info_set_default_uint32(
635 mac_prop_info_handle_t
, uint32_t);
636 extern void mac_prop_info_set_default_link_flowctrl(
637 mac_prop_info_handle_t
, link_flowctrl_t
);
638 extern void mac_prop_info_set_default_fec(
639 mac_prop_info_handle_t
, link_fec_t
);
640 extern void mac_prop_info_set_range_uint32(
641 mac_prop_info_handle_t
,
643 extern void mac_prop_info_set_perm(mac_prop_info_handle_t
,
646 extern void mac_hcksum_get(const mblk_t
*, uint32_t *,
647 uint32_t *, uint32_t *, uint32_t *,
649 extern void mac_hcksum_set(mblk_t
*, uint32_t, uint32_t,
650 uint32_t, uint32_t, uint32_t);
651 extern void mac_hcksum_clone(const mblk_t
*, mblk_t
*);
653 extern void mac_lso_get(mblk_t
*, uint32_t *, uint32_t *);
655 extern void mac_transceiver_info_set_present(
656 mac_transceiver_info_t
*,
658 extern void mac_transceiver_info_set_usable(
659 mac_transceiver_info_t
*,
663 * This represents a provisional set of currently illumos-private APIs to get
664 * information about a mblk_t chain's type. This is an evolving interface.
666 typedef enum mac_ether_offload_flags
{
667 MEOI_L2INFO_SET
= 1 << 0,
668 MEOI_VLAN_TAGGED
= 1 << 1,
669 MEOI_L3INFO_SET
= 1 << 2,
670 MEOI_L4INFO_SET
= 1 << 3
671 } mac_ether_offload_flags_t
;
673 typedef struct mac_ether_offload_info
{
674 mac_ether_offload_flags_t meoi_flags
; /* What's valid? */
675 size_t meoi_len
; /* Total message length */
676 uint8_t meoi_l2hlen
; /* How long is the Ethernet header? */
677 uint16_t meoi_l3proto
; /* What's the Ethertype */
678 uint16_t meoi_l3hlen
; /* How long is the header? */
679 uint8_t meoi_l4proto
; /* What is the payload type? */
680 uint8_t meoi_l4hlen
; /* How long is the L4 header */
681 } mac_ether_offload_info_t
;
683 extern int mac_ether_offload_info(mblk_t
*,
684 mac_ether_offload_info_t
*);
693 #endif /* _SYS_MAC_PROVIDER_H */