summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/mac_impl.h
diff options
context:
space:
mode:
authorVenugopal Iyer <Venu.Iyer@Sun.COM>2010-03-09 15:30:01 -0800
committerVenugopal Iyer <Venu.Iyer@Sun.COM>2010-03-09 15:30:01 -0800
commit0dc2366f7b9f9f36e10909b1e95edbf2a261c2ac (patch)
tree21e9b7ebf6656a506e66695947b60e562787ea4f /usr/src/uts/common/sys/mac_impl.h
parente47012d1925f46ba3ba641bef25c0cf3af74d020 (diff)
downloadillumos-gate-0dc2366f7b9f9f36e10909b1e95edbf2a261c2ac.tar.gz
PSARC/2009/364 dlstat and flowstat
PSARC/2009/436 Anti-spoofing Link Protection PSARC/2009/448 pool dladm link property PSARC/2009/501 Dynamic Ring Grouping on NICs PSARC/2009/638 Public GLDv3 Interfaces PSARC/2010/074 Crossbow resource usage updates 6838175 mac_tx should be able to send out a packet without a configured address 6806552 single MAC default TX ring doesn't scale 6809686 back-to-back LACP not recovering after removing one of the aggregated ports 6902209 setting maxbw to zero requires an intermediate reset-linkprop to take effect 6855972 Bind interrupts to the same CPU as poll thread using new interrupt APIs 6863945 aggr pseudo Tx rings 6796839 allow CPU pools to be associated with data-links 6526471 data-links assigned to an exclusive zone should seamlessly be bound the zone's CPUs 6802595 Per links stats can use some improvement 6889685 Crossbow should provide control over provision of h/w rings to MAC clients. 6708310 ixgbe needs to support VMDq 6869019 ixgbe should support IRM (Interrupt Resource Management framework) 6902266 vnet should support entry point for per ring stat querying 6926790 Integrate Link Protection Phase II 6930358 Make the core set of GLDv3 driver APIs committed 6901419 dladm create-aggr -u incorrectly rejects some valid ethernet addresses 6717042 should support "cpus" link properties for aggregations 6908184 bge_set_priv_prop() and bge_get_priv_prop() can't agree on the set of private properties 6907617 bge_m_getprop() shouldn't return default values for read-only properties 6900833 unused code in vnic_impl.h can be removed
Diffstat (limited to 'usr/src/uts/common/sys/mac_impl.h')
-rw-r--r--usr/src/uts/common/sys/mac_impl.h223
1 files changed, 179 insertions, 44 deletions
diff --git a/usr/src/uts/common/sys/mac_impl.h b/usr/src/uts/common/sys/mac_impl.h
index 760e2a4a18..ff4eeb1221 100644
--- a/usr/src/uts/common/sys/mac_impl.h
+++ b/usr/src/uts/common/sys/mac_impl.h
@@ -26,10 +26,12 @@
#ifndef _SYS_MAC_IMPL_H
#define _SYS_MAC_IMPL_H
+#include <sys/cpupart.h>
#include <sys/modhash.h>
#include <sys/mac_client.h>
#include <sys/mac_provider.h>
#include <sys/note.h>
+#include <sys/avl.h>
#include <net/if.h>
#include <sys/mac_flow_impl.h>
#include <netinet/ip6.h>
@@ -85,6 +87,8 @@ typedef struct mac_chain_s {
#define MCB_NOTIFY_CB_T 0x2
#define MCB_TX_NOTIFY_CB_T 0x4
+extern boolean_t mac_tx_serialize;
+
typedef struct mac_cb_s {
struct mac_cb_s *mcb_nextp; /* Linked list of callbacks */
void *mcb_objp; /* Ptr to enclosing object */
@@ -189,6 +193,8 @@ typedef enum {
#define MR_CONDEMNED 0x2
#define MR_QUIESCE 0x4
+typedef struct mac_impl_s mac_impl_t;
+
struct mac_ring_s {
int mr_index; /* index in the original list */
mac_ring_type_t mr_type; /* ring type */
@@ -196,11 +202,15 @@ struct mac_ring_s {
mac_group_handle_t mr_gh; /* reference to group */
mac_classify_type_t mr_classify_type; /* HW vs SW */
- struct mac_soft_ring_set_s *mr_srs; /* associated SRS */
- uint_t mr_refcnt; /* Ring references */
+ struct mac_soft_ring_set_s *mr_srs; /* associated SRS */
+ mac_ring_handle_t mr_prh; /* associated pseudo ring hdl */
+ uint_t mr_refcnt; /* Ring references */
/* ring generation no. to guard against drivers using stale rings */
uint64_t mr_gen_num;
+ kstat_t *mr_ksp; /* ring kstats */
+ mac_impl_t *mr_mip; /* pointer to primary's mip */
+
kmutex_t mr_lock;
kcondvar_t mr_cv; /* mr_lock */
mac_ring_state_t mr_state; /* mr_lock */
@@ -211,6 +221,7 @@ struct mac_ring_s {
#define mr_driver mr_info.mri_driver
#define mr_start mr_info.mri_start
#define mr_stop mr_info.mri_stop
+#define mr_stat mr_info.mri_stat
#define MAC_RING_MARK(mr, flag) \
(mr)->mr_flag |= flag;
@@ -245,9 +256,9 @@ typedef struct mac_grp_client {
struct mac_client_impl_s *mgc_client;
} mac_grp_client_t;
-#define MAC_RX_GROUP_NO_CLIENT(g) ((g)->mrg_clients == NULL)
+#define MAC_GROUP_NO_CLIENT(g) ((g)->mrg_clients == NULL)
-#define MAC_RX_GROUP_ONLY_CLIENT(g) \
+#define MAC_GROUP_ONLY_CLIENT(g) \
((((g)->mrg_clients != NULL) && \
((g)->mrg_clients->mgc_next == NULL)) ? \
(g)->mrg_clients->mgc_client : NULL)
@@ -267,7 +278,6 @@ struct mac_group_s {
mac_grp_client_t *mrg_clients; /* clients list */
- struct mac_client_impl_s *mrg_tx_client; /* TX client pointer */
mac_group_info_t mrg_info; /* driver supplied info */
};
@@ -279,8 +289,6 @@ struct mac_group_s {
#define GROUP_INTR_ENABLE_FUNC(g) (g)->mrg_info.mgi_intr.mi_enable
#define GROUP_INTR_DISABLE_FUNC(g) (g)->mrg_info.mgi_intr.mi_disable
-#define MAC_DEFAULT_GROUP(mh) (((mac_impl_t *)mh)->mi_rx_groups)
-
#define MAC_RING_TX(mhp, rh, mp, rest) { \
mac_ring_handle_t mrh = rh; \
mac_impl_t *mimpl = (mac_impl_t *)mhp; \
@@ -304,7 +312,8 @@ struct mac_group_s {
* rh nulled out if the bridge chooses to send output on a different
* link due to forwarding.
*/
-#define MAC_TX(mip, rh, mp, share_bound) { \
+#define MAC_TX(mip, rh, mp, src_mcip) { \
+ mac_ring_handle_t rhandle = (rh); \
/* \
* If there is a bound Hybrid I/O share, send packets through \
* the default tx ring. (When there's a bound Hybrid I/O share, \
@@ -312,17 +321,19 @@ struct mac_group_s {
* and not accessible from here.) \
*/ \
_NOTE(CONSTANTCONDITION) \
- if (share_bound) \
- rh = NULL; \
+ if ((src_mcip)->mci_state_flags & MCIS_SHARE_BOUND) \
+ rhandle = (mip)->mi_default_tx_ring; \
+ if (mip->mi_promisc_list != NULL) \
+ mac_promisc_dispatch(mip, mp, src_mcip); \
/* \
* Grab the proper transmit pointer and handle. Special \
* optimization: we can test mi_bridge_link itself atomically, \
* and if that indicates no bridge send packets through tx ring.\
*/ \
if (mip->mi_bridge_link == NULL) { \
- MAC_RING_TX(mip, rh, mp, mp); \
+ MAC_RING_TX(mip, rhandle, mp, mp); \
} else { \
- mp = mac_bridge_tx(mip, rh, mp); \
+ mp = mac_bridge_tx(mip, rhandle, mp); \
} \
}
@@ -346,8 +357,6 @@ typedef enum {
MAC_ADDRESS_TYPE_UNICAST_PROMISC /* promiscuous mode */
} mac_address_type_t;
-typedef struct mac_impl_s mac_impl_t;
-
typedef struct mac_address_s {
mac_address_type_t ma_type; /* address type */
int ma_nusers; /* number of users */
@@ -406,7 +415,6 @@ struct mac_impl_s {
link_state_t mi_lowlinkstate; /* none */
link_state_t mi_lastlowlinkstate; /* none */
uint_t mi_devpromisc; /* SL */
- kmutex_t mi_lock;
uint8_t mi_addr[MAXMACADDRLEN]; /* mi_rw_lock */
uint8_t mi_dstaddr[MAXMACADDRLEN]; /* mi_rw_lock */
boolean_t mi_dstaddr_set;
@@ -436,6 +444,11 @@ struct mac_impl_s {
mac_group_type_t mi_rx_group_type; /* grouping type */
uint_t mi_rx_group_count;
mac_group_t *mi_rx_groups;
+ mac_group_t *mi_rx_donor_grp;
+ uint_t mi_rxrings_rsvd;
+ uint_t mi_rxrings_avail;
+ uint_t mi_rxhwclnt_avail;
+ uint_t mi_rxhwclnt_used;
mac_capab_rings_t mi_rx_rings_cap;
@@ -446,8 +459,11 @@ struct mac_impl_s {
uint_t mi_tx_group_count;
uint_t mi_tx_group_free;
mac_group_t *mi_tx_groups;
-
mac_capab_rings_t mi_tx_rings_cap;
+ uint_t mi_txrings_rsvd;
+ uint_t mi_txrings_avail;
+ uint_t mi_txhwclnt_avail;
+ uint_t mi_txhwclnt_used;
mac_ring_handle_t mi_default_tx_ring;
@@ -516,7 +532,7 @@ struct mac_impl_s {
* sorted: the first one has the greatest value.
*/
mac_margin_req_t *mi_mmrp;
- mac_priv_prop_t *mi_priv_prop;
+ char **mi_priv_prop;
uint_t mi_priv_prop_count;
/*
@@ -541,6 +557,72 @@ struct mac_impl_s {
#endif
};
+/*
+ * The default TX group is the last one in the list.
+ */
+#define MAC_DEFAULT_TX_GROUP(mip) \
+ (mip)->mi_tx_groups + (mip)->mi_tx_group_count
+
+/*
+ * The default RX group is the first one in the list
+ */
+#define MAC_DEFAULT_RX_GROUP(mip) (mip)->mi_rx_groups
+
+/* Reserved RX rings */
+#define MAC_RX_RING_RESERVED(m, cnt) { \
+ ASSERT((m)->mi_rxrings_avail >= (cnt)); \
+ (m)->mi_rxrings_rsvd += (cnt); \
+ (m)->mi_rxrings_avail -= (cnt); \
+}
+
+/* Released RX rings */
+#define MAC_RX_RING_RELEASED(m, cnt) { \
+ ASSERT((m)->mi_rxrings_rsvd >= (cnt)); \
+ (m)->mi_rxrings_rsvd -= (cnt); \
+ (m)->mi_rxrings_avail += (cnt); \
+}
+
+/* Reserved a RX group */
+#define MAC_RX_GRP_RESERVED(m) { \
+ ASSERT((m)->mi_rxhwclnt_avail > 0); \
+ (m)->mi_rxhwclnt_avail--; \
+ (m)->mi_rxhwclnt_used++; \
+}
+
+/* Released a RX group */
+#define MAC_RX_GRP_RELEASED(m) { \
+ ASSERT((m)->mi_rxhwclnt_used > 0); \
+ (m)->mi_rxhwclnt_avail++; \
+ (m)->mi_rxhwclnt_used--; \
+}
+
+/* Reserved TX rings */
+#define MAC_TX_RING_RESERVED(m, cnt) { \
+ ASSERT((m)->mi_txrings_avail >= (cnt)); \
+ (m)->mi_txrings_rsvd += (cnt); \
+ (m)->mi_txrings_avail -= (cnt); \
+}
+/* Released TX rings */
+#define MAC_TX_RING_RELEASED(m, cnt) { \
+ ASSERT((m)->mi_txrings_rsvd >= (cnt)); \
+ (m)->mi_txrings_rsvd -= (cnt); \
+ (m)->mi_txrings_avail += (cnt); \
+}
+
+/* Reserved a TX group */
+#define MAC_TX_GRP_RESERVED(m) { \
+ ASSERT((m)->mi_txhwclnt_avail > 0); \
+ (m)->mi_txhwclnt_avail--; \
+ (m)->mi_txhwclnt_used++; \
+}
+
+/* Released a TX group */
+#define MAC_TX_GRP_RELEASED(m) { \
+ ASSERT((m)->mi_txhwclnt_used > 0); \
+ (m)->mi_txhwclnt_avail++; \
+ (m)->mi_txhwclnt_used--; \
+}
+
/* for mi_state_flags */
#define MIS_DISABLED 0x0001
#define MIS_IS_VNIC 0x0002
@@ -570,12 +652,6 @@ typedef struct mac_notify_task_arg {
mac_ring_t *mnt_ring;
} mac_notify_task_arg_t;
-typedef enum {
- MAC_RX_NO_RESERVE,
- MAC_RX_RESERVE_DEFAULT,
- MAC_RX_RESERVE_NONDEFAULT
-} mac_rx_group_reserve_type_t;
-
/*
* XXX All MAC_DBG_PRTs must be replaced with call to dtrace probes. For now
* it may be easier to have these printfs for easier debugging
@@ -599,18 +675,45 @@ extern int mac_dbg;
(need_close) = ((uintptr_t)mph & 0x1); \
}
+/*
+ * Type of property information that can be returned by a driver.
+ * Valid flags of the pr_flags of the mac_prop_info_t data structure.
+ */
+#define MAC_PROP_INFO_DEFAULT 0x0001
+#define MAC_PROP_INFO_RANGE 0x0002
+#define MAC_PROP_INFO_PERM 0x0004
+
+/*
+ * Property information. pr_flags is a combination of one of the
+ * MAC_PROP_INFO_* flags, it is reset by the framework before invoking
+ * the driver's prefix_propinfo() entry point.
+ *
+ * Drivers should use MAC_PROP_INFO_SET_*() macros to provide
+ * information about a property.
+ */
+typedef struct mac_prop_info_state_s {
+ uint8_t pr_flags;
+ uint8_t pr_perm;
+ void *pr_default;
+ size_t pr_default_size;
+ uint8_t pr_default_status;
+ mac_propval_range_t *pr_range;
+} mac_prop_info_state_t;
+
+#define MAC_PROTECT_ENABLED(mcip, type) \
+ (((mcip)->mci_flent-> \
+ fe_resource_props.mrp_mask & MRP_PROTECT) != 0 && \
+ ((mcip)->mci_flent-> \
+ fe_resource_props.mrp_protect.mp_types & (type)) != 0)
+
typedef struct mac_client_impl_s mac_client_impl_t;
extern void mac_init(void);
extern int mac_fini(void);
-extern void mac_stat_create(mac_impl_t *);
-extern void mac_stat_destroy(mac_impl_t *);
-extern uint64_t mac_stat_default(mac_impl_t *, uint_t);
extern void mac_ndd_ioctl(mac_impl_t *, queue_t *, mblk_t *);
-extern void mac_create_soft_ring_kstats(mac_impl_t *, int32_t);
-extern boolean_t mac_ip_hdr_length_v6(mblk_t *, ip6_t *, uint16_t *,
- uint8_t *, boolean_t *, uint32_t *);
+extern boolean_t mac_ip_hdr_length_v6(ip6_t *, uint8_t *, uint16_t *,
+ uint8_t *, ip6_frag_t **);
extern mblk_t *mac_copymsgchain_cksum(mblk_t *);
extern mblk_t *mac_fix_cksum(mblk_t *);
@@ -649,10 +752,17 @@ extern int mac_rx_group_add_flow(mac_client_impl_t *, flow_entry_t *,
mac_group_t *);
extern mblk_t *mac_hwring_tx(mac_ring_handle_t, mblk_t *);
extern mblk_t *mac_bridge_tx(mac_impl_t *, mac_ring_handle_t, mblk_t *);
+extern mac_group_t *mac_reserve_rx_group(mac_client_impl_t *, uint8_t *,
+ boolean_t);
+extern void mac_release_rx_group(mac_client_impl_t *, mac_group_t *);
+extern int mac_rx_switch_group(mac_client_impl_t *, mac_group_t *,
+ mac_group_t *);
extern mac_ring_t *mac_reserve_tx_ring(mac_impl_t *, mac_ring_t *);
-extern void mac_release_tx_ring(mac_ring_handle_t);
-extern mac_group_t *mac_reserve_tx_group(mac_impl_t *, mac_share_handle_t);
-extern void mac_release_tx_group(mac_impl_t *, mac_group_t *);
+extern mac_group_t *mac_reserve_tx_group(mac_client_impl_t *, boolean_t);
+extern void mac_release_tx_group(mac_client_impl_t *, mac_group_t *);
+extern void mac_tx_switch_group(mac_client_impl_t *, mac_group_t *,
+ mac_group_t *);
+extern void mac_rx_switch_grp_to_sw(mac_group_t *);
/*
* MAC address functions are used internally by MAC layer.
@@ -676,7 +786,7 @@ extern void mac_link_flow_clean(mac_client_handle_t, flow_entry_t *);
* Fanout update routines called when the link speed of the NIC changes
* or when a MAC client's share is unbound.
*/
-extern void mac_fanout_recompute_client(mac_client_impl_t *);
+extern void mac_fanout_recompute_client(mac_client_impl_t *, cpupart_t *);
extern void mac_fanout_recompute(mac_impl_t *);
/*
@@ -687,14 +797,15 @@ extern void mac_fanout_recompute(mac_impl_t *);
extern int mac_datapath_setup(mac_client_impl_t *, flow_entry_t *, uint32_t);
extern void mac_datapath_teardown(mac_client_impl_t *, flow_entry_t *,
uint32_t);
-extern void mac_srs_group_setup(mac_client_impl_t *, flow_entry_t *,
- mac_group_t *, uint32_t);
-extern void mac_srs_group_teardown(mac_client_impl_t *, flow_entry_t *,
+extern void mac_rx_srs_group_setup(mac_client_impl_t *, flow_entry_t *,
+ uint32_t);
+extern void mac_tx_srs_group_setup(mac_client_impl_t *, flow_entry_t *,
+ uint32_t);
+extern void mac_rx_srs_group_teardown(flow_entry_t *, boolean_t);
+extern void mac_tx_srs_group_teardown(mac_client_impl_t *, flow_entry_t *,
uint32_t);
extern int mac_rx_classify_flow_quiesce(flow_entry_t *, void *);
extern int mac_rx_classify_flow_restart(flow_entry_t *, void *);
-extern void mac_tx_client_quiesce(mac_client_impl_t *, uint_t);
-extern void mac_tx_client_restart(mac_client_impl_t *);
extern void mac_client_quiesce(mac_client_impl_t *);
extern void mac_client_restart(mac_client_impl_t *);
@@ -725,15 +836,17 @@ extern void mac_rx_group_unmark(mac_group_t *, uint_t);
extern void mac_tx_client_flush(mac_client_impl_t *);
extern void mac_tx_client_block(mac_client_impl_t *);
extern void mac_tx_client_unblock(mac_client_impl_t *);
+extern void mac_tx_invoke_callbacks(mac_client_impl_t *, mac_tx_cookie_t);
extern int i_mac_promisc_set(mac_impl_t *, boolean_t);
extern void i_mac_promisc_walker_cleanup(mac_impl_t *);
extern mactype_t *mactype_getplugin(const char *);
extern void mac_addr_factory_init(mac_impl_t *);
extern void mac_addr_factory_fini(mac_impl_t *);
-extern void mac_register_priv_prop(mac_impl_t *, mac_priv_prop_t *, uint_t);
+extern void mac_register_priv_prop(mac_impl_t *, char **);
extern void mac_unregister_priv_prop(mac_impl_t *);
extern int mac_init_rings(mac_impl_t *, mac_ring_type_t);
extern void mac_free_rings(mac_impl_t *, mac_ring_type_t);
+extern void mac_compare_ddi_handle(mac_group_t *, uint_t, mac_ring_t *);
extern int mac_start_group(mac_group_t *);
extern void mac_stop_group(mac_group_t *);
@@ -742,20 +855,41 @@ extern void mac_stop_ring(mac_ring_t *);
extern int mac_add_macaddr(mac_impl_t *, mac_group_t *, uint8_t *, boolean_t);
extern int mac_remove_macaddr(mac_address_t *);
-extern void mac_set_rx_group_state(mac_group_t *, mac_group_state_t);
-extern void mac_rx_group_add_client(mac_group_t *, mac_client_impl_t *);
-extern void mac_rx_group_remove_client(mac_group_t *, mac_client_impl_t *)
-;
+extern void mac_set_group_state(mac_group_t *, mac_group_state_t);
+extern void mac_group_add_client(mac_group_t *, mac_client_impl_t *);
+extern void mac_group_remove_client(mac_group_t *, mac_client_impl_t *);
+
extern int i_mac_group_add_ring(mac_group_t *, mac_ring_t *, int);
extern void i_mac_group_rem_ring(mac_group_t *, mac_ring_t *, boolean_t);
-
+extern int mac_group_ring_modify(mac_client_impl_t *, mac_group_t *,
+ mac_group_t *);
extern void mac_poll_state_change(mac_handle_t, boolean_t);
+extern mac_group_state_t mac_group_next_state(mac_group_t *,
+ mac_client_impl_t **, mac_group_t *, boolean_t);
+
extern mblk_t *mac_protect_check(mac_client_handle_t, mblk_t *);
extern int mac_protect_set(mac_client_handle_t, mac_resource_props_t *);
extern boolean_t mac_protect_enabled(mac_client_handle_t, uint32_t);
extern int mac_protect_validate(mac_resource_props_t *);
extern void mac_protect_update(mac_resource_props_t *, mac_resource_props_t *);
+extern void mac_protect_update_v6_local_addr(mac_client_impl_t *);
+extern void mac_protect_intercept_dhcp(mac_client_impl_t *, mblk_t *);
+extern void mac_protect_flush_dhcp(mac_client_impl_t *);
+extern void mac_protect_cancel_timer(mac_client_impl_t *);
+extern void mac_protect_init(mac_client_impl_t *);
+extern void mac_protect_fini(mac_client_impl_t *);
+
+extern int mac_set_resources(mac_handle_t, mac_resource_props_t *);
+extern void mac_get_resources(mac_handle_t, mac_resource_props_t *);
+extern void mac_get_effective_resources(mac_handle_t, mac_resource_props_t *);
+
+extern cpupart_t *mac_pset_find(mac_resource_props_t *, boolean_t *);
+extern void mac_set_pool_effective(boolean_t, cpupart_t *,
+ mac_resource_props_t *, mac_resource_props_t *);
+extern void mac_set_rings_effective(mac_client_impl_t *);
+extern mac_client_impl_t *mac_check_primary_relocation(mac_client_impl_t *,
+ boolean_t);
/* Global callbacks into the bridging module (when loaded) */
extern mac_bridge_tx_t mac_bridge_tx_cb;
@@ -763,6 +897,7 @@ extern mac_bridge_rx_t mac_bridge_rx_cb;
extern mac_bridge_ref_t mac_bridge_ref_cb;
extern mac_bridge_ls_t mac_bridge_ls_cb;
+
#ifdef __cplusplus
}
#endif