On 03/09/15(Thu) 11:14, Martin Pieuchot wrote:
> In the IPv4 forwarding case your kernel checks if its is doing ARP proxy
> for the destination to decide if it needs to send an ICMP redirect msg.
> 
> Currently arpproxy() does an iteration on the global list of interfaces.
> This will be not allowed as soon as we go SMP.  This list MUST not be
> used in interrupt context.
> 
> But this is actually not needed because if you add an ARP entry that
> matches one of your lladdr, with:
> 
>       # arp -s 204.1.2.3 00:90:27:bb:cc:dd pub
> 
> The entry will be attached on the corresponding interface, so we can
> simplify the check as below.
> 
> Ok?

Anyone?

> Index: netinet/if_ether.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/if_ether.c,v
> retrieving revision 1.162
> diff -u -p -r1.162 if_ether.c
> --- netinet/if_ether.c        19 Aug 2015 11:05:33 -0000      1.162
> +++ netinet/if_ether.c        3 Sep 2015 08:59:30 -0000
> @@ -826,29 +826,24 @@ arplookup(u_int32_t addr, int create, in
>   * Check whether we do proxy ARP for this address and we point to ourselves.
>   */
>  int
> -arpproxy(struct in_addr in, u_int rdomain)
> +arpproxy(struct in_addr in, unsigned int rtableid)
>  {
> +     struct sockaddr_dl *sdl;
>       struct rtentry *rt;
> -     struct llinfo_arp *la;
>       struct ifnet *ifp;
>       int found = 0;
>  
> -     rt = arplookup(in.s_addr, 0, SIN_PROXY, rdomain);
> +     rt = arplookup(in.s_addr, 0, SIN_PROXY, rtableid);
>       if (rt == NULL)
>               return (0);
> -     la = ((struct llinfo_arp *)rt->rt_llinfo);
>  
> -     TAILQ_FOREACH(ifp, &ifnet, if_list) {
> -             if (ifp->if_rdomain != rdomain)
> -                     continue;
> +     sdl = (struct sockaddr_dl *)rt->rt_gateway;
> +     if (sdl->sdl_alen != ETHER_ADDR_LEN)
> +             return (0);
>  
> -             if (!memcmp(LLADDR((struct sockaddr_dl *)la->la_rt->rt_gateway),
> -                 LLADDR(ifp->if_sadl),
> -                 ETHER_ADDR_LEN)) {
> -                     found = 1;
> -                     break;
> -             }
> -     }
> +     ifp = rt->rt_ifp;
> +     if (!memcmp(LLADDR(sdl), LLADDR(ifp->if_sadl), sdl->sdl_alen))
> +             found = 1;
>  
>       return (found);
>  }
> Index: netinet/if_ether.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/if_ether.h,v
> retrieving revision 1.57
> diff -u -p -r1.57 if_ether.h
> --- netinet/if_ether.h        23 Jun 2015 13:20:17 -0000      1.57
> +++ netinet/if_ether.h        3 Sep 2015 08:59:30 -0000
> @@ -272,7 +280,7 @@ extern struct ifnet *revarp_ifp;
>  #endif /* NFSCLIENT */
>  
>  void arprequest(struct ifnet *, u_int32_t *, u_int32_t *, u_int8_t *);
> -int arpproxy(struct in_addr, u_int);
> +int arpproxy(struct in_addr, unsigned int);
>  void revarpinput(struct mbuf *);
>  void in_revarpinput(struct mbuf *);
>  void revarprequest(struct ifnet *);
> 

Reply via email to