mac_provider.h revision 1cb875ae88fb9463b368e725c2444776595895cb
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * CDDL HEADER START
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * The contents of this file are subject to the terms of the
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Common Development and Distribution License (the "License").
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * You may not use this file except in compliance with the License.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * See the License for the specific language governing permissions
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * and limitations under the License.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * When distributing Covered Code, include this CDDL HEADER in each
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * If applicable, add the following below this CDDL HEADER, with the
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * fields enclosed by brackets "[]" replaced with your own identifying
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * information: Portions Copyright [yyyy] [name of copyright owner]
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * CDDL HEADER END
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Use is subject to license terms.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC Provider Interface
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern "C" {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC version identifier. This is used by mac_alloc() mac_register() to
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * verify that incompatible drivers don't register.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Opaque handle types
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Statistics
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Definitions for MAC Drivers Capabilities
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC layer capabilities. These capabilities are handled by the drivers'
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * mc_capab_get() callbacks. Some capabilities require the driver to fill
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * in a given data structure, and others are simply boolean capabilities.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Note that capability values must be powers of 2 so that consumers and
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * providers of this interface can keep track of which capabilities they
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * care about by keeping a bitfield of these things around somewhere.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Capabilities reserved for internal use only
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_ANCHOR_VNIC = 0x0002, /* boolean only, no data */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_NO_NATIVEVLAN = 0x0008, /* boolean only, no data */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_LEGACY = 0x0020, /* data is mac_capab_legacy_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Public Capabilities
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_RINGS = 0x0400, /* data is mac_capab_rings_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_MULTIFACTADDR = 0x0800, /* mac_data_multifactaddr_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_SHARES = 0x1000 /* data is mac_capab_share_t */
aa81749390e332985277568edab1ee6132326b42gs /* add new capabilities here */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * LSO capability
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebtypedef struct lso_basic_tcp_ipv4_s {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Currently supported flags for LSO.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb#define LSO_TX_BASIC_TCP_IPV4 0x01 /* TCP LSO capability */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Future LSO capabilities can be added at the end of the mac_capab_lso_t.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * When such capability is added to the GLDv3 framework, the size of the
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * mac_capab_lso_t it allocates and passes to the drivers increases. Older
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * drivers wil access only the (upper) sections of that structure, that is the
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * sections carrying the capabilities they understand. This ensures the
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * interface can be safely extended in a binary compatible way.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebtypedef struct mac_capab_lso_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /* Add future lso capabilities here */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Multiple Factory MAC Addresses Capability
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_multifactaddr_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Number of factory addresses
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Callbacks to query all the factory addresses.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Info and callbacks of legacy devices.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_legacy_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Notifications that the legacy device does not support.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * dev_t of the legacy device; can be held to force attach.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs void (*ml_active_clear)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs int (*ml_fastpath_disable)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs void (*ml_fastpath_enable)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC driver entry point types.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_start_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_stop_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_multicst_t)(void *, boolean_t, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_resources_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef boolean_t (*mac_getcapab_t)(void *, mac_capab_t, void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_open_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_close_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_set_prop_t)(void *, const char *, mac_prop_id_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t, const void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_get_prop_t)(void *, const char *, mac_prop_id_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Drivers must set all of these callbacks except for mc_resources,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * mc_ioctl, and mc_getcapab, which are optional. If any of these optional
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * callbacks are set, their appropriate flags must be set in mc_callbacks.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Any future additions to this list must also be accompanied by an
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * associated mc_callbacks flag so that the framework can grow without
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * affecting the binary compatibility of the interface.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_callbacks_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t mc_callbacks; /* Denotes which callbacks are set */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_getstat_t mc_getstat; /* Get the value of a statistic */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_setpromisc_t mc_setpromisc; /* Enable or disable promiscuous mode */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_multicst_t mc_multicst; /* Enable or disable a multicast addr */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_unicst_t mc_unicst; /* Set the unicast MAC address */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_getcapab_t mc_getcapab; /* Get capability information */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_priv_prop_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Virtualization Capabilities
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * The ordering of entries below is important. MAC_HW_CLASSIFIER
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * is the cutoff below which are entries which don't depend on
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * H/W. MAC_HW_CLASSIFIER and entries after that are cases where
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * H/W has been updated through add/modify/delete APIs.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_rx_func_t)(void *, mac_resource_handle_t, mblk_t *,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * The virtualization level conveys the extent of the NIC hardware assistance
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * for traffic steering employed for virtualization:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_VIRT_NONE: No assist for v12n.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_VIRT_LEVEL1: Multiple Rx rings with MAC address level
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * classification between groups of rings.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Requires the support of the MAC_CAPAB_RINGS
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * capability.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_VIRT_HIO: Hybrid I/O capable MAC. Require the support
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * of the MAC_CAPAB_SHARES capability.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_VIRT_SERIALIZE: Temporary flag *ONLY* for nxge. Mac layer
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * uses this to enable mac Tx serializer on
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * outbound traffic and to always enqueue
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * incoming traffic on Rx soft rings in mac.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Grouping type of a ring group
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_GROUP_TYPE_STATIC: The ring group can not be re-grouped.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_GROUP_TYPE_DYNAMIC: The ring group support dynamic re-grouping
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_get_ring_t)(void *, mac_ring_type_t, const int, const int,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_get_group_t)(void *, mac_ring_type_t, const int,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Multiple Rings Capability
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_rings_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_type_t mr_group_type; /* Dynamic vs static grouping */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_get_group_t mr_gget; /* Get ring group from driver */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_add_ring_t mr_gaddring; /* Add ring into a group */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_rem_ring_t mr_gremring; /* Remove ring from a group */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Common ring functions and driver interfaces
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_ring_start_t)(mac_ring_driver_t, uint64_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_ring_info_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_add_mac_addr_t)(void *, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_rem_mac_addr_t)(void *, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /* Only used for rx groups */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_rem_mac_addr_t mgi_remmac; /* Remove a MAC address */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Share management functions.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Allocate and free a share. Returns ENOSPC if all shares have been
aa81749390e332985277568edab1ee6132326b42gs * previously allocated.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_alloc_share_t)(void *, mac_share_handle_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Bind and unbind a share. Binding a share allows a domain
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * to have direct access to the groups and rings associated with
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * that share.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_bind_share_t)(mac_share_handle_t, uint64_t, uint64_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Return information on about a share.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_share_query_t)(mac_share_handle_t, mac_ring_type_t,
aa81749390e332985277568edab1ee6132326b42gs * Basic idea, bind previously created ring groups to shares
aa81749390e332985277568edab1ee6132326b42gs * for them to be exported (or shared) by another domain.
aa81749390e332985277568edab1ee6132326b42gs * These interfaces bind/unbind the ring group to a share.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * The groups and their rings will be shared with the guest
aa81749390e332985277568edab1ee6132326b42gs * as soon as the share is bound.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_share_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_alloc_share_t ms_salloc; /* Get a share from driver. */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_free_share_t ms_sfree; /* Return a share to driver. */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_share_add_group_t ms_sadd; /* Add a group to the share. */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_share_rem_group_t ms_sremove; /* Remove group from share. */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_share_query_t ms_squery; /* Query share constraints */
aa81749390e332985277568edab1ee6132326b42gstypedef struct mac_capab_vrrp_s {
aa81749390e332985277568edab1ee6132326b42gs /* IPv6 or IPv4? */
aa81749390e332985277568edab1ee6132326b42gs * MAC registration interface
aa81749390e332985277568edab1ee6132326b42gstypedef struct mac_register_s {
aa81749390e332985277568edab1ee6132326b42gs const char *m_type_ident;
aa81749390e332985277568edab1ee6132326b42gs * Flags for mc_callbacks. Requiring drivers to set the flags associated
aa81749390e332985277568edab1ee6132326b42gs * with optional callbacks initialized in the structure allows the mac
aa81749390e332985277568edab1ee6132326b42gs * module to add optional callbacks in the future without requiring drivers
aa81749390e332985277568edab1ee6132326b42gs * to recompile.
aa81749390e332985277568edab1ee6132326b42gs * Driver interface functions.
aa81749390e332985277568edab1ee6132326b42gsextern void mac_sdu_get(mac_handle_t, uint_t *, uint_t *);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_register(mac_register_t *, mac_handle_t *);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_dst_update(mac_handle_t, const uint8_t *);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_unicst_refresh(mac_handle_t, mac_unicst_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern boolean_t mac_margin_update(mac_handle_t, uint32_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern int mactype_unregister(const char *);
aa81749390e332985277568edab1ee6132326b42gs#endif /* _KERNEL */
aa81749390e332985277568edab1ee6132326b42gs#endif /* _SYS_MAC_PROVIDER_H */