Merge "Add netlink public header library"
diff --git a/wpa_supplicant/aidl/supplicant.cpp b/wpa_supplicant/aidl/supplicant.cpp
index ee6f809..799790b 100644
--- a/wpa_supplicant/aidl/supplicant.cpp
+++ b/wpa_supplicant/aidl/supplicant.cpp
@@ -303,12 +303,38 @@
wpa_printf(MSG_DEBUG, "%s,NULL wpa_s for wlan0", __FUNCTION__);
return createStatus(SupplicantStatusCode::FAILURE_IFACE_UNKNOWN);
}
- if (wpas_p2p_add_p2pdev_interface(
- wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
+
+ const u8 *if_addr = NULL;
+ char force_name[100] = {'\0'};
+ wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
+ if (wpa_s->conf->p2p_device_random_mac_addr == 2 &&
+ !is_zero_ether_addr(wpa_s->conf->p2p_device_persistent_mac_addr))
+ if_addr = wpa_s->conf->p2p_device_persistent_mac_addr;
+
+ int ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, iface_params.ifname, if_addr, NULL,
+ force_name, wpa_s->pending_interface_addr, NULL);
+ if (ret < 0) {
+ wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device interface");
+ return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
+ }
+
+ os_strlcpy(wpa_s->pending_interface_name, iface_params.ifname,
+ sizeof(wpa_s->pending_interface_name));
+ iface_params.p2p_mgmt = 1;
+ iface_params.driver_param = wpa_s->conf->driver_param;
+ iface_params.ctrl_interface = NULL;
+
+ struct wpa_supplicant *p2pdev_wpa_s = wpa_supplicant_add_iface(
+ wpa_s->global, &iface_params, wpa_s);
+
+ if (!p2pdev_wpa_s) {
wpa_printf(MSG_INFO,
"Failed to enable P2P Device");
return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
}
+ p2pdev_wpa_s->p2pdev = p2pdev_wpa_s;
+ wpa_s->pending_interface_name[0] = '\0';
+
return ndk::ScopedAStatus::ok();
}
@@ -321,6 +347,13 @@
if (name.empty()) {
return {nullptr, createStatus(SupplicantStatusCode::FAILURE_ARGS_INVALID)};
}
+ if (strncmp(name.c_str(), P2P_MGMT_DEVICE_PREFIX, strlen(P2P_MGMT_DEVICE_PREFIX)) == 0) {
+ struct wpa_supplicant* wpa_s = wpa_supplicant_get_iface(wpa_global_, name.c_str());
+ if (wpa_s) {
+ wpa_printf(MSG_DEBUG, "Remove existing p2p dev interface");
+ wpa_supplicant_remove_iface(wpa_global_, wpa_s, 0);
+ }
+ }
// Try to get the wpa_supplicant record for this iface, return
// the iface object with the appropriate status code if it exists.
ndk::ScopedAStatus status;
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 14ce58c..2e7cc4c 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -9745,9 +9745,12 @@
goto out;
}
- if (conf->hw_mode != wpa_s->ap_iface->current_mode->mode) {
- wpa_dbg(wpa_s, MSG_DEBUG,
- "P2P CSA: CSA to a different band is not supported");
+ if (conf->hw_mode != wpa_s->ap_iface->current_mode->mode &&
+ (wpa_s->ap_iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A ||
+ conf->hw_mode != HOSTAPD_MODE_IEEE80211G)) {
+ wpa_dbg(wpa_s, MSG_INFO,
+ "P2P CSA: CSA from Hardware mode %d to %d is not supported",
+ wpa_s->ap_iface->current_mode->mode, conf->hw_mode);
ret = -1;
goto out;
}
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 8ee8ca6..78efba0 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -7195,11 +7195,15 @@
return NULL;
}
- /* Notify the control interfaces about new networks for non p2p mgmt
- * ifaces. */
- if (iface->p2p_mgmt == 0) {
- for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
+ /* Notify the control interfaces about new networks */
+ for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
+ if (iface->p2p_mgmt == 0) {
wpas_notify_network_added(wpa_s, ssid);
+ } else if (ssid->ssid_len > P2P_WILDCARD_SSID_LEN
+ && os_strncmp((const char *) ssid->ssid,
+ P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN) == 0) {
+ wpas_notify_persistent_group_added(wpa_s, ssid);
+ }
}
wpa_s->next = global->ifaces;