uvrrpd is a VRRP daemon written in C, providing an implementation of VRRPv2 (rfc3768) and VRRPv3 (rfc5798), with IPv4 and IPv6 support.
Go to file
Arnaud Andre 4860d50b5f Fix unused-result 2016-01-29 00:06:20 +01:00
.gitignore Autoconfiscate, thanks to gilles-chanteperdrix (https://github.com/gilles-chanteperdrix/uvrrpd/commit/ae45e71) 2015-12-22 12:40:29 +01:00
COPYING Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
Makefile.am Add vrrp_ctrl.c/.h module 2016-01-18 15:22:40 +01:00
README.md Rework README.md and usage() 2016-01-18 19:05:59 +01:00
bits.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
common.h Add vrrp_ctrl.c/.h module 2016-01-18 15:22:40 +01:00
configure.ac Check for IPv6 multicast support in autoconf 2016-01-26 11:21:58 +01:00
list.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
log.c Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
log.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
uvrrpd.c Fix unused-result 2016-01-29 00:06:20 +01:00
uvrrpd.h Set SCHED_RR 2016-01-24 21:45:18 +01:00
vrrp.c Add --start-delay option 2016-01-18 18:44:39 +01:00
vrrp.h Add --start-delay option 2016-01-18 18:44:39 +01:00
vrrp_adv.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_adv.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_arp.c Standardize log_* format 2015-09-16 01:03:04 +02:00
vrrp_arp.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_ctrl.c vrrp_ctrl.c: Fix bad cleaning of ctrl buffers 2016-01-19 16:31:18 +01:00
vrrp_ctrl.h Move vrrp_net_listen() to vrrp.c:vrrp_listen() and listen control fifo fd. Add CTRL_FIFO event. Close #1715. 2016-01-18 15:33:41 +01:00
vrrp_exec.c Set SCHED_RR 2016-01-24 21:45:18 +01:00
vrrp_exec.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_ip4.c Standardize log_* format 2015-09-16 01:03:04 +02:00
vrrp_ip6.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_ipx.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_na.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_na.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_net.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_net.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_options.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_options.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_rfc.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_state.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_state.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_switch.sh vrrp_switch.sh: shorten VRRP interface name. Replace dot separator by / in sysctl cmd to be compatible with vlan interface. 2015-09-16 13:21:37 +02:00
vrrp_timer.c Standardize log_* format 2015-09-16 01:03:04 +02:00
vrrp_timer.h Add --start-delay option 2016-01-18 18:44:39 +01:00

README.md

uvrrpd

uvrrpd is a VRRP daemon written in C, providing a full implementation of VRRPv2 (rfc3768) and VRRPv3 (rfc5798), with IPv4 and IPv6 support.

uvrrpd is a project hosted at Evolix's forge

uvrrpd is written for GNU/Linux and use macvlan in order to derive multiple virtual NICs (virtual VRRP mac) from a single physical NIC.

uvrrpd is a simply VRRP state machine, and a script (vrrp_switch.sh) is in charge to create or destroy Virtual VRRP interfaces.

uvrrpd is designed to run a single VRRP instance, but you can run multiple instances of uvrrpd, each of them with a different VRRP id, on the same or different physical NIC.

Simple text authentication from deprecated RFC2332 may be used while running uvrrpd in version 2 (rfc3768), but not in version 3 (rfc5798).

It provides a network topology update by sending :

  • an ARP gratuitous packet for each Virtual VRRP IPv4 address specified in the VRRP instance,
  • an NDP neighbour advertisement for each Virtual VRRP IPv6 address.

Building

uvrrpd uses the autotools, so to build it from the released tarball, follow the usual procedure.

./configure
make
sudo make install

If building from the git sources, run:

autoreconf -i

before that.

That's all. You need the binary uvrrpd and the shell script vrrp_switch.sh to start playing, they are installed in $prefix/sbin, the default prefix being /usr/local.

Usage

$ ./uvrrpd -h
Usage: uvrrpd -v vrid -i ifname [OPTIONS] VIP1 [… VIPn]

Mandatory options:
  -v, --vrid vrid           Virtual router identifier
  -i, --interface iface     Interface
  VIP                       Virtual IP(s), 1 to 255 VIPs

Optional arguments:
  -p, --priority prio       Priority of VRRP Instance, (0-255, default 100)
  -t, --time delay          Time interval between advertisements
                            Seconds in VRRPv2 (default 1s),
                            Centiseconds in VRRPv3 (default 100cs)
  -T, --start-delay delay   Use custom delay in INIT state, override masterdown
                            timer
                            Seconds in VRRPv2 (default 0s),
                            Centiseconds in VRRPv3 (default 0cs)
  -P, --preempt on|off      Switch preempt (default on)
  -r, --rfc version         Specify protocol 'version'
                            2 (VRRPv2, RFC3768) by default,
                            3 (VRRPv3, RFC5798)
  -6, --ipv6                IPv6 support, (only in VRRPv3)
  -a, --auth pass           Simple text password (only in VRRPv2)
  -f, --foreground          Execute uvrrpd in foreground
  -s, --script              Path of hook script (default /usr/local/sbin/vrrp_switch.sh)
  -F  --pidfile name        Use alternate pid file 'name'
                            Default /run/uvrrp_${vrid}.pid
  -C  --control name        Use alternate control file 'name'
                            Default /run/uvrrpd_ctrl.${vrid}
  -d, --debug
  -h, --help

Signals

  • SIGHUP : force uvrrpd to switch to init state
  • SIGUSR1|SIGUSR2 : dump VRRP instance informations

Control fifo

User can send command through a control FIFO, by default in /var/run/uvrrpd_ctrl.${vrid}

Commands available:

  • reload (force init state)
  • stop (exit)
  • state || status (dump vrrp status)
  • prio X (change priority while running, and switch to init state)
# ./uvrrpd -v 42 -i eth0 10.0.0.254
# echo "prio 90" > /var/run/uvrrpd_ctrl.42
#
# tail -10 /var/log/daemon.log
[...]
uvrrpd[27820]: vrid 42 :: new prio 90 applied                 
uvrrpd[27820]: vrid 42 :: init                                
uvrrpd[27820]: vrid 42 :: init -> backup                      
uvrrpd[27820]: vrid 42 :: masterdown_timer expired            
[...]
#

Log

LOG_DAEMON facility

vrrp_switch.sh maintain a state file of the current instance in /tmp/state.vrrp_${vrid}_${ifname}

Examples

uvrrpd must be run as root.

  • Start a VRRP instance on eth0 interface with VRID 42, default priority (100), with vrrp_switch.sh in /usr/local/sbin/ directory.
# ./uvrrpd -v 42 -i eth0 -s /usr/local/sbin/vrrp_switch.sh 10.0.0.254
#

In our example, no other VRRP instance, we are the master and we can see the new VRRP interface with the VIP 10.0.0.254 and the virtual VRRP mac address 00:00:5e:00:01:2a :

# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:4f:48:3f  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe4f:483f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4935 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3835 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:965166 (942.5 KiB)  TX bytes:613308 (598.9 KiB)

eth0_42   Link encap:Ethernet  HWaddr 00:00:5e:00:01:2a  
          inet addr:10.0.0.254  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::200:5eff:fe00:12a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3217 (3.1 KiB)  TX bytes:520 (520.0 B)
[...]

See logs :

# tail -f /var/log/daemon.log
[...]
uvrrpd[2966]: vrid 42 :: init
uvrrpd[2966]: vrid 42 :: init -> backup
uvrrpd[2966]: vrid 42 :: masterdown_timer expired
uvrrpd[2966]: vrid 42 :: backup -> master

and /tmp/state.vrrp_42_eth0 :

# cat /tmp/state.vrrp_42_eth0 
state           master
vrid            42
ifname          eth0
priority        100
adv_int         1
naddr           1
ips             10.0.0.254

You can start an another VRRP instance on another GNU/Linux box or a router with VRRP support, with the same VRID and different priority.

  • uvrrpd support IPv6 (RFC5798) :
#  ./uvrrpd -v 42 -i eth0 -p 90 -6 fe80::fada/64
  • Multiple VIPs could be specified for a single VRRP instance (up to 255 VIPs) :
# ./uvrrpd -v 42 -i eth0 10.0.0.69 10.0.0.80

TODOs

  • more tests
  • packaging
  • ...

Any suggestions, ideas, patches or whatever are welcome and will be greatly appreciated !