|
@@ -1698,6 +1698,7 @@ out:
|
|
|
static int ip6_convert_metrics(struct mx6_config *mxc,
|
|
|
const struct fib6_config *cfg)
|
|
|
{
|
|
|
+ bool ecn_ca = false;
|
|
|
struct nlattr *nla;
|
|
|
int remaining;
|
|
|
u32 *mp;
|
|
@@ -1722,7 +1723,7 @@ static int ip6_convert_metrics(struct mx6_config *mxc,
|
|
|
char tmp[TCP_CA_NAME_MAX];
|
|
|
|
|
|
nla_strlcpy(tmp, nla, sizeof(tmp));
|
|
|
- val = tcp_ca_get_key_by_name(tmp);
|
|
|
+ val = tcp_ca_get_key_by_name(tmp, &ecn_ca);
|
|
|
if (val == TCP_CA_UNSPEC)
|
|
|
goto err;
|
|
|
} else {
|
|
@@ -1735,8 +1736,12 @@ static int ip6_convert_metrics(struct mx6_config *mxc,
|
|
|
__set_bit(type - 1, mxc->mx_valid);
|
|
|
}
|
|
|
|
|
|
- mxc->mx = mp;
|
|
|
+ if (ecn_ca) {
|
|
|
+ __set_bit(RTAX_FEATURES - 1, mxc->mx_valid);
|
|
|
+ mp[RTAX_FEATURES - 1] |= DST_FEATURE_ECN_CA;
|
|
|
+ }
|
|
|
|
|
|
+ mxc->mx = mp;
|
|
|
return 0;
|
|
|
err:
|
|
|
kfree(mp);
|