From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Sergey Popov <pinkbyte@gentoo.org>,
Dmitry Popov <ixaphire@qrator.net>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 3.14 07/39] ip_tunnel(ipv4): fix tunnels with "local any remote $remote_ip"
Date: Fri, 8 Aug 2014 14:34:53 -0700 [thread overview]
Message-ID: <20140808213355.295343578@linuxfoundation.org> (raw)
In-Reply-To: <20140808213354.980430919@linuxfoundation.org>
3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Popov <ixaphire@qrator.net>
[ Upstream commit 95cb5745983c222867cc9ac593aebb2ad67d72c0 ]
Ipv4 tunnels created with "local any remote $ip" didn't work properly since
7d442fab0 (ipv4: Cache dst in tunnels). 99% of packets sent via those tunnels
had src addr = 0.0.0.0. That was because only dst_entry was cached, although
fl4.saddr has to be cached too. Every time ip_tunnel_xmit used cached dst_entry
(tunnel_rtable_get returned non-NULL), fl4.saddr was initialized with
tnl_params->saddr (= 0 in our case), and wasn't changed until iptunnel_xmit().
This patch adds saddr to ip_tunnel->dst_cache, fixing this issue.
Reported-by: Sergey Popov <pinkbyte@gentoo.org>
Signed-off-by: Dmitry Popov <ixaphire@qrator.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
include/net/ip_tunnels.h | 1 +
net/ipv4/ip_tunnel.c | 29 ++++++++++++++++++-----------
2 files changed, 19 insertions(+), 11 deletions(-)
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -40,6 +40,7 @@ struct ip_tunnel_prl_entry {
struct ip_tunnel_dst {
struct dst_entry __rcu *dst;
+ __be32 saddr;
};
struct ip_tunnel {
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -69,23 +69,25 @@ static unsigned int ip_tunnel_hash(__be3
}
static void __tunnel_dst_set(struct ip_tunnel_dst *idst,
- struct dst_entry *dst)
+ struct dst_entry *dst, __be32 saddr)
{
struct dst_entry *old_dst;
dst_clone(dst);
old_dst = xchg((__force struct dst_entry **)&idst->dst, dst);
dst_release(old_dst);
+ idst->saddr = saddr;
}
-static void tunnel_dst_set(struct ip_tunnel *t, struct dst_entry *dst)
+static void tunnel_dst_set(struct ip_tunnel *t,
+ struct dst_entry *dst, __be32 saddr)
{
- __tunnel_dst_set(this_cpu_ptr(t->dst_cache), dst);
+ __tunnel_dst_set(this_cpu_ptr(t->dst_cache), dst, saddr);
}
static void tunnel_dst_reset(struct ip_tunnel *t)
{
- tunnel_dst_set(t, NULL);
+ tunnel_dst_set(t, NULL, 0);
}
void ip_tunnel_dst_reset_all(struct ip_tunnel *t)
@@ -93,20 +95,25 @@ void ip_tunnel_dst_reset_all(struct ip_t
int i;
for_each_possible_cpu(i)
- __tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL);
+ __tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL, 0);
}
EXPORT_SYMBOL(ip_tunnel_dst_reset_all);
-static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, u32 cookie)
+static struct rtable *tunnel_rtable_get(struct ip_tunnel *t,
+ u32 cookie, __be32 *saddr)
{
+ struct ip_tunnel_dst *idst;
struct dst_entry *dst;
rcu_read_lock();
- dst = rcu_dereference(this_cpu_ptr(t->dst_cache)->dst);
+ idst = this_cpu_ptr(t->dst_cache);
+ dst = rcu_dereference(idst->dst);
if (dst && !atomic_inc_not_zero(&dst->__refcnt))
dst = NULL;
if (dst) {
- if (dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
+ if (!dst->obsolete || dst->ops->check(dst, cookie)) {
+ *saddr = idst->saddr;
+ } else {
tunnel_dst_reset(t);
dst_release(dst);
dst = NULL;
@@ -362,7 +369,7 @@ static int ip_tunnel_bind_dev(struct net
if (!IS_ERR(rt)) {
tdev = rt->dst.dev;
- tunnel_dst_set(tunnel, &rt->dst);
+ tunnel_dst_set(tunnel, &rt->dst, fl4.saddr);
ip_rt_put(rt);
}
if (dev->type != ARPHRD_ETHER)
@@ -606,7 +613,7 @@ void ip_tunnel_xmit(struct sk_buff *skb,
init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr,
tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link);
- rt = connected ? tunnel_rtable_get(tunnel, 0) : NULL;
+ rt = connected ? tunnel_rtable_get(tunnel, 0, &fl4.saddr) : NULL;
if (!rt) {
rt = ip_route_output_key(tunnel->net, &fl4);
@@ -616,7 +623,7 @@ void ip_tunnel_xmit(struct sk_buff *skb,
goto tx_error;
}
if (connected)
- tunnel_dst_set(tunnel, &rt->dst);
+ tunnel_dst_set(tunnel, &rt->dst, fl4.saddr);
}
if (rt->dst.dev == dev) {
next prev parent reply other threads:[~2014-08-08 21:56 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-08 21:34 [PATCH 3.14 00/39] 3.14.17-stable review Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 01/39] xfrm: Fix installation of AH IPsec SAs Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 02/39] bnx2x: fix crash during TSO tunneling Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 03/39] inetpeer: get rid of ip_id_count Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 04/39] ip: make IP identifiers less predictable Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 05/39] net: sendmsg: fix NULL pointer dereference Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 06/39] net: phy: re-apply PHY fixups during phy_register_device Greg Kroah-Hartman
2014-08-08 21:34 ` Greg Kroah-Hartman [this message]
2014-08-08 21:34 ` [PATCH 3.14 08/39] tcp: Fix integer-overflows in TCP veno Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 09/39] tcp: Fix integer-overflow in TCP vegas Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 10/39] bna: fix performance regression Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 11/39] net: sctp: inherit auth_capable on INIT collisions Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 12/39] macvlan: Initialize vlan_features to turn on offload support Greg Kroah-Hartman
2014-08-08 21:34 ` [PATCH 3.14 13/39] net: Correctly set segment mac_len in skb_segment() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 14/39] iovec: make sure the caller actually wants anything in memcpy_fromiovecend Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 15/39] batman-adv: Fix out-of-order fragmentation support Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 16/39] sctp: fix possible seqlock seadlock in sctp_packet_transmit() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 17/39] sparc64: Fix argument sign extension for compat_sys_futex() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 18/39] sparc64: Make itc_sync_lock raw Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 19/39] sparc64: Fix executable bit testing in set_pmd_at() paths Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 20/39] sparc64: Fix huge PMD invalidation Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 21/39] sparc64: Fix bugs in get_user_pages_fast() wrt. THP Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 22/39] sparc64: Fix hex values in comment above pte_modify() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 23/39] sparc64: Dont use _PAGE_PRESENT in pte_modify() mask Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 24/39] sparc64: Handle 32-bit tasks properly in compute_effective_address() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 25/39] sparc64: Fix top-level fault handling bugs Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 26/39] sparc64: Fix range check in kern_addr_valid() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 27/39] sparc64: Use ILOG2_4MB instead of constant 22 Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 28/39] sparc64: Add basic validations to {pud,pmd}_bad() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 29/39] sparc64: Give more detailed information in {pgd,pmd}_ERROR() and kill pte_ERROR() Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 30/39] sparc64: Dont bark so loudly about 32-bit tasks generating 64-bit fault addresses Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 31/39] sparc64: Fix huge TSB mapping on pre-UltraSPARC-III cpus Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 32/39] sparc64: Add membar to Niagara2 memcpy code Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 33/39] sparc64: Do not insert non-valid PTEs into the TSB hash table Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 34/39] sparc64: Guard against flushing openfirmware mappings Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 35/39] bbc-i2c: Fix BBC I2C envctrl on SunBlade 2000 Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 36/39] sunsab: Fix detection of BREAK on sunsab serial console Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 37/39] sparc64: ldc_connect() should not return EINVAL when handshake is in progress Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 38/39] arch/sparc/math-emu/math_32.c: drop stray break operator Greg Kroah-Hartman
2014-08-08 21:35 ` [PATCH 3.14 39/39] xfs: log vector rounding leaks log space Greg Kroah-Hartman
2014-08-09 3:01 ` [PATCH 3.14 00/39] 3.14.17-stable review Guenter Roeck
2014-08-09 14:41 ` Shuah Khan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140808213355.295343578@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=ixaphire@qrator.net \
--cc=linux-kernel@vger.kernel.org \
--cc=pinkbyte@gentoo.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).