summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@gmail.com>2019-05-13 13:15:33 +0200
committerSusant Sahani <ssahani@gmail.com>2019-05-14 04:38:36 +0200
commit633c7258655ba94b2b9c24689de150717839e78b (patch)
tree00f9d70192bdfa5cd49fd40bc68b76985b57cb27
parentsd-netlink: support RTAX_FASTOPEN_NO_COOKIE (diff)
downloadsystemd-633c7258655ba94b2b9c24689de150717839e78b.tar.xz
systemd-633c7258655ba94b2b9c24689de150717839e78b.zip
networkd: route add support to configure fastopen_no_cookie
This patch adds fastopen_no_cookie option to enable/disable TCP fastopen without a cookie on a per-route basis.
-rw-r--r--man/systemd.network.xml8
-rw-r--r--src/network/networkd-network-gperf.gperf1
-rw-r--r--src/network/networkd-route.c45
-rw-r--r--src/network/networkd-route.h2
-rw-r--r--test/fuzz/fuzz-network-parser/directives.network1
5 files changed, 57 insertions, 0 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 3ff1a036ff..0395f2c330 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -1219,6 +1219,14 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><varname>FastOpenNoCookie=</varname></term>
+ <listitem>
+ <para>Takes a boolean. When true enables TCP fastopen without a cookie on a per-route basis.
+ When unset, the kernel's default will be used.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><varname>MTUBytes=</varname></term>
<listitem>
<para>The maximum transmission unit in bytes to set for the
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index c6036e29fa..e8e228092c 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -127,6 +127,7 @@ Route.Type, config_parse_route_type,
Route.InitialCongestionWindow, config_parse_tcp_window, 0, 0
Route.InitialAdvertisedReceiveWindow, config_parse_tcp_window, 0, 0
Route.QuickAck, config_parse_quickack, 0, 0
+Route.FastOpenNoCookie, config_parse_fast_open_no_cookie, 0, 0
DHCP.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier)
DHCP.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_use_dns)
DHCP.UseNTP, config_parse_bool, 0, offsetof(Network, dhcp_use_ntp)
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index 379077cbfd..03332cd21b 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -59,6 +59,7 @@ int route_new(Route **ret) {
.table = RT_TABLE_MAIN,
.lifetime = USEC_INFINITY,
.quickack = -1,
+ .fast_open_no_cookie = -1,
.gateway_onlink = -1,
};
@@ -644,6 +645,12 @@ int route_configure(
return log_link_error_errno(link, r, "Could not append RTAX_QUICKACK attribute: %m");
}
+ if (route->fast_open_no_cookie >= 0) {
+ r = sd_netlink_message_append_u32(req, RTAX_FASTOPEN_NO_COOKIE, route->fast_open_no_cookie);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not append RTAX_FASTOPEN_NO_COOKIE attribute: %m");
+ }
+
r = sd_netlink_message_close_container(req);
if (r < 0)
return log_link_error_errno(link, r, "Could not append RTA_METRICS attribute: %m");
@@ -1197,6 +1204,44 @@ int config_parse_quickack(
return 0;
}
+int config_parse_fast_open_no_cookie(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ _cleanup_(route_free_or_set_invalidp) Route *n = NULL;
+ Network *network = userdata;
+ int k, r;
+
+ assert(filename);
+ assert(section);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ r = route_new_static(network, filename, section_line, &n);
+ if (r < 0)
+ return r;
+
+ k = parse_boolean(rvalue);
+ if (k < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, k,
+ "Failed to parse TCP fastopen no cookie, ignoring: %s", rvalue);
+ return 0;
+ }
+
+ n->fast_open_no_cookie = k;
+ TAKE_PTR(n);
+ return 0;
+}
+
int config_parse_route_mtu(
const char *unit,
const char *filename,
diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h
index 1e8320fdc0..892da25bd5 100644
--- a/src/network/networkd-route.h
+++ b/src/network/networkd-route.h
@@ -17,6 +17,7 @@ struct Route {
int family;
int quickack;
+ int fast_open_no_cookie;
unsigned char dst_prefixlen;
unsigned char src_prefixlen;
@@ -74,4 +75,5 @@ CONFIG_PARSER_PROTOTYPE(config_parse_route_protocol);
CONFIG_PARSER_PROTOTYPE(config_parse_route_type);
CONFIG_PARSER_PROTOTYPE(config_parse_tcp_window);
CONFIG_PARSER_PROTOTYPE(config_parse_quickack);
+CONFIG_PARSER_PROTOTYPE(config_parse_fast_open_no_cookie);
CONFIG_PARSER_PROTOTYPE(config_parse_route_mtu);
diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network
index 97e8e4a580..3c4a16bc39 100644
--- a/test/fuzz/fuzz-network-parser/directives.network
+++ b/test/fuzz/fuzz-network-parser/directives.network
@@ -78,6 +78,7 @@ PreferredSource=
Scope=
MTUBytes=
QuickAck=
+FastOpenNoCookie=
Source=
Metric=
[Network]