Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Apr 2012 20:39:40 -0400
From:      Ed Maste <emaste@freebsd.org>
To:        <freebsd-net@freebsd.org>
Subject:   lagg(4) MAC address selection proposal
Message-ID:  <20120418003939.GA32603@sandvine.com>

next in thread | raw e-mail | index | archive | help
When a new lagg(4) interface is created the link layer address from the
first port in the group is assigned to the lagg and to all other lagg
port members.  This means the address assigned to the lagg is different
if specified as, for example, "laggport em0 laggport em1" vs
"laggport em1 laggport em0".

The code in lagg_port_create(), in if_lagg.c that chooses the first
l2 address:

   575  if (SLIST_EMPTY(&sc->sc_ports)) {
   576          sc->sc_primary = lp;
   577          lagg_lladdr(sc, IF_LLADDR(ifp));
   578  } else {
   579          /* Update link layer address for this port */
   580          lagg_port_lladdr(lp, IF_LLADDR(sc->sc_ifp));
   581  }

For the current modes lagg supports this probably doesn't matter much,
but we have some improvements in the pipeline for which this behaviour
is undesirable.  (The first of which is an interface for choosing a
different master; this allows a failover lagg to be set to transmit on a
new port, without changing link states.  With the current behaviour this
causes all ports in the lagg to then change their l2 address.)

In looking into potential solutions I found that the bridgestp code in
bridge(4) searches the list of associated MAC addresses and uses the
lowest one when it needs to select one from a group.  I'd like to
propose using the same logic for lagg's MAC address selection.  Can
anyone foresee an issue with this change?  (I'm not aware of any lagg
use cases that rely on the current behaviour.)

-Ed



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120418003939.GA32603>