diff options
Diffstat (limited to 'usr/src/uts/common/sys/mac_impl.h')
-rw-r--r-- | usr/src/uts/common/sys/mac_impl.h | 223 |
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 |