// 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.router.config;

using fuchsia.net;

alias port_number = uint16;

/// Security features define the features enabled or disabled on the router.
/// For example, NAT, firewall, passthough for common protocols that need it.
table SecurityFeatures {
    1: bool PPTP_PASSTHRU;
    2: bool L2TP_PASSTHRU;
    3: bool IPSEC_PASSTHRU;
    4: bool RTSP_PASSTHRU;
    5: bool H323_PASSTHRU;
    6: bool SIP_PASSTHRU;
    7: bool ALLOW_MULTICAST;
    8: bool NAT;
    9: bool FIREWALL;
    10: bool V6_FIREWALL;
    11: bool UPNP;
    12: bool DROP_ICMP_ECHO;
};

struct PortRange {
    port_number from;
    port_number to;
};

enum Protocol {
    BOTH = 0;
    TCP = 1;
    UDP = 2;
};

enum FilterAction {
    DROP = 0;
    ALLOW = 1;
};

/// FlowSelector is the set of packet selectors defining a traffic flow.
/// a not specified selector represents a match all.
table FlowSelector {
    1: CidrAddress src_address;
    2: vector<PortRange> src_ports;
    3: CidrAddress dst_address;
    4: vector<PortRange> dst_ports;
    5: Protocol protocol;
};

/// Filter rule is applied on the LAN side; it allows blocking traffic from LAN to WAN.
/// Normally, all traffic from LAN to WAN is allowed. By applying filter rules, it is possible to
/// selectively block traffic from LAN devices to services on the WAN side.
struct FilterRule {
    Id element;
    FilterAction action;
    FlowSelector selector;
};

/// Port Forwarding allows remote (WAN) devices to connect to a service hosted on a LAN device.
/// It forwards all WAN packets (or only those from the optional source_address), destined to any of
/// the incoming ports, to the target address and port. Target address must be on one of the LANs.
struct PortForwardingRule {
    Id element;
    string? name;
    bool enabled;
    // WAN device(s) whose traffic will be forwarded. If not present, all WAN devices will be
    // forwarded.
    CidrAddress source_address;
    // Traffic received on any of the WAN side ports will be forwarded.
    vector<PortRange> destination_ports;
    // LAN address where forwarded packets will be sent.
    fuchsia.net.IpAddress target_address;
    // Port on the LAN target address where forwarded packets will be sent.
    port_number target_port;
    Protocol protocol;
};

/// Port Triggering provides similar functionality to Port Forwarding. The difference is that it is
/// the target device that enables the port forwarding functionality.
/// The target device is not known in advance, and port forwarding is disabled. The first local
/// device to send traffic to the trigger port becomes the target device, and enables port
/// forwarding. WAN traffic comming to any of the incoming ports will be forwarded to the trigger
/// port on the target device.
struct PortTriggerRule {
    Id element;
    string? name;
    bool enabled;
    vector<PortRange> incoming_ports;
    Protocol protocol;
    port_number trigger_port;
};

/// IPv6 firewall pinholes create a hole in the IPv6 firewall.
/// It will allow traffic from source_address, destined to the indicated ports to pass
/// from WAN to LAN.
struct Ipv6PinHoleRule {
    Id element;
    string nickname;
    bool enabled;
    fuchsia.net.Ipv6Address source_address;
    vector<PortRange> ports;
    Protocol protocol;
};

/// DmzHost is a LAN host that receives all incoming tcp/udp packets that do not match any other rule.
struct DmzHost {
    Id element;
    bool enabled;
    fuchsia.net.Ipv4Address wan_addr;
    fuchsia.net.Ipv4Address lan_addr;
};

enum AclAction {
    /// Allows traffic to pass.
    PERMIT = 1;
    /// Blocks traffic, dropping the packets.
    DENY = 2;
    /// Redirects packets to the destination port.
    REDIRECT = 3;
};

enum AclType {
    /// Ingress ACL is applied on the ingress port, before packet enters the forwarding path.
    INGRESS = 1;
    /// Egress ACL is applied on the egress port, after packet has passed the forwarding path.
    EGRESS = 2;
};

/// SystemAcl describes an ACL installed at startup.
table SystemAcl {
    1: Id element;
    2: FlowSelector selector;
    3: port_number ingress_port;
    4: port_number egress_port;
    5: AclType acl_type;
    6: AclAction acl_action;
};
