diff options
author | Everton Marques <everton.marques@gmail.com> | 2014-09-22 18:29:29 -0300 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2015-02-04 06:07:58 +0100 |
commit | b240297cfea37f7a6608cac9fd2ae4848fe88e3f (patch) | |
tree | 5328a38cc02b8796366653ca6f31829610a5bfea | |
parent | 2a0ecf21d6c0918da92033fbe4741ede63f108f2 (diff) | |
download | quagga-b240297cfea37f7a6608cac9fd2ae4848fe88e3f.tar.bz2 quagga-b240297cfea37f7a6608cac9fd2ae4848fe88e3f.tar.xz |
pimd: Detection of interface primary address changes.
-rw-r--r-- | pimd/pim_iface.c | 14 | ||||
-rw-r--r-- | pimd/pim_iface.h | 2 |
2 files changed, 10 insertions, 6 deletions
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 8ceecf85..fdbb79be 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -282,6 +282,7 @@ static void on_primary_address_change(struct interface *ifp, } static void detect_primary_address_change(struct interface *ifp, + int force_prim_as_any, const char *caller) { struct pim_interface *pim_ifp; @@ -292,7 +293,10 @@ static void detect_primary_address_change(struct interface *ifp, if (!pim_ifp) return; - new_prim_addr = pim_find_primary_addr(ifp); + if (force_prim_as_any) + new_prim_addr = qpim_inaddr_any; + else + new_prim_addr = pim_find_primary_addr(ifp); changed = new_prim_addr.s_addr != pim_ifp->primary_address.s_addr; @@ -344,7 +348,7 @@ void pim_if_addr_add(struct connected *ifc) ifaddr = ifc->address->u.prefix4; - detect_primary_address_change(ifp, __PRETTY_FUNCTION__); + detect_primary_address_change(ifp, 0, __PRETTY_FUNCTION__); if (PIM_IF_TEST_IGMP(pim_ifp->options)) { struct igmp_sock *igmp; @@ -443,7 +447,7 @@ static void pim_if_addr_del_pim(struct connected *ifc) pim_sock_delete(ifc->ifp, "last address has been removed from interface"); } -void pim_if_addr_del(struct connected *ifc) +void pim_if_addr_del(struct connected *ifc, int force_prim_as_any) { struct interface *ifp; @@ -461,7 +465,7 @@ void pim_if_addr_del(struct connected *ifc) "secondary" : "primary"); } - detect_primary_address_change(ifp, __PRETTY_FUNCTION__); + detect_primary_address_change(ifp, force_prim_as_any, __PRETTY_FUNCTION__); pim_if_addr_del_igmp(ifc); pim_if_addr_del_pim(ifc); @@ -503,7 +507,7 @@ void pim_if_addr_del_all(struct interface *ifp) if (p->family != AF_INET) continue; - pim_if_addr_del(ifc); + pim_if_addr_del(ifc, 1 /* force_prim_as_any=true */); } } diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 6a2f7c95..4b06b9ff 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -113,7 +113,7 @@ void pim_if_init(void); struct pim_interface *pim_if_new(struct interface *ifp, int igmp, int pim); void pim_if_delete(struct interface *ifp); void pim_if_addr_add(struct connected *ifc); -void pim_if_addr_del(struct connected *ifc); +void pim_if_addr_del(struct connected *ifc, int force_prim_as_any); void pim_if_addr_add_all(struct interface *ifp); void pim_if_addr_del_all(struct interface *ifp); void pim_if_addr_del_all_igmp(struct interface *ifp); |