aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJimmy Chen <jimmycmchen@google.com>2022-02-08 23:51:45 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-02-08 23:51:45 +0000
commit34c660246eaa677d1b721992bf0ee8f90e0d92a5 (patch)
tree659fa9eee69a9c4a2e814ef38c8933e46306885c
parent1aaf1803c52469dc0bf08916c3c35d11e3ab48c5 (diff)
parentd148c62736aab81d2dc62d32349387295f3b70e4 (diff)
downloadwpa_supplicant_8-34c660246eaa677d1b721992bf0ee8f90e0d92a5.tar.gz
Merge changes from topic "t-p2p-vendor-extras"
* changes: p2p: implement new HAL API to pass vendor extras p2p: set p2p probe response vendor information elements for p2p dev interface
-rw-r--r--wpa_supplicant/aidl/aidl_manager.cpp46
-rw-r--r--wpa_supplicant/aidl/p2p_iface.cpp73
-rw-r--r--wpa_supplicant/aidl/p2p_iface.h6
-rw-r--r--wpa_supplicant/wpa_supplicant.c2
4 files changed, 102 insertions, 25 deletions
diff --git a/wpa_supplicant/aidl/aidl_manager.cpp b/wpa_supplicant/aidl/aidl_manager.cpp
index 780ee923..531ccea7 100644
--- a/wpa_supplicant/aidl/aidl_manager.cpp
+++ b/wpa_supplicant/aidl/aidl_manager.cpp
@@ -1194,7 +1194,7 @@ void AidlManager::notifyP2pDeviceFound(
}
}
- std::vector<uint8_t> aidl_peer_wfd_r2_device_info(kWfdR2DeviceInfoLen);
+ std::vector<uint8_t> aidl_peer_wfd_r2_device_info;
if (peer_wfd_r2_device_info) {
if (peer_wfd_r2_device_info_len != kWfdR2DeviceInfoLen) {
wpa_printf(
@@ -1202,33 +1202,31 @@ void AidlManager::notifyP2pDeviceFound(
peer_wfd_r2_device_info_len);
return;
} else {
- os_memcpy(
- aidl_peer_wfd_r2_device_info.data(),
- peer_wfd_r2_device_info, kWfdR2DeviceInfoLen);
+ std::copy(peer_wfd_r2_device_info,
+ peer_wfd_r2_device_info + peer_wfd_r2_device_info_len,
+ std::back_inserter(aidl_peer_wfd_r2_device_info));
}
}
- if (peer_wfd_r2_device_info_len == kWfdR2DeviceInfoLen) {
- const std::function<
- ndk::ScopedAStatus(std::shared_ptr<ISupplicantP2pIfaceCallback>)>
- func = std::bind(
- &ISupplicantP2pIfaceCallback::onR2DeviceFound,
- std::placeholders::_1, macAddrToVec(addr), macAddrToVec(info->p2p_device_addr),
- byteArrToVec(info->pri_dev_type, 8), misc_utils::charBufToString(info->device_name),
- static_cast<WpsConfigMethods>(info->config_methods),
- info->dev_capab, static_cast<P2pGroupCapabilityMask>(info->group_capab), aidl_peer_wfd_device_info,
- aidl_peer_wfd_r2_device_info);
- callWithEachP2pIfaceCallback(misc_utils::charBufToString(wpa_s->ifname), func);
- } else {
- callWithEachP2pIfaceCallback(
- misc_utils::charBufToString(wpa_s->ifname),
- std::bind(
- &ISupplicantP2pIfaceCallback::onDeviceFound,
- std::placeholders::_1, macAddrToVec(addr), macAddrToVec(info->p2p_device_addr),
- byteArrToVec(info->pri_dev_type, 8), misc_utils::charBufToString(info->device_name),
- static_cast<WpsConfigMethods>(info->config_methods),
- info->dev_capab, static_cast<P2pGroupCapabilityMask>(info->group_capab), aidl_peer_wfd_device_info));
+ std::vector<uint8_t> aidl_vendor_elems;
+ if (NULL != info->vendor_elems && wpabuf_len(info->vendor_elems) > 0) {
+ aidl_vendor_elems.reserve(wpabuf_len(info->vendor_elems));
+ std::copy(wpabuf_head_u8(info->vendor_elems),
+ wpabuf_head_u8(info->vendor_elems)
+ + wpabuf_len(info->vendor_elems),
+ std::back_inserter(aidl_vendor_elems));
}
+
+ const std::function<
+ ndk::ScopedAStatus(std::shared_ptr<ISupplicantP2pIfaceCallback>)>
+ func = std::bind(
+ &ISupplicantP2pIfaceCallback::onDeviceFoundWithVendorElements,
+ std::placeholders::_1, macAddrToVec(addr), macAddrToVec(info->p2p_device_addr),
+ byteArrToVec(info->pri_dev_type, 8), misc_utils::charBufToString(info->device_name),
+ static_cast<WpsConfigMethods>(info->config_methods),
+ info->dev_capab, static_cast<P2pGroupCapabilityMask>(info->group_capab), aidl_peer_wfd_device_info,
+ aidl_peer_wfd_r2_device_info, aidl_vendor_elems);
+ callWithEachP2pIfaceCallback(wpa_s->ifname, func);
}
void AidlManager::notifyP2pDeviceLost(
diff --git a/wpa_supplicant/aidl/p2p_iface.cpp b/wpa_supplicant/aidl/p2p_iface.cpp
index 3dcfec83..50d8fb20 100644
--- a/wpa_supplicant/aidl/p2p_iface.cpp
+++ b/wpa_supplicant/aidl/p2p_iface.cpp
@@ -46,6 +46,7 @@ std::function<void()> pending_scan_res_join_callback = NULL;
using aidl::android::hardware::wifi::supplicant::ISupplicantP2pIface;
using aidl::android::hardware::wifi::supplicant::ISupplicantStaNetwork;
using aidl::android::hardware::wifi::supplicant::MiracastMode;
+using aidl::android::hardware::wifi::supplicant::P2pFrameTypeMask;
uint8_t convertAidlMiracastModeToInternal(
MiracastMode mode)
@@ -505,6 +506,53 @@ void scanResJoinIgnore(struct wpa_supplicant *wpa_s, struct wpa_scan_results *sc
}
+static void updateP2pVendorElem(struct wpa_supplicant* wpa_s, enum wpa_vendor_elem_frame frameType,
+ const std::vector<uint8_t>& vendorElemBytes) {
+
+ wpa_printf(MSG_INFO, "Set vendor elements to frames %d", frameType);
+ struct wpa_supplicant* vendor_elem_wpa_s = wpas_vendor_elem(wpa_s, frameType);
+ if (vendor_elem_wpa_s->vendor_elem[frameType]) {
+ wpabuf_free(vendor_elem_wpa_s->vendor_elem[frameType]);
+ vendor_elem_wpa_s->vendor_elem[frameType] = NULL;
+ }
+ if (vendorElemBytes.size() > 0) {
+ vendor_elem_wpa_s->vendor_elem[frameType] =
+ wpabuf_alloc_copy(vendorElemBytes.data(), vendorElemBytes.size());
+ }
+ wpas_vendor_elem_update(vendor_elem_wpa_s);
+}
+
+uint32_t convertWpaP2pFrameTypeToHalP2pFrameTypeBit(int frameType) {
+ switch (frameType) {
+ case VENDOR_ELEM_PROBE_REQ_P2P:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_PROBE_REQ_P2P);
+ case VENDOR_ELEM_PROBE_RESP_P2P:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_PROBE_RESP_P2P);
+ case VENDOR_ELEM_PROBE_RESP_P2P_GO:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_PROBE_RESP_P2P_GO);
+ case VENDOR_ELEM_BEACON_P2P_GO:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_BEACON_P2P_GO);
+ case VENDOR_ELEM_P2P_PD_REQ:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_PD_REQ);
+ case VENDOR_ELEM_P2P_PD_RESP:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_PD_RESP);
+ case VENDOR_ELEM_P2P_GO_NEG_REQ:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_GO_NEG_REQ);
+ case VENDOR_ELEM_P2P_GO_NEG_RESP:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_GO_NEG_RESP);
+ case VENDOR_ELEM_P2P_GO_NEG_CONF:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_GO_NEG_CONF);
+ case VENDOR_ELEM_P2P_INV_REQ:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_INV_REQ);
+ case VENDOR_ELEM_P2P_INV_RESP:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_INV_RESP);
+ case VENDOR_ELEM_P2P_ASSOC_REQ:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_ASSOC_REQ);
+ case VENDOR_ELEM_P2P_ASSOC_RESP:
+ return static_cast<uint32_t>(P2pFrameTypeMask::P2P_FRAME_P2P_ASSOC_RESP);
+ }
+ return 0;
+}
} // namespace
namespace aidl {
@@ -1044,6 +1092,15 @@ ndk::ScopedAStatus P2pIface::addGroup(
in_freq, in_timeoutInSec);
}
+::ndk::ScopedAStatus P2pIface::setVendorElements(
+ P2pFrameTypeMask in_frameTypeMask,
+ const std::vector<uint8_t>& in_vendorElemBytes)
+{
+ return validateAndCall(
+ this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
+ &P2pIface::setVendorElementsInternal, in_frameTypeMask, in_vendorElemBytes);
+}
+
std::pair<std::string, ndk::ScopedAStatus> P2pIface::getNameInternal()
{
return {ifname_, ndk::ScopedAStatus::ok()};
@@ -2066,6 +2123,22 @@ ndk::ScopedAStatus P2pIface::findOnSpecificFrequencyInternal(
return ndk::ScopedAStatus::ok();
}
+ndk::ScopedAStatus P2pIface::setVendorElementsInternal(
+ P2pFrameTypeMask frameTypeMask,
+ const std::vector<uint8_t>& vendorElemBytes)
+{
+ struct wpa_supplicant* wpa_s = retrieveIfacePtr();
+ for (int i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
+ uint32_t bit = convertWpaP2pFrameTypeToHalP2pFrameTypeBit(i);
+ if (0 == bit) continue;
+
+ if (static_cast<uint32_t>(frameTypeMask) & bit) {
+ updateP2pVendorElem(wpa_s, (enum wpa_vendor_elem_frame) i, vendorElemBytes);
+ }
+ }
+ return ndk::ScopedAStatus::ok();
+}
+
/**
* Retrieve the underlying |wpa_supplicant| struct
* pointer for this iface.
diff --git a/wpa_supplicant/aidl/p2p_iface.h b/wpa_supplicant/aidl/p2p_iface.h
index 4cb86b62..5f9903cc 100644
--- a/wpa_supplicant/aidl/p2p_iface.h
+++ b/wpa_supplicant/aidl/p2p_iface.h
@@ -169,6 +169,9 @@ public:
::ndk::ScopedAStatus findOnSocialChannels(int32_t in_timeoutInSec) override;
::ndk::ScopedAStatus findOnSpecificFrequency(
int32_t in_freq, int32_t in_timeoutInSec) override;
+ ::ndk::ScopedAStatus setVendorElements(
+ P2pFrameTypeMask in_frameTypeMask,
+ const std::vector<uint8_t>& in_vendorElemBytes) override;
private:
// Corresponding worker functions for the AIDL methods.
@@ -286,6 +289,9 @@ private:
ndk::ScopedAStatus findOnSocialChannelsInternal(uint32_t timeout_in_sec);
ndk::ScopedAStatus findOnSpecificFrequencyInternal(
uint32_t freq, uint32_t timeout_in_sec);
+ ndk::ScopedAStatus setVendorElementsInternal(
+ P2pFrameTypeMask frameTypeMask,
+ const std::vector<uint8_t>& vendorElemBytes);
struct wpa_supplicant* retrieveIfacePtr();
struct wpa_supplicant* retrieveGroupIfacePtr(
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index df3bb357..54d223d1 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -8111,7 +8111,7 @@ void wpas_vendor_elem_update(struct wpa_supplicant *wpa_s)
}
#ifdef CONFIG_P2P
- if (wpa_s->parent == wpa_s &&
+ if ((wpa_s->parent == wpa_s || (wpa_s == wpa_s->p2pdev && wpa_s->p2p_mgmt)) &&
wpa_s->global->p2p &&
!wpa_s->global->p2p_disabled)
p2p_set_vendor_elems(wpa_s->global->p2p, wpa_s->vendor_elem);