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); }