diff options
author | Nicolas Bock <nicolas.bock@canonical.com> | 2021-09-29 02:35:08 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-29 10:35:08 +0200 |
commit | 76ae706aba57eb77c3863aca6c568b0d2700eb30 (patch) | |
tree | 31caa1aeda41077fc750962c13d15b6955bd5c0a | |
parent | 23cb913f13e92d848aa0390b0d6af7e8e88148f7 (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.md | 42 | ||||
-rw-r--r-- | examples/offload.yaml | 11 | ||||
-rw-r--r-- | src/netplan.c | 22 | ||||
-rw-r--r-- | src/networkd.c | 33 | ||||
-rw-r--r-- | src/parse.c | 9 | ||||
-rw-r--r-- | src/parse.h | 9 | ||||
-rw-r--r-- | tests/generator/test_ethernets.py | 34 |
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) |