svn commit: r290603 - in head/sys: net netgraph netinet
Gleb Smirnoff
glebius at FreeBSD.org
Fri Nov 13 22:54:04 UTC 2015
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.
More information about the svn-src-all
mailing list