[PATCH 1/1] dbus: Expose P2PDevice's own device address.
Emilio Cobos Álvarez
emilio at crisal.io
Sun May 11 10:08:57 PDT 2025
(Re-sending because I realized I hadn't signed off on the previous
patch, please remove this paragraph if/when applying the patch. Thanks
and sorry for the noise!)
If you have two peers using wpa_supplicant, right now the client can get
both the GO interface and device addresses, but you can't know your own
device address. Knowing your own device address is useful to coordinate
to the GO and map the interface address to a Peer object once the P2P
connection has been established.
Android seems to expose this information:
https://stackoverflow.com/questions/10650337/how-do-you-retrieve-the-wifi-direct-mac-address
Let me know if I'm missing something and this is achievable some other
way or what not.
Add some basic tests in test_dbus.py.
Signed-off-by: Emilio Cobos Álvarez <emilio at crisal.io>
---
doc/dbus.doxygen | 4 ++++
tests/hwsim/test_dbus.py | 18 ++++++++++++++++++
wpa_supplicant/dbus/dbus_new.c | 5 +++++
wpa_supplicant/dbus/dbus_new_handlers_p2p.c | 15 +++++++++++++++
wpa_supplicant/dbus/dbus_new_handlers_p2p.h | 1 +
5 files changed, 43 insertions(+)
diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen
index 473603a1f..86ceedbac 100644
--- a/doc/dbus.doxygen
+++ b/doc/dbus.doxygen
@@ -2069,6 +2069,10 @@ Interface for performing P2P (Wi-Fi Peer-to-Peer) P2P Device operations.
<li>
<h3>PersistentGroups - ao - (read)</h3>
</li>
+
+ <li>
+ <h3>DeviceAddress - ay - (read)</h3>
+ </li>
</ul>
\subsection dbus_p2pdevice_signals Signals
diff --git a/tests/hwsim/test_dbus.py b/tests/hwsim/test_dbus.py
index ab535a3ef..9b13424d1 100644
--- a/tests/hwsim/test_dbus.py
+++ b/tests/hwsim/test_dbus.py
@@ -62,6 +62,18 @@ def prepare_dbus(dev):
except Exception as e:
raise HwsimSkip("Could not connect to D-Bus: %s" % e)
+def assert_dev_addr(p2p, expected):
+ property = p2p.Get(WPAS_DBUS_IFACE_P2PDEVICE, "DeviceAddress",
+ dbus_interface=dbus.PROPERTIES_IFACE)
+ dev_addr_str = ''
+ for item in property:
+ if len(dev_addr_str) > 0:
+ dev_addr_str += ':'
+ dev_addr_str += '%02x' % item
+
+ if expected != dev_addr_str:
+ raise Exception("Expected device addr to be %s, got %s" % (expected, dev_addr_str))
+
class TestDbus(object):
def __init__(self, bus):
self.loop = gobject.MainLoop()
@@ -3195,6 +3207,7 @@ def run_dbus_p2p_discovery(dev, apdev):
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
addr0 = dev[0].p2p_dev_addr()
+ assert_dev_addr(p2p, addr0);
dev[1].request("SET sec_device_type 1-0050F204-2")
dev[1].request("VENDOR_ELEM_ADD 1 dd0c0050f2041049000411223344")
@@ -5075,6 +5088,7 @@ def test_dbus_p2p_wps_failure(dev, apdev):
(bus, wpas_obj, path, if_obj) = prepare_dbus(dev[0])
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
addr0 = dev[0].p2p_dev_addr()
+ assert_dev_addr(p2p, addr0);
class TestDbusP2p(TestDbus):
def __init__(self, bus):
@@ -5156,6 +5170,8 @@ def test_dbus_p2p_two_groups(dev, apdev):
addr2 = dev[2].p2p_dev_addr()
dev[1].p2p_start_go(freq=2412)
+ assert_dev_addr(p2p, addr0);
+
class TestDbusP2p(TestDbus):
def __init__(self, bus):
TestDbus.__init__(self, bus)
@@ -5341,6 +5357,8 @@ def test_dbus_p2p_cancel(dev, apdev):
pass
addr0 = dev[0].p2p_dev_addr()
+ assert_dev_addr(p2p, addr0);
+
dev[1].p2p_listen()
class TestDbusP2p(TestDbus):
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index 7893f3561..5a8fb7c03 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -4055,6 +4055,11 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
wpas_dbus_setter_p2p_device_config,
NULL
},
+ { "DeviceAddress", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ay",
+ wpas_dbus_getter_p2p_device_address,
+ NULL,
+ NULL
+ },
{ "Peers", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
wpas_dbus_getter_p2p_peers,
NULL,
diff --git a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c
index fc59947ee..5f9281929 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c
@@ -1455,6 +1455,21 @@ dbus_bool_t wpas_dbus_getter_p2p_peergo(
&path, error);
}
+dbus_bool_t wpas_dbus_getter_p2p_device_address(
+ const struct wpa_dbus_property_desc *property_desc,
+ DBusMessageIter *iter, DBusError *error, void *user_data)
+{
+ struct wpa_supplicant *wpa_s = user_data;
+
+ if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error))
+ return FALSE;
+
+ wpa_s = wpa_s->global->p2p_init_wpa_s;
+
+ return wpas_dbus_simple_array_property_getter(
+ iter, DBUS_TYPE_BYTE, (char *) wpa_s->own_addr,
+ ETH_ALEN, error);
+}
/*
* Peer object properties accessor methods
diff --git a/wpa_supplicant/dbus/dbus_new_handlers_p2p.h b/wpa_supplicant/dbus/dbus_new_handlers_p2p.h
index b3c45c110..4644812cf 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.h
+++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.h
@@ -95,6 +95,7 @@ DECLARE_ACCESSOR(wpas_dbus_getter_p2p_peers);
DECLARE_ACCESSOR(wpas_dbus_getter_p2p_role);
DECLARE_ACCESSOR(wpas_dbus_getter_p2p_group);
DECLARE_ACCESSOR(wpas_dbus_getter_p2p_peergo);
+DECLARE_ACCESSOR(wpas_dbus_getter_p2p_device_address);
/*
* P2P Peer properties.
--
2.49.0
More information about the Hostap
mailing list