diff options
author | Jimmy Chen <jimmycmchen@google.com> | 2022-02-08 23:51:45 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-02-08 23:51:45 +0000 |
commit | 34c660246eaa677d1b721992bf0ee8f90e0d92a5 (patch) | |
tree | 659fa9eee69a9c4a2e814ef38c8933e46306885c | |
parent | 1aaf1803c52469dc0bf08916c3c35d11e3ab48c5 (diff) | |
parent | d148c62736aab81d2dc62d32349387295f3b70e4 (diff) | |
download | wpa_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.cpp | 46 | ||||
-rw-r--r-- | wpa_supplicant/aidl/p2p_iface.cpp | 73 | ||||
-rw-r--r-- | wpa_supplicant/aidl/p2p_iface.h | 6 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant.c | 2 |
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); |