svn commit: r290603 - in head/sys: net netgraph netinet

Alexander V. Chernikov melifaro at freebsd.org
Sat Nov 14 11:32:20 UTC 2015


14.11.2015, 01:54, "Gleb Smirnoff" <glebius at 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.


More information about the svn-src-all mailing list