From owner-svn-src-head@FreeBSD.ORG Wed Feb 1 11:07:42 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E4B56106566C; Wed, 1 Feb 2012 11:07:41 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C4DF48FC0A; Wed, 1 Feb 2012 11:07:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q11B7fCl084497; Wed, 1 Feb 2012 11:07:41 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q11B7fV1084495; Wed, 1 Feb 2012 11:07:41 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201202011107.q11B7fV1084495@svn.freebsd.org> From: Gleb Smirnoff Date: Wed, 1 Feb 2012 11:07:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230863 - head/sys/netinet X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Feb 2012 11:07:42 -0000 Author: glebius Date: Wed Feb 1 11:07:41 2012 New Revision: 230863 URL: http://svn.freebsd.org/changeset/base/230863 Log: 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] Modified: head/sys/netinet/ip_carp.c Modified: head/sys/netinet/ip_carp.c ============================================================================== --- head/sys/netinet/ip_carp.c Wed Feb 1 10:59:19 2012 (r230862) +++ head/sys/netinet/ip_carp.c Wed Feb 1 11:07:41 2012 (r230863) @@ -269,7 +269,9 @@ static void carp_master_down_locked(stru 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;