From owner-svn-src-all@freebsd.org Wed Sep 16 06:23:17 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3C9E39CEE04; Wed, 16 Sep 2015 06:23:17 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 21DA11E88; Wed, 16 Sep 2015 06:23:17 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id t8G6NHPl027084; Wed, 16 Sep 2015 06:23:17 GMT (envelope-from melifaro@FreeBSD.org) Received: (from melifaro@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id t8G6NGsg027081; Wed, 16 Sep 2015 06:23:16 GMT (envelope-from melifaro@FreeBSD.org) Message-Id: <201509160623.t8G6NGsg027081@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: melifaro set sender to melifaro@FreeBSD.org using -f From: "Alexander V. Chernikov" Date: Wed, 16 Sep 2015 06:23:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r287851 - in head/sys: net netinet X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Sep 2015 06:23:17 -0000 Author: melifaro Date: Wed Sep 16 06:23:15 2015 New Revision: 287851 URL: https://svnweb.freebsd.org/changeset/base/287851 Log: Unify loopback route switching: * prepare gateway before insertion * use RTM_CHANGE instead of explicit find/change route * Remove fib argument from ifa_switch_loopback_route added in r264887: if old ifp fib differes from new one, that the caller is doing something wrong * Make ifa_*_loopback_route call single ifa_maintain_loopback_route(). Modified: head/sys/net/if.c head/sys/net/if_var.h head/sys/netinet/in.c Modified: head/sys/net/if.c ============================================================================== --- head/sys/net/if.c Wed Sep 16 04:38:07 2015 (r287850) +++ head/sys/net/if.c Wed Sep 16 06:23:15 2015 (r287851) @@ -1545,76 +1545,53 @@ ifa_free(struct ifaddr *ifa) } } -int -ifa_add_loopback_route(struct ifaddr *ifa, struct sockaddr *ia) +static int +ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa, + struct sockaddr *ia) { - int error = 0; - struct rtentry *rt = NULL; + int error; struct rt_addrinfo info; - static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK}; + struct sockaddr_dl null_sdl; + struct ifnet *ifp; + + ifp = ifa->ifa_ifp; bzero(&info, sizeof(info)); - info.rti_ifp = V_loif; + if (cmd != RTM_DELETE) + info.rti_ifp = V_loif; info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC; info.rti_info[RTAX_DST] = ia; info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl; - error = rtrequest1_fib(RTM_ADD, &info, &rt, ifa->ifa_ifp->if_fib); + link_init_sdl(ifp, (struct sockaddr *)&null_sdl, ifp->if_type); + + error = rtrequest1_fib(cmd, &info, NULL, ifp->if_fib); - if (error == 0 && rt != NULL) { - RT_LOCK(rt); - ((struct sockaddr_dl *)rt->rt_gateway)->sdl_type = - ifa->ifa_ifp->if_type; - ((struct sockaddr_dl *)rt->rt_gateway)->sdl_index = - ifa->ifa_ifp->if_index; - RT_REMREF(rt); - RT_UNLOCK(rt); - } else if (error != 0) - log(LOG_DEBUG, "%s: insertion failed: %u\n", __func__, error); + if (error != 0) + log(LOG_DEBUG, "%s: %s failed for interface %s: %u\n", + __func__, otype, if_name(ifp), error); return (error); } int -ifa_del_loopback_route(struct ifaddr *ifa, struct sockaddr *ia) +ifa_add_loopback_route(struct ifaddr *ifa, struct sockaddr *ia) { - int error = 0; - struct rt_addrinfo info; - struct sockaddr_dl null_sdl; - bzero(&null_sdl, sizeof(null_sdl)); - null_sdl.sdl_len = sizeof(null_sdl); - null_sdl.sdl_family = AF_LINK; - null_sdl.sdl_type = ifa->ifa_ifp->if_type; - null_sdl.sdl_index = ifa->ifa_ifp->if_index; - bzero(&info, sizeof(info)); - info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC; - info.rti_info[RTAX_DST] = ia; - info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl; - error = rtrequest1_fib(RTM_DELETE, &info, NULL, ifa->ifa_ifp->if_fib); + return (ifa_maintain_loopback_route(RTM_ADD, "insertion", ifa, ia)); +} - if (error != 0) - log(LOG_DEBUG, "%s: deletion failed: %u\n", __func__, error); +int +ifa_del_loopback_route(struct ifaddr *ifa, struct sockaddr *ia) +{ - return (error); + return (ifa_maintain_loopback_route(RTM_DELETE, "deletion", ifa, ia)); } int -ifa_switch_loopback_route(struct ifaddr *ifa, struct sockaddr *sa, int fib) +ifa_switch_loopback_route(struct ifaddr *ifa, struct sockaddr *ia) { - struct rtentry *rt; - - rt = rtalloc1_fib(sa, 0, 0, fib); - if (rt == NULL) { - log(LOG_DEBUG, "%s: fail", __func__); - return (EHOSTUNREACH); - } - ((struct sockaddr_dl *)rt->rt_gateway)->sdl_type = - ifa->ifa_ifp->if_type; - ((struct sockaddr_dl *)rt->rt_gateway)->sdl_index = - ifa->ifa_ifp->if_index; - RTFREE_LOCKED(rt); - return (0); + return (ifa_maintain_loopback_route(RTM_CHANGE, "switch", ifa, ia)); } /* Modified: head/sys/net/if_var.h ============================================================================== --- head/sys/net/if_var.h Wed Sep 16 04:38:07 2015 (r287850) +++ head/sys/net/if_var.h Wed Sep 16 06:23:15 2015 (r287851) @@ -504,7 +504,7 @@ struct ifnet *ifunit_ref(const char *); int ifa_add_loopback_route(struct ifaddr *, struct sockaddr *); int ifa_del_loopback_route(struct ifaddr *, struct sockaddr *); -int ifa_switch_loopback_route(struct ifaddr *, struct sockaddr *, int fib); +int ifa_switch_loopback_route(struct ifaddr *, struct sockaddr *); struct ifaddr *ifa_ifwithaddr(const struct sockaddr *); int ifa_ifwithaddr_check(const struct sockaddr *); Modified: head/sys/netinet/in.c ============================================================================== --- head/sys/netinet/in.c Wed Sep 16 04:38:07 2015 (r287850) +++ head/sys/netinet/in.c Wed Sep 16 06:23:15 2015 (r287851) @@ -776,13 +776,16 @@ in_scrubprefix(struct in_ifaddr *target, (flags & LLE_STATIC)) { struct in_ifaddr *eia; + /* + * XXXME: add fib-aware in_localip. + * We definitely don't want to switch between + * prefixes in different fibs. + */ eia = in_localip_more(target); if (eia != NULL) { - int fibnum = target->ia_ifp->if_fib; - error = ifa_switch_loopback_route((struct ifaddr *)eia, - (struct sockaddr *)&target->ia_addr, fibnum); + (struct sockaddr *)&target->ia_addr); ifa_free(&eia->ia_ifa); } else { error = ifa_del_loopback_route((struct ifaddr *)target,