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