Print this page
2869 duplicate packets with vnics over aggrs
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2012 OmniTI Computer Consulting, Inc All rights reserved.
*/
/*
* IEEE 802.3ad Link Aggregation - Receive
*
*** 66,85 ****
aggr_lacp_rx_enqueue(port, mp);
}
/*
* Callback function invoked by MAC service module when packets are
! * made available by a MAC port.
*/
/* ARGSUSED */
! void
! aggr_recv_cb(void *arg, mac_resource_handle_t mrh, mblk_t *mp,
! boolean_t loopback)
{
aggr_port_t *port = (aggr_port_t *)arg;
aggr_grp_t *grp = port->lp_grp;
if (grp->lg_lacp_mode == AGGR_LACP_OFF) {
aggr_mac_rx(grp->lg_mh, mrh, mp);
} else {
mblk_t *cmp, *last, *head;
struct ether_header *ehp;
--- 67,97 ----
aggr_lacp_rx_enqueue(port, mp);
}
/*
* Callback function invoked by MAC service module when packets are
! * made available by a MAC port, both in promisc_on mode and not.
*/
/* ARGSUSED */
! static void
! aggr_recv_path_cb(void *arg, mac_resource_handle_t mrh, mblk_t *mp,
! boolean_t loopback, boolean_t promisc_path)
{
aggr_port_t *port = (aggr_port_t *)arg;
aggr_grp_t *grp = port->lp_grp;
+ /* In the case where lp_promisc_on has been turned on to
+ * compensate for insufficient hardware MAC matching and
+ * hardware rings are not in use we will fall back to
+ * using flows for delivery which can result in duplicates
+ * pushed up the stack. Only respect the chosen path.
+ */
+ if (port->lp_promisc_on != promisc_path) {
+ freemsgchain(mp);
+ return;
+ }
+
if (grp->lg_lacp_mode == AGGR_LACP_OFF) {
aggr_mac_rx(grp->lg_mh, mrh, mp);
} else {
mblk_t *cmp, *last, *head;
struct ether_header *ehp;
*** 158,163 ****
--- 170,191 ----
aggr_mac_rx(grp->lg_mh, mrh, head);
else
freemsgchain(head);
}
}
+ }
+
+ /* ARGSUSED */
+ void
+ aggr_recv_cb(void *arg, mac_resource_handle_t mrh, mblk_t *mp,
+ boolean_t loopback)
+ {
+ aggr_recv_path_cb(arg, mrh, mp, loopback, B_FALSE);
+ }
+
+ /* ARGSUSED */
+ void
+ aggr_recv_promisc_cb(void *arg, mac_resource_handle_t mrh, mblk_t *mp,
+ boolean_t loopback)
+ {
+ aggr_recv_path_cb(arg, mrh, mp, loopback, B_TRUE);
}