From 25289c946427db676d41c0fa4e6c01ade2f43b66 Mon Sep 17 00:00:00 2001 From: Kristian Evensen Date: Wed, 26 Nov 2014 10:16:05 +0000 Subject: [PATCH] netifd v2: Fix source routing for IPv4 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 --- system-linux.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system-linux.c b/system-linux.c index 8518f0f..ed69bef 100644 --- a/system-linux.c +++ b/system-linux.c @@ -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); -- 2.25.1