// 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.telephony.ril;

/// Power State of the radio
enum RadioPowerState : uint8 {
    OFF = 0x00;
    ON = 0x01;
};

/// Errors that the Radio Interface Layer presents to modem
/// management interfaces
enum RilError : uint32 {
    /// The radio on this interface is unavailable.
    NO_RADIO = 0x01;
    /// The request required a SIM card and none are unavailable.
    NO_SIM = 0x02;
    /// The baseband reported information for a type of cellular network
    /// that is currently unsupported.
    UNSUPPORTED_NETWORK_TYPE = 0x03;
    /// An unknown error.
    UNKNOWN_ERROR = 0x04;
    /// An unknown transport error.
    TRANSPORT_ERROR = 0x05;
};

protocol NetworkConnection {
    Stop() -> (bool success);
};

// currently only ipv4 stuff, to drastically change
struct NetworkSettings {
    uint32 ip_v4_addr;
    uint32 ip_v4_subnet;
    uint32 ip_v4_gateway;
    uint32 ip_v4_dns;
    uint32 mtu;
};

/// The Standard Fuchsia RIL (FRIL)
[Discoverable]
protocol RadioInterfaceLayer {
    /// Hand a transport |channel| to the RIL service connecting it to the modem. Most
    /// modems will require this to be the first method called, since they are dependent
    /// on this. If a connection is already active, it will return false. If the channel
    /// is set successfully, it will return true.
    ///
    /// Called globaly per-modem, not per client connection.
    ///
    /// Implementation Detail: current services speak QMI but others will most likely speak other
    /// binary formats.
    ConnectTransport(handle<channel> channel) -> () error RilError;

    /// Retrieve the identity of the modem (currently |imei| only).
    GetDeviceIdentity() -> (string imei) error RilError;

    /// Power state of the radio. Currently on On or Off.
    RadioPowerStatus() -> (RadioPowerState state) error RilError;

    /// Activate a network connection.
    StartNetwork(string apn) -> (NetworkConnection conn) error RilError;

    /// Network settings known to the modem.
    GetNetworkSettings() -> (NetworkSettings settings) error RilError;

    /// Signal Strength (dBm) for LTE networks (total received wideband power).
    GetSignalStrength() -> (float32 dbm) error RilError;
};
