// Copyright 2020 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;

/// The security level required for this pairing - corresponds to the security
/// levels defined in the Security Manager Protocol in Vol 3, Part H, Section 2.3.1
enum PairingSecurityLevel {
    /// Encrypted without MITM protection (unauthenticated)
    ENCRYPTED = 1;

    /// Encrypted with MITM protection (authenticated), although this level of security does not
    /// fully protect against passive eavesdroppers
    AUTHENTICATED = 2;
};

/// Whether or not the device should form a bluetooth bond during the pairing prodecure.
/// As described in Core Spec v5.2 | Vol 3, Part C, Sec 4.3
enum BondableMode {
    /// The device will form a bond during pairing with peers
    BONDABLE = 1;
    /// The device will not form a bond during pairing with peers
    NON_BONDABLE = 2;
};

/// Parameters that give a caller more fine-grained control over the pairing process. All of the
/// fields of this table are optional and pairing can still succeed if none of them are set.
table PairingOptions {
    /// Only relevant for LE. If present, determines the Security Manager security level to pair
    /// with. If not present, defaults to PairingSecurityLevel.AUTHENTICATED.
    1: PairingSecurityLevel le_security_level;

    /// If transport is LOW_ENERGY or DUAL_MODE, whether the device should form a bond or not during
    /// pairing. If not present, the pairing will default to bondable mode.
    ///
    /// If transport is CLASSIC, this option must be absent or otherwise the value BONDABLE.
    /// NON_BONDABLE mode is not currently supported for the CLASSIC transport
    // TODO(fxbug.dev/42403): Support NON_BONDABLE for the CLASSIC transport.
    2: BondableMode bondable_mode;

    /// If transport is LOW_ENERGY, indicate a desire to pair over the LE transport.
    /// If transport is CLASSIC, indicate a desire to pair over the Br/Edr transport.
    /// If transport is DUAL_MODE, indicate a desire to pair over both transports.
    /// If absent, shall be interpreted as DUAL_MODE
    3: TechnologyType transport;
};
