mac_provider.h revision 1cb875ae88fb9463b368e725c2444776595895cb
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * CDDL HEADER START
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
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 *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * or http://www.opensolaris.org/os/licensing.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * See the License for the specific language governing permissions
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * and limitations under the License.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
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 *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * CDDL HEADER END
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
5ca61e50c68a7a60dc35cd76831471faa4974d71Li-Zhen You/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Use is subject to license terms.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#ifndef _SYS_MAC_PROVIDER_H
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define _SYS_MAC_PROVIDER_H
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/types.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/ddi.h>
193974072f41a843678abf5f61979c748687e66bSherry Moore#include <sys/sunddi.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/stream.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/mkdev.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/mac_flow.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/mac.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC Provider Interface
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#ifdef __cplusplus
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern "C" {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#endif
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC version identifier. This is used by mac_alloc() mac_register() to
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * verify that incompatible drivers don't register.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define MAC_VERSION 0x2
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Opaque handle types
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct __mac_rule_handle *mac_rule_handle_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Statistics
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_UNDEFINED 0
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_NONE 1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_10 2
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_100T4 3
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_100X 4
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_100T2 5
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_1000X 6
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define XCVR_1000T 7
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#ifdef _KERNEL
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Definitions for MAC Drivers Capabilities
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
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.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Capabilities reserved for internal use only
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_VNIC = 0x0001, /* data is mac_capab_vnic_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_ANCHOR_VNIC = 0x0002, /* boolean only, no data */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_AGGR = 0x0004, /* data is mac_capab_aggr_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_NO_NATIVEVLAN = 0x0008, /* boolean only, no data */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_NO_ZCOPY = 0x0010, /* boolean only, no data */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_LEGACY = 0x0020, /* data is mac_capab_legacy_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_VRRP = 0x0040, /* data is mac_capab_vrrp_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Public Capabilities
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_HCKSUM = 0x0100, /* data is a uint32_t */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_CAPAB_LSO = 0x0200, /* data is mac_capab_lso_t */
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
aa81749390e332985277568edab1ee6132326b42gs /* add new capabilities here */
aa81749390e332985277568edab1ee6132326b42gs} mac_capab_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb/*
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * LSO capability
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebtypedef struct lso_basic_tcp_ipv4_s {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb t_uscalar_t lso_max; /* maximum payload */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb} lso_basic_tcp_ipv4_t;
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb * Currently supported flags for LSO.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb#define LSO_TX_BASIC_TCP_IPV4 0x01 /* TCP LSO capability */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb/*
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.
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932sebtypedef struct mac_capab_lso_s {
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb t_uscalar_t lso_flags;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lso_basic_tcp_ipv4_t lso_basic_tcp_ipv4;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /* Add future lso capabilities here */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_capab_lso_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Multiple Factory MAC Addresses Capability
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_multifactaddr_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Number of factory addresses
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t mcm_naddr;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Callbacks to query all the factory addresses.
dd4eeefdb8e4583c47e28a7f315db6087931ef06eota */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs void (*mcm_getaddr)(void *, uint_t, uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_capab_multifactaddr_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Info and callbacks of legacy devices.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_legacy_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Notifications that the legacy device does not support.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint32_t ml_unsup_note;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * dev_t of the legacy device; can be held to force attach.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs dev_t ml_dev;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs boolean_t (*ml_active_set)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs void (*ml_active_clear)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs int (*ml_fastpath_disable)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs void (*ml_fastpath_enable)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_capab_legacy_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC driver entry point types.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_getstat_t)(void *, uint_t, uint64_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_start_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_stop_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_setpromisc_t)(void *, boolean_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_multicst_t)(void *, boolean_t, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_unicst_t)(void *, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_ioctl_t)(void *, queue_t *, mblk_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_resources_t)(void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef mblk_t *(*mac_tx_t)(void *, mblk_t *);
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 uint_t, uint_t, void *, uint_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
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.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
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_start_t mc_start; /* Start the device */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_stop_t mc_stop; /* Stop the device */
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_tx_t mc_tx; /* Transmit a packet */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ioctl_t mc_ioctl; /* Process an unknown ioctl */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_getcapab_t mc_getcapab; /* Get capability information */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_open_t mc_open; /* Open the device */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_close_t mc_close; /* Close the device */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_set_prop_t mc_setprop;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_get_prop_t mc_getprop;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_callbacks_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_priv_prop_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs char mpp_name[MAXLINKPROPNAME];
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t mpp_flags;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_priv_prop_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Virtualization Capabilities
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
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.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_NO_CLASSIFIER = 0,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_SW_CLASSIFIER,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_HW_CLASSIFIER
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_classify_type_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_rx_func_t)(void *, mac_resource_handle_t, mblk_t *,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs boolean_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * The virtualization level conveys the extent of the NIC hardware assistance
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * for traffic steering employed for virtualization:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_VIRT_NONE: No assist for v12n.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
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 *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * MAC_VIRT_HIO: Hybrid I/O capable MAC. Require the support
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * of the MAC_CAPAB_SHARES capability.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
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.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define MAC_VIRT_NONE 0x0
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define MAC_VIRT_LEVEL1 0x1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define MAC_VIRT_HIO 0x2
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define MAC_VIRT_SERIALIZE 0x4
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_RING_TYPE_RX = 1, /* Receive ring */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_RING_TYPE_TX /* Transmit ring */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_ring_type_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define MAX_RINGS_PER_GROUP 128
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Grouping type of a ring group
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
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
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef enum {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_GROUP_TYPE_STATIC = 1, /* Static ring group */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs MAC_GROUP_TYPE_DYNAMIC /* Dynamic ring group */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_group_type_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct __mac_ring_driver *mac_ring_driver_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct __mac_group_driver *mac_group_driver_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_ring_info_s mac_ring_info_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_group_info_s mac_group_info_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_get_ring_t)(void *, mac_ring_type_t, const int, const int,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_info_t *, mac_ring_handle_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_get_group_t)(void *, mac_ring_type_t, const int,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_info_t *, mac_group_handle_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_group_add_ring_t)(mac_group_driver_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_driver_t, mac_ring_type_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_group_rem_ring_t)(mac_group_driver_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_driver_t, mac_ring_type_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Multiple Rings Capability
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_rings_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_type_t mr_type; /* Ring type: Rx vs Tx */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_type_t mr_group_type; /* Dynamic vs static grouping */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t mr_rnum; /* Number of rings */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t mr_gnum; /* Number of ring groups */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_get_ring_t mr_rget; /* Get ring from driver */
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} mac_capab_rings_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Common ring functions and driver interfaces
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_ring_start_t)(mac_ring_driver_t, uint64_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_ring_stop_t)(mac_ring_driver_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef mblk_t *(*mac_ring_send_t)(void *, mblk_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef mblk_t *(*mac_ring_poll_t)(void *, int);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_ring_info_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_driver_t mri_driver;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_start_t mri_start;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_stop_t mri_stop;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_intr_t mri_intr;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs union {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_send_t send;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_poll_t poll;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs } mrfunion;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs} mac_ring_info_s;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define mri_tx mrfunion.send
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#define mri_poll mrfunion.poll
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_group_start_t)(mac_group_driver_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_group_stop_t)(mac_group_driver_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_add_mac_addr_t)(void *, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_rem_mac_addr_t)(void *, const uint8_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsstruct mac_group_info_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_driver_t mgi_driver; /* Driver reference */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_start_t mgi_start; /* Start the group */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_stop_t mgi_stop; /* Stop the group */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t mgi_count; /* Count of rings */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_intr_t mgi_intr; /* Optional per-group intr */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /* Only used for rx groups */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_add_mac_addr_t mgi_addmac; /* Add a MAC address */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_rem_mac_addr_t mgi_remmac; /* Remove a MAC address */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs};
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Share management functions.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef uint64_t mac_share_handle_t;
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Allocate and free a share. Returns ENOSPC if all shares have been
aa81749390e332985277568edab1ee6132326b42gs * previously allocated.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_alloc_share_t)(void *, mac_share_handle_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_free_share_t)(mac_share_handle_t);
aa81749390e332985277568edab1ee6132326b42gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
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.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_bind_share_t)(mac_share_handle_t, uint64_t, uint64_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_unbind_share_t)(mac_share_handle_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Return information on about a share.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef void (*mac_share_query_t)(mac_share_handle_t, mac_ring_type_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_ring_handle_t *, uint_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
aa81749390e332985277568edab1ee6132326b42gs/*
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.
aa81749390e332985277568edab1ee6132326b42gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_share_add_group_t)(mac_share_handle_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_driver_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef int (*mac_share_rem_group_t)(mac_share_handle_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_group_driver_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gstypedef struct mac_capab_share_s {
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs uint_t ms_snum; /* Number of shares (vr's) */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs void *ms_handle; /* Handle to driver. */
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 */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_bind_share_t ms_sbind; /* Bind a share */
aa81749390e332985277568edab1ee6132326b42gs mac_unbind_share_t ms_sunbind; /* Unbind a share */
aa81749390e332985277568edab1ee6132326b42gs} mac_capab_share_t;
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gstypedef struct mac_capab_vrrp_s {
aa81749390e332985277568edab1ee6132326b42gs /* IPv6 or IPv4? */
aa81749390e332985277568edab1ee6132326b42gs int mcv_af;
aa81749390e332985277568edab1ee6132326b42gs} mac_capab_vrrp_t;
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs/*
aa81749390e332985277568edab1ee6132326b42gs * MAC registration interface
aa81749390e332985277568edab1ee6132326b42gs */
aa81749390e332985277568edab1ee6132326b42gstypedef struct mac_register_s {
aa81749390e332985277568edab1ee6132326b42gs uint_t m_version; /* set by mac_alloc() */
aa81749390e332985277568edab1ee6132326b42gs const char *m_type_ident;
aa81749390e332985277568edab1ee6132326b42gs void *m_driver; /* Driver private data */
aa81749390e332985277568edab1ee6132326b42gs dev_info_t *m_dip;
aa81749390e332985277568edab1ee6132326b42gs uint_t m_instance;
aa81749390e332985277568edab1ee6132326b42gs uint8_t *m_src_addr;
aa81749390e332985277568edab1ee6132326b42gs uint8_t *m_dst_addr;
aa81749390e332985277568edab1ee6132326b42gs mac_callbacks_t *m_callbacks;
aa81749390e332985277568edab1ee6132326b42gs uint_t m_min_sdu;
aa81749390e332985277568edab1ee6132326b42gs uint_t m_max_sdu;
aa81749390e332985277568edab1ee6132326b42gs void *m_pdata;
aa81749390e332985277568edab1ee6132326b42gs size_t m_pdata_size;
aa81749390e332985277568edab1ee6132326b42gs uint32_t m_margin;
aa81749390e332985277568edab1ee6132326b42gs mac_priv_prop_t *m_priv_props;
aa81749390e332985277568edab1ee6132326b42gs size_t m_priv_prop_count;
aa81749390e332985277568edab1ee6132326b42gs uint32_t m_v12n; /* Virtualization level */
aa81749390e332985277568edab1ee6132326b42gs} mac_register_t;
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs/*
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 */
aa81749390e332985277568edab1ee6132326b42gs#define MC_IOCTL 0x001
aa81749390e332985277568edab1ee6132326b42gs#define MC_GETCAPAB 0x002
aa81749390e332985277568edab1ee6132326b42gs#define MC_OPEN 0x004
aa81749390e332985277568edab1ee6132326b42gs#define MC_CLOSE 0x008
aa81749390e332985277568edab1ee6132326b42gs#define MC_SETPROP 0x010
aa81749390e332985277568edab1ee6132326b42gs#define MC_GETPROP 0x020
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs/*
aa81749390e332985277568edab1ee6132326b42gs * Driver interface functions.
aa81749390e332985277568edab1ee6132326b42gs */
aa81749390e332985277568edab1ee6132326b42gsextern void mac_sdu_get(mac_handle_t, uint_t *, uint_t *);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_maxsdu_update(mac_handle_t, uint_t);
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gsextern mac_register_t *mac_alloc(uint_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_free(mac_register_t *);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_register(mac_register_t *, mac_handle_t *);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_disable_nowait(mac_handle_t);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_disable(mac_handle_t);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_unregister(mac_handle_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_rx(mac_handle_t, mac_resource_handle_t,
aa81749390e332985277568edab1ee6132326b42gs mblk_t *);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_rx_ring(mac_handle_t, mac_ring_handle_t,
aa81749390e332985277568edab1ee6132326b42gs mblk_t *, uint64_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_link_update(mac_handle_t, link_state_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_link_redo(mac_handle_t, link_state_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_unicst_update(mac_handle_t,
aa81749390e332985277568edab1ee6132326b42gs const uint8_t *);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_dst_update(mac_handle_t, const uint8_t *);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_tx_update(mac_handle_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_tx_ring_update(mac_handle_t,
aa81749390e332985277568edab1ee6132326b42gs mac_ring_handle_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_capab_update(mac_handle_t);
aa81749390e332985277568edab1ee6132326b42gsextern int mac_pdata_update(mac_handle_t, void *,
aa81749390e332985277568edab1ee6132326b42gs size_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_multicast_refresh(mac_handle_t,
aa81749390e332985277568edab1ee6132326b42gs mac_multicst_t, void *, boolean_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_unicst_refresh(mac_handle_t, mac_unicst_t,
aa81749390e332985277568edab1ee6132326b42gs void *);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_promisc_refresh(mac_handle_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mac_setpromisc_t, void *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern boolean_t mac_margin_update(mac_handle_t, uint32_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern void mac_margin_get(mac_handle_t, uint32_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern int mac_margin_remove(mac_handle_t, uint32_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern int mac_margin_add(mac_handle_t, uint32_t *,
aa81749390e332985277568edab1ee6132326b42gs boolean_t);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_init_ops(struct dev_ops *, const char *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern void mac_fini_ops(struct dev_ops *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern int mac_devt_to_instance(dev_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern minor_t mac_private_minor(void);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern mactype_register_t *mactype_alloc(uint_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern void mactype_free(mactype_register_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern int mactype_register(mactype_register_t *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern int mactype_unregister(const char *);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gsextern boolean_t mac_unicst_verify(mac_handle_t,
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs const uint8_t *, uint_t);
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
aa81749390e332985277568edab1ee6132326b42gsextern int mac_group_add_ring(mac_group_handle_t, int);
aa81749390e332985277568edab1ee6132326b42gsextern void mac_group_rem_ring(mac_group_handle_t,
aa81749390e332985277568edab1ee6132326b42gs mac_ring_handle_t);
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs#endif /* _KERNEL */
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs#ifdef __cplusplus
aa81749390e332985277568edab1ee6132326b42gs}
aa81749390e332985277568edab1ee6132326b42gs#endif
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs#endif /* _SYS_MAC_PROVIDER_H */
aa81749390e332985277568edab1ee6132326b42gs