Chris Lalancette wrote:
> All,
>      Attached is a patch to fix arp_reply when you have multiple possible 
> routers doing ARP requests to you.  Currently arp_reply always replies to the 
> MAC address that it was given when it starts.  However, if you have multiple 
> routers that can ARP request you, you might respond to the wrong router; in 
> which case the other router will eventually drop you from it's ARP cache and 
> stop delivering packets to you.  The fix is to always reply to the router 
> that asked you, not the one you have hard-coded.
>      I do not have the setup to test this; the customer that does have the 
> setup has tested the patch and reports that it fixes the problems they were 
> having.
> 
> 
> Signed-off-by: Chris Lalancette <[EMAIL PROTECTED]>
> 
> 
> ------------------------------------------------------------------------
> 
> diff --git a/net/core/netpoll.c b/net/core/netpoll.c
> index 3c58846..5833b21 100644
> --- a/net/core/netpoll.c
> +++ b/net/core/netpoll.c
> @@ -331,6 +331,7 @@ static void arp_reply(struct sk_buff *sk
>       unsigned char *arp_ptr;
>       int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;
>       __be32 sip, tip;
> +     unsigned char *sha;
>       struct sk_buff *send_skb;
>       struct netpoll *np = NULL;
>  
> @@ -357,9 +358,14 @@ static void arp_reply(struct sk_buff *sk
>           arp->ar_op != htons(ARPOP_REQUEST))
>               return;
>  
> -     arp_ptr = (unsigned char *)(arp+1) + skb->dev->addr_len;
> +     arp_ptr = (unsigned char *)(arp+1);
> +     /* save the location of the src hw addr */
> +     sha = arp_ptr;
> +     arp_ptr += skb->dev->addr_len;
>       memcpy(&sip, arp_ptr, 4);
> -     arp_ptr += 4 + skb->dev->addr_len;
> +     arp_ptr += 4;
> +     /* if we actually cared about dst hw addr, it would get copied here */
> +     arp_ptr += skb->dev->addr_len;
>       memcpy(&tip, arp_ptr, 4);
>  
>       /* Should we ignore arp? */
> @@ -382,7 +388,7 @@ static void arp_reply(struct sk_buff *sk
>  
>       if (np->dev->hard_header &&
>           np->dev->hard_header(send_skb, skb->dev, ptype,
> -                              np->remote_mac, np->local_mac,
> +                              sha, np->local_mac,
>                                send_skb->len) < 0) {
>               kfree_skb(send_skb);
>               return;
> @@ -406,7 +412,7 @@ static void arp_reply(struct sk_buff *sk
>       arp_ptr += np->dev->addr_len;
>       memcpy(arp_ptr, &tip, 4);
>       arp_ptr += 4;
> -     memcpy(arp_ptr, np->remote_mac, np->dev->addr_len);
> +     memcpy(arp_ptr, sha, np->dev->addr_len);
>       arp_ptr += np->dev->addr_len;
>       memcpy(arp_ptr, &sip, 4);
>  

All,
     Sorry for the confusion...this was already picked up by akpm on linux-net. 
 Please don't take the patch.

Thanks,
Chris Lalancette
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to