13f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh/*
23f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * Copyright (C) 2017 The Android Open Source Project
33f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh *
43f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * Licensed under the Apache License, Version 2.0 (the "License");
53f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * you may not use this file except in compliance with the License.
63f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * You may obtain a copy of the License at
73f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh *
83f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh *      http://www.apache.org/licenses/LICENSE-2.0
93f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh *
103f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * Unless required by applicable law or agreed to in writing, software
113f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * distributed under the License is distributed on an "AS IS" BASIS,
123f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * See the License for the specific language governing permissions and
143f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh * limitations under the License.
153f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh */
163f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
173f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include "chre/apps/wifi_offload/scan_params.h"
183f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include "chre/apps/wifi_offload/channel_histogram.h"
193f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh#include "chre/apps/wifi_offload/vector_serialization.h"
203f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
213f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehnamespace wifi_offload {
223f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
233f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi AlizadehScanParams::ScanParams() : disconnected_mode_scan_interval_ms_(0) {}
243f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
253f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehbool ScanParams::operator==(const ScanParams &other) const {
263f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  if (this == &other) {
273f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    return true;
283f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  }
293f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  return ssids_to_scan_ == other.ssids_to_scan_ &&
303f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh         frequencies_to_scan_mhz_ == other.frequencies_to_scan_mhz_ &&
313f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh         disconnected_mode_scan_interval_ms_ ==
323f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh             other.disconnected_mode_scan_interval_ms_;
333f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh}
343f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
353f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehflatbuffers::Offset<ScanParams::FbsType> ScanParams::Serialize(
363f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    flatbuffers::FlatBufferBuilder *builder) const {
373f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  auto ssid_vec = SerializeVector(ssids_to_scan_, builder);
383f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  auto freq_vec = builder->CreateVector(frequencies_to_scan_mhz_);
393f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  return fbs::CreateScanParams(*builder, ssid_vec, freq_vec,
403f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh                               disconnected_mode_scan_interval_ms_);
413f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh}
423f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
433f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehbool ScanParams::Deserialize(const ScanParams::FbsType &fbs_params) {
443f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  const auto &ssid_vec = fbs_params.ssids_to_scan();
453f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  if (ssid_vec == nullptr ||
463f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh      !DeserializeVector<Ssid>(*ssid_vec, &ssids_to_scan_)) {
473f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    LOGE("Failed to deserialize ScanParams. Null or incomplete members.");
483f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    return false;
493f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  }
503f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
513f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  const auto &freq_vec = fbs_params.frequencies_to_scan_mhz();
523f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  if (freq_vec == nullptr) {
533f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    LOGE("Failed to deserialize ScanParams. Null or incomplete members.");
543f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    return false;
553f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  }
563f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  frequencies_to_scan_mhz_.clear();
573f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  frequencies_to_scan_mhz_.reserve(freq_vec->size());
583f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  for (const auto &freq : *freq_vec) {
593f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    if (!ChannelHistogram::IsSupportedFrequency(freq)) {
603f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh      LOGE("Failed to deserialize ScanParams. Invalid frequency to scan.");
613f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh      return false;
623f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    }
633f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    frequencies_to_scan_mhz_.push_back(freq);
643f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  }
653f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  disconnected_mode_scan_interval_ms_ =
663f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh      fbs_params.disconnected_mode_scan_interval_ms();
673f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
683f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  return true;
693f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh}
703f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
713f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadehvoid ScanParams::Log() const {
723f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  LOGI("ScanParams:");
733f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  LOGI("  disconnected mode scan interval (ms): %" PRIu32,
743f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh       disconnected_mode_scan_interval_ms_);
753f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  LOGI("  number of ssids to scan: %zu", ssids_to_scan_.size());
763f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  for (const auto &ssid : ssids_to_scan_) {
773f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    ssid.Log();
783f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  }
793f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  LOGI("  number of frequencies to scan: %zu", frequencies_to_scan_mhz_.size());
803f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  for (const auto &freq : frequencies_to_scan_mhz_) {
813f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh    LOGI("  frequency: %" PRIu32, freq);
823f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh  }
833f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh}
843f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh
853f5e86ee9463dce381ebd8cdb65ab3f79c1b864dMehdi Alizadeh}  // namespace wifi_offload
86