Add --start-delay option

This commit is contained in:
Arnaud ANDRE 2016-01-18 18:44:39 +01:00
parent d13433f743
commit 211f699794
6 changed files with 48 additions and 5 deletions

View file

@ -60,6 +60,9 @@ Optional arguments:
-t, --time delay Time interval between advertisements -t, --time delay Time interval between advertisements
Seconds in VRRPv2 (default 1s), Seconds in VRRPv2 (default 1s),
Centiseconds in VRRPv3 (default 100cs) Centiseconds in VRRPv3 (default 100cs)
-T, --start-delay delay Use custom delay in INIT state
Seconds in VRRPv2 (default 1s),
Centiseconds in VRRPv3 (default 100cs)
-P, --preempt on|off Switch preempt (default on) -P, --preempt on|off Switch preempt (default on)
-r, --rfc version Specify protocol 'version' -r, --rfc version Specify protocol 'version'
2 (VRRPv2, RFC3768) by default, 2 (VRRPv2, RFC3768) by default,
@ -67,9 +70,11 @@ Optional arguments:
-6, --ipv6 IPv6 support, (only in VRRPv3) -6, --ipv6 IPv6 support, (only in VRRPv3)
-a, --auth pass Simple text password (only in VRRPv2) -a, --auth pass Simple text password (only in VRRPv2)
-f, --foreground Execute uvrrpd in foreground -f, --foreground Execute uvrrpd in foreground
-s, --script Path of hook script (default /etc/uvrrpd/uvrrpd-switch.sh) -s, --script Path of hook script (default /usr/local/sbin/vrrp-switch.sh)
-F --pidfile Create pid file 'name' -F --pidfile name Use alternate pid file 'name'
Default /var/run/uvrrp_${vrid}.pid Default /run/uvrrp_${vrid}.pid
-C --control name Use alternate control file 'name'
Default /run/uvrrpd_ctrl.${vrid}
-d, --debug -d, --debug
-h, --help -h, --help
``` ```

1
vrrp.c
View file

@ -63,6 +63,7 @@ void vrrp_init(struct vrrp *vrrp)
/* timers */ /* timers */
vrrp->adv_int = 0; vrrp->adv_int = 0;
vrrp->start_delay = 0;
vrrp->master_adv_int = 0; vrrp->master_adv_int = 0;
vrrp_timer_clear(&vrrp->adv_timer); vrrp_timer_clear(&vrrp->adv_timer);
vrrp_timer_clear(&vrrp->masterdown_timer); vrrp_timer_clear(&vrrp->masterdown_timer);

3
vrrp.h
View file

@ -94,6 +94,9 @@ struct vrrp {
*/ */
uint16_t adv_int; uint16_t adv_int;
/* Start delay */
uint16_t start_delay;
/* Master advertisement interval /* Master advertisement interval
* only in VRRPv3 / rfc5798 * only in VRRPv3 / rfc5798
*/ */

View file

@ -52,6 +52,9 @@ static void vrrp_usage(void)
" -t, --time delay Time interval between advertisements\n" " -t, --time delay Time interval between advertisements\n"
" Seconds in VRRPv2 (default 1s),\n" " Seconds in VRRPv2 (default 1s),\n"
" Centiseconds in VRRPv3 (default 100cs)\n" " Centiseconds in VRRPv3 (default 100cs)\n"
" -T, --start-delay delay Use custom delay in INIT state\n"
" Seconds in VRRPv2 (default 1s),\n"
" Centiseconds in VRRPv3 (default 100cs)\n"
" -P, --preempt on|off Switch preempt (default on)\n" " -P, --preempt on|off Switch preempt (default on)\n"
" -r, --rfc version Specify protocol 'version'\n" " -r, --rfc version Specify protocol 'version'\n"
" 2 (VRRPv2, RFC3768) by default,\n" " 2 (VRRPv2, RFC3768) by default,\n"
@ -81,6 +84,7 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
{"interface", required_argument, 0, 'i'}, {"interface", required_argument, 0, 'i'},
{"priority", required_argument, 0, 'p'}, {"priority", required_argument, 0, 'p'},
{"time", required_argument, 0, 't'}, {"time", required_argument, 0, 't'},
{"start-delay", required_argument, 0, 'T'},
{"preempt", required_argument, 0, 'P'}, {"preempt", required_argument, 0, 'P'},
{"rfc", required_argument, 0, 'r'}, {"rfc", required_argument, 0, 'r'},
{"ipv6", no_argument, 0, '6'}, {"ipv6", no_argument, 0, '6'},
@ -95,7 +99,7 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
}; };
while ((optc = while ((optc =
getopt_long(argc, argv, "v:i:p:t:P:r:6a:fs:F:C:dh", opts, getopt_long(argc, argv, "v:i:p:t:T:P:r:6a:fs:F:C:dh", opts,
NULL)) != EOF) { NULL)) != EOF) {
switch (optc) { switch (optc) {
@ -164,6 +168,24 @@ int vrrp_options(struct vrrp *vrrp, struct vrrp_net *vnet, int argc,
vrrp->adv_int = (uint16_t) opt; vrrp->adv_int = (uint16_t) opt;
break; break;
/* start delay */
case 'T':
err = mystrtoul(&opt, optarg, ADVINT_MAX);
if (err == -ERANGE) {
vrrp_usage();
return -1;
}
if (err == -EINVAL) {
fprintf(stderr,
"Error parsing \"%s\" as a number\n",
optarg);
vrrp_usage();
return err;
}
vrrp->start_delay = (uint16_t) opt;
break;
/* preempt mode */ /* preempt mode */
case 'P': case 'P':
if (matches(optarg, "on")) if (matches(optarg, "on"))

View file

@ -332,6 +332,14 @@ static int vrrp_state_goto_backup(struct vrrp *vrrp, struct vrrp_net *vnet)
/* clear adv timer && set masterdown_timer */ /* clear adv timer && set masterdown_timer */
vrrp_timer_clear(&vrrp->adv_timer); vrrp_timer_clear(&vrrp->adv_timer);
if ((previous_state == INIT) && (vrrp->start_delay != 0)) {
log_notice("vrid %d :: applying start_delay %d%s",
vrrp->vrid, vrrp->start_delay,
(vrrp->version == 3 ? "cs":"s")
);
VRRP_SET_STARTDELAY_TIMER(vrrp);
}
else
VRRP_SET_MASTERDOWN_TIMER(vrrp); VRRP_SET_MASTERDOWN_TIMER(vrrp);
log_debug("%d %d", vrrp->master_adv_int, log_debug("%d %d", vrrp->master_adv_int,

View file

@ -70,5 +70,9 @@ int vrrp_timer_is_expired(struct vrrp_timer *timer);
(v->version == 3 ? 0:SKEW_TIME( v )), \ (v->version == 3 ? 0:SKEW_TIME( v )), \
(v->version == 3 ? SKEW_TIME( v ):0)) (v->version == 3 ? SKEW_TIME( v ):0))
#define VRRP_SET_STARTDELAY_TIMER( v ) \
vrrp_timer_set(&v->masterdown_timer, \
(v->version == 3 ? 0:v->start_delay), \
(v->version == 3 ? v->start_delay:0))
#endif /* _VRRP_TIMER_H_ */ #endif /* _VRRP_TIMER_H_ */