Print this page
11493 aggr needs support for multiple pseudo rx groups
Portions contributed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>

*** 54,63 **** --- 54,65 ---- * Possible value of aggr_rseudo_rx_ring_t.arr_flags. Set when the ring entry * in the pseudo RX group is used. */ #define MAC_PSEUDO_RING_INUSE 0x01 + #define MAX_GROUPS_PER_PORT 128 + /* * VLAN filters placed on the Rx pseudo group. */ typedef struct aggr_vlan { list_node_t av_link;
*** 69,86 **** uint8_t aua_addr[ETHERADDRL]; struct aggr_unicst_addr_s *aua_next; } aggr_unicst_addr_t; typedef struct aggr_pseudo_rx_ring_s { ! mac_ring_handle_t arr_rh; /* filled in by aggr_fill_ring() */ struct aggr_port_s *arr_port; mac_ring_handle_t arr_hw_rh; uint_t arr_flags; uint64_t arr_gen; } aggr_pseudo_rx_ring_t; typedef struct aggr_pseudo_rx_group_s { struct aggr_grp_s *arg_grp; /* filled in by aggr_fill_group() */ mac_group_handle_t arg_gh; /* filled in by aggr_fill_group() */ aggr_unicst_addr_t *arg_macaddr; aggr_pseudo_rx_ring_t arg_rings[MAX_RINGS_PER_GROUP]; uint_t arg_ring_cnt; --- 71,97 ---- uint8_t aua_addr[ETHERADDRL]; struct aggr_unicst_addr_s *aua_next; } aggr_unicst_addr_t; typedef struct aggr_pseudo_rx_ring_s { ! mac_ring_handle_t arr_rh; /* set by aggr_fill_ring() */ struct aggr_port_s *arr_port; + struct aggr_pseudo_rx_group_s *arr_grp; mac_ring_handle_t arr_hw_rh; uint_t arr_flags; uint64_t arr_gen; } aggr_pseudo_rx_ring_t; + /* + * An aggr pseudo group abstracts the underlying ports' HW groups. For + * example, if each port has 8 groups (mac_group_t), then the aggr + * will create 8 pseudo groups. Each pseudo group represents a + * collection of HW groups: one group from each port. If you have + * three ports then the pseudo group stands in for three HW groups. + */ typedef struct aggr_pseudo_rx_group_s { + uint_t arg_index; struct aggr_grp_s *arg_grp; /* filled in by aggr_fill_group() */ mac_group_handle_t arg_gh; /* filled in by aggr_fill_group() */ aggr_unicst_addr_t *arg_macaddr; aggr_pseudo_rx_ring_t arg_rings[MAX_RINGS_PER_GROUP]; uint_t arg_ring_cnt;
*** 117,132 **** uint32_t lp_started : 1, lp_tx_enabled : 1, lp_collector_enabled : 1, lp_promisc_on : 1, lp_no_link_update : 1, - lp_rx_grp_added : 1, lp_tx_grp_added : 1, lp_closing : 1, ! lp_pad_bits : 24; mac_handle_t lp_mh; mac_client_handle_t lp_mch; const mac_info_t *lp_mip; mac_notify_handle_t lp_mnh; uint_t lp_tx_idx; /* idx in group's tx array */ uint64_t lp_ifspeed; link_state_t lp_link_state; --- 128,144 ---- uint32_t lp_started : 1, lp_tx_enabled : 1, lp_collector_enabled : 1, lp_promisc_on : 1, lp_no_link_update : 1, lp_tx_grp_added : 1, lp_closing : 1, ! lp_pad_bits : 25; mac_handle_t lp_mh; + mac_client_handle_t lp_mch; + const mac_info_t *lp_mip; mac_notify_handle_t lp_mnh; uint_t lp_tx_idx; /* idx in group's tx array */ uint64_t lp_ifspeed; link_state_t lp_link_state;
*** 134,150 **** uint64_t lp_stat[MAC_NSTAT]; uint64_t lp_ether_stat[ETHER_NSTAT]; aggr_lacp_port_t lp_lacp; /* LACP state */ lacp_stats_t lp_lacp_stats; uint32_t lp_margin; ! mac_promisc_handle_t lp_mphp; mac_unicast_handle_t lp_mah; /* List of non-primary addresses that requires promiscous mode set */ aggr_unicst_addr_t *lp_prom_addr; ! /* handle of the underlying HW RX group */ ! mac_group_handle_t lp_hwgh; int lp_tx_ring_cnt; /* handles of the underlying HW TX rings */ mac_ring_handle_t *lp_tx_rings; /* * Handles of the pseudo TX rings. Each of them maps to --- 146,168 ---- uint64_t lp_stat[MAC_NSTAT]; uint64_t lp_ether_stat[ETHER_NSTAT]; aggr_lacp_port_t lp_lacp; /* LACP state */ lacp_stats_t lp_lacp_stats; uint32_t lp_margin; ! mac_unicast_handle_t lp_mah; /* List of non-primary addresses that requires promiscous mode set */ aggr_unicst_addr_t *lp_prom_addr; ! ! /* ! * References to the underlying HW Rx groups of this port. ! * Used by aggr to program HW classification for the pseudo ! * groups. ! */ ! mac_group_handle_t lp_hwghs[MAX_GROUPS_PER_PORT]; ! int lp_tx_ring_cnt; /* handles of the underlying HW TX rings */ mac_ring_handle_t *lp_tx_rings; /* * Handles of the pseudo TX rings. Each of them maps to
*** 187,197 **** lg_vlan : 1, lg_force : 1, lg_lso : 1, lg_pad_bits : 8; aggr_port_t *lg_ports; /* list of configured ports */ ! aggr_port_t *lg_mac_addr_port; mac_handle_t lg_mh; zoneid_t lg_zoneid; uint_t lg_nattached_ports; krwlock_t lg_tx_lock; uint_t lg_ntx_ports; --- 205,215 ---- lg_vlan : 1, lg_force : 1, lg_lso : 1, lg_pad_bits : 8; aggr_port_t *lg_ports; /* list of configured ports */ ! aggr_port_t *lg_mac_addr_port; /* using address of this port */ mac_handle_t lg_mh; zoneid_t lg_zoneid; uint_t lg_nattached_ports; krwlock_t lg_tx_lock; uint_t lg_ntx_ports;
*** 231,241 **** mblk_t *lg_lacp_head; mblk_t *lg_lacp_tail; kthread_t *lg_lacp_rx_thread; boolean_t lg_lacp_done; ! aggr_pseudo_rx_group_t lg_rx_group; aggr_pseudo_tx_group_t lg_tx_group; kmutex_t lg_tx_flowctl_lock; kcondvar_t lg_tx_flowctl_cv; uint_t lg_tx_blocked_cnt; --- 249,261 ---- mblk_t *lg_lacp_head; mblk_t *lg_lacp_tail; kthread_t *lg_lacp_rx_thread; boolean_t lg_lacp_done; ! uint_t lg_rx_group_count; ! aggr_pseudo_rx_group_t lg_rx_groups[MAX_GROUPS_PER_PORT]; ! aggr_pseudo_tx_group_t lg_tx_group; kmutex_t lg_tx_flowctl_lock; kcondvar_t lg_tx_flowctl_cv; uint_t lg_tx_blocked_cnt;
*** 326,337 **** extern uint64_t aggr_port_stat(aggr_port_t *, uint_t); extern boolean_t aggr_port_notify_link(aggr_grp_t *, aggr_port_t *); extern void aggr_port_init_callbacks(aggr_port_t *); extern void aggr_recv_cb(void *, mac_resource_handle_t, mblk_t *, boolean_t); - extern void aggr_recv_promisc_cb(void *, mac_resource_handle_t, mblk_t *, - boolean_t); extern void aggr_tx_ring_update(void *, uintptr_t); extern void aggr_tx_notify_thread(void *); extern void aggr_send_port_enable(aggr_port_t *); extern void aggr_send_port_disable(aggr_port_t *); --- 346,355 ----
*** 355,369 **** extern void aggr_grp_port_hold(aggr_port_t *); extern void aggr_grp_port_rele(aggr_port_t *); extern void aggr_grp_port_wait(aggr_grp_t *); ! extern int aggr_port_addmac(aggr_port_t *, const uint8_t *); ! extern void aggr_port_remmac(aggr_port_t *, const uint8_t *); ! extern int aggr_port_addvlan(aggr_port_t *, uint16_t); ! extern int aggr_port_remvlan(aggr_port_t *, uint16_t); extern mblk_t *aggr_ring_tx(void *, mblk_t *); extern mblk_t *aggr_find_tx_ring(void *, mblk_t *, uintptr_t, mac_ring_handle_t *); --- 373,387 ---- extern void aggr_grp_port_hold(aggr_port_t *); extern void aggr_grp_port_rele(aggr_port_t *); extern void aggr_grp_port_wait(aggr_grp_t *); ! extern int aggr_port_addmac(aggr_port_t *, uint_t, const uint8_t *); ! extern void aggr_port_remmac(aggr_port_t *, uint_t, const uint8_t *); ! extern int aggr_port_addvlan(aggr_port_t *, uint_t, uint16_t); ! extern int aggr_port_remvlan(aggr_port_t *, uint_t, uint16_t); extern mblk_t *aggr_ring_tx(void *, mblk_t *); extern mblk_t *aggr_find_tx_ring(void *, mblk_t *, uintptr_t, mac_ring_handle_t *);