/*
 * hostapd / Interface steering
 * Copyright (c) 2015 Google, Inc.
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#ifndef STEERING_H
#define STEERING_H

#define MAX_STEERING_TIMESTAMP_FILES 100
/* 10 seconds is long enough to scan all channels on both bands at least twice
 * at 100ms/channel.
 */
#define BANDSTEERING_DELAY_SECONDS 10
#define BANDSTEERING_EXPIRATION_SECONDS 120

extern char *steering_timestamp_path;
extern char *request_logging_path;

struct hostapd_data;
enum hostapd_hw_mode;
struct ieee80211_mgmt;
struct os_reltime;

typedef enum {
  LOG_PROBE,
  LOG_ASSOC,
  LOG_BANDSTEERING_FAILED,
  LOG_ASSOC_SUCCESSFUL,
  NUM_LOGGED_REQUEST_TYPES } logged_request_type;
typedef enum {
  LOGGING_PATH,
  STEERING_PATH,
  NUM_STEERING_PATH_TYPES } steering_path_type;

/**
 * Writes timestamp for the source address in mgmt to request_logging_path.
 * Returns 1 if the write succeeded, 0 otherwise.
 */
int write_timestamp_file(const u8 *mac,
                         const struct hostapd_data *hapd,
                         logged_request_type type,
                         const struct os_reltime *timestamp);

/**
 * Calls write_timestamp_file unless there is an existing file younger than
 * BANDSTEERING_EXPIRATION_SECONDS. Also garbage collects before writing.
 * Returns 0 on write or garbage collection failure, 1 otherwise.
 */
int maybe_write_timestamp_file(const u8 *mac,
                               const struct hostapd_data *hapd,
                               logged_request_type type);

/**
 * Reads a timestamp from either request_logging_path or steering_timestamp_path
 * (based on path) for the source address in mgmt, putting the result in
 * timestamp.  Returns 1 if the read succeeded, 0 otherwise.
 */
int read_timestamp_file(const u8 *mac,
                        logged_request_type type,
                        steering_path_type path_type,
                        struct os_reltime *timestamp);

/**
 * Deletes a timestamp file from either request_logging_path or
 * steering_timestamp_path (based on path) for the source address in mgmt.
 * Returns 1 if the delete succeeded or the file does not exist, 0 otherwise.
 */
int delete_timestamp_file(const u8 *mac,
                          logged_request_type type,
                          steering_path_type path_type);

/**
 * Delete all but the most recent MAX_TIMESTAMP_FILES files of type LOG_PROBE in
 * request_logging_path.  Returns the number of files deleted.
 */
int garbage_collect_timestamp_files();

#endif /* STEERING_H */
