mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-10 08:39:33 +00:00
vrrpd: autoconfig support, continued
* Add support for interface up/down + address add/del events when using autoconfigure mode * Add autoconfig information to show command Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
parent
3d55d46721
commit
27fd882710
276
vrrpd/vrrp.c
276
vrrpd/vrrp.c
@ -39,6 +39,11 @@
|
|||||||
|
|
||||||
#define VRRP_LOGPFX "[CORE] "
|
#define VRRP_LOGPFX "[CORE] "
|
||||||
|
|
||||||
|
/* statics */
|
||||||
|
struct hash *vrrp_vrouters_hash;
|
||||||
|
bool vrrp_autoconfig_is_on;
|
||||||
|
int vrrp_autoconfig_version;
|
||||||
|
|
||||||
const char *vrrp_state_names[3] = {
|
const char *vrrp_state_names[3] = {
|
||||||
[VRRP_STATE_INITIALIZE] = "Initialize",
|
[VRRP_STATE_INITIALIZE] = "Initialize",
|
||||||
[VRRP_STATE_MASTER] = "Master",
|
[VRRP_STATE_MASTER] = "Master",
|
||||||
@ -156,6 +161,10 @@ static bool vrrp_has_ip(struct vrrp_vrouter *vr, struct ipaddr *ip)
|
|||||||
|
|
||||||
int vrrp_add_ip(struct vrrp_router *r, struct ipaddr *ip, bool activate)
|
int vrrp_add_ip(struct vrrp_router *r, struct ipaddr *ip, bool activate)
|
||||||
{
|
{
|
||||||
|
int af = (ip->ipa_type == IPADDR_V6) ? AF_INET6 : AF_INET;
|
||||||
|
|
||||||
|
assert(r->family == af);
|
||||||
|
|
||||||
if (vrrp_has_ip(r->vr, ip))
|
if (vrrp_has_ip(r->vr, ip))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -177,8 +186,11 @@ int vrrp_add_ip(struct vrrp_router *r, struct ipaddr *ip, bool activate)
|
|||||||
bool do_activate = (activate && r->fsm.state == VRRP_STATE_INITIALIZE);
|
bool do_activate = (activate && r->fsm.state == VRRP_STATE_INITIALIZE);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (do_activate)
|
if (do_activate) {
|
||||||
ret = vrrp_event(r, VRRP_EVENT_STARTUP);
|
ret = vrrp_event(r, VRRP_EVENT_STARTUP);
|
||||||
|
if (ret)
|
||||||
|
listnode_delete(r->addrs, new);
|
||||||
|
}
|
||||||
else if (r->fsm.state == VRRP_STATE_MASTER) {
|
else if (r->fsm.state == VRRP_STATE_MASTER) {
|
||||||
switch (r->family) {
|
switch (r->family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
@ -800,15 +812,6 @@ static int vrrp_socket(struct vrrp_router *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Configure sockets */
|
/* Configure sockets */
|
||||||
if (!listcount(r->vr->ifp->connected)) {
|
|
||||||
zlog_warn(
|
|
||||||
VRRP_LOGPFX VRRP_LOGPFX_VRID
|
|
||||||
"No address on interface %s; cannot configure multicast",
|
|
||||||
r->vr->vrid, r->vr->ifp->name);
|
|
||||||
failed = true;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->family == AF_INET) {
|
if (r->family == AF_INET) {
|
||||||
/* Set Tx socket to always Tx with TTL set to 255 */
|
/* Set Tx socket to always Tx with TTL set to 255 */
|
||||||
int ttl = 255;
|
int ttl = 255;
|
||||||
@ -1282,6 +1285,10 @@ static int (*vrrp_event_handlers[])(struct vrrp_router *r) = {
|
|||||||
*
|
*
|
||||||
* event
|
* event
|
||||||
* The event to spawn
|
* The event to spawn
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
*/
|
*/
|
||||||
int vrrp_event(struct vrrp_router *r, int event)
|
int vrrp_event(struct vrrp_router *r, int event)
|
||||||
{
|
{
|
||||||
@ -1291,7 +1298,41 @@ int vrrp_event(struct vrrp_router *r, int event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Other ------------------------------------------------------------------- */
|
/* Autoconfig -------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the configured addresses for this VRRP instance to exactly the addresses
|
||||||
|
* present on its macvlan subinterface(s).
|
||||||
|
*
|
||||||
|
* vr
|
||||||
|
* VRRP router to act on
|
||||||
|
*/
|
||||||
|
static void vrrp_autoconfig_autoaddrupdate(struct vrrp_vrouter *vr)
|
||||||
|
{
|
||||||
|
list_delete_all_node(vr->v4->addrs);
|
||||||
|
list_delete_all_node(vr->v6->addrs);
|
||||||
|
|
||||||
|
struct listnode *ln;
|
||||||
|
struct connected *c = NULL;
|
||||||
|
|
||||||
|
if (vr->v4->mvl_ifp)
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(vr->v4->mvl_ifp->connected, ln, c))
|
||||||
|
if (c->address->family == AF_INET)
|
||||||
|
vrrp_add_ipv4(vr, c->address->u.prefix4, true);
|
||||||
|
|
||||||
|
if (vr->v6->mvl_ifp)
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(vr->v6->mvl_ifp->connected, ln, c))
|
||||||
|
if (c->address->family == AF_INET6
|
||||||
|
&& !IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6))
|
||||||
|
vrrp_add_ipv6(vr, c->address->u.prefix6, true);
|
||||||
|
|
||||||
|
if (vr->v4->addrs->count == 0
|
||||||
|
&& vr->v4->fsm.state != VRRP_STATE_INITIALIZE)
|
||||||
|
vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN);
|
||||||
|
if (vr->v6->addrs->count == 0
|
||||||
|
&& vr->v6->fsm.state != VRRP_STATE_INITIALIZE)
|
||||||
|
vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN);
|
||||||
|
}
|
||||||
|
|
||||||
static struct vrrp_vrouter *
|
static struct vrrp_vrouter *
|
||||||
vrrp_autoconfig_autocreate(struct interface *mvl_ifp)
|
vrrp_autoconfig_autocreate(struct interface *mvl_ifp)
|
||||||
@ -1300,47 +1341,32 @@ vrrp_autoconfig_autocreate(struct interface *mvl_ifp)
|
|||||||
struct vrrp_vrouter *vr;
|
struct vrrp_vrouter *vr;
|
||||||
|
|
||||||
p = if_lookup_by_index(mvl_ifp->link_ifindex, VRF_DEFAULT);
|
p = if_lookup_by_index(mvl_ifp->link_ifindex, VRF_DEFAULT);
|
||||||
|
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
uint8_t vrid = mvl_ifp->hw_addr[5];
|
uint8_t vrid = mvl_ifp->hw_addr[5];
|
||||||
|
|
||||||
zlog_info(VRRP_LOGPFX "Autoconfiguring VRRP on %s", p->name);
|
zlog_info(VRRP_LOGPFX "Autoconfiguring VRRP on %s", p->name);
|
||||||
|
|
||||||
/* If it already exists, skip it */
|
|
||||||
vr = vrrp_lookup(p, vrid);
|
|
||||||
if (vr) {
|
|
||||||
zlog_info(VRRP_LOGPFX "VRRP instance %" PRIu8
|
|
||||||
"already configured on %s",
|
|
||||||
vrid, p->name);
|
|
||||||
return vr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create a new one */
|
|
||||||
vr = vrrp_vrouter_create(p, vrid, vrrp_autoconfig_version);
|
vr = vrrp_vrouter_create(p, vrid, vrrp_autoconfig_version);
|
||||||
|
|
||||||
if (!vr)
|
if (!vr) {
|
||||||
|
zlog_warn(VRRP_LOGPFX
|
||||||
|
"Failed to autoconfigure VRRP instance %" PRIu8
|
||||||
|
" on %s",
|
||||||
|
vrid, p->name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* add connected addresses as vips */
|
vrrp_autoconfig_autoaddrupdate(vr);
|
||||||
struct listnode *ln;
|
|
||||||
struct connected *c = NULL;
|
|
||||||
for (ALL_LIST_ELEMENTS_RO(mvl_ifp->connected, ln, c))
|
|
||||||
if (c->address->family == AF_INET)
|
|
||||||
vrrp_add_ipv4(vr, c->address->u.prefix4, false);
|
|
||||||
else if (c->address->family == AF_INET6) {
|
|
||||||
if (!IN6_IS_ADDR_LINKLOCAL(&c->address->u.prefix6))
|
|
||||||
vrrp_add_ipv6(vr, c->address->u.prefix6, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vr->v4->addrs->count)
|
|
||||||
vrrp_event(vr->v4, VRRP_EVENT_STARTUP);
|
|
||||||
if (vr->v6->addrs->count)
|
|
||||||
vrrp_event(vr->v6, VRRP_EVENT_STARTUP);
|
|
||||||
|
|
||||||
vr->autoconf = true;
|
vr->autoconf = true;
|
||||||
|
|
||||||
return vr;
|
return vr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool vrrp_ifp_is_mvl(struct interface *ifp)
|
static bool vrrp_ifp_has_vrrp_mac(struct interface *ifp)
|
||||||
{
|
{
|
||||||
struct ethaddr vmac4;
|
struct ethaddr vmac4;
|
||||||
struct ethaddr vmac6;
|
struct ethaddr vmac6;
|
||||||
@ -1351,23 +1377,177 @@ static bool vrrp_ifp_is_mvl(struct interface *ifp)
|
|||||||
|| !memcmp(ifp->hw_addr, vmac6.octet, sizeof(vmac6.octet) - 1);
|
|| !memcmp(ifp->hw_addr, vmac6.octet, sizeof(vmac6.octet) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int vrrp_autoconfig(struct interface *ifp)
|
static struct vrrp_vrouter *vrrp_lookup_by_mvlif(struct interface *mvl_ifp)
|
||||||
{
|
{
|
||||||
if (ifp && vrrp_ifp_is_mvl(ifp)) {
|
struct interface *p;
|
||||||
vrrp_autoconfig_autocreate(ifp);
|
|
||||||
|
if (!mvl_ifp || !mvl_ifp->link_ifindex
|
||||||
|
|| !vrrp_ifp_has_vrrp_mac(mvl_ifp))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
p = if_lookup_by_index(mvl_ifp->link_ifindex, VRF_DEFAULT);
|
||||||
|
uint8_t vrid = mvl_ifp->hw_addr[5];
|
||||||
|
|
||||||
|
return vrrp_lookup(p, vrid);
|
||||||
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig_if_add(struct interface *ifp)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
struct vrrp_vrouter *vr;
|
||||||
|
|
||||||
|
if (!ifp || !ifp->link_ifindex || !vrrp_ifp_has_vrrp_mac(ifp))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vr = vrrp_lookup_by_mvlif(ifp);
|
||||||
|
|
||||||
|
if (!vr)
|
||||||
|
vr = vrrp_autoconfig_autocreate(ifp);
|
||||||
|
|
||||||
|
if (!vr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (vr->autoconf == false)
|
||||||
|
return 0;
|
||||||
|
else {
|
||||||
|
vrrp_attach_interface(vr->v4);
|
||||||
|
vrrp_attach_interface(vr->v6);
|
||||||
|
vrrp_autoconfig_autoaddrupdate(vr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loop through interfaces, looking for compatible macvlan devices. */
|
|
||||||
struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
|
|
||||||
|
|
||||||
FOR_ALL_INTERFACES (vrf, ifp)
|
|
||||||
if (vrrp_ifp_is_mvl(ifp))
|
|
||||||
vrrp_autoconfig_autocreate(ifp);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig_if_del(struct interface *ifp)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct vrrp_vrouter *vr = vrrp_lookup_by_mvlif(ifp);
|
||||||
|
|
||||||
|
if (!vr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (vr && vr->autoconf == false)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (vr && vr->v4->mvl_ifp == ifp) {
|
||||||
|
if (vr->v4->fsm.state != VRRP_STATE_INITIALIZE)
|
||||||
|
vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN);
|
||||||
|
vr->v4->mvl_ifp = NULL;
|
||||||
|
}
|
||||||
|
if (vr && vr->v6->mvl_ifp == ifp) {
|
||||||
|
if (vr->v6->fsm.state != VRRP_STATE_INITIALIZE)
|
||||||
|
vrrp_event(vr->v6, VRRP_EVENT_SHUTDOWN);
|
||||||
|
vr->v6->mvl_ifp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vr->v4->mvl_ifp == NULL && vr->v6->mvl_ifp == NULL) {
|
||||||
|
vrrp_vrouter_destroy(vr);
|
||||||
|
vr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig_if_up(struct interface *ifp)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct vrrp_vrouter *vr = vrrp_lookup_by_mvlif(ifp);
|
||||||
|
|
||||||
|
if (vr && !vr->autoconf)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!vr) {
|
||||||
|
vrrp_autoconfig_if_add(ifp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vrrp_attach_interface(vr->v4);
|
||||||
|
vrrp_attach_interface(vr->v6);
|
||||||
|
vrrp_autoconfig_autoaddrupdate(vr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig_if_down(struct interface *ifp)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig_if_address_add(struct interface *ifp)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct vrrp_vrouter *vr = vrrp_lookup_by_mvlif(ifp);
|
||||||
|
|
||||||
|
if (vr && vr->autoconf)
|
||||||
|
vrrp_autoconfig_autoaddrupdate(vr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig_if_address_del(struct interface *ifp)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct vrrp_vrouter *vr = vrrp_lookup_by_mvlif(ifp);
|
||||||
|
|
||||||
|
if (vr && vr->autoconf)
|
||||||
|
vrrp_autoconfig_autoaddrupdate(vr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vrrp_autoconfig(void)
|
||||||
|
{
|
||||||
|
if (!vrrp_autoconfig_is_on)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
|
||||||
|
struct interface *ifp;
|
||||||
|
|
||||||
|
FOR_ALL_INTERFACES (vrf, ifp)
|
||||||
|
vrrp_autoconfig_if_add(ifp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vrrp_autoconfig_on(int version)
|
||||||
|
{
|
||||||
|
vrrp_autoconfig_is_on = true;
|
||||||
|
vrrp_autoconfig_version = version;
|
||||||
|
|
||||||
|
vrrp_autoconfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
void vrrp_autoconfig_off(void)
|
||||||
|
{
|
||||||
|
vrrp_autoconfig_is_on = false;
|
||||||
|
|
||||||
|
struct list *ll = hash_to_list(vrrp_vrouters_hash);
|
||||||
|
|
||||||
|
struct listnode *ln;
|
||||||
|
struct vrrp_vrouter *vr;
|
||||||
|
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(ll, ln, vr))
|
||||||
|
if (vr->autoconf)
|
||||||
|
vrrp_vrouter_destroy(vr);
|
||||||
|
|
||||||
|
list_delete(&ll);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Other ------------------------------------------------------------------- */
|
||||||
|
|
||||||
static unsigned int vrrp_hash_key(void *arg)
|
static unsigned int vrrp_hash_key(void *arg)
|
||||||
{
|
{
|
||||||
struct vrrp_vrouter *vr = arg;
|
struct vrrp_vrouter *vr = arg;
|
||||||
|
147
vrrpd/vrrp.h
147
vrrpd/vrrp.h
@ -51,19 +51,15 @@ extern struct thread_master *master;
|
|||||||
extern struct zebra_privs_t vrrp_privs;
|
extern struct zebra_privs_t vrrp_privs;
|
||||||
|
|
||||||
/* Global hash of all Virtual Routers */
|
/* Global hash of all Virtual Routers */
|
||||||
struct hash *vrrp_vrouters_hash;
|
extern struct hash *vrrp_vrouters_hash;
|
||||||
|
|
||||||
/* Whether to automatically configure VRRP instances */
|
/*
|
||||||
static bool vrrp_autoconfig_on;
|
* VRRP Router.
|
||||||
static int vrrp_autoconfig_version;
|
*
|
||||||
|
* This struct contains all state for a particular VRRP Router operating
|
||||||
/*
|
* in a Virtual Router for either IPv4 or IPv6.
|
||||||
* VRRP Router.
|
*/
|
||||||
*
|
struct vrrp_router {
|
||||||
* This struct contains all state for a particular VRRP Router operating
|
|
||||||
* in a Virtual Router for either IPv4 or IPv6.
|
|
||||||
*/
|
|
||||||
struct vrrp_router {
|
|
||||||
/*
|
/*
|
||||||
* Whether this VRRP Router is active.
|
* Whether this VRRP Router is active.
|
||||||
*/
|
*/
|
||||||
@ -421,8 +417,7 @@ DECLARE_HOOK(vrrp_change_state_hook, (struct vrrp_router * r, int to), (r, to));
|
|||||||
*/
|
*/
|
||||||
int vrrp_event(struct vrrp_router *r, int event);
|
int vrrp_event(struct vrrp_router *r, int event);
|
||||||
|
|
||||||
|
/* Autoconfig -------------------------------------------------------------- */
|
||||||
/* Other ------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Search for and automatically configure VRRP instances on interfaces.
|
* Search for and automatically configure VRRP instances on interfaces.
|
||||||
@ -439,7 +434,129 @@ int vrrp_event(struct vrrp_router *r, int event);
|
|||||||
* -1 on failure
|
* -1 on failure
|
||||||
* 0 otherwise
|
* 0 otherwise
|
||||||
*/
|
*/
|
||||||
int vrrp_autoconfig(struct interface *ifp);
|
int vrrp_autoconfig(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable autoconfiguration.
|
||||||
|
*
|
||||||
|
* Calling this function will cause vrrpd to automatically configure VRRP
|
||||||
|
* instances on existing compatible macvlan interfaces. These instances will
|
||||||
|
* react to interface up/down and address add/delete events to keep themselves
|
||||||
|
* in sync with the available interfaces.
|
||||||
|
*
|
||||||
|
* version
|
||||||
|
* VRRP version to use for autoconfigured instances. Must be 2 or 3.
|
||||||
|
*/
|
||||||
|
void vrrp_autoconfig_on(int version);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disable autoconfiguration.
|
||||||
|
*
|
||||||
|
* Calling this function will delete all existing autoconfigured VRRP instances.
|
||||||
|
*/
|
||||||
|
void vrrp_autoconfig_off(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback to notify autoconfig of interface add.
|
||||||
|
*
|
||||||
|
* If the interface is a VRRP-compatible device, and there is no existing VRRP
|
||||||
|
* router running on it, one is created. All addresses on the interface are
|
||||||
|
* added to the router.
|
||||||
|
*
|
||||||
|
* ifp
|
||||||
|
* Interface to operate on
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
|
*/
|
||||||
|
int vrrp_autoconfig_if_add(struct interface *ifp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback to notify autoconfig of interface delete.
|
||||||
|
*
|
||||||
|
* If the interface is a VRRP-compatible device, and a VRRP router is running
|
||||||
|
* on it, and that VRRP router was automatically configured, it will be
|
||||||
|
* deleted. If that was the last router for the corresponding VRID (i.e., if
|
||||||
|
* this interface was a v4 VRRP interface and no v6 router is configured for
|
||||||
|
* the same VRID) then the entire virtual router is deleted.
|
||||||
|
*
|
||||||
|
* ifp
|
||||||
|
* Interface to operate on
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
|
*/
|
||||||
|
int vrrp_autoconfig_if_del(struct interface *ifp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback to notify autoconfig of interface up.
|
||||||
|
*
|
||||||
|
* Roughly equivalent to vrrp_autoconfig_if_add, except that addresses are
|
||||||
|
* refreshed if an autoconfigured virtual router already exists.
|
||||||
|
*
|
||||||
|
* ifp
|
||||||
|
* Interface to operate on
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
|
*/
|
||||||
|
int vrrp_autoconfig_if_up(struct interface *ifp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback to notify autoconfig of interface down.
|
||||||
|
*
|
||||||
|
* Does nothing. An interface down event is accompanied by address deletion
|
||||||
|
* events for all the addresses on the interface; if an autoconfigured VRRP
|
||||||
|
* router exists on this interface, then it will have all its addresses deleted
|
||||||
|
* and end up in Initialize.
|
||||||
|
*
|
||||||
|
* ifp
|
||||||
|
* Interface to operate on
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
|
*/
|
||||||
|
int vrrp_autoconfig_if_down(struct interface *ifp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback to notify autoconfig of a new interface address.
|
||||||
|
*
|
||||||
|
* If a VRRP router exists on this interface, its address list is updated to
|
||||||
|
* match the new address list. If no addresses remain, a Shutdown event is
|
||||||
|
* issued to the VRRP router.
|
||||||
|
*
|
||||||
|
* ifp
|
||||||
|
* Interface to operate on
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int vrrp_autoconfig_if_address_add(struct interface *ifp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback to notify autoconfig of a removed interface address.
|
||||||
|
*
|
||||||
|
* If a VRRP router exists on this interface, its address list is updated to
|
||||||
|
* match the new address list. If no addresses remain, a Shutdown event is
|
||||||
|
* issued to the VRRP router.
|
||||||
|
*
|
||||||
|
* ifp
|
||||||
|
* Interface to operate on
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* -1 on failure
|
||||||
|
* 0 otherwise
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int vrrp_autoconfig_if_address_del(struct interface *ifp);
|
||||||
|
|
||||||
|
/* Other ------------------------------------------------------------------- */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find VRRP Virtual Router by Virtual Router ID
|
* Find VRRP Virtual Router by Virtual Router ID
|
||||||
|
@ -259,22 +259,21 @@ DEFPY(vrrp_preempt,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY(vrrp_autoconf,
|
DEFPY(vrrp_autoconfigure,
|
||||||
vrrp_autoconf_cmd,
|
vrrp_autoconfigure_cmd,
|
||||||
"[no] vrrp autoconfig [version (2-3)]",
|
"[no] vrrp autoconfigure [version (2-3)]",
|
||||||
NO_STR
|
NO_STR
|
||||||
VRRP_STR
|
VRRP_STR
|
||||||
"Automatically set up VRRP instances on VRRP-compatible interfaces\n"
|
"Automatically set up VRRP instances on VRRP-compatible interfaces\n"
|
||||||
"Version for automatically configured instances\n"
|
"Version for automatically configured instances\n"
|
||||||
VRRP_VERSION_STR)
|
VRRP_VERSION_STR)
|
||||||
{
|
{
|
||||||
vrrp_autoconfig_on = !no;
|
|
||||||
version = version ? version : 3;
|
version = version ? version : 3;
|
||||||
|
|
||||||
if (vrrp_autoconfig_on)
|
if (!no)
|
||||||
vrrp_autoconfig(NULL);
|
vrrp_autoconfig_on(version);
|
||||||
|
else
|
||||||
vrrp_autoconfig_version = !no ? version : vrrp_autoconfig_version;
|
vrrp_autoconfig_off();
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -293,6 +292,8 @@ static void vrrp_show(struct vty *vty, struct vrrp_vrouter *vr)
|
|||||||
|
|
||||||
ttable_add_row(tt, "%s|%" PRIu32, "Virtual Router ID", vr->vrid);
|
ttable_add_row(tt, "%s|%" PRIu32, "Virtual Router ID", vr->vrid);
|
||||||
ttable_add_row(tt, "%s|%" PRIu8, "Protocol Version", vr->version);
|
ttable_add_row(tt, "%s|%" PRIu8, "Protocol Version", vr->version);
|
||||||
|
ttable_add_row(tt, "%s|%s", "Autoconfigured",
|
||||||
|
vr->autoconf ? "Yes" : "No");
|
||||||
ttable_add_row(tt, "%s|%s", "Interface", vr->ifp->name);
|
ttable_add_row(tt, "%s|%s", "Interface", vr->ifp->name);
|
||||||
prefix_mac2str(&vr->v4->vmac, ethstr4, sizeof(ethstr4));
|
prefix_mac2str(&vr->v4->vmac, ethstr4, sizeof(ethstr4));
|
||||||
prefix_mac2str(&vr->v6->vmac, ethstr6, sizeof(ethstr6));
|
prefix_mac2str(&vr->v6->vmac, ethstr6, sizeof(ethstr6));
|
||||||
@ -393,7 +394,7 @@ void vrrp_vty_init(void)
|
|||||||
if_cmd_init();
|
if_cmd_init();
|
||||||
install_element(VIEW_NODE, &show_debugging_vrrpd_cmd);
|
install_element(VIEW_NODE, &show_debugging_vrrpd_cmd);
|
||||||
install_element(VIEW_NODE, &vrrp_vrid_show_cmd);
|
install_element(VIEW_NODE, &vrrp_vrid_show_cmd);
|
||||||
install_element(CONFIG_NODE, &vrrp_autoconf_cmd);
|
install_element(CONFIG_NODE, &vrrp_autoconfigure_cmd);
|
||||||
install_element(INTERFACE_NODE, &vrrp_vrid_cmd);
|
install_element(INTERFACE_NODE, &vrrp_vrid_cmd);
|
||||||
install_element(INTERFACE_NODE, &vrrp_priority_cmd);
|
install_element(INTERFACE_NODE, &vrrp_priority_cmd);
|
||||||
install_element(INTERFACE_NODE, &vrrp_advertisement_interval_cmd);
|
install_element(INTERFACE_NODE, &vrrp_advertisement_interval_cmd);
|
||||||
|
@ -61,8 +61,7 @@ static int vrrp_zebra_if_add(int command, struct zclient *zclient,
|
|||||||
if (!ifp)
|
if (!ifp)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (vrrp_autoconfig_on)
|
vrrp_autoconfig_if_add(ifp);
|
||||||
vrrp_autoconfig(ifp);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -76,6 +75,8 @@ static int vrrp_zebra_if_del(int command, struct zclient *zclient,
|
|||||||
if (!ifp)
|
if (!ifp)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
vrrp_autoconfig_if_del(ifp);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (VRRP_DEBUG_ZEBRA) {
|
if (VRRP_DEBUG_ZEBRA) {
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
@ -103,6 +104,8 @@ static int vrrp_zebra_if_state_up(int command, struct zclient *zclient,
|
|||||||
if (!ifp)
|
if (!ifp)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
vrrp_autoconfig_if_up(ifp);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (VRRP_DEBUG_ZEBRA) {
|
if (VRRP_DEBUG_ZEBRA) {
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
@ -129,6 +132,8 @@ static int vrrp_zebra_if_state_down(int command, struct zclient *zclient,
|
|||||||
if (!ifp)
|
if (!ifp)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
vrrp_autoconfig_if_down(ifp);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (VRRP_DEBUG_ZEBRA) {
|
if (VRRP_DEBUG_ZEBRA) {
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
@ -184,6 +189,8 @@ static int vrrp_zebra_if_address_add(int command, struct zclient *zclient,
|
|||||||
if (!c)
|
if (!c)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
vrrp_autoconfig_if_address_add(c->ifp);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (VRRP_DEBUG_ZEBRA) {
|
if (VRRP_DEBUG_ZEBRA) {
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
@ -218,6 +225,8 @@ static int vrrp_zebra_if_address_del(int command, struct zclient *client,
|
|||||||
if (!c)
|
if (!c)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
vrrp_autoconfig_if_address_del(c->ifp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user