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>
*** 1434,1443 ****
--- 1434,1444 ----
if (err != 0)
goto done;
mcip->mci_flent = flent;
FLOW_MARK(flent, FE_MC_NO_DATAPATH);
flent->fe_mcip = mcip;
+
/*
* Place initial creation reference on the flow. This reference
* is released in the corresponding delete action viz.
* mac_unicast_remove after waiting for all transient refs to
* to go away. The wait happens in mac_flow_wait.
*** 2435,2445 ****
--- 2436,2456 ----
* could have set the MCI_TX_QUIESCE flag.
*/
if (flent->fe_rx_ring_group != NULL)
mac_rx_group_unmark(flent->fe_rx_ring_group, MR_INCIPIENT);
FLOW_UNMARK(flent, FE_INCIPIENT);
+
+ /*
+ * If this is an aggr port client, don't enable the flow's
+ * datapath at this stage. Otherwise, bcast traffic could
+ * arrive while the aggr port is in the process of
+ * initializing. Instead, the flow's datapath is started later
+ * when mac_client_set_flow_cb() is called.
+ */
+ if ((mcip->mci_state_flags & MCIS_IS_AGGR_PORT) == 0)
FLOW_UNMARK(flent, FE_MC_NO_DATAPATH);
+
mac_tx_client_unblock(mcip);
return (0);
bail:
if (bcast_added)
mac_bcast_delete(mcip, mip->mi_type->mt_brdcst_addr, vid);