]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Add D-Bus property for current MAC address
authorAndrzej Ostruszka <amo@semihalf.com>
Thu, 1 Dec 2022 15:43:44 +0000 (16:43 +0100)
committerJouni Malinen <j@w1.fi>
Fri, 2 Dec 2022 10:55:45 +0000 (12:55 +0200)
Since wpa_supplicant can change MAC address of the interface on its own
(with randomization enabled) it makes sense to introduce MACAddress as a
property of the interface and send notifications about its change.

This allows other applications to just use D-Bus instead of both
communicating over D-Bus with wpa_supplicant and listening to Netlink
notifications for MAC changes.

Signed-off-by: Andrzej Ostruszka <amo@semihalf.com>
doc/dbus.doxygen
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new.h
wpa_supplicant/dbus/dbus_new_handlers.c
wpa_supplicant/dbus/dbus_new_handlers.h
wpa_supplicant/notify.c
wpa_supplicant/notify.h
wpa_supplicant/wpa_supplicant.c

index 504db7540459ae19d43201e7625c25040a92c12b..e4819d134294f38f465c9332f66f72440513ac98 100644 (file)
@@ -1095,6 +1095,10 @@ fi.w1.wpa_supplicant1.CreateInterface.
        <p>Masks to show which bits not to randomize with MAC address randomization. Possible keys are "scan", "sched_scan", and "pno". Values must be an array of 6 bytes.</p>
        <p>When this property is set, the new dictionary replaces the old value, rather than merging them together. Leaving a key out of the dictionary will turn off MAC address randomization for that scan type.</p>
       </li>
+
+      <li>
+       <h3>MACAddress - ay - (read)</h3>
+       <p>MAC address of the interface</p>
     </ul>
 
 \subsection dbus_interface_signals Signals
index 9279ae4d58476072fc28eccf28c711e4c1989408..12a2d42e53b6bb16db4b9b2c3a470f3a5a103916 100644 (file)
@@ -2344,6 +2344,9 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
        case WPAS_DBUS_PROP_BSS_TM_STATUS:
                prop = "BSSTMStatus";
                break;
+       case WPAS_DBUS_PROP_MAC_ADDRESS:
+               prop = "MACAddress";
+               break;
        default:
                wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
                           __func__, property);
@@ -3939,6 +3942,11 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
          wpas_dbus_setter_mac_address_randomization_mask,
          NULL
        },
+       { "MACAddress", WPAS_DBUS_NEW_IFACE_INTERFACE, "ay",
+         wpas_dbus_getter_mac_address,
+         NULL,
+         NULL,
+       },
        { NULL, NULL, NULL, NULL, NULL, NULL }
 };
 
index 26bdcb548de85c888eac9fd3fe376cb137eab9fe..40ff9bb7d659b0bfa97a55f846e06dc8277186c3 100644 (file)
@@ -38,6 +38,7 @@ enum wpas_dbus_prop {
        WPAS_DBUS_PROP_ROAM_COMPLETE,
        WPAS_DBUS_PROP_SESSION_LENGTH,
        WPAS_DBUS_PROP_BSS_TM_STATUS,
+       WPAS_DBUS_PROP_MAC_ADDRESS,
 };
 
 enum wpas_dbus_bss_prop {
index b45ab4022bb7edc70d118e2483930e9997387c31..3bbfda63bdba94ec360ff17c37ba525d93462b3b 100644 (file)
@@ -4753,6 +4753,27 @@ dbus_bool_t wpas_dbus_getter_mac_address_randomization_mask(
 }
 
 
+/**
+ * wpas_dbus_getter_mac_address - Get MAC address of an interface
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: a list of stations
+ *
+ * Getter for "MACAddress" property.
+ */
+dbus_bool_t wpas_dbus_getter_mac_address(
+       const struct wpa_dbus_property_desc *property_desc,
+       DBusMessageIter *iter, DBusError *error, void *user_data)
+{
+       struct wpa_supplicant *wpa_s = user_data;
+
+       return wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
+                                                     wpa_s->own_addr, ETH_ALEN,
+                                                     error);
+}
+
+
 /**
  * wpas_dbus_getter_sta_address - Return the address of a connected station
  * @iter: Pointer to incoming dbus message iter
index a421083f7fe2334f95c169914a0eb74c7ad99762..72c36cdc6bfaf5c3aa3db8a8a1975c06a56477d3 100644 (file)
@@ -196,6 +196,7 @@ DECLARE_ACCESSOR(wpas_dbus_getter_blobs);
 DECLARE_ACCESSOR(wpas_dbus_getter_stas);
 DECLARE_ACCESSOR(wpas_dbus_getter_mac_address_randomization_mask);
 DECLARE_ACCESSOR(wpas_dbus_setter_mac_address_randomization_mask);
+DECLARE_ACCESSOR(wpas_dbus_getter_mac_address);
 DECLARE_ACCESSOR(wpas_dbus_getter_sta_address);
 DECLARE_ACCESSOR(wpas_dbus_getter_sta_aid);
 DECLARE_ACCESSOR(wpas_dbus_getter_sta_caps);
index 427405da9249c6f26d74ca39bcd1c02522245db1..a0f70d640333575aaaaafcc9f594797ee5ff13f6 100644 (file)
@@ -213,6 +213,15 @@ void wpas_notify_bssid_changed(struct wpa_supplicant *wpa_s)
 }
 
 
+void wpas_notify_mac_address_changed(struct wpa_supplicant *wpa_s)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+       wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_MAC_ADDRESS);
+}
+
+
 void wpas_notify_auth_changed(struct wpa_supplicant *wpa_s)
 {
        if (wpa_s->p2p_mgmt)
index f26f4286dc782ac34ba7fb2ab8ae88686fbd830e..a3349a061d166621c36072e41979f7854c7fa4de 100644 (file)
@@ -35,6 +35,7 @@ void wpas_notify_bss_tm_status(struct wpa_supplicant *wpa_s);
 void wpas_notify_network_changed(struct wpa_supplicant *wpa_s);
 void wpas_notify_ap_scan_changed(struct wpa_supplicant *wpa_s);
 void wpas_notify_bssid_changed(struct wpa_supplicant *wpa_s);
+void wpas_notify_mac_address_changed(struct wpa_supplicant *wpa_s);
 void wpas_notify_auth_changed(struct wpa_supplicant *wpa_s);
 void wpas_notify_network_enabled_changed(struct wpa_supplicant *wpa_s,
                                         struct wpa_ssid *ssid);
index 9c711d154fb06433c89729741f9085169c49e15f..85a0699abd2ad5068e67b058b777f0803bf0d814 100644 (file)
@@ -5360,6 +5360,10 @@ static int wpas_eapol_needs_l2_packet(struct wpa_supplicant *wpa_s)
 
 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
 {
+       u8 prev_mac_addr[ETH_ALEN];
+
+       os_memcpy(prev_mac_addr, wpa_s->own_addr, ETH_ALEN);
+
        if ((!wpa_s->p2p_mgmt ||
             !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
            !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
@@ -5397,6 +5401,9 @@ int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
                fst_update_mac_addr(wpa_s->fst, wpa_s->own_addr);
 #endif /* CONFIG_FST */
 
+       if (os_memcmp(prev_mac_addr, wpa_s->own_addr, ETH_ALEN) != 0)
+               wpas_notify_mac_address_changed(wpa_s);
+
        return 0;
 }