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>
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2012 OmniTI Computer Consulting, Inc All rights reserved.
+ * Copyright 2018 Joyent, Inc.
*/
/*
* IEEE 802.3ad Link Aggregation - Receive
*
*** 54,64 ****
void
aggr_recv_lacp(aggr_port_t *port, mac_resource_handle_t mrh, mblk_t *mp)
{
aggr_grp_t *grp = port->lp_grp;
! /* in promiscuous mode, send copy of packet up */
if (grp->lg_promisc) {
mblk_t *nmp = copymsg(mp);
if (nmp != NULL)
aggr_mac_rx(grp->lg_mh, mrh, nmp);
--- 55,65 ----
void
aggr_recv_lacp(aggr_port_t *port, mac_resource_handle_t mrh, mblk_t *mp)
{
aggr_grp_t *grp = port->lp_grp;
! /* In promiscuous mode, pass copy of packet up. */
if (grp->lg_promisc) {
mblk_t *nmp = copymsg(mp);
if (nmp != NULL)
aggr_mac_rx(grp->lg_mh, mrh, nmp);
*** 72,98 ****
* 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;
--- 73,87 ----
* 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)
{
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;
*** 173,192 ****
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);
}
--- 162,172 ----
freemsgchain(head);
}
}
}
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);
}