]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Expose P2PDevice's own device address
authorEmilio Cobos Álvarez <emilio@crisal.io>
Sun, 11 May 2025 17:08:57 +0000 (19:08 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 29 Sep 2025 17:14:22 +0000 (20:14 +0300)
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 <emilio@crisal.io>
doc/dbus.doxygen
tests/hwsim/test_dbus.py
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.h

index 7ca89918d5d1e208f42be27152bd43312798f5a7..68c3cb7840d06a86acdc46223338dbfc5308c31a 100644 (file)
@@ -2070,6 +2070,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
index e5b919728b90a522d9d75875e0857f45c2807a9e..15f3b31a65cec21fff4796edd93a2a2a7cf2a9eb 100644 (file)
@@ -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):
index 508c4842cbcee88ef053b40e2e297bcd37630e7c..2d623fe8dcb508fa4365c18a3569d21909ef7e64 100644 (file)
@@ -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,
index 6e40ffc4cf2d3d6da96e486f11255a5c68d25b36..8e04284ab22978c431102aba30e72174e4890388 100644 (file)
@@ -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
index 3bcf8679e2ab887d4ca79c39f1745b95f0173f18..6d37078c76f357aaa19dd4f9c9158b18dc2b9911 100644 (file)
@@ -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.