Re: [PATCH] ipv4/route.c: respect prefsrc for local routes

Previous thread: [net-next-2.6 PATCH v4 1/2] net: implement mechanism for HW based QOS by John Fastabend on Monday, January 3, 2011 - 8:05 pm. (6 messages)

Next thread: 'tcp: bind() fix when many ports are bound' problem by Daniel Baluta on Tuesday, January 4, 2011 - 1:53 am. (3 messages)
From: Joel Sing
Date: Monday, January 3, 2011 - 11:24 pm

The preferred source address is currently ignored for local routes,
which results in all local connections having a src address that is the
same as the local dst address. Fix this by respecting the preferred source
address when it is provided for local routes.

This bug can be demonstrated as follows:

 # ifconfig dummy0 192.168.0.1
 # ip route show table local | grep local.*dummy0
 local 192.168.0.1 dev dummy0  proto kernel  scope host  src 192.168.0.1
 # ip route change table local local 192.168.0.1 dev dummy0 \
     proto kernel scope host src 127.0.0.1
 # ip route show table local | grep local.*dummy0
 local 192.168.0.1 dev dummy0  proto kernel  scope host  src 127.0.0.1

We now establish a local connection and verify the source IP
address selection:

 # nc -l 192.168.0.1 3128 &
 # nc 192.168.0.1 3128 &
 # netstat -ant | grep 192.168.0.1:3128.*EST
 tcp        0      0 192.168.0.1:3128        192.168.0.1:33228 ESTABLISHED
 tcp        0      0 192.168.0.1:33228       192.168.0.1:3128  ESTABLISHED

Signed-off-by: Joel Sing <jsing@google.com>
---
 net/ipv4/route.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index df948b0..93bfd95 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2649,8 +2649,12 @@ static int ip_route_output_slow(struct net *net, struct rtable **rp,
 	}
 
 	if (res.type == RTN_LOCAL) {
-		if (!fl.fl4_src)
-			fl.fl4_src = fl.fl4_dst;
+		if (!fl.fl4_src) {
+			if (res.fi->fib_prefsrc)
+				fl.fl4_src = res.fi->fib_prefsrc;
+			else
+				fl.fl4_src = fl.fl4_dst;
+		}
 		dev_out = net->loopback_dev;
 		fl.oif = dev_out->ifindex;
 		res.fi = NULL;
-- 
1.7.3.1

--

From: Eric Dumazet
Date: Tuesday, January 4, 2011 - 12:24 am

Please use FIB_RES_PREFSRC(res)

as we do a few lines after ;)

Thanks


--

From: Eric Dumazet
Date: Tuesday, January 4, 2011 - 12:33 am

Hmm no, this is not applicable, but this could be shorter :

fl.fl4_src = res.fi->fib_prefsrc ? : fl.fl4_dst;



--

From: Changli Gao
Date: Tuesday, January 4, 2011 - 1:07 am

I think Joe may object the use of "? :"

-- 
Regards,
Changli Gao(xiaosuo@gmail.com)
--

From: Eric Dumazet
Date: Tuesday, January 4, 2011 - 1:38 am

Ternary operator is standard C idiom, used in networking stuff, for
example in FIB_RES_PREFSRC() ;)

This could be properly done using another macro in include/net/ip_fib.h
to centralize this ternary op in one point :

#define __FIB_RES_PREFSRC(res, default) ((res).fi->fib_prefsrc ? : default)
#define FIB_RES_PREFSRC(res) __FIB_RES_PREFSRC(res, default, __fib_res_prefsrc(&res))



--

From: Eric Dumazet
Date: Tuesday, January 4, 2011 - 1:40 am

I meant

#define FIB_RES_PREFSRC(res) __FIB_RES_PREFSRC(res, __fib_res_prefsrc(&res))



--

From: Ben Hutchings
Date: Tuesday, January 4, 2011 - 7:16 am

[...]

However, the option to omit the second operand is a GNU extension.

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

--

From: Joe Perches
Date: Tuesday, January 4, 2011 - 8:32 am

I don't object to using GNU extensions.

The ?: extension is used in most every major subsystem.

$ grep -rP --include=*.[ch] "\?\s*:" * | wc -l
515

(with some false positives)

--

From: David Miller
Date: Tuesday, January 4, 2011 - 12:35 pm

From: Joel Sing <jsing@google.com>

Applied to net-2.6, thanks Joel.

If you guys want to mess with ternary operators and new macros,
please do that in net-next-2.6 the next time I merge or similar.

Thanks.
--

Previous thread: [net-next-2.6 PATCH v4 1/2] net: implement mechanism for HW based QOS by John Fastabend on Monday, January 3, 2011 - 8:05 pm. (6 messages)

Next thread: 'tcp: bind() fix when many ports are bound' problem by Daniel Baluta on Tuesday, January 4, 2011 - 1:53 am. (3 messages)