summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Bock <nicolas.bock@canonical.com>2021-09-29 02:35:08 -0600
committerGitHub <noreply@github.com>2021-09-29 10:35:08 +0200
commit76ae706aba57eb77c3863aca6c568b0d2700eb30 (patch)
tree31caa1aeda41077fc750962c13d15b6955bd5c0a
parent23cb913f13e92d848aa0390b0d6af7e8e88148f7 (diff)
Add support for additional `Link` options (#225) (LP: #1771740)
This change adds systemd support for additional configuration options for interfaces. * ReceiveChecksumOffload * TransmitChecksumOffload * TCPSegmentationOffload * TCP6SegmentationOffload * GenericSegmentationOffload * GenericReceiveOffload * LargeReceiveOffload Closes: https://bugs.launchpad.net/netplan/+bug/1771740 Signed-off-by: Nicolas Bock <nicolas.bock@canonical.com>
-rw-r--r--doc/netplan.md42
-rw-r--r--examples/offload.yaml11
-rw-r--r--src/netplan.c22
-rw-r--r--src/networkd.c33
-rw-r--r--src/parse.c9
-rw-r--r--src/parse.h9
-rw-r--r--tests/generator/test_ethernets.py34
7 files changed, 158 insertions, 2 deletions
diff --git a/doc/netplan.md b/doc/netplan.md
index 7a99ce6..c5cc01f 100644
--- a/doc/netplan.md
+++ b/doc/netplan.md
@@ -141,6 +141,48 @@ Virtual devices
: (networkd backend only) Whether to emit LLDP packets. Off by default.
+``receive-checksum-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the hardware offload for
+ checksumming of ingress network packets is enabled. When unset,
+ the kernel's default will be used.
+
+``transmit-checksum-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the hardware offload for
+ checksumming of egress network packets is enabled. When unset,
+ the kernel's default will be used.
+
+``tcp-segmentation-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the TCP Segmentation
+ Offload (TSO) is enabled. When unset, the kernel's default will
+ be used.
+
+``tcp6-segmentation-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the TCP6 Segmentation
+ Offload (tx-tcp6-segmentation) is enabled. When unset, the
+ kernel's default will be used.
+
+``generic-segmentation-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the Generic Segmentation
+ Offload (GSO) is enabled. When unset, the kernel's default will
+ be used.
+
+``generic-receive-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the Generic Receive
+ Offload (GRO) is enabled. When unset, the kernel's default will
+ be used.
+
+``large-receive-offload`` (bool) – since **0.104**
+
+: (networkd backend only) If set to true, the Generic Receive
+ Offload (GRO) is enabled. When unset, the kernel's default will
+ be used.
+
``openvswitch`` (mapping) – since **0.100**
: This provides additional configuration for the network device for openvswitch.
diff --git a/examples/offload.yaml b/examples/offload.yaml
new file mode 100644
index 0000000..37853d1
--- /dev/null
+++ b/examples/offload.yaml
@@ -0,0 +1,11 @@
+network:
+ version: 2
+ ethernets:
+ ens1:
+ receive-checksum-offload: false
+ transmit-checksum-offload: true
+ tcp-segmentation-offload: true
+ tcp6-segmentation-offload: true
+ generic-segmentation-offload: true
+ generic-receive-offload: true
+ large-receive-offload: true
diff --git a/src/netplan.c b/src/netplan.c
index 8418ac2..7a7bc43 100644
--- a/src/netplan.c
+++ b/src/netplan.c
@@ -720,6 +720,28 @@ _serialize_yaml(yaml_event_t* event, yaml_emitter_t* emitter, const NetplanNetDe
if (def->wake_on_lan)
YAML_STRING_PLAIN(event, emitter, "wakeonlan", "true");
+ /* Offload options */
+ if (def->receive_checksum_offload)
+ YAML_STRING_PLAIN(event, emitter, "receive-checksum-offload", "true");
+
+ if (def->transmit_checksum_offload)
+ YAML_STRING_PLAIN(event, emitter, "transmit-checksum-offload", "true");
+
+ if (def->tcp_segmentation_offload)
+ YAML_STRING_PLAIN(event, emitter, "tcp-segmentation-offload", "true");
+
+ if (def->tcp6_segmentation_offload)
+ YAML_STRING_PLAIN(event, emitter, "tcp6-segmentation-offload", "true");
+
+ if (def->generic_segmentation_offload)
+ YAML_STRING_PLAIN(event, emitter, "generic-segmentation-offload", "true");
+
+ if (def->generic_receive_offload)
+ YAML_STRING_PLAIN(event, emitter, "generic-receive-offload", "true");
+
+ if (def->large_receive_offload)
+ YAML_STRING_PLAIN(event, emitter, "large-receive-offload", "true");
+
if (def->wowlan && def->wowlan != NETPLAN_WIFI_WOWLAN_DEFAULT) {
YAML_SCALAR_PLAIN(event, emitter, "wakeonwlan");
YAML_SEQUENCE_OPEN(event, emitter);
diff --git a/src/networkd.c b/src/networkd.c
index cdaac97..e8e680e 100644
--- a/src/networkd.c
+++ b/src/networkd.c
@@ -230,7 +230,16 @@ write_link_file(const NetplanNetDefinition* def, const char* rootdir, const char
return;
/* do we need to write a .link file? */
- if (!def->set_name && !def->wake_on_lan && !def->mtubytes)
+ if (!def->set_name &&
+ !def->wake_on_lan &&
+ !def->mtubytes &&
+ !def->receive_checksum_offload &&
+ !def->transmit_checksum_offload &&
+ !def->tcp_segmentation_offload &&
+ !def->tcp6_segmentation_offload &&
+ !def->generic_segmentation_offload &&
+ !def->generic_receive_offload &&
+ !def->large_receive_offload)
return;
/* build file contents */
@@ -245,6 +254,28 @@ write_link_file(const NetplanNetDefinition* def, const char* rootdir, const char
if (def->mtubytes)
g_string_append_printf(s, "MTUBytes=%u\n", def->mtubytes);
+ /* Offload options */
+ if (def->receive_checksum_offload)
+ g_string_append_printf(s, "ReceiveChecksumOffload=%u\n", def->receive_checksum_offload);
+
+ if (def->transmit_checksum_offload)
+ g_string_append_printf(s, "TransmitChecksumOffload=%u\n", def->transmit_checksum_offload);
+
+ if (def->tcp_segmentation_offload)
+ g_string_append_printf(s, "TCPSegmentationOffload=%u\n", def->tcp_segmentation_offload);
+
+ if (def->tcp6_segmentation_offload)
+ g_string_append_printf(s, "TCP6SegmentationOffload=%u\n", def->tcp6_segmentation_offload);
+
+ if (def->generic_segmentation_offload)
+ g_string_append_printf(s, "GenericSegmentationOffload=%u\n", def->generic_segmentation_offload);
+
+ if (def->generic_receive_offload)
+ g_string_append_printf(s, "GenericReceiveOffload=%u\n", def->generic_receive_offload);
+
+ if (def->large_receive_offload)
+ g_string_append_printf(s, "LargeReceiveOffload=%u\n", def->large_receive_offload);
+
orig_umask = umask(022);
g_string_free_to_file(s, rootdir, path, ".link");
umask(orig_umask);
diff --git a/src/parse.c b/src/parse.c
index dd747e9..f62deef 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -2260,7 +2260,14 @@ static const mapping_entry_handler dhcp6_overrides_handlers[] = {
{"set-name", YAML_SCALAR_NODE, handle_netdef_str, NULL, netdef_offset(set_name)}, \
{"wakeonlan", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(wake_on_lan)}, \
{"wakeonwlan", YAML_SEQUENCE_NODE, handle_wowlan, NULL, netdef_offset(wowlan)}, \
- {"emit-lldp", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(emit_lldp)}
+ {"emit-lldp", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(emit_lldp)}, \
+ {"receive-checksum-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(receive_checksum_offload)}, \
+ {"transmit-checksum-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(transmit_checksum_offload)}, \
+ {"tcp-segmentation-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(tcp_segmentation_offload)}, \
+ {"tcp6-segmentation-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(tcp6_segmentation_offload)}, \
+ {"generic-segmentation-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(generic_segmentation_offload)}, \
+ {"generic-receive-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(generic_receive_offload)}, \
+ {"large-receive-offload", YAML_SCALAR_NODE, handle_netdef_bool, NULL, netdef_offset(large_receive_offload)}
static const mapping_entry_handler ethernet_def_handlers[] = {
COMMON_LINK_HANDLERS,
diff --git a/src/parse.h b/src/parse.h
index 0c49f9b..28050f2 100644
--- a/src/parse.h
+++ b/src/parse.h
@@ -397,6 +397,15 @@ struct net_definition {
/* configure without carrier */
gboolean ignore_carrier;
+
+ /* offload options */
+ gboolean receive_checksum_offload;
+ gboolean transmit_checksum_offload;
+ gboolean tcp_segmentation_offload;
+ gboolean tcp6_segmentation_offload;
+ gboolean generic_segmentation_offload;
+ gboolean generic_receive_offload;
+ gboolean large_receive_offload;
};
typedef enum {
diff --git a/tests/generator/test_ethernets.py b/tests/generator/test_ethernets.py
index ac8ffc8..b98581b 100644
--- a/tests/generator/test_ethernets.py
+++ b/tests/generator/test_ethernets.py
@@ -713,3 +713,37 @@ method=ignore
'''})
self.assert_networkd({})
self.assert_nm_udev(None)
+
+ def test_offload(self):
+ self.generate('''network:
+ version: 2
+ ethernets:
+ eth1:
+ receive-checksum-offload: true
+ transmit-checksum-offload: true
+ tcp-segmentation-offload: true
+ tcp6-segmentation-offload: true
+ generic-segmentation-offload: true
+ generic-receive-offload: true
+ large-receive-offload: true''')
+
+ self.assert_networkd({'eth1.link': '''[Match]
+OriginalName=eth1
+
+[Link]
+WakeOnLan=off
+ReceiveChecksumOffload=1
+TransmitChecksumOffload=1
+TCPSegmentationOffload=1
+TCP6SegmentationOffload=1
+GenericSegmentationOffload=1
+GenericReceiveOffload=1
+LargeReceiveOffload=1
+''',
+ 'eth1.network': '''[Match]
+Name=eth1
+
+[Network]
+LinkLocalAddressing=ipv6
+'''})
+ self.assert_networkd_udev(None)