diff options
Diffstat (limited to 'net/core/rtnetlink.c')
| -rw-r--r-- | net/core/rtnetlink.c | 35 | 
1 files changed, 34 insertions, 1 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 64289bc98887..5d8eb57867a9 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -58,7 +58,7 @@  #include "dev.h"  #define RTNL_MAX_TYPE		50 -#define RTNL_SLAVE_MAX_TYPE	40 +#define RTNL_SLAVE_MAX_TYPE	42  struct rtnl_link {  	rtnl_doit_func		doit; @@ -1074,6 +1074,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,  	       + nla_total_size(4) /* IFLA_GSO_MAX_SEGS */  	       + nla_total_size(4) /* IFLA_GSO_MAX_SIZE */  	       + nla_total_size(4) /* IFLA_GRO_MAX_SIZE */ +	       + nla_total_size(4) /* IFLA_GSO_IPV4_MAX_SIZE */ +	       + nla_total_size(4) /* IFLA_GRO_IPV4_MAX_SIZE */  	       + nla_total_size(4) /* IFLA_TSO_MAX_SIZE */  	       + nla_total_size(4) /* IFLA_TSO_MAX_SEGS */  	       + nla_total_size(1) /* IFLA_OPERSTATE */ @@ -1807,6 +1809,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,  	    nla_put_u32(skb, IFLA_GSO_MAX_SEGS, dev->gso_max_segs) ||  	    nla_put_u32(skb, IFLA_GSO_MAX_SIZE, dev->gso_max_size) ||  	    nla_put_u32(skb, IFLA_GRO_MAX_SIZE, dev->gro_max_size) || +	    nla_put_u32(skb, IFLA_GSO_IPV4_MAX_SIZE, dev->gso_ipv4_max_size) || +	    nla_put_u32(skb, IFLA_GRO_IPV4_MAX_SIZE, dev->gro_ipv4_max_size) ||  	    nla_put_u32(skb, IFLA_TSO_MAX_SIZE, dev->tso_max_size) ||  	    nla_put_u32(skb, IFLA_TSO_MAX_SEGS, dev->tso_max_segs) ||  #ifdef CONFIG_RPS @@ -1968,6 +1972,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {  	[IFLA_TSO_MAX_SIZE]	= { .type = NLA_REJECT },  	[IFLA_TSO_MAX_SEGS]	= { .type = NLA_REJECT },  	[IFLA_ALLMULTI]		= { .type = NLA_REJECT }, +	[IFLA_GSO_IPV4_MAX_SIZE]	= { .type = NLA_U32 }, +	[IFLA_GRO_IPV4_MAX_SIZE]	= { .type = NLA_U32 },  };  static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { @@ -2883,6 +2889,29 @@ static int do_setlink(const struct sk_buff *skb,  		}  	} +	if (tb[IFLA_GSO_IPV4_MAX_SIZE]) { +		u32 max_size = nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]); + +		if (max_size > dev->tso_max_size) { +			err = -EINVAL; +			goto errout; +		} + +		if (dev->gso_ipv4_max_size ^ max_size) { +			netif_set_gso_ipv4_max_size(dev, max_size); +			status |= DO_SETLINK_MODIFIED; +		} +	} + +	if (tb[IFLA_GRO_IPV4_MAX_SIZE]) { +		u32 gro_max_size = nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]); + +		if (dev->gro_ipv4_max_size ^ gro_max_size) { +			netif_set_gro_ipv4_max_size(dev, gro_max_size); +			status |= DO_SETLINK_MODIFIED; +		} +	} +  	if (tb[IFLA_OPERSTATE])  		set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE])); @@ -3325,6 +3354,10 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname,  		netif_set_gso_max_segs(dev, nla_get_u32(tb[IFLA_GSO_MAX_SEGS]));  	if (tb[IFLA_GRO_MAX_SIZE])  		netif_set_gro_max_size(dev, nla_get_u32(tb[IFLA_GRO_MAX_SIZE])); +	if (tb[IFLA_GSO_IPV4_MAX_SIZE]) +		netif_set_gso_ipv4_max_size(dev, nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE])); +	if (tb[IFLA_GRO_IPV4_MAX_SIZE]) +		netif_set_gro_ipv4_max_size(dev, nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]));  	return dev;  }  |