File 0001-addrconf-fix-fallback-lease-drop-bsc-1220996.patch of Package wicked

From 969a3ac88391667821f84a2fe11e21b8ded89745 Mon Sep 17 00:00:00 2001
From: Clemens Famulla-Conrad <cfamullaconrad@suse.de>
Date: Thu, 14 Mar 2024 11:43:11 +0100
Subject: [PATCH 1/3] addrconf: fix fallback-lease drop (bsc#1220996)

If the lease isn't known by the supplicant, we need to
stop/cleanup local data-structures and notify listeners
e.g. nanny.

Signed-off-by: Marius Tomaschewski <mt@suse.com>
---
 src/dbus-objects/addrconf.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/dbus-objects/addrconf.c b/src/dbus-objects/addrconf.c
index 993c939d8..d9de24674 100644
--- a/src/dbus-objects/addrconf.c
+++ b/src/dbus-objects/addrconf.c
@@ -1357,6 +1357,14 @@ ni_objectmodel_addrconf_fallback_release(ni_netdev_t *dev, unsigned int family)
 				ni_debug_objectmodel("%s: no %s/%s lease", dev->name,
 						ni_addrconf_type_to_name(forwarder->addrconf),
 						ni_addrfamily_type_to_name(forwarder->addrfamily));
+
+				if (ni_addrconf_flag_bit_is_set(lease->flags, NI_ADDRCONF_FLAGS_FALLBACK)) {
+					/* bsc#1220996 - on fallback lease, it just wasn't triggered,
+					 * so we need to change state and inform nanny that it's done. */
+					lease->state = NI_ADDRCONF_STATE_REQUESTING;
+					ni_objectmodel_addrconf_send_event(dev,
+							NI_EVENT_ADDRESS_DEFERRED, &lease->uuid);
+				}
 				rv = TRUE;
 				break;
 			default:
-- 
2.35.3


From 5b44baf4108a5ab8f279f89ade107e985cc756e8 Mon Sep 17 00:00:00 2001
From: Clemens Famulla-Conrad <cfamullaconrad@suse.de>
Date: Thu, 14 Mar 2024 11:43:34 +0100
Subject: [PATCH 2/3] client: show lease fallback flag in ifstatus

Signed-off-by: Marius Tomaschewski <mt@suse.com>
---
 client/ifstatus.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/client/ifstatus.c b/client/ifstatus.c
index 5feb79d2b..51f5ba4ca 100644
--- a/client/ifstatus.c
+++ b/client/ifstatus.c
@@ -617,10 +617,14 @@ __show_leases_by_family(const ni_netdev_t *dev, ni_bool_t verbose, sa_family_t f
 			ni_addrconf_type_to_name(lease->type),
 			ni_addrconf_state_to_name(lease->state));
 
-		if (verbose && lease->flags) {
+		if ((verbose && lease->flags) ||
+		    ni_addrconf_flag_bit_is_set(lease->flags, NI_ADDRCONF_FLAGS_FALLBACK)) {
+			ni_stringbuf_t tmp = NI_STRINGBUF_INIT_DYNAMIC;
 			ni_stringbuf_puts(&buf, " [");
-			ni_addrconf_flags_format(&buf, lease->flags, ",");
+			ni_addrconf_flags_format(&tmp, lease->flags, ",");
+			ni_stringbuf_puts(&buf, tmp.string);
 			ni_stringbuf_puts(&buf, "]");
+			ni_stringbuf_destroy(&tmp);
 		}
 	}
 	if (buf.string)
-- 
2.35.3


From 5fb4a07e9c9cef1bd6922e2b5d2004b60a7d753b Mon Sep 17 00:00:00 2001
From: Clemens Famulla-Conrad <cfamullaconrad@suse.de>
Date: Thu, 14 Mar 2024 11:43:34 +0100
Subject: [PATCH 3/3] client: fix ifstatus for fallback lease

Signed-off-by: Marius Tomaschewski <mt@suse.com>
---
 client/ifstatus.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/client/ifstatus.c b/client/ifstatus.c
index 51f5ba4ca..568de17bf 100644
--- a/client/ifstatus.c
+++ b/client/ifstatus.c
@@ -213,10 +213,44 @@ __ifstatus_of_device_lease(ni_netdev_t *dev, ni_addrconf_lease_t *lease, unsigne
 	}
 }
 
+static ni_addrconf_lease_t*
+ifstatus_primary_lease(ni_netdev_t *dev,
+		ni_addrconf_lease_t *lease)
+{
+	ni_addrconf_lease_t *l;
+
+	if (!ni_addrconf_flag_bit_is_set(lease->flags, NI_ADDRCONF_FLAGS_FALLBACK))
+		return NULL;
+
+	for (l = dev->leases; l; l = l->next) {
+		if (l->family != lease->family)
+			continue;
+
+		if (!ni_addrconf_flag_bit_is_set(l->flags, NI_ADDRCONF_FLAGS_PRIMARY))
+			continue;
+
+		if (ni_log_level_at(NI_LOG_DEBUG1)) {
+			ni_stringbuf_t buf = NI_STRINGBUF_INIT_DYNAMIC;
+
+			ni_addrconf_flags_format(&buf, l->flags, "|");
+			ni_debug_application("%s: primary lease %s:%s, state=%s, flags=%s",
+					dev->name,
+					ni_addrfamily_type_to_name(l->family),
+					ni_addrconf_type_to_name(l->type),
+					ni_addrconf_state_to_name(l->state),
+					buf.string);
+			ni_stringbuf_destroy(&buf);
+		}
+
+		return l;
+	}
+	return NULL;
+}
+
 static void
 __ifstatus_of_device_leases(ni_netdev_t *dev, unsigned int *st)
 {
-	ni_addrconf_lease_t *lease;
+	ni_addrconf_lease_t *lease, *primary;
 
 	if (!dev || !st)
 		return;
@@ -241,6 +275,16 @@ __ifstatus_of_device_leases(ni_netdev_t *dev, unsigned int *st)
 					NI_ADDRCONF_FLAGS_OPTIONAL))
 			continue;
 
+		/* Do not consider fallback lease status, if there is a
+		 * corresponding primary+granted lease */
+		if ((primary = ifstatus_primary_lease(dev, lease))) {
+			unsigned int tmp = NI_WICKED_ST_OK;
+
+			__ifstatus_of_device_lease(dev, primary, &tmp);
+			if (tmp == NI_WICKED_ST_OK)
+				continue;
+		}
+
 		__ifstatus_of_device_lease(dev, lease, st);
 	}
 }
-- 
2.35.3

openSUSE Build Service is sponsored by