From: Emilio Cobos Álvarez Date: Sun, 11 May 2025 17:08:57 +0000 (+0200) Subject: dbus: Expose P2PDevice's own device address X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfc84b4d8a8d57559faf415686c1b7babc62307d;p=thirdparty%2Fhostap.git dbus: Expose P2PDevice's own device address 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. Add some basic tests in test_dbus.py. Signed-off-by: Emilio Cobos Álvarez --- diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen index 7ca89918d..68c3cb784 100644 --- a/doc/dbus.doxygen +++ b/doc/dbus.doxygen @@ -2070,6 +2070,10 @@ Interface for performing P2P (Wi-Fi Peer-to-Peer) P2P Device operations.
  • PersistentGroups - ao - (read)

  • + +
  • +

    DeviceAddress - ay - (read)

    +
  • \subsection dbus_p2pdevice_signals Signals diff --git a/tests/hwsim/test_dbus.py b/tests/hwsim/test_dbus.py index e5b919728..15f3b31a6 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() @@ -3218,6 +3230,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") @@ -5115,6 +5128,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): @@ -5196,6 +5210,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) @@ -5381,6 +5397,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 508c4842c..2d623fe8d 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 6e40ffc4c..8e04284ab 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c +++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c @@ -1460,6 +1460,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 3bcf8679e..6d37078c7 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.