/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __WIFI_CACHED_SCAN_RESULTS_H__
#define __WIFI_CACHED_SCAN_RESULTS_H__

#include "wifi_hal.h"

#define WIFI_CACHED_SCAN_RESULT_FLAGS_NONE                         (0)
/* Element ID 61 (HT Operation) is present (see HT 7.3.2) */
#define WIFI_CACHED_SCAN_RESULT_FLAGS_HT_OPS_PRESENT               (1 << 0)
/* Element ID 192 (VHT Operation) is present (see VHT 8.4.2)  */
#define WIFI_CACHED_SCAN_RESULT_FLAGS_VHT_OPS_PRESENT              (1 << 1)
/* Element ID 255 + Extension 36 (HE Operation) is present
 * (see 802.11ax 9.4.2.1)
 */
#define WIFI_CACHED_SCAN_RESULT_FLAGS_HE_OPS_PRESENT               (1 << 2)
/* Element ID 255 + Extension 106 (HE Operation) is present
 * (see 802.11be D1.5 9.4.2.1)
 */
#define WIFI_CACHED_SCAN_RESULT_FLAGS_EHT_OPS_PRESENT              (1 << 3)
/* Element ID 127 (Extended Capabilities) is present, and bit 70
 * (Fine Timing Measurement Responder) is set to 1
 * (see IEEE Std 802.11-2016 9.4.2.27)
 */
#define WIFI_CACHED_SCAN_RESULT_FLAGS_IS_FTM_RESPONDER             (1 << 4)

/**
 * Provides information about a single access point (AP) detected in a scan.
 */
typedef struct {
    /* Number of milliseconds prior to ts in the enclosing
     * wifi_cached_scan_result_report struct when
     * the probe response or beacon frame that
     * was used to populate this structure was received.
     */
    u32 age_ms;
    /* The Capability Information field */
    u16 capability;
    /* null terminated */
    u8 ssid[33];
    u8 ssid_len;
    u8 bssid[6];
    /* A set of flags from WIFI_CACHED_SCAN_RESULT_FLAGS_* */
    u8 flags;
    s8  rssi;
    wifi_channel_spec chanspec;
}wifi_cached_scan_result;

/*
 * Data structure sent with events of type WifiCachedScanResult.
 */
typedef struct  {
    /* time since boot (in microsecond) when the result was retrieved */
    wifi_timestamp ts;
    /* If 0, indicates that all frequencies in current regulation were
     * scanned. Otherwise, indicates the number of frequencies scanned, as
     * specified in scanned_freq_list.
     */
    u16 scanned_freq_num;
    /* Pointer to an array containing scanned_freq_num values comprising the
     * set of frequencies that were scanned. Frequencies are specified as
     * channel center frequencies in MHz. May be NULL if scannedFreqListLen is
     * 0.
     */
    const u32 *scanned_freq_list;
    /* The total number of cached results returned. */
    u8 result_cnt;
    /* Pointer to an array containing result_cnt entries. May be NULL if
     * result_cnt is 0.
     */
    const wifi_cached_scan_result *results;
} wifi_cached_scan_report;

/* callback for reporting cached scan report */
typedef struct {
  void (*on_cached_scan_results) (wifi_cached_scan_report *cache_report);
} wifi_cached_scan_result_handler;
#endif
