// Copyright 2019 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.bluetooth.sys;

enum BootstrapError : uint32 {
    INVALID_HOST_IDENTITY = 1;
    WRITE_FAILURE = 2;
};

/// Protocol used to initialize persistent core Bluetooth data. This protocol populates data that
/// determine the identity of this device as perceived by other Bluetooth devices.
///
/// This protocol can be obtained only before the core Bluetooth host subsystem has generated its
/// own identity. Once initial data is committed, this capability becomes unavailable and remains
/// unavailable even if new Bluetooth adapters are attached.
///
/// Due to the privacy and bonding secrets involved, as well as the capability to make this device
/// assume the Bluetooth identity of another device, this protocol should only be exposed to
/// privileged components that can vouchsafe the origin of the data.
[Discoverable]
protocol Bootstrap {
    /// Adds identities to be added to the unpopulated Bluetooth stack.
    ///
    /// Repeated calls will append identities.
    // TODO(fxbug.dev/1304): If necessary, paginate bonding data to allow an arbitrary number of bonds for
    // each identity, e.g. AddBonds(adapter_id, bonds).
    AddIdentities(vector<Identity> identities);

    /// Writes all added bootstrapping data to the Bluetooth core stack. The server will close the
    /// channel regardless of success. Returns without error if successful and the stack will be
    /// considered initialized even if no bootstrapping data was written. Returns
    /// INVALID_HOST_IDENTITY if any host or bonded peer data is insufficient or inconsistent, with
    /// no effect (the client may retry by obtaining another protocol handle).
    Commit() -> () error BootstrapError;
};
