When modifying IPv4 devconf values using netlink for some relevant
fields the rt_cache_flush() call was missing. In addition, if forwarding
is enabled on the interface then disable LRO.
This is needed to avoid possible connectivity issues and ease the
responsabilities of user space tools.
Fixes: 9f0f7272ac95 ("ipv4: AF_INET link address family")
Signed-off-by: Fernando Fernandez Mancera <redacted>
---
net/ipv4/devinet.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 590c68e979f5..9f55c13a9c1f 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -2159,6 +2159,8 @@ static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
{
struct in_device *in_dev = __in_dev_get_rtnl(dev);
struct nlattr *a, *tb[IFLA_INET_MAX+1];
+ struct net *net = dev_net(in_dev->dev);
+ bool flush_cache = false;
int rem;
if (!in_dev)@@ -2168,8 +2170,27 @@ static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
return -EINVAL;
if (tb[IFLA_INET_CONF]) {
- nla_for_each_nested(a, tb[IFLA_INET_CONF], rem)
+ nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
ipv4_devconf_set(in_dev, nla_type(a), nla_get_u32(a));
+
+ switch (nla_type(a)) {
+ case IPV4_DEVCONF_FORWARDING:
+ if (nla_get_u32(a))
+ dev_disable_lro(in_dev->dev);
+ fallthrough;
+ case IPV4_DEVCONF_NOXFRM:
+ case IPV4_DEVCONF_NOPOLICY:
+ case IPV4_DEVCONF_PROMOTE_SECONDARIES:
+ case IPV4_DEVCONF_ROUTE_LOCALNET:
+ case IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST:
+ flush_cache = true;
+ break;
+ default:
+ break;
+ }
+ }
+ if (flush_cache)
+ rt_cache_flush(net);
}
return 0;--
2.53.0