[glsdk/meta-ti-glsdk.git] / recipes-kernel / linux / linux-omap / linus / 0064-ipv4-route.c-respect-prefsrc-for-local-routes.patch
1 From 1e3d23ed2eae8473568b34fdc323d2fec679616b Mon Sep 17 00:00:00 2001
2 From: Joel Sing <jsing@google.com>
3 Date: Mon, 3 Jan 2011 20:24:20 +0000
4 Subject: [PATCH 64/65] ipv4/route.c: respect prefsrc for local routes
6 The preferred source address is currently ignored for local routes,
7 which results in all local connections having a src address that is the
8 same as the local dst address. Fix this by respecting the preferred source
9 address when it is provided for local routes.
11 This bug can be demonstrated as follows:
13 # ifconfig dummy0 192.168.0.1
14 # ip route show table local | grep local.*dummy0
15 local 192.168.0.1 dev dummy0 proto kernel scope host src 192.168.0.1
16 # ip route change table local local 192.168.0.1 dev dummy0 \
17 proto kernel scope host src 127.0.0.1
18 # ip route show table local | grep local.*dummy0
19 local 192.168.0.1 dev dummy0 proto kernel scope host src 127.0.0.1
21 We now establish a local connection and verify the source IP
22 address selection:
24 # nc -l 192.168.0.1 3128 &
25 # nc 192.168.0.1 3128 &
26 # netstat -ant | grep 192.168.0.1:3128.*EST
27 tcp 0 0 192.168.0.1:3128 192.168.0.1:33228 ESTABLISHED
28 tcp 0 0 192.168.0.1:33228 192.168.0.1:3128 ESTABLISHED
30 Signed-off-by: Joel Sing <jsing@google.com>
31 Signed-off-by: David S. Miller <davem@davemloft.net>
32 ---
33 net/ipv4/route.c | 8 ++++++--
34 1 files changed, 6 insertions(+), 2 deletions(-)
36 diff --git a/net/ipv4/route.c b/net/ipv4/route.c
37 index df948b0..93bfd95 100644
38 --- a/net/ipv4/route.c
39 +++ b/net/ipv4/route.c
40 @@ -2649,8 +2649,12 @@ static int ip_route_output_slow(struct net *net, struct rtable **rp,
41 }
43 if (res.type == RTN_LOCAL) {
44 - if (!fl.fl4_src)
45 - fl.fl4_src = fl.fl4_dst;
46 + if (!fl.fl4_src) {
47 + if (res.fi->fib_prefsrc)
48 + fl.fl4_src = res.fi->fib_prefsrc;
49 + else
50 + fl.fl4_src = fl.fl4_dst;
51 + }
52 dev_out = net->loopback_dev;
53 fl.oif = dev_out->ifindex;
54 res.fi = NULL;
55 --
56 1.6.6.1