Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Nov 2015 14:32:07 +0300
From:      Alexander V. Chernikov <melifaro@freebsd.org>
To:        Gleb Smirnoff <glebius@freebsd.org>
Cc:        "src-committers@freebsd.org" <src-committers@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>
Subject:   Re: svn commit: r290603 - in head/sys: net netgraph netinet
Message-ID:  <386501447500727@web21j.yandex.ru>
In-Reply-To: <20151113225400.GE73031@FreeBSD.org>
References:  <201511091011.tA9ABFWb029549@repo.freebsd.org> <20151113225400.GE73031@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
14.11.2015, 01:54, "Gleb Smirnoff" <glebius@FreeBSD.org>:
> šš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()?
Well, initially (in r202588) it was not done due to "risk of the loop" (there was no lagg handler taskqueue).
It was not possible until r290239 due to strange lagg(4) logic where eventhandler was not always called after if_setlladdr()).
It is possible now. I simply forgot to convert D4019 back to EVENTHANDLER_INVOKE() being inside if_setlladdr() after if_lagg(4) changes.
Will commit soon, thanks for the suggestion.
>
> 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.



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