svn commit: r280620 - projects/ifnet/sys/net
Gleb Smirnoff
glebius at FreeBSD.org
Wed Mar 25 14:36:19 UTC 2015
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_ */
More information about the svn-src-projects
mailing list