Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2015 14:36:18 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r280620 - projects/ifnet/sys/net
Message-ID:  <201503251436.t2PEaINI010851@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Wed Mar 25 14:36:17 2015
New Revision: 280620
URL: https://svnweb.freebsd.org/changeset/base/280620

Log:
  In the head network stack an interface ifp->if_addrlen always matches
  ((struct sockaddr_dl *)ifp->if_addr->ifa_addr))->sdl_alen. We can use
  either to determine interface address length. In the projects/ifnet,
  the if_addrlen moves to ifdrv_addrlen, being the same for all instances
  of a certain driver. However, the vlan(4) driver theoretically may
  have different address length on different instances. We've got code
  in vlan(4) that allows it to run on infiniband.
  
  o Change if_addrlen() to return sdl_alen of hardware address instead
    of ifdrv_addrlen.
  o Generalize setup of ifa_addr. Set up sdl->sdl_alen and copy the
    link level address in the if_attach(), instead of doing that in
    ether_ifattach/arc_ifattch/whatever_ifattach.
  o Make ifat_lla an optional argument. An interface may not know its
    address at creation time, thus it will have address of all zeroes.
  
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/ifnet/sys/net/if.c
  projects/ifnet/sys/net/if_ethersubr.c
  projects/ifnet/sys/net/if_var.h

Modified: projects/ifnet/sys/net/if.c
==============================================================================
--- projects/ifnet/sys/net/if.c	Wed Mar 25 14:24:04 2015	(r280619)
+++ projects/ifnet/sys/net/if.c	Wed Mar 25 14:36:17 2015	(r280620)
@@ -619,6 +619,9 @@ if_attach(struct if_attach_args *ifat)
 	sdl->sdl_nlen = namelen;
 	sdl->sdl_index = ifp->if_index;
 	sdl->sdl_type = ifdrv->ifdrv_type;
+	sdl->sdl_alen = ifdrv->ifdrv_addrlen;
+	if (ifat->ifat_lla != NULL)
+		bcopy(ifat->ifat_lla, LLADDR(sdl), ifdrv->ifdrv_addrlen);
 	ifp->if_addr = ifa;
 	ifa->ifa_ifp = ifp;
 	ifa->ifa_rtrequest = link_rtrequest;
@@ -3498,6 +3501,21 @@ if_setlladdr(struct ifnet *ifp, const u_
 	return (0);
 }
 
+/*
+ * Return address length of the interface.
+ *
+ * For vlan(4) the address length of different instances can be different.
+ * For usual interfaces sdl->sdl_alen == ifdrv_addrlen.
+ */
+uint8_t
+if_addrlen(const if_t ifp)
+{
+	struct sockaddr_dl *sdl;
+
+	sdl = (struct sockaddr_dl *)ifp->if_addr->ifa_addr;
+	return (sdl->sdl_alen);
+}
+
 int
 if_printf(struct ifnet *ifp, const char * fmt, ...)
 {

Modified: projects/ifnet/sys/net/if_ethersubr.c
==============================================================================
--- projects/ifnet/sys/net/if_ethersubr.c	Wed Mar 25 14:24:04 2015	(r280619)
+++ projects/ifnet/sys/net/if_ethersubr.c	Wed Mar 25 14:36:17 2015	(r280620)
@@ -796,8 +796,6 @@ ether_sprintf(const u_char *ap)
 static void
 ether_ifattach(struct ifnet *ifp, struct if_attach_args *ifat)
 {
-	struct ifaddr *ifa;
-	struct sockaddr_dl *sdl;
 	int i;
 
 	if (ifp->if_mtu == 0)
@@ -806,13 +804,6 @@ ether_ifattach(struct ifnet *ifp, struct
 		ifp->if_baudrate = IF_Mbps(10);	/* just a default */
 	ifp->if_broadcastaddr = etherbroadcastaddr;
 
-	ifa = ifp->if_addr;
-	KASSERT(ifa != NULL, ("%s: no lladdr!\n", __func__));
-	sdl = (struct sockaddr_dl *)ifa->ifa_addr;
-	sdl->sdl_type = IFT_ETHER;
-	sdl->sdl_alen = if_addrlen(ifp);
-	bcopy(ifat->ifat_lla, LLADDR(sdl), if_addrlen(ifp));
-
 	if (ng_ether_attach_p != NULL)
 		(*ng_ether_attach_p)(ifp);
 
@@ -823,7 +814,7 @@ ether_ifattach(struct ifnet *ifp, struct
 	if (i != if_addrlen(ifp))
 		if_printf(ifp, "Ethernet address: %6D\n", ifat->ifat_lla, ":");
 
-	uuid_ether_add(LLADDR(sdl));
+	uuid_ether_add(LLADDR((struct sockaddr_dl *)ifp->if_addr->ifa_addr));
 }
 
 /*

Modified: projects/ifnet/sys/net/if_var.h
==============================================================================
--- projects/ifnet/sys/net/if_var.h	Wed Mar 25 14:24:04 2015	(r280619)
+++ projects/ifnet/sys/net/if_var.h	Wed Mar 25 14:36:17 2015	(r280620)
@@ -384,6 +384,7 @@ int	ifioctl(struct socket *, u_long, cad
 int	ifpromisc(struct ifnet *, int);
 struct	ifnet *ifunit(const char *);
 struct	ifnet *ifunit_ref(const char *);
+uint8_t	if_addrlen(const if_t);
 
 void	iftype_register(struct iftype *);
 void	iftype_unregister(struct iftype *);
@@ -513,12 +514,5 @@ if_type(const if_t ifp)
 
 	return (ifp->if_drv->ifdrv_type);
 }
-
-static inline uint8_t
-if_addrlen(const if_t ifp)
-{
-
-	return (ifp->if_drv->ifdrv_addrlen);
-}
 #endif /* _KERNEL */
 #endif /* !_NET_IF_VAR_H_ */



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