summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2012-02-01 11:07:41 +0000
committerglebius <glebius@FreeBSD.org>2012-02-01 11:07:41 +0000
commitc5de302211375e16297fb98fd4e3ae86055c959e (patch)
tree43d8188068242ca3a34f4ba25b7b1fb7ce550a28 /sys/netinet
parent651caac6f4f13d3d598d1e56707f93991bb46ab4 (diff)
downloadFreeBSD-src-c5de302211375e16297fb98fd4e3ae86055c959e.zip
FreeBSD-src-c5de302211375e16297fb98fd4e3ae86055c959e.tar.gz
o Provide functions carp_ifa_addroute()/carp_ifa_delroute()
to cleanup routes from a single ifa. o Implement carp_addroute()/carp_delroute() via above functions. o Call carp_ifa_delroute() in the carp_detach() to avoid junk routes left in routing table, in case if user removes an address in a MASTER state. [1] Reported by: az [1]
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_carp.c65
1 files changed, 41 insertions, 24 deletions
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index e23f369..1376868 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -269,7 +269,9 @@ static void carp_master_down_locked(struct carp_softc *);
static void carp_send_ad(void *);
static void carp_send_ad_locked(struct carp_softc *);
static void carp_addroute(struct carp_softc *);
+static void carp_ifa_addroute(struct ifaddr *);
static void carp_delroute(struct carp_softc *);
+static void carp_ifa_delroute(struct ifaddr *);
static void carp_send_ad_all(void *, int);
static void carp_demote_adj(int, char *);
@@ -907,22 +909,29 @@ carp_addroute(struct carp_softc *sc)
struct ifaddr *ifa;
CARP_FOREACH_IFA(sc, ifa)
- switch (ifa->ifa_addr->sa_family) {
+ carp_ifa_addroute(ifa);
+}
+
+static void
+carp_ifa_addroute(struct ifaddr *ifa)
+{
+
+ switch (ifa->ifa_addr->sa_family) {
#ifdef INET
- case AF_INET:
- in_addprefix(ifatoia(ifa), RTF_UP);
- ifa_add_loopback_route(ifa,
- (struct sockaddr *)&ifatoia(ifa)->ia_addr);
- break;
+ case AF_INET:
+ in_addprefix(ifatoia(ifa), RTF_UP);
+ ifa_add_loopback_route(ifa,
+ (struct sockaddr *)&ifatoia(ifa)->ia_addr);
+ break;
#endif
#ifdef INET6
- case AF_INET6:
- ifa_add_loopback_route(ifa,
- (struct sockaddr *)&ifatoia6(ifa)->ia_addr);
- in6_ifaddloop(ifa);
- break;
+ case AF_INET6:
+ ifa_add_loopback_route(ifa,
+ (struct sockaddr *)&ifatoia6(ifa)->ia_addr);
+ in6_ifaddloop(ifa);
+ break;
#endif
- }
+ }
}
static void
@@ -931,22 +940,29 @@ carp_delroute(struct carp_softc *sc)
struct ifaddr *ifa;
CARP_FOREACH_IFA(sc, ifa)
- switch (ifa->ifa_addr->sa_family) {
+ carp_ifa_delroute(ifa);
+}
+
+static void
+carp_ifa_delroute(struct ifaddr *ifa)
+{
+
+ switch (ifa->ifa_addr->sa_family) {
#ifdef INET
- case AF_INET:
- ifa_del_loopback_route(ifa,
- (struct sockaddr *)&ifatoia(ifa)->ia_addr);
- in_scrubprefix(ifatoia(ifa), LLE_STATIC);
- break;
+ case AF_INET:
+ ifa_del_loopback_route(ifa,
+ (struct sockaddr *)&ifatoia(ifa)->ia_addr);
+ in_scrubprefix(ifatoia(ifa), LLE_STATIC);
+ break;
#endif
#ifdef INET6
- case AF_INET6:
- ifa_del_loopback_route(ifa,
- (struct sockaddr *)&ifatoia6(ifa)->ia_addr);
- in6_ifremloop(ifa);
- break;
+ case AF_INET6:
+ ifa_del_loopback_route(ifa,
+ (struct sockaddr *)&ifatoia6(ifa)->ia_addr);
+ in6_ifremloop(ifa);
+ break;
#endif
- }
+ }
}
#ifdef INET
@@ -1856,6 +1872,7 @@ carp_detach(struct ifaddr *ifa)
#endif
}
+ carp_ifa_delroute(ifa);
carp_multicast_cleanup(sc, ifa->ifa_addr->sa_family);
ifa->ifa_carp = NULL;
OpenPOWER on IntegriCloud