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>