summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/control3
-rwxr-xr-xscripts/keepalived/vyatta-vrrp-state.pl20
2 files changed, 20 insertions, 3 deletions
diff --git a/debian/control b/debian/control
index 615b5050..1f63a6ce 100644
--- a/debian/control
+++ b/debian/control
@@ -26,7 +26,8 @@ Depends: sed (>= 4.1.5),
bridge-utils,
ssh,
ed,
- tshark
+ tshark,
+ iputils-arping
Suggests: util-linux (>= 2.13-5),
net-tools,
ethtool,
diff --git a/scripts/keepalived/vyatta-vrrp-state.pl b/scripts/keepalived/vyatta-vrrp-state.pl
index 9e11b649..2f3554d9 100755
--- a/scripts/keepalived/vyatta-vrrp-state.pl
+++ b/scripts/keepalived/vyatta-vrrp-state.pl
@@ -56,7 +56,10 @@ my $vrrp_state = $ARGV[0];
my $vrrp_intf = $ARGV[1];
my $vrrp_group = $ARGV[2];
my $vrrp_transitionscript = $ARGV[3];
-my $vrrp_vip = $ARGV[4];
+my @vrrp_vips;
+foreach my $arg (4 .. $#ARGV) {
+ push @vrrp_vips, $ARGV[$arg];
+}
my $sfile = VyattaKeepalived::get_state_file($vrrp_intf, $vrrp_group);
my ($old_time, $old_intf, $old_group, $old_state, $old_ltime) =
@@ -73,8 +76,21 @@ VyattaKeepalived::vrrp_log("$vrrp_intf $vrrp_group transition to $vrrp_state");
vrrp_state_log($vrrp_state, $vrrp_intf, $vrrp_group);
my $mfile = VyattaKeepalived::get_master_file($vrrp_intf, $vrrp_group);
if ($vrrp_state eq "backup") {
- snoop_for_master($vrrp_intf, $vrrp_group, $vrrp_vip, $mfile);
+ snoop_for_master($vrrp_intf, $vrrp_group, $vrrp_vips[0], $mfile);
} elsif ($vrrp_state eq "master") {
+ #
+ # keepalived will send gratuitous arp requests on master transition
+ # but some hosts do not update their arp cache for gratuitous arp
+ # requests. Some of those host do respond to gratuitous arp replies
+ # so here we will send 5 gratuitous arp replies also.
+ #
+ foreach my $vip (@vrrp_vips) {
+ system("/usr/bin/arping -A -c5 -I $vrrp_intf $vip");
+ }
+
+ #
+ # remove the old master file since we are now master
+ #
system("rm -f $mfile");
}