summaryrefslogtreecommitdiff
path: root/debian/patches/0003-Add-tristate-type-for-offload-options-LP-1956264-270.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0003-Add-tristate-type-for-offload-options-LP-1956264-270.patch')
-rw-r--r--debian/patches/0003-Add-tristate-type-for-offload-options-LP-1956264-270.patch534
1 files changed, 0 insertions, 534 deletions
diff --git a/debian/patches/0003-Add-tristate-type-for-offload-options-LP-1956264-270.patch b/debian/patches/0003-Add-tristate-type-for-offload-options-LP-1956264-270.patch
deleted file mode 100644
index 62af06c..0000000
--- a/debian/patches/0003-Add-tristate-type-for-offload-options-LP-1956264-270.patch
+++ /dev/null
@@ -1,534 +0,0 @@
-From: Nicolas Bock <nicolas.bock@canonical.com>
-Date: Thu, 12 May 2022 01:18:36 -0600
-Subject: Add tristate type for offload options (LP: #1956264) (#270)
-MIME-Version: 1.0
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-Closes: https://bugs.launchpad.net/netplan/+bug/1956264
-
-COMMITS:
-* Add tristate type for offload options
-* Clarify name matching issues for `networkd`
-* Fix tests for offload
-* cli: apply: properly change udev/.link offloading settings
-* Re-used existing offloading fields, they are ABI compatible
-Size:
-Both enum and gboolean reduce to integer, so they are of same size.
-Content:
-An old consumer looking at these will interpret UNSET as if it was TRUE,
-which is the kernel's default (=UNSET) value.
-* CI: quirk to add ethtool test dependency
-* tests: ethernets: link offloading validation
-* doc: be more specific with the offloading docs
-
-Co-authored-by: Lukas Märdian <slyon@ubuntu.com>
----
- doc/netplan.md | 36 ++++++++++++------------
- netplan/cli/commands/apply.py | 11 +++++++-
- src/netplan.c | 21 +++++++++-----
- src/networkd.c | 49 ++++++++++++++++++--------------
- src/parse.c | 55 +++++++++++++++++++++++++++++++-----
- src/types.c | 8 ++++++
- src/types.h | 35 ++++++++++++++++++-----
- tests/generator/test_ethernets.py | 34 +++++++++++++++-------
- tests/integration/ethernets.py | 59 +++++++++++++++++++++++++++++++++++++++
- 9 files changed, 237 insertions(+), 71 deletions(-)
-
-diff --git a/doc/netplan.md b/doc/netplan.md
-index e9b4e92..373e05d 100644
---- a/doc/netplan.md
-+++ b/doc/netplan.md
-@@ -79,6 +79,10 @@ Virtual devices
-
- ## Common properties for physical device types
-
-+**Note:** Some options will not work reliably for devices matched by name only
-+and rendered by networkd, due to interactions with device renaming in udev.
-+Match devices by MAC when setting options like: ``wakeonlan`` or ``*-offload``.
-+
- ``match`` (mapping)
-
- : This selects a subset of available physical devices by various hardware
-@@ -139,54 +143,50 @@ Virtual devices
-
- : Enable wake on LAN. Off by default.
-
-- **Note:** This will not work reliably for devices matched by name
-- only and rendered by networkd, due to interactions with device
-- renaming in udev. Match devices by MAC when setting wake on LAN.
--
- ``emit-lldp`` (bool) – since **0.99**
-
- : (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,
-+: (networkd backend only) If set to true (false), the hardware offload for
-+ checksumming of ingress network packets is enabled (disabled). 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,
-+: (networkd backend only) If set to true (false), the hardware offload for
-+ checksumming of egress network packets is enabled (disabled). 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
-+: (networkd backend only) If set to true (false), the TCP Segmentation
-+ Offload (TSO) is enabled (disabled). 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
-+: (networkd backend only) If set to true (false), the TCP6 Segmentation
-+ Offload (tx-tcp6-segmentation) is enabled (disabled). 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
-+: (networkd backend only) If set to true (false), the Generic Segmentation
-+ Offload (GSO) is enabled (disabled). 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
-+: (networkd backend only) If set to true (false), the Generic Receive
-+ Offload (GRO) is enabled (disabled). 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
-+: (networkd backend only) If set to true (false), the Large Receive Offload
-+ (LRO) is enabled (disabled). When unset, the kernel's default will
- be used.
-
- ``openvswitch`` (mapping) – since **0.100**
-diff --git a/netplan/cli/commands/apply.py b/netplan/cli/commands/apply.py
-index b36662a..9d4511f 100644
---- a/netplan/cli/commands/apply.py
-+++ b/netplan/cli/commands/apply.py
-@@ -221,13 +221,22 @@ class NetplanApply(utils.NetplanCommand):
- '/sys/class/net/' + device],
- stdout=subprocess.DEVNULL,
- stderr=subprocess.DEVNULL)
-+ subprocess.check_call(['udevadm', 'test',
-+ '/sys/class/net/' + device],
-+ stdout=subprocess.DEVNULL,
-+ stderr=subprocess.DEVNULL)
- except subprocess.CalledProcessError:
- logging.debug('Ignoring device without syspath: %s', device)
-
-+ devices_after_udev = netifaces.interfaces()
- # apply some more changes manually
- for iface, settings in changes.items():
- # rename non-critical network interfaces
-- if settings.get('name'):
-+ new_name = settings.get('name')
-+ if new_name:
-+ if iface in devices and new_name in devices_after_udev:
-+ logging.debug('Interface rename {} -> {} already happened.'.format(iface, new_name))
-+ continue # re-name already happened via 'udevadm test'
- # bring down the interface, using its current (matched) interface name
- subprocess.check_call(['ip', 'link', 'set', 'dev', iface, 'down'],
- stdout=subprocess.DEVNULL,
-diff --git a/src/netplan.c b/src/netplan.c
-index 7b387b4..d1a27a6 100644
---- a/src/netplan.c
-+++ b/src/netplan.c
-@@ -752,13 +752,20 @@ _serialize_yaml(
- YAML_BOOL_TRUE(def, event, emitter, "wakeonlan", def->wake_on_lan);
-
- /* Offload options */
-- YAML_BOOL_TRUE(def, event, emitter, "receive-checksum-offload", def->receive_checksum_offload);
-- YAML_BOOL_TRUE(def, event, emitter, "transmit-checksum-offload", def->transmit_checksum_offload);
-- YAML_BOOL_TRUE(def, event, emitter, "tcp-segmentation-offload", def->tcp_segmentation_offload);
-- YAML_BOOL_TRUE(def, event, emitter, "tcp6-segmentation-offload", def->tcp6_segmentation_offload);
-- YAML_BOOL_TRUE(def, event, emitter, "generic-segmentation-offload", def->generic_segmentation_offload);
-- YAML_BOOL_TRUE(def, event, emitter, "generic-receive-offload", def->generic_receive_offload);
-- YAML_BOOL_TRUE(def, event, emitter, "large-receive-offload", def->large_receive_offload);
-+ if (def->receive_checksum_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "receive-checksum-offload", def->receive_checksum_offload);
-+ if (def->transmit_checksum_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "transmit-checksum-offload", def->transmit_checksum_offload);
-+ if (def->tcp_segmentation_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "tcp-segmentation-offload", def->tcp_segmentation_offload);
-+ if (def->tcp6_segmentation_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "tcp6-segmentation-offload", def->tcp6_segmentation_offload);
-+ if (def->generic_segmentation_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "generic-segmentation-offload", def->generic_segmentation_offload);
-+ if (def->generic_receive_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "generic-receive-offload", def->generic_receive_offload);
-+ if (def->large_receive_offload != NETPLAN_TRISTATE_UNSET)
-+ YAML_BOOL_TRUE(def, event, emitter, "large-receive-offload", def->large_receive_offload);
-
- if (def->wowlan && def->wowlan != NETPLAN_WIFI_WOWLAN_DEFAULT) {
- YAML_SCALAR_PLAIN(event, emitter, "wakeonwlan");
-diff --git a/src/networkd.c b/src/networkd.c
-index 6d26047..62c87ce 100644
---- a/src/networkd.c
-+++ b/src/networkd.c
-@@ -243,13 +243,13 @@ write_link_file(const NetplanNetDefinition* def, const char* rootdir, const char
- 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)
-+ (def->receive_checksum_offload == NETPLAN_TRISTATE_UNSET) &&
-+ (def->transmit_checksum_offload == NETPLAN_TRISTATE_UNSET) &&
-+ (def->tcp_segmentation_offload == NETPLAN_TRISTATE_UNSET) &&
-+ (def->tcp6_segmentation_offload == NETPLAN_TRISTATE_UNSET) &&
-+ (def->generic_segmentation_offload == NETPLAN_TRISTATE_UNSET) &&
-+ (def->generic_receive_offload == NETPLAN_TRISTATE_UNSET) &&
-+ (def->large_receive_offload == NETPLAN_TRISTATE_UNSET))
- return;
-
- /* build file contents */
-@@ -265,26 +265,33 @@ write_link_file(const NetplanNetDefinition* def, const char* rootdir, const char
- 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->receive_checksum_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "ReceiveChecksumOffload=%s\n",
-+ (def->receive_checksum_offload ? "true" : "false"));
-
-- if (def->transmit_checksum_offload)
-- g_string_append_printf(s, "TransmitChecksumOffload=%u\n", def->transmit_checksum_offload);
-+ if (def->transmit_checksum_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "TransmitChecksumOffload=%s\n",
-+ (def->transmit_checksum_offload ? "true" : "false"));
-
-- if (def->tcp_segmentation_offload)
-- g_string_append_printf(s, "TCPSegmentationOffload=%u\n", def->tcp_segmentation_offload);
-+ if (def->tcp_segmentation_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "TCPSegmentationOffload=%s\n",
-+ (def->tcp_segmentation_offload ? "true" : "false"));
-
-- if (def->tcp6_segmentation_offload)
-- g_string_append_printf(s, "TCP6SegmentationOffload=%u\n", def->tcp6_segmentation_offload);
-+ if (def->tcp6_segmentation_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "TCP6SegmentationOffload=%s\n",
-+ (def->tcp6_segmentation_offload ? "true" : "false"));
-
-- if (def->generic_segmentation_offload)
-- g_string_append_printf(s, "GenericSegmentationOffload=%u\n", def->generic_segmentation_offload);
-+ if (def->generic_segmentation_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "GenericSegmentationOffload=%s\n",
-+ (def->generic_segmentation_offload ? "true" : "false"));
-
-- if (def->generic_receive_offload)
-- g_string_append_printf(s, "GenericReceiveOffload=%u\n", def->generic_receive_offload);
-+ if (def->generic_receive_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "GenericReceiveOffload=%s\n",
-+ (def->generic_receive_offload ? "true" : "false"));
-
-- if (def->large_receive_offload)
-- g_string_append_printf(s, "LargeReceiveOffload=%u\n", def->large_receive_offload);
-+ if (def->large_receive_offload != NETPLAN_TRISTATE_UNSET)
-+ g_string_append_printf(s, "LargeReceiveOffload=%s\n",
-+ (def->large_receive_offload ? "true" : "false"));
-
- orig_umask = umask(022);
- g_string_free_to_file(s, rootdir, path, ".link");
-diff --git a/src/parse.c b/src/parse.c
-index 350c508..0cb07d2 100644
---- a/src/parse.c
-+++ b/src/parse.c
-@@ -370,6 +370,37 @@ handle_generic_bool(NetplanParser* npp, yaml_node_t* node, void* entryptr, const
- return TRUE;
- }
-
-+/*
-+ * Handler for setting a HashTable field from a mapping node, inside a given struct
-+ * @entryptr: pointer to the beginning of the to-be-modified data structure
-+ * @data: offset into entryptr struct where the boolean field to write is located
-+ */
-+static gboolean
-+handle_generic_tristate(NetplanParser* npp, yaml_node_t* node, void* entryptr, const void* data, GError** error)
-+{
-+ g_assert(entryptr);
-+ NetplanTristate v;
-+ guint offset = GPOINTER_TO_UINT(data);
-+ NetplanTristate* dest = ((void*) entryptr + offset);
-+
-+ if (g_ascii_strcasecmp(scalar(node), "true") == 0 ||
-+ g_ascii_strcasecmp(scalar(node), "on") == 0 ||
-+ g_ascii_strcasecmp(scalar(node), "yes") == 0 ||
-+ g_ascii_strcasecmp(scalar(node), "y") == 0)
-+ v = NETPLAN_TRISTATE_TRUE;
-+ else if (g_ascii_strcasecmp(scalar(node), "false") == 0 ||
-+ g_ascii_strcasecmp(scalar(node), "off") == 0 ||
-+ g_ascii_strcasecmp(scalar(node), "no") == 0 ||
-+ g_ascii_strcasecmp(scalar(node), "n") == 0)
-+ v = NETPLAN_TRISTATE_FALSE;
-+ else
-+ return yaml_error(npp, node, error, "invalid boolean value '%s'", scalar(node));
-+
-+ *dest = v;
-+ mark_data_as_dirty(npp, dest);
-+ return TRUE;
-+}
-+
- /*
- * Handler for setting a HashTable field from a mapping node, inside a given struct
- * @entryptr: pointer to the beginning of the to-be-modified data structure
-@@ -516,6 +547,16 @@ handle_netdef_bool(NetplanParser* npp, yaml_node_t* node, const void* data, GErr
- return handle_generic_bool(npp, node, npp->current.netdef, data, error);
- }
-
-+/**
-+ * Generic handler for tri-state settings that can bei "UNSET", "TRUE", or "FALSE".
-+ * @data: offset into NetplanNetDefinition where the guint field to write is located
-+ */
-+static gboolean
-+handle_netdef_tristate(NetplanParser* npp, yaml_node_t* node, const void* data, GError** error)
-+{
-+ return handle_generic_tristate(npp, node, npp->current.netdef, data, error);
-+}
-+
- /**
- * Generic handler for setting a npp->current.netdef guint field from a scalar node
- * @data: offset into NetplanNetDefinition where the guint field to write is located
-@@ -2356,13 +2397,13 @@ static const mapping_entry_handler dhcp6_overrides_handlers[] = {
- {"wakeonlan", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(wake_on_lan)}, \
- {"wakeonwlan", YAML_SEQUENCE_NODE, {.generic=handle_wowlan}, netdef_offset(wowlan)}, \
- {"emit-lldp", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(emit_lldp)}, \
-- {"receive-checksum-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(receive_checksum_offload)}, \
-- {"transmit-checksum-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(transmit_checksum_offload)}, \
-- {"tcp-segmentation-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(tcp_segmentation_offload)}, \
-- {"tcp6-segmentation-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(tcp6_segmentation_offload)}, \
-- {"generic-segmentation-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(generic_segmentation_offload)}, \
-- {"generic-receive-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(generic_receive_offload)}, \
-- {"large-receive-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_bool}, netdef_offset(large_receive_offload)}
-+ {"receive-checksum-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(receive_checksum_offload)}, \
-+ {"transmit-checksum-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(transmit_checksum_offload)}, \
-+ {"tcp-segmentation-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(tcp_segmentation_offload)}, \
-+ {"tcp6-segmentation-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(tcp6_segmentation_offload)}, \
-+ {"generic-segmentation-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(generic_segmentation_offload)}, \
-+ {"generic-receive-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(generic_receive_offload)}, \
-+ {"large-receive-offload", YAML_SCALAR_NODE, {.generic=handle_netdef_tristate}, netdef_offset(large_receive_offload)}
-
- static const mapping_entry_handler ethernet_def_handlers[] = {
- COMMON_LINK_HANDLERS,
-diff --git a/src/types.c b/src/types.c
-index eb9f780..00c2b0f 100644
---- a/src/types.c
-+++ b/src/types.c
-@@ -335,6 +335,14 @@ reset_netdef(NetplanNetDefinition* netdef, NetplanDefType new_type, NetplanBacke
-
- reset_private_netdef_data(netdef->_private);
- FREE_AND_NULLIFY(netdef->_private);
-+
-+ netdef->receive_checksum_offload = NETPLAN_TRISTATE_UNSET;
-+ netdef->transmit_checksum_offload = NETPLAN_TRISTATE_UNSET;
-+ netdef->tcp_segmentation_offload = NETPLAN_TRISTATE_UNSET;
-+ netdef->tcp6_segmentation_offload = NETPLAN_TRISTATE_UNSET;
-+ netdef->generic_segmentation_offload = NETPLAN_TRISTATE_UNSET;
-+ netdef->generic_receive_offload = NETPLAN_TRISTATE_UNSET;
-+ netdef->large_receive_offload = NETPLAN_TRISTATE_UNSET;
- }
-
- static void
-diff --git a/src/types.h b/src/types.h
-index 27a23fc..710b1f1 100644
---- a/src/types.h
-+++ b/src/types.h
-@@ -171,6 +171,27 @@ typedef union {
- } networkd;
- } NetplanBackendSettings;
-
-+typedef enum
-+{
-+ /**
-+ * @brief Tristate enum type
-+ *
-+ * This type defines a boolean which can be unset, i.e.
-+ * this type has three states. The enum is ordered so
-+ * that
-+ *
-+ * UNSET -> -1
-+ * FALSE -> 0
-+ * TRUE -> 1
-+ *
-+ * And the integer values can be used directly when
-+ * converting to string.
-+ */
-+ NETPLAN_TRISTATE_UNSET = -1, /* -1 */
-+ NETPLAN_TRISTATE_FALSE, /* 0 */
-+ NETPLAN_TRISTATE_TRUE, /* 1 */
-+} NetplanTristate;
-+
- struct netplan_net_definition {
- NetplanDefType type;
- NetplanBackend backend;
-@@ -333,13 +354,13 @@ struct netplan_net_definition {
- 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;
-+ NetplanTristate receive_checksum_offload;
-+ NetplanTristate transmit_checksum_offload;
-+ NetplanTristate tcp_segmentation_offload;
-+ NetplanTristate tcp6_segmentation_offload;
-+ NetplanTristate generic_segmentation_offload;
-+ NetplanTristate generic_receive_offload;
-+ NetplanTristate large_receive_offload;
-
- struct private_netdef_data* _private;
-
-diff --git a/tests/generator/test_ethernets.py b/tests/generator/test_ethernets.py
-index 46bf764..e81941b 100644
---- a/tests/generator/test_ethernets.py
-+++ b/tests/generator/test_ethernets.py
-@@ -772,11 +772,11 @@ method=ignore
- ethernets:
- eth1:
- receive-checksum-offload: true
-- transmit-checksum-offload: true
-+ transmit-checksum-offload: off
- tcp-segmentation-offload: true
-- tcp6-segmentation-offload: true
-+ tcp6-segmentation-offload: false
- generic-segmentation-offload: true
-- generic-receive-offload: true
-+ generic-receive-offload: no
- large-receive-offload: true''')
-
- self.assert_networkd({'eth1.link': '''[Match]
-@@ -784,13 +784,13 @@ OriginalName=eth1
-
- [Link]
- WakeOnLan=off
--ReceiveChecksumOffload=1
--TransmitChecksumOffload=1
--TCPSegmentationOffload=1
--TCP6SegmentationOffload=1
--GenericSegmentationOffload=1
--GenericReceiveOffload=1
--LargeReceiveOffload=1
-+ReceiveChecksumOffload=true
-+TransmitChecksumOffload=false
-+TCPSegmentationOffload=true
-+TCP6SegmentationOffload=false
-+GenericSegmentationOffload=true
-+GenericReceiveOffload=false
-+LargeReceiveOffload=true
- ''',
- 'eth1.network': '''[Match]
- Name=eth1
-@@ -799,3 +799,17 @@ Name=eth1
- LinkLocalAddressing=ipv6
- '''})
- self.assert_networkd_udev(None)
-+
-+ def test_offload_invalid(self):
-+ err = self.generate('''network:
-+ version: 2
-+ ethernets:
-+ eth1:
-+ generic-receive-offload: n
-+ receive-checksum-offload: true
-+ tcp-segmentation-offload: true
-+ tcp6-segmentation-offload: false
-+ generic-segmentation-offload: true
-+ transmit-checksum-offload: xx
-+ large-receive-offload: true''', expect_fail=True)
-+ self.assertIn('invalid boolean value \'xx\'', err)
-diff --git a/tests/integration/ethernets.py b/tests/integration/ethernets.py
-index 865c0d4..06ac069 100644
---- a/tests/integration/ethernets.py
-+++ b/tests/integration/ethernets.py
-@@ -236,6 +236,65 @@ class _CommonTests():
- self.assert_iface_up('iface1', ['inet 10.10.10.11'])
- self.assert_iface_up('iface2', ['inet 10.10.10.22'])
-
-+ def test_link_offloading(self):
-+ self.setup_eth(None, False)
-+ # check kernel defaults
-+ out = subprocess.check_output(['ethtool', '-k', self.dev_e_client])
-+ self.assertIn(b'rx-checksumming: on', out)
-+ self.assertIn(b'tx-checksumming: on', out)
-+ self.assertIn(b'tcp-segmentation-offload: on', out)
-+ self.assertIn(b'tx-tcp6-segmentation: on', out)
-+ self.assertIn(b'generic-segmentation-offload: on', out)
-+ self.assertIn(b'generic-receive-offload: off', out) # off by default
-+ # validate turning off
-+ with open(self.config, 'w') as f:
-+ f.write('''network:
-+ renderer: %(r)s
-+ ethernets:
-+ %(ec)s:
-+ addresses: [10.10.10.22/24]
-+ receive-checksum-offload: off
-+ transmit-checksum-offload: off
-+ tcp-segmentation-offload: off
-+ tcp6-segmentation-offload: off
-+ generic-segmentation-offload: off
-+ generic-receive-offload: off
-+ #large-receive-offload: off # not possible on veth
-+''' % {'r': self.backend, 'ec': self.dev_e_client})
-+ self.generate_and_settle([self.dev_e_client])
-+ self.assert_iface_up(self.dev_e_client, ['inet 10.10.10.22'])
-+ out = subprocess.check_output(['ethtool', '-k', self.dev_e_client])
-+ self.assertIn(b'rx-checksumming: off', out)
-+ self.assertIn(b'tx-checksumming: off', out)
-+ self.assertIn(b'tcp-segmentation-offload: off', out)
-+ self.assertIn(b'tx-tcp6-segmentation: off', out)
-+ self.assertIn(b'generic-segmentation-offload: off', out)
-+ self.assertIn(b'generic-receive-offload: off', out)
-+ # validate turning on
-+ with open(self.config, 'w') as f:
-+ f.write('''network:
-+ renderer: %(r)s
-+ ethernets:
-+ %(ec)s:
-+ addresses: [10.10.10.22/24]
-+ 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 # not possible on veth
-+''' % {'r': self.backend, 'ec': self.dev_e_client})
-+ self.generate_and_settle([self.dev_e_client])
-+ self.assert_iface_up(self.dev_e_client, ['inet 10.10.10.22'])
-+ out = subprocess.check_output(['ethtool', '-k', self.dev_e_client])
-+ self.assertIn(b'rx-checksumming: on', out)
-+ self.assertIn(b'tx-checksumming: on', out)
-+ self.assertIn(b'tcp-segmentation-offload: on', out)
-+ self.assertIn(b'tx-tcp6-segmentation: on', out)
-+ self.assertIn(b'generic-segmentation-offload: on', out)
-+ self.assertIn(b'generic-receive-offload: on', out)
-+
-
- @unittest.skipIf("networkd" not in test_backends,
- "skipping as networkd backend tests are disabled")