LVS
lvs-users
Google
 
Web LinuxVirtualServer.org

Re: AW: keepalived and "stupid" router

To: <christian.jacobsen@xxxxxxxxxxxxxxx>
Subject: Re: AW: keepalived and "stupid" router
Cc: <lvs-users@xxxxxxxxxxxxxxxxxxxxxx>, <keepalived-devel@xxxxxxxxxxxxxxxxxxxxx>
From: "Alexandre Cassen" <alexandre.cassen@xxxxxxxxxx>
Date: Thu, 21 Nov 2002 11:47:55 +0100 (MET)
Hi Christian,

> As far as I have found out till now, ARP-Reply will not help :(
>
> Bintec know of the Problem and are solving it, but it will take 4 months :(
> This is what it does : so long the Router can reach the IP-Address it does
> not update its ARP Cache :(

Please, give it a shot :

diff -urN keepalived-0.7.6/keepalived/vrrp/vrrp_arp.c 
keepalived-0.7.7/keepalived/vrrp/vrrp_arp.c
--- keepalived-0.7.6/keepalived/vrrp/vrrp_arp.c Wed Nov 20 16:41:20 2002
+++ keepalived-0.7.7/keepalived/vrrp/vrrp_arp.c Thu Nov 21 12:44:53 2002
@@ -53,7 +53,7 @@
 }

 /* Build a gratuitous ARP message over a specific interface */
-int send_gratuitous_arp(vrrp_rt * vrrp, int addr)
+static int send_arp_type(vrrp_rt * vrrp, int addr, int type)
 {
        char buflen                     = sizeof(m_arphdr) + ETHER_HDR_LEN;
        char *buf                       = (char *)MALLOC(buflen);
@@ -72,7 +72,7 @@
        arph->ar_pro = htons(ETHERTYPE_IP);
        arph->ar_hln = ETHERNET_HW_LEN;
        arph->ar_pln = IPPROTO_ADDR_LEN;
-       arph->ar_op = htons(ARPOP_REQUEST);
+       arph->ar_op = htons(type);
        memcpy(arph->__ar_sha, hwaddr, ETH_ALEN);
        memcpy(arph->__ar_sip, &addr, sizeof (addr));
        memcpy(arph->__ar_tip, &addr, sizeof (addr));
@@ -83,3 +83,11 @@
        FREE(buf);
        return len;
 }
+
+int send_gratuitous_arp(vrrp_rt * vrrp, int addr)
+{
+       send_arp_type(vrrp, addr, ARPOP_REQUEST);
+       send_arp_type(vrrp, addr, ARPOP_REPLY);
+
+       return 0;
+}

> Solutions :
>
> 1. take down the VIP (and mybee the Card on the failed LB) for 90-100 Sec.
> so that the cache in the Bintec timouts. Then start it again. Could that be
> done with notify_failure/notify_master ?

You can use notify_* for this but still hacky :)

> 2. Somehow use a VMAC. I have found an "ip arp" patch here
> http://www.linuxvirtualserver.org/~julian/#iparp - could that possibly solve
> my Problem ?
> I would then use the notify_master to set a Private MAC and notify_failure
> to remove it again. send_arp of the piranha package could be used to do the
> Gratious ARP :)

VMAC would be nice but there is current trouble with Linux Kernel that doesn t
allow to add this VMAC support in a simple way.

Hey, Julian, you will say, "Alexandre : AGAIN YOU VRRP VMAC !!!!" :) The fact
is that we spend some time on this problem and Julian produced a nice netlink
patch that handle ARP reply filtering.

There is other solution using bridge and/or 802.1Q Kernel code :
http://www.math.leidenuniv.nl/pipermail/bridge/2002-June/002021.html

But this still hacky. And it can introduce ugly thinks into the current VRRP
code. The fact is that I really want to keep the code as simple as possible
to keep readability.

Since gratuitous ARP are working quite nicely (for non bintec switch :)) I
have not considered spending time on this VMAC part. And I don t want to
polute Julian time with that :).

I think I will put an email into the LKML when the 1.0.0 code will be release,
and I will let an open discussion on this VMAC. But currently it is not my
area, so I must delay this part.

Best regards,
Alexandre



<Prev in Thread] Current Thread [Next in Thread>