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.
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to