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,10 +1434,11 @@
         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,11 +2436,21 @@
          * 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);