merge: branch 'bg/route-attrs'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1274
This commit is contained in:
Beniamino Galvani 2022-06-27 11:39:22 +02:00
commit c47edbb199
14 changed files with 227 additions and 45 deletions

View file

@ -1388,16 +1388,20 @@ nm_utils_ip_route_attribute_to_platform(int addr_family,
r->r_rtm_flags = ((onlink) ? (unsigned) RTNH_F_ONLINK : 0u); r->r_rtm_flags = ((onlink) ? (unsigned) RTNH_F_ONLINK : 0u);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_ADVMSS, r->mss, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_WINDOW, r->window, UINT32, uint32, 0); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_WINDOW, r->window, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_CWND, r->cwnd, UINT32, uint32, 0); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_CWND, r->cwnd, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_INITCWND, r->initcwnd, UINT32, uint32, 0); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_INITCWND, r->initcwnd, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_INITRWND, r->initrwnd, UINT32, uint32, 0); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_INITRWND, r->initrwnd, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_MTU, r->mtu, UINT32, uint32, 0); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_MTU, r->mtu, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_RTO_MIN, r->rto_min, UINT32, uint32, 0);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_QUICKACK, r->quickack, BOOLEAN, boolean, FALSE);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_WINDOW, r->lock_window, BOOLEAN, boolean, FALSE); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_WINDOW, r->lock_window, BOOLEAN, boolean, FALSE);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND, r->lock_cwnd, BOOLEAN, boolean, FALSE); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND, r->lock_cwnd, BOOLEAN, boolean, FALSE);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND, r->lock_initcwnd, BOOLEAN, boolean, FALSE); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND, r->lock_initcwnd, BOOLEAN, boolean, FALSE);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_INITRWND, r->lock_initrwnd, BOOLEAN, boolean, FALSE); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_INITRWND, r->lock_initrwnd, BOOLEAN, boolean, FALSE);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU, r->lock_mtu, BOOLEAN, boolean, FALSE); GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU, r->lock_mtu, BOOLEAN, boolean, FALSE);
GET_ATTR(NM_IP_ROUTE_ATTRIBUTE_LOCK_ADVMSS, r->lock_mss, BOOLEAN, boolean, FALSE);
if ((variant = nm_ip_route_get_attribute(s_route, NM_IP_ROUTE_ATTRIBUTE_SRC)) if ((variant = nm_ip_route_get_attribute(s_route, NM_IP_ROUTE_ATTRIBUTE_SRC))
&& g_variant_is_of_type(variant, G_VARIANT_TYPE_STRING)) { && g_variant_is_of_type(variant, G_VARIANT_TYPE_STRING)) {

View file

@ -646,6 +646,9 @@ test_ip4_route_options(gconstpointer test_data)
.initrwnd = 50, .initrwnd = 50,
.mtu = 1350, .mtu = 1350,
.lock_cwnd = TRUE, .lock_cwnd = TRUE,
.mss = 1300,
.quickack = TRUE,
.rto_min = 1000,
}); });
break; break;
case 2: case 2:

View file

@ -850,6 +850,7 @@ typedef struct {
union { union {
guint8 uint8; guint8 uint8;
guint32 uint32; guint32 uint32;
gboolean boolean;
const char *str; const char *str;
struct { struct {
guint32 uint32; guint32 uint32;
@ -878,6 +879,9 @@ enum {
PARSE_LINE_ATTR_ROUTE_INITCWND, PARSE_LINE_ATTR_ROUTE_INITCWND,
PARSE_LINE_ATTR_ROUTE_INITRWND, PARSE_LINE_ATTR_ROUTE_INITRWND,
PARSE_LINE_ATTR_ROUTE_MTU, PARSE_LINE_ATTR_ROUTE_MTU,
PARSE_LINE_ATTR_ROUTE_ADVMSS,
PARSE_LINE_ATTR_ROUTE_RTO_MIN,
PARSE_LINE_ATTR_ROUTE_QUICKACK,
/* iproute2 arguments that only matter when parsing the file. */ /* iproute2 arguments that only matter when parsing the file. */
PARSE_LINE_ATTR_ROUTE_TO, PARSE_LINE_ATTR_ROUTE_TO,
@ -891,6 +895,7 @@ enum {
#define PARSE_LINE_TYPE_UINT8 '8' #define PARSE_LINE_TYPE_UINT8 '8'
#define PARSE_LINE_TYPE_UINT32 'u' #define PARSE_LINE_TYPE_UINT32 'u'
#define PARSE_LINE_TYPE_UINT32_WITH_LOCK 'l' #define PARSE_LINE_TYPE_UINT32_WITH_LOCK 'l'
#define PARSE_LINE_TYPE_BOOL 'b'
#define PARSE_LINE_TYPE_ADDR 'a' #define PARSE_LINE_TYPE_ADDR 'a'
#define PARSE_LINE_TYPE_ADDR_WITH_PREFIX 'p' #define PARSE_LINE_TYPE_ADDR_WITH_PREFIX 'p'
#define PARSE_LINE_TYPE_IFNAME 'i' #define PARSE_LINE_TYPE_IFNAME 'i'
@ -977,6 +982,11 @@ parse_route_line(const char *line,
.key = NM_IP_ROUTE_ATTRIBUTE_CWND, .key = NM_IP_ROUTE_ATTRIBUTE_CWND,
.type = PARSE_LINE_TYPE_UINT32_WITH_LOCK, .type = PARSE_LINE_TYPE_UINT32_WITH_LOCK,
}, },
[PARSE_LINE_ATTR_ROUTE_ADVMSS] =
{
.key = NM_IP_ROUTE_ATTRIBUTE_ADVMSS,
.type = PARSE_LINE_TYPE_UINT32_WITH_LOCK,
},
[PARSE_LINE_ATTR_ROUTE_INITCWND] = [PARSE_LINE_ATTR_ROUTE_INITCWND] =
{ {
.key = NM_IP_ROUTE_ATTRIBUTE_INITCWND, .key = NM_IP_ROUTE_ATTRIBUTE_INITCWND,
@ -992,7 +1002,16 @@ parse_route_line(const char *line,
.key = NM_IP_ROUTE_ATTRIBUTE_MTU, .key = NM_IP_ROUTE_ATTRIBUTE_MTU,
.type = PARSE_LINE_TYPE_UINT32_WITH_LOCK, .type = PARSE_LINE_TYPE_UINT32_WITH_LOCK,
}, },
[PARSE_LINE_ATTR_ROUTE_QUICKACK] =
{
.key = NM_IP_ROUTE_ATTRIBUTE_QUICKACK,
.type = PARSE_LINE_TYPE_BOOL,
},
[PARSE_LINE_ATTR_ROUTE_RTO_MIN] =
{
.key = NM_IP_ROUTE_ATTRIBUTE_RTO_MIN,
.type = PARSE_LINE_TYPE_UINT32,
},
[PARSE_LINE_ATTR_ROUTE_TO] = [PARSE_LINE_ATTR_ROUTE_TO] =
{ {
.key = "to", .key = "to",
@ -1095,6 +1114,9 @@ parse_route_line(const char *line,
case PARSE_LINE_TYPE_UINT32_WITH_LOCK: case PARSE_LINE_TYPE_UINT32_WITH_LOCK:
i_words++; i_words++;
goto parse_line_type_uint32_with_lock; goto parse_line_type_uint32_with_lock;
case PARSE_LINE_TYPE_BOOL:
i_words++;
goto parse_line_type_bool;
case PARSE_LINE_TYPE_ADDR: case PARSE_LINE_TYPE_ADDR:
i_words++; i_words++;
goto parse_line_type_addr; goto parse_line_type_addr;
@ -1223,6 +1245,22 @@ parse_line_type_uint32_with_lock:
i_words++; i_words++;
goto next; goto next;
parse_line_type_bool:
s = words[i_words];
if (!s)
goto err_word_missing_argument;
p_data->v.boolean = !!_nm_utils_ascii_str_to_int64(s, 10, 0, 1, 0);
if (errno) {
g_set_error(error,
NM_SETTINGS_ERROR,
NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Argument for \"%s\" is not a valid boolean number",
w);
return -EINVAL;
}
i_words++;
goto next;
parse_line_type_ifname: parse_line_type_ifname:
s = words[i_words]; s = words[i_words];
if (!s) if (!s)
@ -1375,6 +1413,9 @@ next:;
p_info->key, p_info->key,
g_variant_new_uint32(p_data->v.uint32_with_lock.uint32)); g_variant_new_uint32(p_data->v.uint32_with_lock.uint32));
break; break;
case PARSE_LINE_TYPE_BOOL:
nm_ip_route_set_attribute(route, p_info->key, g_variant_new_boolean(p_data->v.boolean));
break;
case PARSE_LINE_TYPE_ADDR: case PARSE_LINE_TYPE_ADDR:
case PARSE_LINE_TYPE_ADDR_WITH_PREFIX: case PARSE_LINE_TYPE_ADDR_WITH_PREFIX:
nm_ip_route_set_attribute( nm_ip_route_set_attribute(

View file

@ -2321,6 +2321,7 @@ get_route_attributes_string(NMIPRoute *route, int family)
continue; continue;
if (NM_IN_STRSET(names[i], if (NM_IN_STRSET(names[i],
NM_IP_ROUTE_ATTRIBUTE_ADVMSS,
NM_IP_ROUTE_ATTRIBUTE_WINDOW, NM_IP_ROUTE_ATTRIBUTE_WINDOW,
NM_IP_ROUTE_ATTRIBUTE_CWND, NM_IP_ROUTE_ATTRIBUTE_CWND,
NM_IP_ROUTE_ATTRIBUTE_INITCWND, NM_IP_ROUTE_ATTRIBUTE_INITCWND,
@ -2350,8 +2351,12 @@ get_route_attributes_string(NMIPRoute *route, int family)
g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_byte(attr)); g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_byte(attr));
} else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_TOS)) { } else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_TOS)) {
g_string_append_printf(str, "%s 0x%02x", names[i], (unsigned) g_variant_get_byte(attr)); g_string_append_printf(str, "%s 0x%02x", names[i], (unsigned) g_variant_get_byte(attr));
} else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_TABLE)) { } else if (NM_IN_STRSET(names[i],
NM_IP_ROUTE_ATTRIBUTE_TABLE,
NM_IP_ROUTE_ATTRIBUTE_RTO_MIN)) {
g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_uint32(attr)); g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_uint32(attr));
} else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_QUICKACK)) {
g_string_append_printf(str, "%s %u", names[i], (unsigned) g_variant_get_boolean(attr));
} else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_ONLINK)) { } else if (nm_streq(names[i], NM_IP_ROUTE_ATTRIBUTE_ONLINK)) {
if (g_variant_get_boolean(attr)) if (g_variant_get_boolean(attr))
g_string_append(str, "onlink"); g_string_append(str, "onlink");

View file

@ -6,7 +6,7 @@ ADDRESS1=44.55.66.77
NETMASK1=255.255.255.255 NETMASK1=255.255.255.255
GATEWAY1=192.168.1.7 GATEWAY1=192.168.1.7
METRIC1=3 METRIC1=3
OPTIONS1="mtu lock 9000 cwnd 12 src 1.1.1.1 tos 0x28 window 30000 scope 10 initcwnd lock 13 initrwnd 14" OPTIONS1="mtu lock 9000 cwnd 12 src 1.1.1.1 tos 0x28 window 30000 scope 10 initcwnd lock 13 initrwnd 14 rto_min 300 advmss 1300 quickack 1"
ADDRESS2=44.55.66.78 ADDRESS2=44.55.66.78
NETMASK2=255.255.255.255 NETMASK2=255.255.255.255

View file

@ -1352,6 +1352,7 @@ test_read_wired_static_routes(void)
g_assert_cmpint(nm_ip_route_get_prefix(ip4_route), ==, 32); g_assert_cmpint(nm_ip_route_get_prefix(ip4_route), ==, 32);
g_assert_cmpstr(nm_ip_route_get_next_hop(ip4_route), ==, "192.168.1.7"); g_assert_cmpstr(nm_ip_route_get_next_hop(ip4_route), ==, "192.168.1.7");
g_assert_cmpint(nm_ip_route_get_metric(ip4_route), ==, 3); g_assert_cmpint(nm_ip_route_get_metric(ip4_route), ==, 3);
nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_ADVMSS, 1300);
nmtst_assert_route_attribute_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_TOS, 0x28); nmtst_assert_route_attribute_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_TOS, 0x28);
nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_WINDOW, 30000); nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_WINDOW, 30000);
nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_CWND, 12); nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_CWND, 12);
@ -1360,6 +1361,8 @@ test_read_wired_static_routes(void)
nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_MTU, 9000); nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_MTU, 9000);
nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU, TRUE); nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_LOCK_MTU, TRUE);
nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND, TRUE); nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND, TRUE);
nmtst_assert_route_attribute_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_RTO_MIN, 300);
nmtst_assert_route_attribute_boolean(ip4_route, NM_IP_ROUTE_ATTRIBUTE_QUICKACK, TRUE);
nmtst_assert_route_attribute_string(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SRC, "1.1.1.1"); nmtst_assert_route_attribute_string(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SRC, "1.1.1.1");
nmtst_assert_route_attribute_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SCOPE, 10); nmtst_assert_route_attribute_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SCOPE, 10);

View file

@ -1197,6 +1197,10 @@ nm_ip_route_set_attribute(NMIPRoute *route, const char *name, GVariant *value)
} }
static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = {
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_ADVMSS,
G_VARIANT_TYPE_UINT32,
.v4 = TRUE,
.v6 = TRUE, ),
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_CWND, NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_CWND,
G_VARIANT_TYPE_UINT32, G_VARIANT_TYPE_UINT32,
.v4 = TRUE, .v4 = TRUE,
@ -1213,6 +1217,10 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = {
G_VARIANT_TYPE_UINT32, G_VARIANT_TYPE_UINT32,
.v4 = TRUE, .v4 = TRUE,
.v6 = TRUE, ), .v6 = TRUE, ),
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_LOCK_ADVMSS,
G_VARIANT_TYPE_BOOLEAN,
.v4 = TRUE,
.v6 = TRUE, ),
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND, NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND,
G_VARIANT_TYPE_BOOLEAN, G_VARIANT_TYPE_BOOLEAN,
.v4 = TRUE, .v4 = TRUE,
@ -1241,6 +1249,14 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = {
G_VARIANT_TYPE_BOOLEAN, G_VARIANT_TYPE_BOOLEAN,
.v4 = TRUE, .v4 = TRUE,
.v6 = TRUE, ), .v6 = TRUE, ),
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_QUICKACK,
G_VARIANT_TYPE_BOOLEAN,
.v4 = TRUE,
.v6 = TRUE, ),
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_RTO_MIN,
G_VARIANT_TYPE_UINT32,
.v4 = TRUE,
.v6 = TRUE, ),
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_SCOPE, NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_IP_ROUTE_ATTRIBUTE_SCOPE,
G_VARIANT_TYPE_BYTE, G_VARIANT_TYPE_BYTE,
.v4 = TRUE, .v4 = TRUE,

View file

@ -1057,6 +1057,9 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
* Various attributes are supported: * Various attributes are supported:
* <itemizedlist> * <itemizedlist>
* <listitem> * <listitem>
* <para><literal>"advmss"</literal> - an unsigned 32 bit integer.</para>
* </listitem>
* <listitem>
* <para><literal>"cwnd"</literal> - an unsigned 32 bit integer.</para> * <para><literal>"cwnd"</literal> - an unsigned 32 bit integer.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
@ -1066,6 +1069,9 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
* <para><literal>"initrwnd"</literal> - an unsigned 32 bit integer.</para> * <para><literal>"initrwnd"</literal> - an unsigned 32 bit integer.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
* <para><literal>"lock-advmss"</literal> - a boolean value.</para>
* </listitem>
* <listitem>
* <para><literal>"lock-cwnd"</literal> - a boolean value.</para> * <para><literal>"lock-cwnd"</literal> - a boolean value.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
@ -1087,6 +1093,13 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass)
* <para><literal>"onlink"</literal> - a boolean value.</para> * <para><literal>"onlink"</literal> - a boolean value.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
* <para><literal>"quickack"</literal> - a boolean value.</para>
* </listitem>
* <listitem>
* <para><literal>"rto_min"</literal> - an unsigned 32 bit integer.
* The value is in milliseconds.</para>
* </listitem>
* <listitem>
* <para><literal>"scope"</literal> - an unsigned 8 bit integer. IPv4 only.</para> * <para><literal>"scope"</literal> - an unsigned 8 bit integer. IPv4 only.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>

View file

@ -1043,6 +1043,9 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
* Various attributes are supported: * Various attributes are supported:
* <itemizedlist> * <itemizedlist>
* <listitem> * <listitem>
* <para><literal>"advmss"</literal> - an unsigned 32 bit integer.</para>
* </listitem>
* <listitem>
* <para><literal>"cwnd"</literal> - an unsigned 32 bit integer.</para> * <para><literal>"cwnd"</literal> - an unsigned 32 bit integer.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
@ -1055,6 +1058,9 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
* <para><literal>"initrwnd"</literal> - an unsigned 32 bit integer.</para> * <para><literal>"initrwnd"</literal> - an unsigned 32 bit integer.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
* <para><literal>"lock-advmss"</literal> - a boolean value.</para>
* </listitem>
* <listitem>
* <para><literal>"lock-cwnd"</literal> - a boolean value.</para> * <para><literal>"lock-cwnd"</literal> - a boolean value.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
@ -1076,6 +1082,13 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass)
* <para><literal>"onlink"</literal> - a boolean value.</para> * <para><literal>"onlink"</literal> - a boolean value.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>
* <para><literal>"quickack"</literal> - a boolean value.</para>
* </listitem>
* <listitem>
* <para><literal>"rto_min"</literal> - an unsigned 32 bit integer.
* The value is in milliseconds.</para>
* </listitem>
* <listitem>
* <para><literal>"src"</literal> - an IPv6 address.</para> * <para><literal>"src"</literal> - an IPv6 address.</para>
* </listitem> * </listitem>
* <listitem> * <listitem>

View file

@ -2381,12 +2381,18 @@ test_setting_ip_route_attributes(void)
TEST_ATTR("tos", byte, 127, AF_INET, TRUE, TRUE); TEST_ATTR("tos", byte, 127, AF_INET, TRUE, TRUE);
TEST_ATTR("tos", string, "0x28", AF_INET, FALSE, TRUE); TEST_ATTR("tos", string, "0x28", AF_INET, FALSE, TRUE);
TEST_ATTR("advmss", uint32, 1400, AF_INET, TRUE, TRUE);
TEST_ATTR("advmss", string, "1400", AF_INET, FALSE, TRUE);
TEST_ATTR("cwnd", uint32, 10, AF_INET, TRUE, TRUE); TEST_ATTR("cwnd", uint32, 10, AF_INET, TRUE, TRUE);
TEST_ATTR("cwnd", string, "11", AF_INET, FALSE, TRUE); TEST_ATTR("cwnd", string, "11", AF_INET, FALSE, TRUE);
TEST_ATTR("lock-mtu", boolean, TRUE, AF_INET, TRUE, TRUE); TEST_ATTR("lock-mtu", boolean, TRUE, AF_INET, TRUE, TRUE);
TEST_ATTR("lock-mtu", uint32, 1, AF_INET, FALSE, TRUE); TEST_ATTR("lock-mtu", uint32, 1, AF_INET, FALSE, TRUE);
TEST_ATTR("lock-advmss", boolean, TRUE, AF_INET, TRUE, TRUE);
TEST_ATTR("lock-advmss", boolean, TRUE, AF_INET6, TRUE, TRUE);
TEST_ATTR("from", string, "fd01::1", AF_INET6, TRUE, TRUE); TEST_ATTR("from", string, "fd01::1", AF_INET6, TRUE, TRUE);
TEST_ATTR("from", string, "fd01::1/64", AF_INET6, TRUE, TRUE); TEST_ATTR("from", string, "fd01::1/64", AF_INET6, TRUE, TRUE);
TEST_ATTR("from", string, "fd01::1/128", AF_INET6, TRUE, TRUE); TEST_ATTR("from", string, "fd01::1/128", AF_INET6, TRUE, TRUE);
@ -2396,6 +2402,12 @@ test_setting_ip_route_attributes(void)
TEST_ATTR("from", string, "1.2.3.4", AF_INET, FALSE, TRUE); TEST_ATTR("from", string, "1.2.3.4", AF_INET, FALSE, TRUE);
TEST_ATTR("from", string, "1.2.3.4", AF_INET6, FALSE, TRUE); TEST_ATTR("from", string, "1.2.3.4", AF_INET6, FALSE, TRUE);
TEST_ATTR("quickack", boolean, TRUE, AF_INET, TRUE, TRUE);
TEST_ATTR("quickack", boolean, TRUE, AF_INET6, TRUE, TRUE);
TEST_ATTR("rto_min", uint32, 1000, AF_INET, TRUE, TRUE);
TEST_ATTR("rto_min", uint32, 1000, AF_INET6, TRUE, TRUE);
TEST_ATTR("src", string, "1.2.3.4", AF_INET, TRUE, TRUE); TEST_ATTR("src", string, "1.2.3.4", AF_INET, TRUE, TRUE);
TEST_ATTR("src", string, "1.2.3.4", AF_INET6, FALSE, TRUE); TEST_ATTR("src", string, "1.2.3.4", AF_INET6, FALSE, TRUE);
TEST_ATTR("src", string, "1.2.3.0/24", AF_INET, FALSE, TRUE); TEST_ATTR("src", string, "1.2.3.0/24", AF_INET, FALSE, TRUE);

View file

@ -123,10 +123,12 @@ gboolean nm_ip_route_attribute_validate(const char *name,
gboolean *known, gboolean *known,
GError **error); GError **error);
#define NM_IP_ROUTE_ATTRIBUTE_ADVMSS "advmss"
#define NM_IP_ROUTE_ATTRIBUTE_CWND "cwnd" #define NM_IP_ROUTE_ATTRIBUTE_CWND "cwnd"
#define NM_IP_ROUTE_ATTRIBUTE_FROM "from" #define NM_IP_ROUTE_ATTRIBUTE_FROM "from"
#define NM_IP_ROUTE_ATTRIBUTE_INITCWND "initcwnd" #define NM_IP_ROUTE_ATTRIBUTE_INITCWND "initcwnd"
#define NM_IP_ROUTE_ATTRIBUTE_INITRWND "initrwnd" #define NM_IP_ROUTE_ATTRIBUTE_INITRWND "initrwnd"
#define NM_IP_ROUTE_ATTRIBUTE_LOCK_ADVMSS "lock-advmss"
#define NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND "lock-cwnd" #define NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND "lock-cwnd"
#define NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND "lock-initcwnd" #define NM_IP_ROUTE_ATTRIBUTE_LOCK_INITCWND "lock-initcwnd"
#define NM_IP_ROUTE_ATTRIBUTE_LOCK_INITRWND "lock-initrwnd" #define NM_IP_ROUTE_ATTRIBUTE_LOCK_INITRWND "lock-initrwnd"
@ -134,6 +136,8 @@ gboolean nm_ip_route_attribute_validate(const char *name,
#define NM_IP_ROUTE_ATTRIBUTE_LOCK_WINDOW "lock-window" #define NM_IP_ROUTE_ATTRIBUTE_LOCK_WINDOW "lock-window"
#define NM_IP_ROUTE_ATTRIBUTE_MTU "mtu" #define NM_IP_ROUTE_ATTRIBUTE_MTU "mtu"
#define NM_IP_ROUTE_ATTRIBUTE_ONLINK "onlink" #define NM_IP_ROUTE_ATTRIBUTE_ONLINK "onlink"
#define NM_IP_ROUTE_ATTRIBUTE_QUICKACK "quickack"
#define NM_IP_ROUTE_ATTRIBUTE_RTO_MIN "rto_min"
#define NM_IP_ROUTE_ATTRIBUTE_SCOPE "scope" #define NM_IP_ROUTE_ATTRIBUTE_SCOPE "scope"
#define NM_IP_ROUTE_ATTRIBUTE_SRC "src" #define NM_IP_ROUTE_ATTRIBUTE_SRC "src"
#define NM_IP_ROUTE_ATTRIBUTE_TABLE "table" #define NM_IP_ROUTE_ATTRIBUTE_TABLE "table"

View file

@ -3419,13 +3419,15 @@ _new_from_nl_route(const struct nlmsghdr *nlh, gboolean id_only, ParseNlmsgIter
.found = FALSE, .found = FALSE,
.has_more = FALSE, .has_more = FALSE,
}; };
guint32 mss; guint32 mss;
guint32 window = 0; guint32 window = 0;
guint32 cwnd = 0; guint32 cwnd = 0;
guint32 initcwnd = 0; guint32 initcwnd = 0;
guint32 initrwnd = 0; guint32 initrwnd = 0;
guint32 mtu = 0; guint32 mtu = 0;
guint32 lock = 0; guint32 rto_min = 0;
guint32 lock = 0;
gboolean quickack = FALSE;
nm_assert((parse_nlmsg_iter->iter_more && parse_nlmsg_iter->ip6_route.next_multihop > 0) nm_assert((parse_nlmsg_iter->iter_more && parse_nlmsg_iter->ip6_route.next_multihop > 0)
|| (!parse_nlmsg_iter->iter_more && parse_nlmsg_iter->ip6_route.next_multihop == 0)); || (!parse_nlmsg_iter->iter_more && parse_nlmsg_iter->ip6_route.next_multihop == 0));
@ -3603,6 +3605,8 @@ rta_multipath_done:
[RTAX_INITCWND] = {.type = NLA_U32}, [RTAX_INITCWND] = {.type = NLA_U32},
[RTAX_INITRWND] = {.type = NLA_U32}, [RTAX_INITRWND] = {.type = NLA_U32},
[RTAX_MTU] = {.type = NLA_U32}, [RTAX_MTU] = {.type = NLA_U32},
[RTAX_QUICKACK] = {.type = NLA_U32},
[RTAX_RTO_MIN] = {.type = NLA_U32},
}; };
struct nlattr *mtb[G_N_ELEMENTS(rtax_policy)]; struct nlattr *mtb[G_N_ELEMENTS(rtax_policy)];
@ -3623,6 +3627,10 @@ rta_multipath_done:
initrwnd = nla_get_u32(mtb[RTAX_INITRWND]); initrwnd = nla_get_u32(mtb[RTAX_INITRWND]);
if (mtb[RTAX_MTU]) if (mtb[RTAX_MTU])
mtu = nla_get_u32(mtb[RTAX_MTU]); mtu = nla_get_u32(mtb[RTAX_MTU]);
if (mtb[RTAX_RTO_MIN])
rto_min = nla_get_u32(mtb[RTAX_RTO_MIN]);
if (mtb[RTAX_QUICKACK])
quickack = !!nla_get_u32(mtb[RTAX_QUICKACK]);
} }
/*****************************************************************/ /*****************************************************************/
@ -3673,12 +3681,15 @@ rta_multipath_done:
obj->ip_route.cwnd = cwnd; obj->ip_route.cwnd = cwnd;
obj->ip_route.initcwnd = initcwnd; obj->ip_route.initcwnd = initcwnd;
obj->ip_route.initrwnd = initrwnd; obj->ip_route.initrwnd = initrwnd;
obj->ip_route.rto_min = rto_min;
obj->ip_route.quickack = quickack;
obj->ip_route.mtu = mtu; obj->ip_route.mtu = mtu;
obj->ip_route.lock_window = NM_FLAGS_HAS(lock, 1 << RTAX_WINDOW); obj->ip_route.lock_window = NM_FLAGS_HAS(lock, 1 << RTAX_WINDOW);
obj->ip_route.lock_cwnd = NM_FLAGS_HAS(lock, 1 << RTAX_CWND); obj->ip_route.lock_cwnd = NM_FLAGS_HAS(lock, 1 << RTAX_CWND);
obj->ip_route.lock_initcwnd = NM_FLAGS_HAS(lock, 1 << RTAX_INITCWND); obj->ip_route.lock_initcwnd = NM_FLAGS_HAS(lock, 1 << RTAX_INITCWND);
obj->ip_route.lock_initrwnd = NM_FLAGS_HAS(lock, 1 << RTAX_INITRWND); obj->ip_route.lock_initrwnd = NM_FLAGS_HAS(lock, 1 << RTAX_INITRWND);
obj->ip_route.lock_mtu = NM_FLAGS_HAS(lock, 1 << RTAX_MTU); obj->ip_route.lock_mtu = NM_FLAGS_HAS(lock, 1 << RTAX_MTU);
obj->ip_route.lock_mss = NM_FLAGS_HAS(lock, 1 << RTAX_ADVMSS);
if (!IS_IPv4) { if (!IS_IPv4) {
if (tb[RTA_PREF]) if (tb[RTA_PREF])
@ -4781,7 +4792,8 @@ ip_route_get_lock_flag(const NMPlatformIPRoute *route)
| (((guint32) route->lock_cwnd) << RTAX_CWND) | (((guint32) route->lock_cwnd) << RTAX_CWND)
| (((guint32) route->lock_initcwnd) << RTAX_INITCWND) | (((guint32) route->lock_initcwnd) << RTAX_INITCWND)
| (((guint32) route->lock_initrwnd) << RTAX_INITRWND) | (((guint32) route->lock_initrwnd) << RTAX_INITRWND)
| (((guint32) route->lock_mtu) << RTAX_MTU); | (((guint32) route->lock_mtu) << RTAX_MTU)
| (((guint32) route->lock_mss) << RTAX_ADVMSS);
} }
static gboolean static gboolean
@ -4869,7 +4881,8 @@ _nl_msg_new_route(int nlmsg_type, guint16 nlmsgflags, const NMPObject *obj)
} }
if (obj->ip_route.mss || obj->ip_route.window || obj->ip_route.cwnd || obj->ip_route.initcwnd if (obj->ip_route.mss || obj->ip_route.window || obj->ip_route.cwnd || obj->ip_route.initcwnd
|| obj->ip_route.initrwnd || obj->ip_route.mtu || lock) { || obj->ip_route.initrwnd || obj->ip_route.mtu || obj->ip_route.quickack
|| obj->ip_route.rto_min || lock) {
struct nlattr *metrics; struct nlattr *metrics;
metrics = nla_nest_start(msg, RTA_METRICS); metrics = nla_nest_start(msg, RTA_METRICS);
@ -4888,6 +4901,10 @@ _nl_msg_new_route(int nlmsg_type, guint16 nlmsgflags, const NMPObject *obj)
NLA_PUT_U32(msg, RTAX_INITRWND, obj->ip_route.initrwnd); NLA_PUT_U32(msg, RTAX_INITRWND, obj->ip_route.initrwnd);
if (obj->ip_route.mtu) if (obj->ip_route.mtu)
NLA_PUT_U32(msg, RTAX_MTU, obj->ip_route.mtu); NLA_PUT_U32(msg, RTAX_MTU, obj->ip_route.mtu);
if (obj->ip_route.rto_min)
NLA_PUT_U32(msg, RTAX_RTO_MIN, obj->ip_route.rto_min);
if (obj->ip_route.quickack)
NLA_PUT_U32(msg, RTAX_QUICKACK, obj->ip_route.quickack);
if (lock) if (lock)
NLA_PUT_U32(msg, RTAX_LOCK, lock); NLA_PUT_U32(msg, RTAX_LOCK, lock);

View file

@ -6787,6 +6787,7 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz
char s_gateway[INET_ADDRSTRLEN]; char s_gateway[INET_ADDRSTRLEN];
char s_pref_src[INET_ADDRSTRLEN]; char s_pref_src[INET_ADDRSTRLEN];
char str_dev[TO_STRING_DEV_BUF_SIZE]; char str_dev[TO_STRING_DEV_BUF_SIZE];
char str_mss[32];
char str_table[30]; char str_table[30];
char str_scope[30]; char str_scope[30];
char s_source[50]; char s_source[50];
@ -6795,6 +6796,7 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz
char str_cwnd[32]; char str_cwnd[32];
char str_initcwnd[32]; char str_initcwnd[32];
char str_initrwnd[32]; char str_initrwnd[32];
char str_rto_min[32];
char str_mtu[32]; char str_mtu[32];
char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN]; char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN];
char str_type[30]; char str_type[30];
@ -6821,18 +6823,20 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz
"%s%s" /* gateway */ "%s%s" /* gateway */
"%s" "%s"
" metric %s" " metric %s"
" mss %" G_GUINT32_FORMAT /* mss */ "%s" /* mss */
" rt-src %s" /* protocol */ " rt-src %s" /* protocol */
"%s" /* rtm_flags */ "%s" /* rtm_flags */
"%s%s" /* scope */ "%s%s" /* scope */
"%s%s" /* pref-src */ "%s%s" /* pref-src */
"%s" /* tos */ "%s" /* tos */
"%s" /* window */ "%s" /* window */
"%s" /* cwnd */ "%s" /* cwnd */
"%s" /* initcwnd */ "%s" /* initcwnd */
"%s" /* initrwnd */ "%s" /* initrwnd */
"%s" /* mtu */ "%s" /* rto_min */
"%s" /* r_force_commit */ "%s" /* quickack */
"%s" /* mtu */
"%s" /* r_force_commit */
"", "",
nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced), nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced),
str_type), str_type),
@ -6851,7 +6855,10 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz
route->metric_any route->metric_any
? (route->metric ? nm_sprintf_buf(str_metric, "??+%u", route->metric) : "??") ? (route->metric ? nm_sprintf_buf(str_metric, "??+%u", route->metric) : "??")
: nm_sprintf_buf(str_metric, "%u", route->metric), : nm_sprintf_buf(str_metric, "%u", route->metric),
route->mss, nm_sprintf_buf(str_mss,
" mss %s%" G_GUINT32_FORMAT,
route->lock_mss ? "lock " : "",
route->mss),
nmp_utils_ip_config_source_to_string(route->rt_source, s_source, sizeof(s_source)), nmp_utils_ip_config_source_to_string(route->rt_source, s_source, sizeof(s_source)),
_rtm_flags_to_string_full(str_rtm_flags, sizeof(str_rtm_flags), route->r_rtm_flags), _rtm_flags_to_string_full(str_rtm_flags, sizeof(str_rtm_flags), route->r_rtm_flags),
route->scope_inv ? " scope " : "", route->scope_inv ? " scope " : "",
@ -6885,6 +6892,9 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz
route->lock_initrwnd ? "lock " : "", route->lock_initrwnd ? "lock " : "",
route->initrwnd) route->initrwnd)
: "", : "",
route->rto_min ? nm_sprintf_buf(str_rto_min, " rto_min %" G_GUINT32_FORMAT, route->rto_min)
: "",
route->quickack ? " quickack 1" : "",
route->mtu || route->lock_mtu ? nm_sprintf_buf(str_mtu, route->mtu || route->lock_mtu ? nm_sprintf_buf(str_mtu,
" mtu %s%" G_GUINT32_FORMAT, " mtu %s%" G_GUINT32_FORMAT,
route->lock_mtu ? "lock " : "", route->lock_mtu ? "lock " : "",
@ -6919,11 +6929,13 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz
char str_pref[40]; char str_pref[40];
char str_pref2[30]; char str_pref2[30];
char str_dev[TO_STRING_DEV_BUF_SIZE]; char str_dev[TO_STRING_DEV_BUF_SIZE];
char str_mss[32];
char s_source[50]; char s_source[50];
char str_window[32]; char str_window[32];
char str_cwnd[32]; char str_cwnd[32];
char str_initcwnd[32]; char str_initcwnd[32];
char str_initrwnd[32]; char str_initrwnd[32];
char str_rto_min[32];
char str_mtu[32]; char str_mtu[32];
char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN]; char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN];
char str_metric[30]; char str_metric[30];
@ -6954,18 +6966,20 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz
"%s%s" /* gateway */ "%s%s" /* gateway */
"%s" "%s"
" metric %s" " metric %s"
" mss %" G_GUINT32_FORMAT /* mss */ "%s" /* mss */
" rt-src %s" /* protocol */ " rt-src %s" /* protocol */
"%s" /* source */ "%s" /* source */
"%s" /* rtm_flags */ "%s" /* rtm_flags */
"%s%s" /* pref-src */ "%s%s" /* pref-src */
"%s" /* window */ "%s" /* window */
"%s" /* cwnd */ "%s" /* cwnd */
"%s" /* initcwnd */ "%s" /* initcwnd */
"%s" /* initrwnd */ "%s" /* initrwnd */
"%s" /* mtu */ "%s" /* rto_min */
"%s" /* pref */ "%s" /* quickack */
"%s" /* r_force_commit */ "%s" /* mtu */
"%s" /* pref */
"%s" /* r_force_commit */
"", "",
nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced), nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced),
str_type), str_type),
@ -6984,7 +6998,10 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz
route->metric_any route->metric_any
? (route->metric ? nm_sprintf_buf(str_metric, "??+%u", route->metric) : "??") ? (route->metric ? nm_sprintf_buf(str_metric, "??+%u", route->metric) : "??")
: nm_sprintf_buf(str_metric, "%u", route->metric), : nm_sprintf_buf(str_metric, "%u", route->metric),
route->mss, nm_sprintf_buf(str_mss,
" mss %s%" G_GUINT32_FORMAT,
route->lock_mss ? "lock " : "",
route->mss),
nmp_utils_ip_config_source_to_string(route->rt_source, s_source, sizeof(s_source)), nmp_utils_ip_config_source_to_string(route->rt_source, s_source, sizeof(s_source)),
route->src_plen || !IN6_IS_ADDR_UNSPECIFIED(&route->src) route->src_plen || !IN6_IS_ADDR_UNSPECIFIED(&route->src)
? nm_sprintf_buf(s_src_all, ? nm_sprintf_buf(s_src_all,
@ -7017,6 +7034,9 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz
route->lock_initrwnd ? "lock " : "", route->lock_initrwnd ? "lock " : "",
route->initrwnd) route->initrwnd)
: "", : "",
route->rto_min ? nm_sprintf_buf(str_rto_min, " rto_min %" G_GUINT32_FORMAT, route->rto_min)
: "",
route->quickack ? " quickack 1" : "",
route->mtu || route->lock_mtu ? nm_sprintf_buf(str_mtu, route->mtu || route->lock_mtu ? nm_sprintf_buf(str_mtu,
" mtu %s%" G_GUINT32_FORMAT, " mtu %s%" G_GUINT32_FORMAT,
route->lock_mtu ? "lock " : "", route->lock_mtu ? "lock " : "",
@ -8337,15 +8357,18 @@ nm_platform_ip4_route_hash_update(const NMPlatformIP4Route *obj,
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu, obj->mtu,
obj->rto_min,
obj->r_rtm_flags & RTNH_F_ONLINK, obj->r_rtm_flags & RTNH_F_ONLINK,
NM_HASH_COMBINE_BOOLS(guint8, NM_HASH_COMBINE_BOOLS(guint16,
obj->metric_any, obj->metric_any,
obj->table_any, obj->table_any,
obj->quickack,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu)); obj->lock_mtu,
obj->lock_mss));
break; break;
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
nm_hash_update_vals( nm_hash_update_vals(
@ -8367,15 +8390,18 @@ nm_platform_ip4_route_hash_update(const NMPlatformIP4Route *obj,
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu, obj->mtu,
obj->rto_min,
obj->r_rtm_flags & (RTM_F_CLONED | RTNH_F_ONLINK), obj->r_rtm_flags & (RTM_F_CLONED | RTNH_F_ONLINK),
NM_HASH_COMBINE_BOOLS(guint8, NM_HASH_COMBINE_BOOLS(guint16,
obj->metric_any, obj->metric_any,
obj->table_any, obj->table_any,
obj->quickack,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu)); obj->lock_mtu,
obj->lock_mss));
break; break;
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
nm_hash_update_vals(h, nm_hash_update_vals(h,
@ -8396,15 +8422,18 @@ nm_platform_ip4_route_hash_update(const NMPlatformIP4Route *obj,
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu, obj->mtu,
obj->rto_min,
obj->r_rtm_flags, obj->r_rtm_flags,
NM_HASH_COMBINE_BOOLS(guint8, NM_HASH_COMBINE_BOOLS(guint16,
obj->metric_any, obj->metric_any,
obj->table_any, obj->table_any,
obj->quickack,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu, obj->lock_mtu,
obj->lock_mss,
obj->r_force_commit)); obj->r_force_commit));
break; break;
} }
@ -8442,12 +8471,15 @@ nm_platform_ip4_route_cmp(const NMPlatformIP4Route *a,
NM_CMP_FIELD(a, b, initcwnd); NM_CMP_FIELD(a, b, initcwnd);
NM_CMP_FIELD(a, b, initrwnd); NM_CMP_FIELD(a, b, initrwnd);
NM_CMP_FIELD(a, b, mtu); NM_CMP_FIELD(a, b, mtu);
NM_CMP_FIELD(a, b, rto_min);
NM_CMP_DIRECT(a->r_rtm_flags & RTNH_F_ONLINK, b->r_rtm_flags & RTNH_F_ONLINK); NM_CMP_DIRECT(a->r_rtm_flags & RTNH_F_ONLINK, b->r_rtm_flags & RTNH_F_ONLINK);
NM_CMP_FIELD_UNSAFE(a, b, quickack);
NM_CMP_FIELD_UNSAFE(a, b, lock_window); NM_CMP_FIELD_UNSAFE(a, b, lock_window);
NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_mtu); NM_CMP_FIELD_UNSAFE(a, b, lock_mtu);
NM_CMP_FIELD_UNSAFE(a, b, lock_mss);
} }
break; break;
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
@ -8485,16 +8517,19 @@ nm_platform_ip4_route_cmp(const NMPlatformIP4Route *a,
} else } else
NM_CMP_FIELD(a, b, r_rtm_flags); NM_CMP_FIELD(a, b, r_rtm_flags);
NM_CMP_FIELD(a, b, tos); NM_CMP_FIELD(a, b, tos);
NM_CMP_FIELD_UNSAFE(a, b, quickack);
NM_CMP_FIELD_UNSAFE(a, b, lock_window); NM_CMP_FIELD_UNSAFE(a, b, lock_window);
NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_mtu); NM_CMP_FIELD_UNSAFE(a, b, lock_mtu);
NM_CMP_FIELD_UNSAFE(a, b, lock_mss);
NM_CMP_FIELD(a, b, window); NM_CMP_FIELD(a, b, window);
NM_CMP_FIELD(a, b, cwnd); NM_CMP_FIELD(a, b, cwnd);
NM_CMP_FIELD(a, b, initcwnd); NM_CMP_FIELD(a, b, initcwnd);
NM_CMP_FIELD(a, b, initrwnd); NM_CMP_FIELD(a, b, initrwnd);
NM_CMP_FIELD(a, b, mtu); NM_CMP_FIELD(a, b, mtu);
NM_CMP_FIELD(a, b, rto_min);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL)
NM_CMP_FIELD_UNSAFE(a, b, r_force_commit); NM_CMP_FIELD_UNSAFE(a, b, r_force_commit);
break; break;
@ -8552,19 +8587,22 @@ nm_platform_ip6_route_hash_update(const NMPlatformIP6Route *obj,
nmp_utils_ip_config_source_round_trip_rtprot(obj->rt_source), nmp_utils_ip_config_source_round_trip_rtprot(obj->rt_source),
obj->mss, obj->mss,
obj->r_rtm_flags & RTM_F_CLONED, obj->r_rtm_flags & RTM_F_CLONED,
NM_HASH_COMBINE_BOOLS(guint8, NM_HASH_COMBINE_BOOLS(guint16,
obj->metric_any, obj->metric_any,
obj->table_any, obj->table_any,
obj->quickack,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu), obj->lock_mtu,
obj->lock_mss),
obj->window, obj->window,
obj->cwnd, obj->cwnd,
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu, obj->mtu,
obj->rto_min,
_route_pref_normalize(obj->rt_pref)); _route_pref_normalize(obj->rt_pref));
break; break;
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
@ -8584,17 +8622,20 @@ nm_platform_ip6_route_hash_update(const NMPlatformIP6Route *obj,
NM_HASH_COMBINE_BOOLS(guint16, NM_HASH_COMBINE_BOOLS(guint16,
obj->metric_any, obj->metric_any,
obj->table_any, obj->table_any,
obj->quickack,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu, obj->lock_mtu,
obj->lock_mss,
obj->r_force_commit), obj->r_force_commit),
obj->window, obj->window,
obj->cwnd, obj->cwnd,
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu, obj->mtu,
obj->rto_min,
obj->rt_pref); obj->rt_pref);
break; break;
} }
@ -8658,16 +8699,19 @@ nm_platform_ip6_route_cmp(const NMPlatformIP6Route *a,
NM_CMP_DIRECT(a->r_rtm_flags & RTM_F_CLONED, b->r_rtm_flags & RTM_F_CLONED); NM_CMP_DIRECT(a->r_rtm_flags & RTM_F_CLONED, b->r_rtm_flags & RTM_F_CLONED);
} else } else
NM_CMP_FIELD(a, b, r_rtm_flags); NM_CMP_FIELD(a, b, r_rtm_flags);
NM_CMP_FIELD_UNSAFE(a, b, quickack);
NM_CMP_FIELD_UNSAFE(a, b, lock_window); NM_CMP_FIELD_UNSAFE(a, b, lock_window);
NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd);
NM_CMP_FIELD_UNSAFE(a, b, lock_mtu); NM_CMP_FIELD_UNSAFE(a, b, lock_mtu);
NM_CMP_FIELD_UNSAFE(a, b, lock_mss);
NM_CMP_FIELD(a, b, window); NM_CMP_FIELD(a, b, window);
NM_CMP_FIELD(a, b, cwnd); NM_CMP_FIELD(a, b, cwnd);
NM_CMP_FIELD(a, b, initcwnd); NM_CMP_FIELD(a, b, initcwnd);
NM_CMP_FIELD(a, b, initrwnd); NM_CMP_FIELD(a, b, initrwnd);
NM_CMP_FIELD(a, b, mtu); NM_CMP_FIELD(a, b, mtu);
NM_CMP_FIELD(a, b, rto_min);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
NM_CMP_DIRECT(_route_pref_normalize(a->rt_pref), _route_pref_normalize(b->rt_pref)); NM_CMP_DIRECT(_route_pref_normalize(a->rt_pref), _route_pref_normalize(b->rt_pref));
else else

View file

@ -453,6 +453,9 @@ typedef union {
/* RTA_METRICS.RTAX_INITRWND (iproute2: initrwnd) */ \ /* RTA_METRICS.RTAX_INITRWND (iproute2: initrwnd) */ \
guint32 initrwnd; \ guint32 initrwnd; \
\ \
/* RTA_METRICS.RTAX_RTO_MIN (iproute2: rto_min) */ \
guint32 rto_min; \
\
/* RTA_METRICS.RTAX_MTU (iproute2: mtu) */ \ /* RTA_METRICS.RTAX_MTU (iproute2: mtu) */ \
guint32 mtu; \ guint32 mtu; \
\ \
@ -499,6 +502,10 @@ typedef union {
bool lock_initcwnd : 1; \ bool lock_initcwnd : 1; \
bool lock_initrwnd : 1; \ bool lock_initrwnd : 1; \
bool lock_mtu : 1; \ bool lock_mtu : 1; \
bool lock_mss : 1; \
\
/* RTA_METRICS.RTAX_QUICKACK (iproute2: quickack) */ \
bool quickack : 1; \
\ \
/* if TRUE, the "metric" field is interpreted as an offset that is added to a default /* if TRUE, the "metric" field is interpreted as an offset that is added to a default
* metric. For example, form a DHCP lease we don't know the actually used metric, because * metric. For example, form a DHCP lease we don't know the actually used metric, because