net: tcp: add RTAX_CC_ALGO fib handling
This patch adds the minimum necessary for the RTAX_CC_ALGO congestion control metric to be set up and dumped back to user space. While the internal representation of RTAX_CC_ALGO is handled as a u32 key, we avoided to expose this implementation detail to user space, thus instead, we chose the netlink attribute that is being exchanged between user space to be the actual congestion control algorithm name, similarly as in the setsockopt(2) API in order to allow for maximum flexibility, even for 3rd party modules. It is a bit unfortunate that RTAX_QUICKACK used up a whole RTAX slot as it should have been stored in RTAX_FEATURES instead, we first thought about reusing it for the congestion control key, but it brings more complications and/or confusion than worth it. Joint work with Florian Westphal. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
c5c6a8ab45
commit
ea69763999
@@ -1488,10 +1488,22 @@ static int ip6_convert_metrics(struct mx6_config *mxc,
|
||||
int type = nla_type(nla);
|
||||
|
||||
if (type) {
|
||||
u32 val;
|
||||
|
||||
if (unlikely(type > RTAX_MAX))
|
||||
goto err;
|
||||
if (type == RTAX_CC_ALGO) {
|
||||
char tmp[TCP_CA_NAME_MAX];
|
||||
|
||||
mp[type - 1] = nla_get_u32(nla);
|
||||
nla_strlcpy(tmp, nla, sizeof(tmp));
|
||||
val = tcp_ca_get_key_by_name(tmp);
|
||||
if (val == TCP_CA_UNSPEC)
|
||||
goto err;
|
||||
} else {
|
||||
val = nla_get_u32(nla);
|
||||
}
|
||||
|
||||
mp[type - 1] = val;
|
||||
__set_bit(type - 1, mxc->mx_valid);
|
||||
}
|
||||
}
|
||||
@@ -2571,7 +2583,8 @@ static inline size_t rt6_nlmsg_size(void)
|
||||
+ nla_total_size(4) /* RTA_OIF */
|
||||
+ nla_total_size(4) /* RTA_PRIORITY */
|
||||
+ RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
|
||||
+ nla_total_size(sizeof(struct rta_cacheinfo));
|
||||
+ nla_total_size(sizeof(struct rta_cacheinfo))
|
||||
+ nla_total_size(TCP_CA_NAME_MAX); /* RTAX_CC_ALGO */
|
||||
}
|
||||
|
||||
static int rt6_fill_node(struct net *net,
|
||||
|
Reference in New Issue
Block a user