dbus: Add D-Bus property for current MAC address
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>
This commit is contained in:
parent
12d8b8a91e
commit
1897abad94
8 changed files with 52 additions and 0 deletions
|
@ -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>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>
|
<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>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<h3>MACAddress - ay - (read)</h3>
|
||||||
|
<p>MAC address of the interface</p>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
\subsection dbus_interface_signals Signals
|
\subsection dbus_interface_signals Signals
|
||||||
|
|
|
@ -2344,6 +2344,9 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
|
||||||
case WPAS_DBUS_PROP_BSS_TM_STATUS:
|
case WPAS_DBUS_PROP_BSS_TM_STATUS:
|
||||||
prop = "BSSTMStatus";
|
prop = "BSSTMStatus";
|
||||||
break;
|
break;
|
||||||
|
case WPAS_DBUS_PROP_MAC_ADDRESS:
|
||||||
|
prop = "MACAddress";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
|
wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
|
||||||
__func__, property);
|
__func__, property);
|
||||||
|
@ -3939,6 +3942,11 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
|
||||||
wpas_dbus_setter_mac_address_randomization_mask,
|
wpas_dbus_setter_mac_address_randomization_mask,
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
|
{ "MACAddress", WPAS_DBUS_NEW_IFACE_INTERFACE, "ay",
|
||||||
|
wpas_dbus_getter_mac_address,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
{ NULL, NULL, NULL, NULL, NULL, NULL }
|
{ NULL, NULL, NULL, NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ enum wpas_dbus_prop {
|
||||||
WPAS_DBUS_PROP_ROAM_COMPLETE,
|
WPAS_DBUS_PROP_ROAM_COMPLETE,
|
||||||
WPAS_DBUS_PROP_SESSION_LENGTH,
|
WPAS_DBUS_PROP_SESSION_LENGTH,
|
||||||
WPAS_DBUS_PROP_BSS_TM_STATUS,
|
WPAS_DBUS_PROP_BSS_TM_STATUS,
|
||||||
|
WPAS_DBUS_PROP_MAC_ADDRESS,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum wpas_dbus_bss_prop {
|
enum wpas_dbus_bss_prop {
|
||||||
|
|
|
@ -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
|
* wpas_dbus_getter_sta_address - Return the address of a connected station
|
||||||
* @iter: Pointer to incoming dbus message iter
|
* @iter: Pointer to incoming dbus message iter
|
||||||
|
|
|
@ -196,6 +196,7 @@ DECLARE_ACCESSOR(wpas_dbus_getter_blobs);
|
||||||
DECLARE_ACCESSOR(wpas_dbus_getter_stas);
|
DECLARE_ACCESSOR(wpas_dbus_getter_stas);
|
||||||
DECLARE_ACCESSOR(wpas_dbus_getter_mac_address_randomization_mask);
|
DECLARE_ACCESSOR(wpas_dbus_getter_mac_address_randomization_mask);
|
||||||
DECLARE_ACCESSOR(wpas_dbus_setter_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_address);
|
||||||
DECLARE_ACCESSOR(wpas_dbus_getter_sta_aid);
|
DECLARE_ACCESSOR(wpas_dbus_getter_sta_aid);
|
||||||
DECLARE_ACCESSOR(wpas_dbus_getter_sta_caps);
|
DECLARE_ACCESSOR(wpas_dbus_getter_sta_caps);
|
||||||
|
|
|
@ -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)
|
void wpas_notify_auth_changed(struct wpa_supplicant *wpa_s)
|
||||||
{
|
{
|
||||||
if (wpa_s->p2p_mgmt)
|
if (wpa_s->p2p_mgmt)
|
||||||
|
|
|
@ -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_network_changed(struct wpa_supplicant *wpa_s);
|
||||||
void wpas_notify_ap_scan_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_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_auth_changed(struct wpa_supplicant *wpa_s);
|
||||||
void wpas_notify_network_enabled_changed(struct wpa_supplicant *wpa_s,
|
void wpas_notify_network_enabled_changed(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_ssid *ssid);
|
struct wpa_ssid *ssid);
|
||||||
|
|
|
@ -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)
|
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 ||
|
if ((!wpa_s->p2p_mgmt ||
|
||||||
!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
|
!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
|
||||||
!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
|
!(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);
|
fst_update_mac_addr(wpa_s->fst, wpa_s->own_addr);
|
||||||
#endif /* CONFIG_FST */
|
#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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue