mac_client_impl.h revision 8d4cf8d8d2965ea43bccdc838f15c18634fee02d
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_MAC_CLIENT_IMPL_H
#define _SYS_MAC_CLIENT_IMPL_H
#include <sys/mac_client.h>
#include <sys/mac_provider.h>
#include <sys/mac_impl.h>
#include <sys/mac_flow_impl.h>
#ifdef __cplusplus
extern "C" {
#endif
extern kmem_cache_t *mac_client_impl_cache;
extern kmem_cache_t *mac_unicast_impl_cache;
extern kmem_cache_t *mac_promisc_impl_cache;
/*
* Need a list to chain all VIDs assigned to a client. Normally, one
* MAC client only has one VID. But vsw might need multiple VIDs.
*/
typedef struct mac_unicast_impl_s { /* Protected by */
#define MAC_CLIENT_FLAGS_PRIMARY 0X0001
#define MAC_CLIENT_FLAGS_VNIC_PRIMARY 0x0002
#define MAC_CLIENT_FLAGS_MULTI_PRIMARY 0x0004
#define MAC_CLIENT_FLAGS_PASSIVE_PRIMARY 0x0008
/*
* One of these is instantiated per MAC client promiscuous callback.
*
* Each element of this structure belongs to two linked list. One
* for the mac_client_impl_t (mci_promisc_list) which created allocated
* the callback, the other for the mac_impl_t (mi_promisc_list) corresponding
* to the MAC client.
* The former allows us to do bookkeeping, the latter allows us
* to more efficiently dispatch packets to the promiscuous callbacks.
*/
typedef struct mac_promisc_impl_s { /* Protected by */
void *mpi_arg; /* WO */
typedef union mac_tx_percpu_s {
struct {
} pcpu_lr;
/*
* One of these is instanciated for each MAC client.
*/
struct mac_client_impl_s { /* Protected by */
/*
* This flow entry will contain all the internal constructs
* such as SRS etc. for this MAC client. The MAC client may
* have more than one flow corresponding to each upper client
* sharing this mac_client_impl_t.
*/
/*
* If this is a client that has a pass thru MAC (e.g. a VNIC),
* then we also keep the handle for the client's upper MAC.
*/
void *mci_rx_arg; /* Rx Quiescence */
void *mci_direct_rx_arg; /* SL */
void *mci_rx_p_arg; /* Rx Quiescence */
void *mci_p_unicast_list;
/*
* The mac_client_impl_t may be shared by multiple clients, i.e
* multiple VLANs sharing the same MAC client. In this case the
* own flow entry, but the rest underlying components SRS, etc,
* are common.
*/
/* Resource Management Functions */
void *mci_resource_arg; /* SL */
/* Tx notify callback */
/* per MAC client stats */ /* None */
/*
* Priority range for this MAC client. This the range
* corresponding to the priority configured (nr_flow_priority).
*/
/*
* Hybrid I/O related definitions.
*/
/* for multicast support */
/*
* Protected by mci_tx_pcpu[0].pcpu_tx_lock
*/
/* Must be last in the structure for dynamic sizing */
};
#define MAC_CLIENT_IMPL_SIZE \
(sizeof (mac_client_impl_t) + \
(mac_tx_percpu_cnt * sizeof (mac_tx_percpu_t)))
extern int mac_tx_percpu_cnt;
#define MCIP_TX_SRS(mcip) \
/* Defensive coding, non-null mcip_flent could be an assert */
#define MCIP_DATAPATH_SETUP(mcip) \
#define MCIP_RESOURCE_PROPS(mcip) \
#define MCIP_EFFECTIVE_PROPS(mcip) \
#define MCIP_RESOURCE_PROPS_MASK(mcip) \
#define MCIP_RESOURCE_PROPS_MAXBW(mcip) \
#define MCIP_RESOURCE_PROPS_PRIORITY(mcip) \
#define MCIP_RESOURCE_PROPS_CPUS(mcip) \
#define MCIP_RESOURCE_PROPS_NCPUS(mcip) \
#define MCIP_RESOURCE_PROPS_CPU(mcip) \
/*
* We validate the VLAN id of the packet w.r.t the client's vid,
* if required (i.e. !MCIS_DISABLE_TX_VID_CHECK). DLS clients
* will have MCIS_DISABLE_TX_VID_CHECK set.
* (In the case of aggr when we get back packets, due to
* the underlying driver being flow controlled, we won't
* drop the packet even if it is VLAN tagged as we
* don't set MCIS_DISABLE_TX_VID_CHECK for an aggr.)
*/
#define MAC_VID_CHECK_NEEDED(mcip) \
ETHERTYPE_VLAN) { \
/* \
* err is set to EINVAL (so the caller can take the \
* appropriate action. e.g. freemsg()) for two cases: \
* -client is not responsible for filling in the vid. \
* -client is responsible for filling in the vid, but \
* the vid doesn't match the vid of the MAC client. \
*/ \
struct ether_vlan_header *evhp; \
\
(err) = 0; \
} \
} \
}
#define MAC_TAG_NEEDED(mcip) \
/* MCI state flags */
#define MCIS_IS_VNIC 0x0001
#define MCIS_EXCLUSIVE 0x0002
#define MCIS_TAG_DISABLE 0x0004
#define MCIS_STRIP_DISABLE 0x0008
#define MCIS_IS_AGGR_PORT 0x0010
#define MCIS_CLIENT_POLL_CAPABLE 0x0020
#define MCIS_DESC_LOGGED 0x0040
#define MCIS_SHARE_BOUND 0x0080
#define MCIS_NO_HWRINGS 0x0100
#define MCIS_DISABLE_TX_VID_CHECK 0x0200
#define MCIS_USE_DATALINK_NAME 0x0400
#define MCIS_UNICAST_HW 0x0800
#define MCIS_REQ_HWRINGS 0x1000
#define MCIS_RX_BYPASS_DISABLE 0x2000
/* in mac_client.c */
extern void mac_client_init(void);
extern void mac_client_fini(void);
extern int mac_validate_props(mac_resource_props_t *);
extern void mac_update_resources(mac_resource_props_t *,
#ifdef __cplusplus
}
#endif
#endif /* _SYS_MAC_CLIENT_IMPL_H */