From: "VAUTRIN Emmanuel (Canal Plus Prestataire)" <Emmanuel.VAUTRIN@cpexterne.org>
To: "connman@lists.linux.dev" <connman@lists.linux.dev>
Subject: [PATCH] iwd: Forget network on service removal
Date: Mon, 28 Feb 2022 15:03:40 +0000 [thread overview]
Message-ID: <MRZP264MB15447BECF20D7463FD6EA9C693019@MRZP264MB1544.FRAP264.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <20220228145743.2110055-1-Emmanuel.VAUTRIN@cpexterne.org>
[-- Attachment #1: Type: text/plain, Size: 4748 bytes --]
When a service is manually removed, the associated network, at driver
side, needs to be forgotten, to remove the corresponding known network.
---
include/network.h | 1 +
plugins/iwd.c | 41 +++++++++++++++++++++++++++++++++++++++++
src/connman.h | 1 +
src/network.c | 13 +++++++++++++
src/service.c | 2 ++
5 files changed, 58 insertions(+)
diff --git a/include/network.h b/include/network.h
index 8f9dd94a7ec2..5bca62ad3a0e 100644
--- a/include/network.h
+++ b/include/network.h
@@ -163,6 +163,7 @@ struct connman_network_driver {
void (*remove) (struct connman_network *network);
int (*connect) (struct connman_network *network);
int (*disconnect) (struct connman_network *network);
+ int (*forget) (struct connman_network *network);
int (*set_autoconnect) (struct connman_network *network,
bool autoconnect);
};
diff --git a/plugins/iwd.c b/plugins/iwd.c
index 7b59a6eb4386..ee3ed83e5957 100644
--- a/plugins/iwd.c
+++ b/plugins/iwd.c
@@ -270,6 +270,46 @@ static int cm_network_connect(struct connman_network *network)
return -EINPROGRESS;
}
+static void cm_network_forget_cb(DBusMessage *message, void *user_data)
+{
+ struct iwd_known_network *iwdkn;
+ const char *path = user_data;
+
+ iwdkn = g_hash_table_lookup(known_networks, path);
+ if (!iwdkn)
+ return;
+
+ if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_ERROR) {
+ const char *dbus_error = dbus_message_get_error_name(message);
+
+ DBG("%s failed: %s", path, dbus_error);
+ }
+}
+
+static int cm_network_forget(struct connman_network *network)
+{
+ struct iwd_network *iwdn = connman_network_get_data(network);
+ struct iwd_known_network *iwdkn;
+
+ if (!iwdn)
+ return -EINVAL;
+
+ if (!iwdn->known_network)
+ return 0;
+
+ iwdkn = g_hash_table_lookup(known_networks,
+ iwdn->known_network);
+ if (!iwdkn)
+ return 0;
+
+ if (!g_dbus_proxy_method_call(iwdkn->proxy, "Forget",
+ NULL, cm_network_forget_cb,
+ g_strdup(iwdkn->path), g_free))
+ return -EIO;
+
+ return 0;
+}
+
static void cm_network_disconnect_cb(DBusMessage *message, void *user_data)
{
const char *path = user_data;
@@ -470,6 +510,7 @@ static struct connman_network_driver network_driver = {
.probe = cm_network_probe,
.connect = cm_network_connect,
.disconnect = cm_network_disconnect,
+ .forget = cm_network_forget,
.set_autoconnect = cm_network_set_autoconnect,
};
diff --git a/src/connman.h b/src/connman.h
index 33dbec694a95..6405361df5df 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -607,6 +607,7 @@ void __connman_network_set_device(struct connman_network *network,
int __connman_network_connect(struct connman_network *network);
int __connman_network_disconnect(struct connman_network *network);
+int __connman_network_forget(struct connman_network *network);
int __connman_network_clear_ipconfig(struct connman_network *network,
struct connman_ipconfig *ipconfig);
int __connman_network_enable_ipconfig(struct connman_network *network,
diff --git a/src/network.c b/src/network.c
index 1cbdf9cfed95..2090e7fe944e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1848,6 +1848,19 @@ int __connman_network_disconnect(struct connman_network *network)
return err;
}
+int __connman_network_forget(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ if (!network->driver)
+ return -EUNATCH;
+
+ if (network->driver->forget)
+ return network->driver->forget(network);
+
+ return 0;
+}
+
int __connman_network_clear_ipconfig(struct connman_network *network,
struct connman_ipconfig *ipconfig)
{
diff --git a/src/service.c b/src/service.c
index f1abb963b817..d4387361d0c7 100644
--- a/src/service.c
+++ b/src/service.c
@@ -4634,6 +4634,8 @@ bool __connman_service_remove(struct connman_service *service)
return false;
__connman_service_disconnect(service);
+ if (service->network)
+ __connman_network_forget(service->network);
g_free(service->passphrase);
service->passphrase = NULL;
--
2.25.1
Hello,
Please find the right formatted patch in attachment.
Emmanuel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-iwd-Forget-network-on-service-removal.patch --]
[-- Type: text/x-patch; name="0001-iwd-Forget-network-on-service-removal.patch", Size: 4199 bytes --]
From 88f86e7b5dce9c9214db33786e8c72586496399c Mon Sep 17 00:00:00 2001
From: Emmanuel VAUTRIN <Emmanuel.VAUTRIN@cpexterne.org>
Date: Fri, 25 Feb 2022 15:47:22 +0100
Subject: [PATCH] iwd: Forget network on service removal
When a service is manually removed, the associated network, at driver
side, needs to be forgotten, to remove the corresponding known network.
---
include/network.h | 1 +
plugins/iwd.c | 41 +++++++++++++++++++++++++++++++++++++++++
src/connman.h | 1 +
src/network.c | 13 +++++++++++++
src/service.c | 2 ++
5 files changed, 58 insertions(+)
diff --git a/include/network.h b/include/network.h
index 8f9dd94a7ec2..5bca62ad3a0e 100644
--- a/include/network.h
+++ b/include/network.h
@@ -163,6 +163,7 @@ struct connman_network_driver {
void (*remove) (struct connman_network *network);
int (*connect) (struct connman_network *network);
int (*disconnect) (struct connman_network *network);
+ int (*forget) (struct connman_network *network);
int (*set_autoconnect) (struct connman_network *network,
bool autoconnect);
};
diff --git a/plugins/iwd.c b/plugins/iwd.c
index 7b59a6eb4386..ee3ed83e5957 100644
--- a/plugins/iwd.c
+++ b/plugins/iwd.c
@@ -270,6 +270,46 @@ static int cm_network_connect(struct connman_network *network)
return -EINPROGRESS;
}
+static void cm_network_forget_cb(DBusMessage *message, void *user_data)
+{
+ struct iwd_known_network *iwdkn;
+ const char *path = user_data;
+
+ iwdkn = g_hash_table_lookup(known_networks, path);
+ if (!iwdkn)
+ return;
+
+ if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_ERROR) {
+ const char *dbus_error = dbus_message_get_error_name(message);
+
+ DBG("%s failed: %s", path, dbus_error);
+ }
+}
+
+static int cm_network_forget(struct connman_network *network)
+{
+ struct iwd_network *iwdn = connman_network_get_data(network);
+ struct iwd_known_network *iwdkn;
+
+ if (!iwdn)
+ return -EINVAL;
+
+ if (!iwdn->known_network)
+ return 0;
+
+ iwdkn = g_hash_table_lookup(known_networks,
+ iwdn->known_network);
+ if (!iwdkn)
+ return 0;
+
+ if (!g_dbus_proxy_method_call(iwdkn->proxy, "Forget",
+ NULL, cm_network_forget_cb,
+ g_strdup(iwdkn->path), g_free))
+ return -EIO;
+
+ return 0;
+}
+
static void cm_network_disconnect_cb(DBusMessage *message, void *user_data)
{
const char *path = user_data;
@@ -470,6 +510,7 @@ static struct connman_network_driver network_driver = {
.probe = cm_network_probe,
.connect = cm_network_connect,
.disconnect = cm_network_disconnect,
+ .forget = cm_network_forget,
.set_autoconnect = cm_network_set_autoconnect,
};
diff --git a/src/connman.h b/src/connman.h
index 33dbec694a95..6405361df5df 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -607,6 +607,7 @@ void __connman_network_set_device(struct connman_network *network,
int __connman_network_connect(struct connman_network *network);
int __connman_network_disconnect(struct connman_network *network);
+int __connman_network_forget(struct connman_network *network);
int __connman_network_clear_ipconfig(struct connman_network *network,
struct connman_ipconfig *ipconfig);
int __connman_network_enable_ipconfig(struct connman_network *network,
diff --git a/src/network.c b/src/network.c
index 1cbdf9cfed95..2090e7fe944e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1848,6 +1848,19 @@ int __connman_network_disconnect(struct connman_network *network)
return err;
}
+int __connman_network_forget(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ if (!network->driver)
+ return -EUNATCH;
+
+ if (network->driver->forget)
+ return network->driver->forget(network);
+
+ return 0;
+}
+
int __connman_network_clear_ipconfig(struct connman_network *network,
struct connman_ipconfig *ipconfig)
{
diff --git a/src/service.c b/src/service.c
index f1abb963b817..d4387361d0c7 100644
--- a/src/service.c
+++ b/src/service.c
@@ -4634,6 +4634,8 @@ bool __connman_service_remove(struct connman_service *service)
return false;
__connman_service_disconnect(service);
+ if (service->network)
+ __connman_network_forget(service->network);
g_free(service->passphrase);
service->passphrase = NULL;
--
2.25.1
next parent reply other threads:[~2022-02-28 15:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20220228145743.2110055-1-Emmanuel.VAUTRIN@cpexterne.org>
2022-02-28 15:03 ` VAUTRIN Emmanuel (Canal Plus Prestataire) [this message]
2022-03-04 8:58 ` [PATCH] iwd: Forget network on service removal Daniel Wagner
2022-03-04 9:02 ` VAUTRIN Emmanuel (Canal Plus Prestataire)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MRZP264MB15447BECF20D7463FD6EA9C693019@MRZP264MB1544.FRAP264.PROD.OUTLOOK.COM \
--to=emmanuel.vautrin@cpexterne.org \
--cc=connman@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).