// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.wlan.ap.policy;

using fuchsia.net;
using fuchsia.wlan.common;

[Discoverable]
protocol ApPolicy {
  OpenControlChannels(Requests requests, request<StateUpdates> updates);
};


protocol Requests {
  StartAccessPoint(AccessPointParams params) -> (Status request_status);
  StopAccessPoint(bytes ssid) -> (Status request_status);
};


protocol StateUpdates {
  -> OnAccessPointStatusChange(ApState ap_state, ApState previous_ap_state);
  -> OnAccessPointClientUpdate(ApBand ap_band, int32 frequency, vector<ApClient> clients);
};

struct Status {
  fuchsia.wlan.common.RequestStatus status;
  string message;
};


struct AccessPointParams {
  bytes ssid; // 0 - 32 bytes
  bytes passphrase; // 8 - 63 char
  ApBand band;
};


enum ApBand {
  /// allows the band to switch depending on device
  /// operating mode and environment
  BAND_ANY = 0;
  /// restricted to 2.4ghz bands only
  BAND_2_4GHZ = 1;
  /// restricted to 5ghz bands only
  BAND_5GHZ = 2;
};


enum ApState {
  /// confirmation that the softap interface will attempt to be
  /// created (this can take seconds on some devices)
  STARTING = 0;
  UP = 1;
  DOWN = 2;
};


struct ApClient {
  fuchsia.net.MacAddress mac;
};
