From owner-svn-src-head@freebsd.org Fri Nov 13 22:54:04 2015 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DBF37A2E48C; Fri, 13 Nov 2015 22:54:03 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from cell.glebius.int.ru (glebius.int.ru [81.19.69.10]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "cell.glebius.int.ru", Issuer "cell.glebius.int.ru" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 5D1861345; Fri, 13 Nov 2015 22:54:02 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from cell.glebius.int.ru (localhost [127.0.0.1]) by cell.glebius.int.ru (8.15.2/8.15.2) with ESMTPS id tADMs0so073835 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 14 Nov 2015 01:54:00 +0300 (MSK) (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by cell.glebius.int.ru (8.15.2/8.15.2/Submit) id tADMs0xf073834; Sat, 14 Nov 2015 01:54:00 +0300 (MSK) (envelope-from glebius@FreeBSD.org) X-Authentication-Warning: cell.glebius.int.ru: glebius set sender to glebius@FreeBSD.org using -f Date: Sat, 14 Nov 2015 01:54:00 +0300 From: Gleb Smirnoff To: "Alexander V. Chernikov" Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r290603 - in head/sys: net netgraph netinet Message-ID: <20151113225400.GE73031@FreeBSD.org> References: <201511091011.tA9ABFWb029549@repo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201511091011.tA9ABFWb029549@repo.freebsd.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Nov 2015 22:54:04 -0000 Alexander, On Mon, Nov 09, 2015 at 10:11:15AM +0000, Alexander V. Chernikov wrote: A> Author: melifaro A> Date: Mon Nov 9 10:11:14 2015 A> New Revision: 290603 A> URL: https://svnweb.freebsd.org/changeset/base/290603 A> A> Log: A> Use lladdr_event to propagate gratiotus arp. A> A> Differential Revision: https://reviews.freebsd.org/D4019 Looking into a diff a lame question emerges: why can't the call to EVENTHANDLER_INVOKE() moved right into the end of the if_setlladdr()? A> Modified: A> head/sys/net/if.c A> head/sys/net/if_vlan.c A> head/sys/netgraph/ng_eiface.c A> head/sys/netgraph/ng_ether.c A> head/sys/netinet/if_ether.c A> A> Modified: head/sys/net/if.c A> ============================================================================== A> --- head/sys/net/if.c Mon Nov 9 09:39:59 2015 (r290602) A> +++ head/sys/net/if.c Mon Nov 9 10:11:14 2015 (r290603) A> @@ -2512,7 +2512,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, A> return (error); A> error = if_setlladdr(ifp, A> ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len); A> - EVENTHANDLER_INVOKE(iflladdr_event, ifp); A> + if (error == 0) A> + EVENTHANDLER_INVOKE(iflladdr_event, ifp); A> break; A> A> case SIOCAIFGROUP: A> @@ -3375,16 +3376,6 @@ if_setlladdr(struct ifnet *ifp, const u_ A> ifr.ifr_flagshigh = ifp->if_flags >> 16; A> (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr); A> } A> -#ifdef INET A> - /* A> - * Also send gratuitous ARPs to notify other nodes about A> - * the address change. A> - */ A> - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { A> - if (ifa->ifa_addr->sa_family == AF_INET) A> - arp_ifinit(ifp, ifa); A> - } A> -#endif A> } A> return (0); A> } A> A> Modified: head/sys/net/if_vlan.c A> ============================================================================== A> --- head/sys/net/if_vlan.c Mon Nov 9 09:39:59 2015 (r290602) A> +++ head/sys/net/if_vlan.c Mon Nov 9 10:11:14 2015 (r290603) A> @@ -523,7 +523,7 @@ vlan_iflladdr(void *arg __unused, struct A> #ifndef VLAN_ARRAY A> struct ifvlan *next; A> #endif A> - int i; A> + int error, i; A> A> /* A> * Check if it's a trunk interface first of all A> @@ -544,8 +544,11 @@ vlan_iflladdr(void *arg __unused, struct A> LIST_FOREACH_SAFE(ifv, &ifp->if_vlantrunk->hash[i], ifv_list, next) { A> #endif /* VLAN_ARRAY */ A> VLAN_UNLOCK(); A> - if_setlladdr(ifv->ifv_ifp, IF_LLADDR(ifp), A> + error = if_setlladdr(ifv->ifv_ifp, IF_LLADDR(ifp), A> ifp->if_addrlen); A> + if (error == 0) A> + EVENTHANDLER_INVOKE(iflladdr_event, A> + ifv->ifv_ifp); A> VLAN_LOCK(); A> } A> VLAN_UNLOCK(); A> A> Modified: head/sys/netgraph/ng_eiface.c A> ============================================================================== A> --- head/sys/netgraph/ng_eiface.c Mon Nov 9 09:39:59 2015 (r290602) A> +++ head/sys/netgraph/ng_eiface.c Mon Nov 9 10:11:14 2015 (r290603) A> @@ -489,7 +489,8 @@ ng_eiface_rcvmsg(node_p node, item_p ite A> } A> error = if_setlladdr(priv->ifp, A> (u_char *)msg->data, ETHER_ADDR_LEN); A> - EVENTHANDLER_INVOKE(iflladdr_event, priv->ifp); A> + if (error == 0) A> + EVENTHANDLER_INVOKE(iflladdr_event, priv->ifp); A> break; A> } A> A> A> Modified: head/sys/netgraph/ng_ether.c A> ============================================================================== A> --- head/sys/netgraph/ng_ether.c Mon Nov 9 09:39:59 2015 (r290602) A> +++ head/sys/netgraph/ng_ether.c Mon Nov 9 10:11:14 2015 (r290603) A> @@ -534,7 +534,8 @@ ng_ether_rcvmsg(node_p node, item_p item A> } A> error = if_setlladdr(priv->ifp, A> (u_char *)msg->data, ETHER_ADDR_LEN); A> - EVENTHANDLER_INVOKE(iflladdr_event, priv->ifp); A> + if (error == 0) A> + EVENTHANDLER_INVOKE(iflladdr_event, priv->ifp); A> break; A> } A> case NGM_ETHER_GET_PROMISC: A> A> Modified: head/sys/netinet/if_ether.c A> ============================================================================== A> --- head/sys/netinet/if_ether.c Mon Nov 9 09:39:59 2015 (r290602) A> +++ head/sys/netinet/if_ether.c Mon Nov 9 10:11:14 2015 (r290603) A> @@ -142,7 +142,9 @@ static void in_arpinput(struct mbuf *); A> static void arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, A> struct ifnet *ifp, int bridged, struct llentry *la); A> static void arp_mark_lle_reachable(struct llentry *la); A> +static void arp_iflladdr(void *arg __unused, struct ifnet *ifp); A> A> +static eventhandler_tag iflladdr_tag; A> A> static const struct netisr_handler arp_nh = { A> .nh_name = "arp", A> @@ -1150,10 +1152,39 @@ arp_ifinit2(struct ifnet *ifp, struct if A> ifa->ifa_rtrequest = NULL; A> } A> A> +/* A> + * Sends gratuitous ARPs for each ifaddr to notify other A> + * nodes about the address change. A> + */ A> +static __noinline void A> +arp_handle_ifllchange(struct ifnet *ifp) A> +{ A> + struct ifaddr *ifa; A> + A> + TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { A> + if (ifa->ifa_addr->sa_family == AF_INET) A> + arp_ifinit(ifp, ifa); A> + } A> +} A> + A> +/* A> + * A handler for interface link layer address change event. A> + */ A> +static __noinline void A> +arp_iflladdr(void *arg __unused, struct ifnet *ifp) A> +{ A> + A> + if ((ifp->if_flags & IFF_UP) != 0) A> + arp_handle_ifllchange(ifp); A> +} A> + A> static void A> arp_init(void) A> { A> A> netisr_register(&arp_nh); A> + if (IS_DEFAULT_VNET(curvnet)) A> + iflladdr_tag = EVENTHANDLER_REGISTER(iflladdr_event, A> + arp_iflladdr, NULL, EVENTHANDLER_PRI_ANY); A> } A> SYSINIT(arp, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY, arp_init, 0); A> -- Totus tuus, Glebius.