diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2022-06-27 11:39:22 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2022-06-27 11:39:22 +0200 |
commit | c47edbb199ce5dd8b442de0b0dfd296dcfdcfebd (patch) | |
tree | 5604e919db5039e16428671d03f3c7861934ac52 | |
parent | 076ffabe71b5d704c8e25c64b7592db80153c685 (diff) | |
parent | 90e7afc2cd040b19bcd825e186c8e44d068a173b (diff) | |
download | NetworkManager-c47edbb199ce5dd8b442de0b0dfd296dcfdcfebd.tar.gz |
merge: branch 'bg/route-attrs'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1274
-rw-r--r-- | src/core/NetworkManagerUtils.c | 4 | ||||
-rw-r--r-- | src/core/platform/tests/test-route.c | 3 | ||||
-rw-r--r-- | src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 43 | ||||
-rw-r--r-- | src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 7 | ||||
-rw-r--r-- | src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes | 2 | ||||
-rw-r--r-- | src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 3 | ||||
-rw-r--r-- | src/libnm-core-impl/nm-setting-ip-config.c | 16 | ||||
-rw-r--r-- | src/libnm-core-impl/nm-setting-ip4-config.c | 13 | ||||
-rw-r--r-- | src/libnm-core-impl/nm-setting-ip6-config.c | 13 | ||||
-rw-r--r-- | src/libnm-core-impl/tests/test-general.c | 12 | ||||
-rw-r--r-- | src/libnm-core-public/nm-setting-ip-config.h | 4 | ||||
-rw-r--r-- | src/libnm-platform/nm-linux-platform.c | 35 | ||||
-rw-r--r-- | src/libnm-platform/nm-platform.c | 110 | ||||
-rw-r--r-- | src/libnm-platform/nm-platform.h | 7 |
14 files changed, 227 insertions, 45 deletions
diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 56f551060c..503d52038c 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -1388,16 +1388,20 @@ nm_utils_ip_route_attribute_to_platform(int addr_family, 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_CWND, r->cwnd, 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_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_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_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_ADVMSS, r->lock_mss, BOOLEAN, boolean, FALSE); if ((variant = nm_ip_route_get_attribute(s_route, NM_IP_ROUTE_ATTRIBUTE_SRC)) && g_variant_is_of_type(variant, G_VARIANT_TYPE_STRING)) { diff --git a/src/core/platform/tests/test-route.c b/src/core/platform/tests/test-route.c index 2d39cb3789..c4397938a8 100644 --- a/src/core/platform/tests/test-route.c +++ b/src/core/platform/tests/test-route.c @@ -646,6 +646,9 @@ test_ip4_route_options(gconstpointer test_data) .initrwnd = 50, .mtu = 1350, .lock_cwnd = TRUE, + .mss = 1300, + .quickack = TRUE, + .rto_min = 1000, }); break; case 2: diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 78b65c7730..2635ff405f 100644 --- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -850,6 +850,7 @@ typedef struct { union { guint8 uint8; guint32 uint32; + gboolean boolean; const char *str; struct { guint32 uint32; @@ -878,6 +879,9 @@ enum { PARSE_LINE_ATTR_ROUTE_INITCWND, PARSE_LINE_ATTR_ROUTE_INITRWND, 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. */ PARSE_LINE_ATTR_ROUTE_TO, @@ -891,6 +895,7 @@ enum { #define PARSE_LINE_TYPE_UINT8 '8' #define PARSE_LINE_TYPE_UINT32 'u' #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_WITH_PREFIX 'p' #define PARSE_LINE_TYPE_IFNAME 'i' @@ -977,6 +982,11 @@ parse_route_line(const char *line, .key = NM_IP_ROUTE_ATTRIBUTE_CWND, .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] = { .key = NM_IP_ROUTE_ATTRIBUTE_INITCWND, @@ -992,7 +1002,16 @@ parse_route_line(const char *line, .key = NM_IP_ROUTE_ATTRIBUTE_MTU, .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] = { .key = "to", @@ -1095,6 +1114,9 @@ parse_route_line(const char *line, case PARSE_LINE_TYPE_UINT32_WITH_LOCK: i_words++; goto parse_line_type_uint32_with_lock; + case PARSE_LINE_TYPE_BOOL: + i_words++; + goto parse_line_type_bool; case PARSE_LINE_TYPE_ADDR: i_words++; goto parse_line_type_addr; @@ -1223,6 +1245,22 @@ parse_line_type_uint32_with_lock: i_words++; 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: s = words[i_words]; if (!s) @@ -1375,6 +1413,9 @@ next:; p_info->key, g_variant_new_uint32(p_data->v.uint32_with_lock.uint32)); 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_WITH_PREFIX: nm_ip_route_set_attribute( diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index 7c5bf11b6e..816d199448 100644 --- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -2321,6 +2321,7 @@ get_route_attributes_string(NMIPRoute *route, int family) continue; if (NM_IN_STRSET(names[i], + NM_IP_ROUTE_ATTRIBUTE_ADVMSS, NM_IP_ROUTE_ATTRIBUTE_WINDOW, NM_IP_ROUTE_ATTRIBUTE_CWND, 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)); } 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)); - } 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)); + } 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)) { if (g_variant_get_boolean(attr)) g_string_append(str, "onlink"); diff --git a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes index 9c05417ec2..717ad1ac98 100644 --- a/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes +++ b/src/core/settings/plugins/ifcfg-rh/tests/network-scripts/route-test-wired-static-routes @@ -6,7 +6,7 @@ ADDRESS1=44.55.66.77 NETMASK1=255.255.255.255 GATEWAY1=192.168.1.7 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 NETMASK2=255.255.255.255 diff --git a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index b0527789d7..7247100a9b 100644 --- a/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -1352,6 +1352,7 @@ test_read_wired_static_routes(void) 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_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_uint32(ip4_route, NM_IP_ROUTE_ATTRIBUTE_WINDOW, 30000); 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_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_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_byte(ip4_route, NM_IP_ROUTE_ATTRIBUTE_SCOPE, 10); diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index afda5e7a04..ab760c4e5f 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -1197,6 +1197,10 @@ nm_ip_route_set_attribute(NMIPRoute *route, const char *name, GVariant *value) } 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, G_VARIANT_TYPE_UINT32, .v4 = TRUE, @@ -1213,6 +1217,10 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { G_VARIANT_TYPE_UINT32, .v4 = 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, G_VARIANT_TYPE_BOOLEAN, .v4 = TRUE, @@ -1241,6 +1249,14 @@ static const NMVariantAttributeSpec *const ip_route_attribute_spec[] = { G_VARIANT_TYPE_BOOLEAN, .v4 = 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, G_VARIANT_TYPE_BYTE, .v4 = TRUE, diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index ba0670257c..ff56834e1a 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -1057,6 +1057,9 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) * Various attributes are supported: * <itemizedlist> * <listitem> + * <para><literal>"advmss"</literal> - an unsigned 32 bit integer.</para> + * </listitem> + * <listitem> * <para><literal>"cwnd"</literal> - an unsigned 32 bit integer.</para> * </listitem> * <listitem> @@ -1066,6 +1069,9 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) * <para><literal>"initrwnd"</literal> - an unsigned 32 bit integer.</para> * </listitem> * <listitem> + * <para><literal>"lock-advmss"</literal> - a boolean value.</para> + * </listitem> + * <listitem> * <para><literal>"lock-cwnd"</literal> - a boolean value.</para> * </listitem> * <listitem> @@ -1087,6 +1093,13 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) * <para><literal>"onlink"</literal> - a boolean value.</para> * </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> * </listitem> * <listitem> diff --git a/src/libnm-core-impl/nm-setting-ip6-config.c b/src/libnm-core-impl/nm-setting-ip6-config.c index 4f2e7f9415..877ba5dfe4 100644 --- a/src/libnm-core-impl/nm-setting-ip6-config.c +++ b/src/libnm-core-impl/nm-setting-ip6-config.c @@ -1043,6 +1043,9 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) * Various attributes are supported: * <itemizedlist> * <listitem> + * <para><literal>"advmss"</literal> - an unsigned 32 bit integer.</para> + * </listitem> + * <listitem> * <para><literal>"cwnd"</literal> - an unsigned 32 bit integer.</para> * </listitem> * <listitem> @@ -1055,6 +1058,9 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) * <para><literal>"initrwnd"</literal> - an unsigned 32 bit integer.</para> * </listitem> * <listitem> + * <para><literal>"lock-advmss"</literal> - a boolean value.</para> + * </listitem> + * <listitem> * <para><literal>"lock-cwnd"</literal> - a boolean value.</para> * </listitem> * <listitem> @@ -1076,6 +1082,13 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) * <para><literal>"onlink"</literal> - a boolean value.</para> * </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> * </listitem> * <listitem> diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 30be50b92c..4398dbf8f7 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -2381,12 +2381,18 @@ test_setting_ip_route_attributes(void) TEST_ATTR("tos", byte, 127, AF_INET, TRUE, 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", string, "11", AF_INET, FALSE, TRUE); TEST_ATTR("lock-mtu", boolean, TRUE, AF_INET, TRUE, 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/64", 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_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_INET6, FALSE, TRUE); TEST_ATTR("src", string, "1.2.3.0/24", AF_INET, FALSE, TRUE); diff --git a/src/libnm-core-public/nm-setting-ip-config.h b/src/libnm-core-public/nm-setting-ip-config.h index 257a687a1c..6283ecc948 100644 --- a/src/libnm-core-public/nm-setting-ip-config.h +++ b/src/libnm-core-public/nm-setting-ip-config.h @@ -123,10 +123,12 @@ gboolean nm_ip_route_attribute_validate(const char *name, gboolean *known, GError **error); +#define NM_IP_ROUTE_ATTRIBUTE_ADVMSS "advmss" #define NM_IP_ROUTE_ATTRIBUTE_CWND "cwnd" #define NM_IP_ROUTE_ATTRIBUTE_FROM "from" #define NM_IP_ROUTE_ATTRIBUTE_INITCWND "initcwnd" #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_INITCWND "lock-initcwnd" #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_MTU "mtu" #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_SRC "src" #define NM_IP_ROUTE_ATTRIBUTE_TABLE "table" diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index a3d3b50c6e..92106a75b5 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -3419,13 +3419,15 @@ _new_from_nl_route(const struct nlmsghdr *nlh, gboolean id_only, ParseNlmsgIter .found = FALSE, .has_more = FALSE, }; - guint32 mss; - guint32 window = 0; - guint32 cwnd = 0; - guint32 initcwnd = 0; - guint32 initrwnd = 0; - guint32 mtu = 0; - guint32 lock = 0; + guint32 mss; + guint32 window = 0; + guint32 cwnd = 0; + guint32 initcwnd = 0; + guint32 initrwnd = 0; + guint32 mtu = 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) || (!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_INITRWND] = {.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)]; @@ -3623,6 +3627,10 @@ rta_multipath_done: initrwnd = nla_get_u32(mtb[RTAX_INITRWND]); if (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.initcwnd = initcwnd; 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.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_initcwnd = NM_FLAGS_HAS(lock, 1 << RTAX_INITCWND); 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_mss = NM_FLAGS_HAS(lock, 1 << RTAX_ADVMSS); if (!IS_IPv4) { 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_initcwnd) << RTAX_INITCWND) | (((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 @@ -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 - || 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; 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); if (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) NLA_PUT_U32(msg, RTAX_LOCK, lock); diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index 1d7ed1c553..cd4a61aab7 100644 --- a/src/libnm-platform/nm-platform.c +++ b/src/libnm-platform/nm-platform.c @@ -6787,6 +6787,7 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz char s_gateway[INET_ADDRSTRLEN]; char s_pref_src[INET_ADDRSTRLEN]; char str_dev[TO_STRING_DEV_BUF_SIZE]; + char str_mss[32]; char str_table[30]; char str_scope[30]; 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_initcwnd[32]; char str_initrwnd[32]; + char str_rto_min[32]; char str_mtu[32]; char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN]; char str_type[30]; @@ -6821,18 +6823,20 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz "%s%s" /* gateway */ "%s" " metric %s" - " mss %" G_GUINT32_FORMAT /* mss */ - " rt-src %s" /* protocol */ - "%s" /* rtm_flags */ - "%s%s" /* scope */ - "%s%s" /* pref-src */ - "%s" /* tos */ - "%s" /* window */ - "%s" /* cwnd */ - "%s" /* initcwnd */ - "%s" /* initrwnd */ - "%s" /* mtu */ - "%s" /* r_force_commit */ + "%s" /* mss */ + " rt-src %s" /* protocol */ + "%s" /* rtm_flags */ + "%s%s" /* scope */ + "%s%s" /* pref-src */ + "%s" /* tos */ + "%s" /* window */ + "%s" /* cwnd */ + "%s" /* initcwnd */ + "%s" /* initrwnd */ + "%s" /* rto_min */ + "%s" /* quickack */ + "%s" /* mtu */ + "%s" /* r_force_commit */ "", nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced), str_type), @@ -6851,7 +6855,10 @@ nm_platform_ip4_route_to_string(const NMPlatformIP4Route *route, char *buf, gsiz route->metric_any ? (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)), _rtm_flags_to_string_full(str_rtm_flags, sizeof(str_rtm_flags), route->r_rtm_flags), 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->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, " mtu %s%" G_GUINT32_FORMAT, 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_pref2[30]; char str_dev[TO_STRING_DEV_BUF_SIZE]; + char str_mss[32]; char s_source[50]; char str_window[32]; char str_cwnd[32]; char str_initcwnd[32]; char str_initrwnd[32]; + char str_rto_min[32]; char str_mtu[32]; char str_rtm_flags[_RTM_FLAGS_TO_STRING_MAXLEN]; char str_metric[30]; @@ -6954,18 +6966,20 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz "%s%s" /* gateway */ "%s" " metric %s" - " mss %" G_GUINT32_FORMAT /* mss */ - " rt-src %s" /* protocol */ - "%s" /* source */ - "%s" /* rtm_flags */ - "%s%s" /* pref-src */ - "%s" /* window */ - "%s" /* cwnd */ - "%s" /* initcwnd */ - "%s" /* initrwnd */ - "%s" /* mtu */ - "%s" /* pref */ - "%s" /* r_force_commit */ + "%s" /* mss */ + " rt-src %s" /* protocol */ + "%s" /* source */ + "%s" /* rtm_flags */ + "%s%s" /* pref-src */ + "%s" /* window */ + "%s" /* cwnd */ + "%s" /* initcwnd */ + "%s" /* initrwnd */ + "%s" /* rto_min */ + "%s" /* quickack */ + "%s" /* mtu */ + "%s" /* pref */ + "%s" /* r_force_commit */ "", nm_net_aux_rtnl_rtntype_n2a_maybe_buf(nm_platform_route_type_uncoerce(route->type_coerced), str_type), @@ -6984,7 +6998,10 @@ nm_platform_ip6_route_to_string(const NMPlatformIP6Route *route, char *buf, gsiz route->metric_any ? (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)), route->src_plen || !IN6_IS_ADDR_UNSPECIFIED(&route->src) ? 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->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, " mtu %s%" G_GUINT32_FORMAT, route->lock_mtu ? "lock " : "", @@ -8337,15 +8357,18 @@ nm_platform_ip4_route_hash_update(const NMPlatformIP4Route *obj, obj->initcwnd, obj->initrwnd, obj->mtu, + obj->rto_min, obj->r_rtm_flags & RTNH_F_ONLINK, - NM_HASH_COMBINE_BOOLS(guint8, + NM_HASH_COMBINE_BOOLS(guint16, obj->metric_any, obj->table_any, + obj->quickack, obj->lock_window, obj->lock_cwnd, obj->lock_initcwnd, obj->lock_initrwnd, - obj->lock_mtu)); + obj->lock_mtu, + obj->lock_mss)); break; case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: nm_hash_update_vals( @@ -8367,15 +8390,18 @@ nm_platform_ip4_route_hash_update(const NMPlatformIP4Route *obj, obj->initcwnd, obj->initrwnd, obj->mtu, + obj->rto_min, obj->r_rtm_flags & (RTM_F_CLONED | RTNH_F_ONLINK), - NM_HASH_COMBINE_BOOLS(guint8, + NM_HASH_COMBINE_BOOLS(guint16, obj->metric_any, obj->table_any, + obj->quickack, obj->lock_window, obj->lock_cwnd, obj->lock_initcwnd, obj->lock_initrwnd, - obj->lock_mtu)); + obj->lock_mtu, + obj->lock_mss)); break; case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: nm_hash_update_vals(h, @@ -8396,15 +8422,18 @@ nm_platform_ip4_route_hash_update(const NMPlatformIP4Route *obj, obj->initcwnd, obj->initrwnd, obj->mtu, + obj->rto_min, obj->r_rtm_flags, - NM_HASH_COMBINE_BOOLS(guint8, + NM_HASH_COMBINE_BOOLS(guint16, obj->metric_any, obj->table_any, + obj->quickack, obj->lock_window, obj->lock_cwnd, obj->lock_initcwnd, obj->lock_initrwnd, obj->lock_mtu, + obj->lock_mss, obj->r_force_commit)); break; } @@ -8442,12 +8471,15 @@ nm_platform_ip4_route_cmp(const NMPlatformIP4Route *a, NM_CMP_FIELD(a, b, initcwnd); NM_CMP_FIELD(a, b, initrwnd); 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_FIELD_UNSAFE(a, b, quickack); NM_CMP_FIELD_UNSAFE(a, b, lock_window); NM_CMP_FIELD_UNSAFE(a, b, lock_cwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_mtu); + NM_CMP_FIELD_UNSAFE(a, b, lock_mss); } break; case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: @@ -8485,16 +8517,19 @@ nm_platform_ip4_route_cmp(const NMPlatformIP4Route *a, } else NM_CMP_FIELD(a, b, r_rtm_flags); 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_cwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd); 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, cwnd); NM_CMP_FIELD(a, b, initcwnd); NM_CMP_FIELD(a, b, initrwnd); NM_CMP_FIELD(a, b, mtu); + NM_CMP_FIELD(a, b, rto_min); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL) NM_CMP_FIELD_UNSAFE(a, b, r_force_commit); 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), obj->mss, obj->r_rtm_flags & RTM_F_CLONED, - NM_HASH_COMBINE_BOOLS(guint8, + NM_HASH_COMBINE_BOOLS(guint16, obj->metric_any, obj->table_any, + obj->quickack, obj->lock_window, obj->lock_cwnd, obj->lock_initcwnd, obj->lock_initrwnd, - obj->lock_mtu), + obj->lock_mtu, + obj->lock_mss), obj->window, obj->cwnd, obj->initcwnd, obj->initrwnd, obj->mtu, + obj->rto_min, _route_pref_normalize(obj->rt_pref)); break; 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, obj->metric_any, obj->table_any, + obj->quickack, obj->lock_window, obj->lock_cwnd, obj->lock_initcwnd, obj->lock_initrwnd, obj->lock_mtu, + obj->lock_mss, obj->r_force_commit), obj->window, obj->cwnd, obj->initcwnd, obj->initrwnd, obj->mtu, + obj->rto_min, obj->rt_pref); 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); } else 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_cwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initcwnd); NM_CMP_FIELD_UNSAFE(a, b, lock_initrwnd); 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, cwnd); NM_CMP_FIELD(a, b, initcwnd); NM_CMP_FIELD(a, b, initrwnd); NM_CMP_FIELD(a, b, mtu); + NM_CMP_FIELD(a, b, rto_min); 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)); else diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index ade730cc6f..b921a2f562 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -453,6 +453,9 @@ typedef union { /* RTA_METRICS.RTAX_INITRWND (iproute2: initrwnd) */ \ guint32 initrwnd; \ \ + /* RTA_METRICS.RTAX_RTO_MIN (iproute2: rto_min) */ \ + guint32 rto_min; \ + \ /* RTA_METRICS.RTAX_MTU (iproute2: mtu) */ \ guint32 mtu; \ \ @@ -499,6 +502,10 @@ typedef union { bool lock_initcwnd : 1; \ bool lock_initrwnd : 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 * metric. For example, form a DHCP lease we don't know the actually used metric, because |