// 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.net.ppp;

using zx;
using fuchsia.net;

/// Information about PPP device configuration.
// TODO(CONN-166): Change this to a table when LLCPP supports it.
struct Info {
    uint16 mtu; // bytes
};

/// Options for a PPP connection.
// TODO(CONN-166): Change this to a table when LLCPP supports it.
struct ConnectionOptions {
    /// Enable Link Control Protocol Magic Numbers for loopback detection.
    bool magic_number;
    /// Enable IPv4 with the given IP address.
    fuchsia.net.Ipv4Address? ipv4;
    /// Enable IPv6 with the given IPv6 address (used as an interface identifier).
    fuchsia.net.Ipv6Address? ipv6;
};

/// The type of protocol being transmitted or received.
enum ProtocolType {
    CONTROL = 1;
    IPV4 = 2;
    IPV6 = 3;
};

/// PPP device driver interface.
protocol Device {
    /// Receive data.
    Rx(ProtocolType protocol) -> (bytes data) error zx.status;

    /// Transmit data. When this call returns, it is guaranteed that the data has either been
    /// written or that the write failed and the caller may attempt to retransmit.
    Tx(ProtocolType protocol, bytes data) -> () error zx.status;

    /// Obtain information about device configuration.
    GetInfo() -> (Info info);

    /// Obtain status of a given protocol. If a protocol is `up`, `Rx` and `Tx` may be called with
    /// the same protocol to send and receive PPP frames.
    GetStatus(ProtocolType protocol) -> (bool up);

    /// Set status of a given protocol. If a protocol is `up`, `Rx` and `Tx` may be called with the
    /// same protocol to send and receive PPP frames.
    SetStatus(ProtocolType protocol, bool up);

    /// On up, obtain exclusive access to the serial port, and begin continuously reading all
    /// protocol types. On down, stop reading and release access to the serial port. Errors only
    /// occur when the device fails to obtain exclusive access to the serial port, in which case
    /// the device remains in a down state. The device begins down when initialized, so `Enable`
    /// must be called before the driver can send or receive data.
    Enable(bool up) -> () error zx.status;
};

protocol DeviceBootstrap {
    /// Obtain a unique channel to be used with the driver. This is desirable to avoid blocking
    /// other consumers of the device protocol, and should be removed when the DDK has a better
    /// channel ownership model for drivers which implement protocols. All instances point to the
    /// same underlying device; separate instances are only used to allow the driver to
    /// concurrently reply to calls.
    GetInstance() -> (Device instance);
};

/// PPP service interface.
[Discoverable]
protocol Ppp {
    /// Given an instance of the driver and options, attempt to open a PPP connection.
    /// Uses the provided options to determine how to configure the link, and whether or not to
    /// configure IPv4 or IPv6. If no error is returned, the connection is open and the driver
    /// supports the requested protocols. Only one connection can be open at a time.
    Open(Device instance, ConnectionOptions options) -> () error zx.status;

    /// If a connection is currently open, close it. Otherwise return an error.
    Close() -> () error zx.status;
};
