svn commit: r354705 - stable/12/sys/net

Andrey V. Elsukov ae at FreeBSD.org
Thu Nov 14 12:07:50 UTC 2019


Author: ae
Date: Thu Nov 14 12:07:49 2019
New Revision: 354705
URL: https://svnweb.freebsd.org/changeset/base/354705

Log:
  MFC r354443:
    Enqueue lladdr_task to update link level address of vlan, when its parent
    interface has changed.
  
    During vlan reconfiguration without destroying interface, it is possible,
    that parent interface will be changed. This usually means, that link
    layer address of vlan will be different. Therefore we need to update all
    associated with vlan's addresses permanent llentries - NDP for IPv6
    addresses, and ARP for IPv4 addresses. This is done via lladdr_task
    execution. To avoid extra work, before execution do the check, that L2
    address is different.

Modified:
  stable/12/sys/net/if_vlan.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/net/if_vlan.c
==============================================================================
--- stable/12/sys/net/if_vlan.c	Thu Nov 14 09:39:03 2019	(r354704)
+++ stable/12/sys/net/if_vlan.c	Thu Nov 14 12:07:49 2019	(r354705)
@@ -1408,11 +1408,19 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint1
 	 * Set up our interface address to reflect the underlying
 	 * physical interface's.
 	 */
-	bcopy(IF_LLADDR(p), IF_LLADDR(ifp), p->if_addrlen);
+	TASK_INIT(&ifv->lladdr_task, 0, vlan_lladdr_fn, ifv);
 	((struct sockaddr_dl *)ifp->if_addr->ifa_addr)->sdl_alen =
 	    p->if_addrlen;
 
-	TASK_INIT(&ifv->lladdr_task, 0, vlan_lladdr_fn, ifv);
+	/*
+	 * Do not schedule link address update if it was the same
+	 * as previous parent's. This helps avoid updating for each
+	 * associated llentry.
+	 */
+	if (memcmp(IF_LLADDR(p), IF_LLADDR(ifp), p->if_addrlen) != 0) {
+		bcopy(IF_LLADDR(p), IF_LLADDR(ifp), p->if_addrlen);
+		taskqueue_enqueue(taskqueue_thread, &ifv->lladdr_task);
+	}
 
 	/* We are ready for operation now. */
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;


More information about the svn-src-all mailing list