diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 1ab28cde4bb..959ce08314f 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -2073,6 +2073,20 @@ allow my_server_t localnet_peer_t:peer recv;
+
+ InitialCongestionWindow=
+
+ As in the [Route] section.
+
+
+
+
+ InitialAdvertisedReceiveWindow=
+
+ As in the [Route] section.
+
+
+
UseGateway=
diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c
index 321e87bc7eb..e2fe836f2c7 100644
--- a/src/network/networkd-dhcp4.c
+++ b/src/network/networkd-dhcp4.c
@@ -203,6 +203,10 @@ static int dhcp4_request_route(Route *in, Link *link) {
route->mtu = link->network->dhcp_route_mtu;
if (route->quickack < 0)
route->quickack = link->network->dhcp_quickack;
+ if (route->initcwnd == 0)
+ route->initcwnd = link->network->dhcp_initial_congestion_window;
+ if (route->initrwnd == 0)
+ route->initrwnd = link->network->dhcp_advertised_receive_window;
if (route_get(NULL, link, route, &existing) < 0) /* This is a new route. */
link->dhcp4_configured = false;
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 6a7ef24651f..a5d328e0378 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -195,8 +195,8 @@ Route.GatewayOnlink, config_parse_route_boolean,
Route.IPv6Preference, config_parse_ipv6_route_preference, 0, 0
Route.Protocol, config_parse_route_protocol, 0, 0
Route.Type, config_parse_route_type, 0, 0
-Route.InitialCongestionWindow, config_parse_tcp_window, 0, 0
-Route.InitialAdvertisedReceiveWindow, config_parse_tcp_window, 0, 0
+Route.InitialCongestionWindow, config_parse_route_tcp_window, 0, 0
+Route.InitialAdvertisedReceiveWindow, config_parse_route_tcp_window, 0, 0
Route.TCPAdvertisedMaximumSegmentSize, config_parse_tcp_advmss, 0, 0
Route.TCPCongestionControlAlgorithm, config_parse_tcp_congestion, 0, 0
Route.QuickAck, config_parse_route_boolean, 0, 0
@@ -249,6 +249,8 @@ DHCPv4.SocketPriority, config_parse_dhcp_socket_priority,
DHCPv4.SendOption, config_parse_dhcp_send_option, AF_INET, offsetof(Network, dhcp_client_send_options)
DHCPv4.SendVendorOption, config_parse_dhcp_send_option, 0, offsetof(Network, dhcp_client_send_vendor_options)
DHCPv4.RouteMTUBytes, config_parse_mtu, AF_INET, offsetof(Network, dhcp_route_mtu)
+DHCPv4.InitialCongestionWindow, config_parse_tcp_window, 0, offsetof(Network, dhcp_initial_congestion_window)
+DHCPv4.InitialAdvertisedReceiveWindow, config_parse_tcp_window, 0, offsetof(Network, dhcp_advertised_receive_window)
DHCPv4.FallbackLeaseLifetimeSec, config_parse_dhcp_fallback_lease_lifetime, 0, 0
DHCPv4.Use6RD, config_parse_bool, 0, offsetof(Network, dhcp_use_6rd)
DHCPv4.NetLabel, config_parse_string, CONFIG_PARSE_STRING_SAFE, offsetof(Network, dhcp_netlabel)
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index e473a725005..886729cd5a1 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -148,6 +148,8 @@ struct Network {
bool dhcp_use_routes;
int dhcp_use_gateway;
bool dhcp_quickack;
+ uint32_t dhcp_initial_congestion_window;
+ uint32_t dhcp_advertised_receive_window;
bool dhcp_use_timezone;
bool dhcp_use_hostname;
bool dhcp_use_6rd;
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
index f7215858e62..f1f4447ec79 100644
--- a/src/network/networkd-route.c
+++ b/src/network/networkd-route.c
@@ -2643,8 +2643,7 @@ int config_parse_tcp_window(
void *data,
void *userdata) {
- _cleanup_(route_free_or_set_invalidp) Route *n = NULL;
- Network *network = userdata;
+ uint32_t *window = ASSERT_PTR(data);
uint32_t k;
int r;
@@ -2654,15 +2653,6 @@ int config_parse_tcp_window(
assert(rvalue);
assert(data);
- r = route_new_static(network, filename, section_line, &n);
- if (r == -ENOMEM)
- return log_oom();
- if (r < 0) {
- log_syntax(unit, LOG_WARNING, filename, line, r,
- "Failed to allocate route, ignoring assignment: %m");
- return 0;
- }
-
r = safe_atou32(rvalue, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
@@ -2680,13 +2670,53 @@ int config_parse_tcp_window(
return 0;
}
+ *window = k;
+ return 0;
+}
+
+int config_parse_route_tcp_window(
+ 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;
+ uint32_t *d;
+ int r;
+
+ assert(filename);
+ assert(section);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ r = route_new_static(network, filename, section_line, &n);
+ if (r == -ENOMEM)
+ return log_oom();
+ if (r < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Failed to allocate route, ignoring assignment: %m");
+ return 0;
+ }
+
if (streq(lvalue, "InitialCongestionWindow"))
- n->initcwnd = k;
+ d = &n->initcwnd;
else if (streq(lvalue, "InitialAdvertisedReceiveWindow"))
- n->initrwnd = k;
+ d = &n->initrwnd;
else
assert_not_reached();
+ r = config_parse_tcp_window(unit, filename, line, section, section_line, lvalue, ltype, rvalue, d, userdata);
+ if (r < 0)
+ return r;
+
TAKE_PTR(n);
return 0;
}
diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h
index 5fc76b17f85..1f84d31733b 100644
--- a/src/network/networkd-route.h
+++ b/src/network/networkd-route.h
@@ -122,6 +122,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_route_boolean);
CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_route_preference);
CONFIG_PARSER_PROTOTYPE(config_parse_route_protocol);
CONFIG_PARSER_PROTOTYPE(config_parse_route_type);
+CONFIG_PARSER_PROTOTYPE(config_parse_route_tcp_window);
CONFIG_PARSER_PROTOTYPE(config_parse_tcp_window);
CONFIG_PARSER_PROTOTYPE(config_parse_route_mtu);
CONFIG_PARSER_PROTOTYPE(config_parse_multipath_route);