netifd v2: Fix source routing for IPv4
authorKristian Evensen <kristian.evensen@gmail.com>
Wed, 26 Nov 2014 10:16:05 +0000 (10:16 +0000)
committerSteven Barth <steven@midlink.org>
Thu, 27 Nov 2014 07:25:12 +0000 (08:25 +0100)
According to the OpenWRT Network documentation for route, the 'source' option is
"The preferred source address when sending to destinations covered by the
target". However, netifd currently stores this value in RTA_SRC on
NEWROUTE/DELROUTE.

RTA_SRC is not used by kernel when handling NEWROUTE nor DELROUTE for IPv4
routes. When adding a new IPv4 route, the source is stored in RTA_PREFSRC and
the option works as specified in documentation. For IPv6, the address is still
stored in RTA_SRC as to not break source-destination routing for IPv6.

v2: Limit patch to IPv4, to prevent breaking IPv6 configurations (thanks Steven
Barth)

Signed-off-by: Kristian Evensen <kristian.evensen@gmail.com>
system-linux.c

index 8518f0fe4b958d1c8fc76045ec67217d13499add..ed69bef015055ffeabbb3a4aa927cb00b32cda57 100644 (file)
@@ -1433,8 +1433,12 @@ static int system_rt(struct device *dev, struct device_route *route, int cmd)
        if (route->mask)
                nla_put(msg, RTA_DST, alen, &route->addr);
 
-       if (route->sourcemask)
-               nla_put(msg, RTA_SRC, alen, &route->source);
+       if (route->sourcemask) {
+               if (rtm.rtm_family == AF_INET)
+                       nla_put(msg, RTA_PREFSRC, alen, &route->source);
+               else
+                       nla_put(msg, RTA_SRC, alen, &route->source);
+       }
 
        if (route->metric > 0)
                nla_put_u32(msg, RTA_PRIORITY, route->metric);