X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=client_interface_impl.cpp;h=405d1fd3018c51ae5d50452ecd5d133f89b178a0;hb=04559d12e90d2b6c639571c1e074c929ea38f498;hp=b908611c8b5ed91041d944e37d38777c2d8acf62;hpb=a7418ece2a5cdc96b689a0185423e5801c7cf24f;p=android-x86%2Fsystem-connectivity-wificond.git diff --git a/client_interface_impl.cpp b/client_interface_impl.cpp index b908611..405d1fd 100644 --- a/client_interface_impl.cpp +++ b/client_interface_impl.cpp @@ -20,13 +20,13 @@ #include #include -#include #include "wificond/client_interface_binder.h" #include "wificond/net/mlme_event.h" #include "wificond/net/netlink_utils.h" #include "wificond/scanning/scan_result.h" #include "wificond/scanning/scan_utils.h" +#include "wificond/scanning/scanner_impl.h" using android::net::wifi::IClientInterface; using com::android::server::wifi::wificond::NativeScanResult; @@ -34,7 +34,7 @@ using android::sp; using android::wifi_system::InterfaceTool; using android::wifi_system::SupplicantManager; -using namespace std::placeholders; +using std::endl; using std::string; using std::unique_ptr; using std::vector; @@ -50,27 +50,57 @@ MlmeEventHandlerImpl::~MlmeEventHandlerImpl() { } void MlmeEventHandlerImpl::OnConnect(unique_ptr event) { - if (event->GetStatusCode() == 0) { + if (!event->IsTimeout() && event->GetStatusCode() == 0) { + client_interface_->is_associated_ = true; client_interface_->RefreshAssociateFreq(); client_interface_->bssid_ = event->GetBSSID(); + } else { + if (event->IsTimeout()) { + LOG(INFO) << "Connect timeout"; + } + client_interface_->is_associated_ = false; + client_interface_->bssid_.clear(); } } void MlmeEventHandlerImpl::OnRoam(unique_ptr event) { if (event->GetStatusCode() == 0) { + client_interface_->is_associated_ = true; client_interface_->RefreshAssociateFreq(); client_interface_->bssid_ = event->GetBSSID(); + } else { + client_interface_->is_associated_ = false; + client_interface_->bssid_.clear(); } } void MlmeEventHandlerImpl::OnAssociate(unique_ptr event) { - if (event->GetStatusCode() == 0) { + if (!event->IsTimeout() && event->GetStatusCode() == 0) { + client_interface_->is_associated_ = true; client_interface_->RefreshAssociateFreq(); client_interface_->bssid_ = event->GetBSSID(); + } else { + if (event->IsTimeout()) { + LOG(INFO) << "Associate timeout"; + } + client_interface_->is_associated_ = false; + client_interface_->bssid_.clear(); } } +void MlmeEventHandlerImpl::OnDisconnect(unique_ptr event) { + client_interface_->is_associated_ = false; + client_interface_->bssid_.clear(); +} + +void MlmeEventHandlerImpl::OnDisassociate(unique_ptr event) { + client_interface_->is_associated_ = false; + client_interface_->bssid_.clear(); +} + + ClientInterfaceImpl::ClientInterfaceImpl( + uint32_t wiphy_index, const std::string& interface_name, uint32_t interface_index, const std::vector& interface_mac_addr, @@ -78,7 +108,8 @@ ClientInterfaceImpl::ClientInterfaceImpl( SupplicantManager* supplicant_manager, NetlinkUtils* netlink_utils, ScanUtils* scan_utils) - : interface_name_(interface_name), + : wiphy_index_(wiphy_index), + interface_name_(interface_name), interface_index_(interface_index), interface_mac_addr_(interface_mac_addr), if_tool_(if_tool), @@ -86,21 +117,32 @@ ClientInterfaceImpl::ClientInterfaceImpl( netlink_utils_(netlink_utils), scan_utils_(scan_utils), mlme_event_handler_(new MlmeEventHandlerImpl(this)), - binder_(new ClientInterfaceBinder(this)) { - scan_utils_->SubscribeScanResultNotification( - interface_index_, - std::bind(&ClientInterfaceImpl::OnScanResultsReady, - this, - _1, _2, _3, _4)); + binder_(new ClientInterfaceBinder(this)), + is_associated_(false) { netlink_utils_->SubscribeMlmeEvent( interface_index_, mlme_event_handler_.get()); + if (!netlink_utils_->GetWiphyInfo(wiphy_index_, + &band_info_, + &scan_capabilities_, + &wiphy_features_)) { + LOG(ERROR) << "Failed to get wiphy info from kernel"; + } + LOG(INFO) << "create scanner for interface with index: " + << (int)interface_index_; + scanner_ = new ScannerImpl(wiphy_index, + interface_index_, + scan_capabilities_, + wiphy_features_, + this, + netlink_utils_, + scan_utils_); } ClientInterfaceImpl::~ClientInterfaceImpl() { binder_->NotifyImplDead(); + scanner_->Invalidate(); DisableSupplicant(); - scan_utils_->UnsubscribeScanResultNotification(interface_index_); netlink_utils_->UnsubscribeMlmeEvent(interface_index_); if_tool_->SetUpState(interface_name_.c_str(), false); } @@ -109,6 +151,23 @@ sp ClientInterfaceImpl::GetBinder() const return binder_; } +void ClientInterfaceImpl::Dump(std::stringstream* ss) const { + *ss << "------- Dump of client interface with index: " + << interface_index_ << " and name: " << interface_name_ + << "-------" << endl; + *ss << "Max number of ssids for single shot scan: " + << static_cast(scan_capabilities_.max_num_scan_ssids) << endl; + *ss << "Max number of ssids for scheduled scan: " + << static_cast(scan_capabilities_.max_num_sched_scan_ssids) << endl; + *ss << "Max number of match sets for scheduled scan: " + << static_cast(scan_capabilities_.max_match_sets) << endl; + *ss << "Device supports random MAC for single shot scan: " + << wiphy_features_.supports_random_mac_oneshot_scan << endl; + *ss << "Device supports random MAC for scheduled scan: " + << wiphy_features_.supports_random_mac_sched_scan << endl; + *ss << "------- Dump End -------" << endl; +} + bool ClientInterfaceImpl::EnableSupplicant() { return supplicant_manager_->StartSupplicant(); } @@ -153,30 +212,6 @@ const vector& ClientInterfaceImpl::GetMacAddress() { return interface_mac_addr_; } -void ClientInterfaceImpl::OnScanResultsReady( - uint32_t interface_index, - bool aborted, - std::vector>& ssids, - std::vector& frequencies) { - if (aborted) { - LOG(ERROR) << "Scan aborted"; - return; - } - vector scan_results; - // TODO(nywang): Find a way to differentiate scan results for - // internel/external scan request. This is useful when location is - // scanning using regular NL80211 commands. - scan_utils_->GetScanResult(interface_index, &scan_results); - // TODO(nywang): Send these scan results back to java framework. -} - -void ClientInterfaceImpl::OnSchedScanResultsReady( - uint32_t interface_index) { - vector scan_results; - scan_utils_->GetScanResult(interface_index, &scan_results); - // TODO(nywang): Send these scan results back to java framework. -} - bool ClientInterfaceImpl::requestANQP( const ::std::vector& bssid, const ::android::sp<::android::net::wifi::IANQPDoneCallback>& callback) { @@ -199,5 +234,9 @@ bool ClientInterfaceImpl::RefreshAssociateFreq() { return false; } +bool ClientInterfaceImpl::IsAssociated() const { + return is_associated_; +} + } // namespace wificond } // namespace android