[PATCH] make gratuitous ARP repeat count configurable
Patrick Schaaf <[email protected]>
| Newsgroups | gmane.linux.keepalived.devel |
|---|---|
| Message-ID | <175150339.1RcqRXTgEU@rofl> |
Hi,
introducing the new garp_master_repeat mode in my production setup, I noticed
that it is sending 5 GARPs in short succession for each interval, just like
the initial (becoming MASTER) operation does. I find that a bit excessive :)
Looking at the code I saw the '5' being hardcoded in vrrp_send_link_update(),
and decided to make it configurable, separately for the two cases of becoming-
MASTER GARP (new setting garp_master_repeat), and for the periodic refresh
case (new setting garp_master_refresh_repeat).
The default for the becoming-MASTER case is still 5 repetitions, but for the
periodic refresh, I changed the default to 1. That default could be changed in
include/vrrp.h, #define VRRP_GARP_REFRESH_REP
Find the patch below.
best regards
Patrick
diff -urN keepalived-1.2.13/doc/keepalived.conf.SYNOPSIS keepalived-1.2.13-
bof/doc/keepalived.conf.SYNOPSIS
--- keepalived-1.2.13/doc/keepalived.conf.SYNOPSIS 2014-05-12
09:11:27.000000000 +0200
+++ keepalived-1.2.13-bof/doc/keepalived.conf.SYNOPSIS 2014-05-27
12:29:10.330000000 +0200
@@ -175,9 +175,16 @@
}
lvs_sync_daemon_interface <STRING> # Binding interface for lvs syncd
garp_master_delay <INTEGER> # delay for gratuitous ARP
after MASTER
- # state transition
+ # state transition.
+ # Default: 5 seconds
+ garp_master_repeat <INTEGER> # how often the gratuitous ARP after
MASTER
+ # state transition should be
repeated?
+ # Default: 5 times
garp_master_refresh <INTEGER> # Periodic delay in seconds sending
# gratuitous ARP while in MASTER
state
+ garp_master_refresh_repeat <INTEGER># how often the periodically repeated
gratuitous ARP
+ # should be repeated?
+ # Default: once (per period)
virtual_router_id <INTEGER-0..255> # VRRP VRID
priority <INTEGER-0..255> # VRRP PRIO
advert_int <INTEGER> # VRRP Advert interval (use default)
diff -urN keepalived-1.2.13/keepalived/include/vrrp.h keepalived-1.2.13-
bof/keepalived/include/vrrp.h
--- keepalived-1.2.13/keepalived/include/vrrp.h 2014-01-28 14:38:19.000000000
+0100
+++ keepalived-1.2.13-bof/keepalived/include/vrrp.h 2014-05-27
12:20:39.860000000 +0200
@@ -64,6 +64,8 @@
#define VRRP_AUTH_AH 2 /* AH(IPSec) authentification
- rfc2338.5.3.6 */
#define VRRP_ADVER_DFL 1 /* advert. interval (in sec)
-- rfc2338.5.3.7 */
#define VRRP_GARP_DELAY (5 * TIMER_HZ) /* Default delay to launch
gratuitous arp */
+#define VRRP_GARP_REP 5 /* Default repeat value for
initial (MASTER) gratuitous arp */
+#define VRRP_GARP_REFRESH_REP 1 /* Default repeat value for
refresh gratuitous arp */
/*
* parameters per vrrp sync group. A vrrp_sync_group is a set
@@ -108,6 +110,8 @@
int garp_delay; /* Delay to launch
gratuitous ARP */
int garp_refresh; /* Next scheduled
gratuitous ARP refresh */
timeval_t garp_refresh_timer; /* Next scheduled
gratuitous ARP timer */
+ int garp_rep; /* gratuitous ARP
repeat value */
+ int garp_refresh_rep; /* refresh gratuitous
ARP repeat value */
int vrid; /* virtual id. from
1(!) to 255 */
int base_priority; /* configured priority
value */
int effective_priority; /* effective priority
value */
@@ -228,7 +232,7 @@
extern int open_vrrp_socket(sa_family_t, int, int, int);
extern int new_vrrp_socket(vrrp_t *);
extern void close_vrrp_socket(vrrp_t *);
-extern void vrrp_send_link_update(vrrp_t *);
+extern void vrrp_send_link_update(vrrp_t *, int);
extern int vrrp_send_adv(vrrp_t *, int);
extern int vrrp_state_fault_rx(vrrp_t *, char *, int);
extern int vrrp_state_master_rx(vrrp_t *, char *, int);
diff -urN keepalived-1.2.13/keepalived/vrrp/vrrp.c keepalived-1.2.13-
bof/keepalived/vrrp/vrrp.c
--- keepalived-1.2.13/keepalived/vrrp/vrrp.c 2014-05-12 09:11:27.000000000
+0200
+++ keepalived-1.2.13-bof/keepalived/vrrp/vrrp.c 2014-05-27
12:23:35.930000000 +0200
@@ -722,7 +722,7 @@
}
void
-vrrp_send_link_update(vrrp_t * vrrp)
+vrrp_send_link_update(vrrp_t * vrrp, int rep)
{
int j;
ip_address_t *ipaddress;
@@ -733,7 +733,7 @@
return;
/* send gratuitous arp for each virtual ip */
- for (j = 0; j < 5; j++) {
+ for (j = 0; j < rep; j++) {
if (!LIST_ISEMPTY(vrrp->vip)) {
for (e = LIST_HEAD(vrrp->vip); e; ELEMENT_NEXT(e)) {
ipaddress = ELEMENT_DATA(e);
@@ -766,7 +766,7 @@
vrrp_handle_iproutes(vrrp, IPROUTE_ADD);
/* remotes neighbour update */
- vrrp_send_link_update(vrrp);
+ vrrp_send_link_update(vrrp, vrrp->garp_rep ? vrrp->garp_rep :
VRRP_GARP_REP);
/* set refresh timer */
if (vrrp->garp_refresh) {
@@ -922,7 +922,7 @@
vrrp_state_become_master(vrrp);
ret = 1;
} else if (vrrp->garp_refresh && timer_cmp(time_now, vrrp-
>garp_refresh_timer) > 0) {
- vrrp_send_link_update(vrrp);
+ vrrp_send_link_update(vrrp, vrrp->garp_refresh_rep ? vrrp-
>garp_refresh_rep : VRRP_GARP_REFRESH_REP);
vrrp->garp_refresh_timer = timer_add_long(time_now, vrrp-
>garp_refresh);
}
@@ -971,7 +971,7 @@
vrrp->ipsecah_counter->cycle = 0;
}
vrrp_send_adv(vrrp, vrrp->effective_priority);
- vrrp_send_link_update(vrrp);
+ vrrp_send_link_update(vrrp, vrrp->garp_rep ? vrrp->garp_rep :
VRRP_GARP_REP);
return 0;
} else if (hd->priority == 0) {
vrrp_send_adv(vrrp, vrrp->effective_priority);
diff -urN keepalived-1.2.13/keepalived/vrrp/vrrp_parser.c keepalived-1.2.13-
bof/keepalived/vrrp/vrrp_parser.c
--- keepalived-1.2.13/keepalived/vrrp/vrrp_parser.c 2014-01-02
20:53:15.000000000 +0100
+++ keepalived-1.2.13-bof/keepalived/vrrp/vrrp_parser.c 2014-05-27
12:20:01.210000000 +0200
@@ -366,6 +366,22 @@
vrrp->garp_refresh = atoi(vector_slot(strvec, 1)) * TIMER_HZ;
}
static void
+vrrp_garp_rep_handler(vector_t *strvec)
+{
+ vrrp_t *vrrp = LIST_TAIL_DATA(vrrp_data->vrrp);
+ vrrp->garp_rep = atoi(vector_slot(strvec, 1));
+ if (vrrp->garp_rep < 1)
+ vrrp->garp_rep = 1;
+}
+static void
+vrrp_garp_refresh_rep_handler(vector_t *strvec)
+{
+ vrrp_t *vrrp = LIST_TAIL_DATA(vrrp_data->vrrp);
+ vrrp->garp_refresh_rep = atoi(vector_slot(strvec, 1));
+ if (vrrp->garp_refresh_rep < 1)
+ vrrp->garp_refresh_rep = 1;
+}
+static void
vrrp_auth_type_handler(vector_t *strvec)
{
vrrp_t *vrrp = LIST_TAIL_DATA(vrrp_data->vrrp);
@@ -542,6 +558,8 @@
install_keyword("lvs_sync_daemon_interface", &vrrp_lvs_syncd_handler);
install_keyword("garp_master_delay", &vrrp_garp_delay_handler);
install_keyword("garp_master_refresh", &vrrp_garp_refresh_handler);
+ install_keyword("garp_master_repeat", &vrrp_garp_rep_handler);
+ install_keyword("garp_master_refresh_repeat",
&vrrp_garp_refresh_rep_handler);
install_keyword("authentication", NULL);
install_sublevel();
install_keyword("auth_type", &vrrp_auth_type_handler);
diff -urN keepalived-1.2.13/keepalived/vrrp/vrrp_scheduler.c
keepalived-1.2.13-bof/keepalived/vrrp/vrrp_scheduler.c
--- keepalived-1.2.13/keepalived/vrrp/vrrp_scheduler.c 2014-05-12
15:14:46.000000000 +0200
+++ keepalived-1.2.13-bof/keepalived/vrrp/vrrp_scheduler.c 2014-05-27
12:22:30.720000000 +0200
@@ -709,7 +709,7 @@
vrrp_t *vrrp = THREAD_ARG(thread);
/* Simply broadcast the gratuitous ARP */
- vrrp_send_link_update(vrrp);
+ vrrp_send_link_update(vrrp, vrrp->garp_rep ? vrrp->garp_rep :
VRRP_GARP_REP);
return 0;
}
------------------------------------------------------------------------------
The best possible search technologies are now affordable for all companies.
Download your FREE open source Enterprise Search Engine today!
Our experts will assist you in its installation for $59/mo, no commitment.
Test it for FREE on our Cloud platform anytime!
http://pubads.g.doubleclick.net/gampad/clk?id=145328191&iu=/4140/ostg.clktrk