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