This will be necessary for a connection/disconnection request to work in
the relevant wifi plugin.
---
 include/peer.h |  6 +++++-
 plugins/wifi.c |  9 +++++++--
 src/peer.c     | 43 ++++++++++++++++++++++++++++++++++++-------
 3 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/include/peer.h b/include/peer.h
index 807c945..e069f43 100644
--- a/include/peer.h
+++ b/include/peer.h
@@ -32,11 +32,15 @@ struct connman_peer *connman_peer_create(const char 
*identifier);
 void connman_peer_destroy(struct connman_peer *peer);
 
 void connman_peer_set_name(struct connman_peer *peer, const char *name);
+void connman_peer_set_device(struct connman_peer *peer,
+                               struct connman_device *device);
+struct connman_device *connman_peer_get_device(struct connman_peer *peer);
 
 int connman_peer_register(struct connman_peer *peer);
 void connman_peer_unregister(struct connman_peer *peer);
 
-struct connman_peer *connman_peer_get(const char *identifier);
+struct connman_peer *connman_peer_get(struct connman_device *device,
+                                               const char *identifier);
 
 #ifdef __cplusplus
 }
diff --git a/plugins/wifi.c b/plugins/wifi.c
index aaa5b00..c8d0bcd 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -2076,6 +2076,8 @@ static void network_changed(GSupplicantNetwork *network, 
const char *property)
 
 static void peer_found(GSupplicantPeer *peer)
 {
+       GSupplicantInterface *iface = g_supplicant_peer_get_interface(peer);
+       struct wifi_data *wifi = g_supplicant_interface_get_data(iface);
        struct connman_peer *connman_peer;
        const char *identifier, *name;
 
@@ -2084,18 +2086,21 @@ static void peer_found(GSupplicantPeer *peer)
 
        DBG("ident: %s", identifier);
 
-       connman_peer = connman_peer_get(identifier);
+       connman_peer = connman_peer_get(wifi->device, identifier);
        if (connman_peer)
                return;
 
        connman_peer = connman_peer_create(identifier);
        connman_peer_set_name(connman_peer, name);
+       connman_peer_set_device(connman_peer, wifi->device);
 
        connman_peer_register(connman_peer);
 }
 
 static void peer_lost(GSupplicantPeer *peer)
 {
+       GSupplicantInterface *iface = g_supplicant_peer_get_interface(peer);
+       struct wifi_data *wifi = g_supplicant_interface_get_data(iface);
        struct connman_peer *connman_peer;
        const char *identifier;
 
@@ -2103,7 +2108,7 @@ static void peer_lost(GSupplicantPeer *peer)
 
        DBG("ident: %s", identifier);
 
-       connman_peer = connman_peer_get(identifier);
+       connman_peer = connman_peer_get(wifi->device, identifier);
        if (connman_peer)
                connman_peer_unregister(connman_peer);
 }
diff --git a/src/peer.c b/src/peer.c
index ce3b582..6626551 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -33,6 +33,7 @@ static DBusConnection *connection = NULL;
 static GHashTable *peers_table = NULL;
 
 struct connman_peer {
+       struct connman_device *device;
        char *identifier;
        char *name;
        char *path;
@@ -200,7 +201,7 @@ struct connman_peer *connman_peer_create(const char 
*identifier)
        struct connman_peer *peer;
 
        peer = g_malloc0(sizeof(struct connman_peer));
-       peer->identifier = g_strdup_printf("peer_%s", identifier);
+       peer->identifier = g_strdup(identifier);
 
        return peer;
 }
@@ -217,6 +218,9 @@ void connman_peer_destroy(struct connman_peer *peer)
                g_free(peer->path);
        }
 
+       if (peer->device)
+               connman_device_unref(peer->device);
+
        g_free(peer->identifier);
        g_free(peer->name);
 
@@ -229,6 +233,24 @@ void connman_peer_set_name(struct connman_peer *peer, 
const char *name)
        peer->name = g_strdup(name);
 }
 
+void connman_peer_set_device(struct connman_peer *peer,
+                               struct connman_device *device)
+{
+       if (!peer || !device)
+               return;
+
+       peer->device = device;
+       connman_device_ref(device);
+}
+
+struct connman_device *connman_peer_get_device(struct connman_peer *peer)
+{
+       if (!peer)
+               return NULL;
+
+       return peer->device;
+}
+
 static const GDBusMethodTable peer_methods[] = {
        { GDBUS_METHOD("GetProperties",
                        NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
@@ -244,6 +266,13 @@ static const GDBusSignalTable peer_signals[] = {
        { },
 };
 
+static char *get_peer_path(struct connman_device *device,
+                                       const char *identifier)
+{
+       return g_strdup_printf("%s/peer/peer_%s_%s", CONNMAN_PATH,
+                               connman_device_get_ident(device), identifier);
+}
+
 int connman_peer_register(struct connman_peer *peer)
 {
        DBG("peer %p", peer);
@@ -251,11 +280,10 @@ int connman_peer_register(struct connman_peer *peer)
        if (peer->path)
                return -EALREADY;
 
-       peer->path = g_strdup_printf("%s/peer/%s", CONNMAN_PATH,
-                                               peer->identifier);
+       peer->path = get_peer_path(peer->device, peer->identifier);
        DBG("path %s", peer->path);
 
-       g_hash_table_insert(peers_table, peer->identifier, peer);
+       g_hash_table_insert(peers_table, peer->path, peer);
 
        g_dbus_register_interface(connection, peer->path,
                                        CONNMAN_PEER_INTERFACE,
@@ -271,14 +299,15 @@ void connman_peer_unregister(struct connman_peer *peer)
        DBG("peer %p", peer);
 
        if (peer->path)
-               g_hash_table_remove(peers_table, peer->identifier);
+               g_hash_table_remove(peers_table, peer->path);
        else
                connman_peer_destroy(peer);
 }
 
-struct connman_peer *connman_peer_get(const char *identifier)
+struct connman_peer *connman_peer_get(struct connman_device *device,
+                                               const char *identifier)
 {
-       char *ident = g_strdup_printf("peer_%s", identifier);
+       char *ident = get_peer_path(device, identifier);
        struct connman_peer *peer;
 
        peer = g_hash_table_lookup(peers_table, ident);
-- 
1.8.5.5

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to