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

/// Status codes for commands.
enum Status {
    OK = 0;
    ERR_INTERNAL = 1;
    ERR_GENERATION_MISMATCH = 2;
    ERR_BAD_RULE = 3;
};

/// The maximum number of rules.
const uint32 MAX_RULES = 128;

[Discoverable]
protocol Filter {
    /// Enable enables the filter if true is passed.
    /// It disables the filter if false is passed.
    Enable(bool enabled) -> (Status status);

    /// IsEnabled returns true if the filter is enabled.
    IsEnabled() -> (bool enabled);

    /// GetRules gets the current rules. They do not include NAT or RDR rules.
    /// (use GetNatRules or GetRdrRules instead).
    ///
    /// GetRules also returns a generation number associated with the current
    /// rules.
    GetRules() -> (vector<Rule>:MAX_RULES rules, uint32 generation, Status status);

    /// UpdateRules updates the current rules. It does not update NAT or RDR rules
    /// (use UpdateNatRules or UpdateRdrRules instead).
    ///
    /// UpdateRules takes a generation number that is previously returned from
    /// GetRules. To successfully update the current rules, the generation number
    /// passed to UpdateRules needs to be up-to-date.
    ///
    /// If somebody else has updated the rules since the previous GetRules, the
    /// generation number won't match and err_generation_mismatch will be returned.
    UpdateRules(vector<Rule>:MAX_RULES rules, uint32 generation) -> (Status status);

    /// GetNatRules gets the current NAT rules.
    ///
    /// It also returns a generation number that can be passed to UpdateNatRules.
    ///
    GetNatRules() -> (vector<Nat>:MAX_RULES rules, uint32 generation, Status status);

    /// UpdateNatRules updates the current NAT rules.
    ///
    /// It takes a generation number that is returned from GetNatRules. To
    /// successfully update the current rules, the generation number passed to
    /// UpdateNatRules needs to be up-to-date.
    UpdateNatRules(vector<Nat>:MAX_RULES rules, uint32 generation) -> (Status status);

    /// GetRdrRules gets the current RDR rules.
    ///
    /// It also returns a generation number that can be passed to UpdateRdrRules.
    GetRdrRules() -> (vector<Rdr>:MAX_RULES rules, uint32 generation, Status status);

    /// UpdateRdrRules updates the previous RDR rules with new rules.
    ///
    /// It takes a generation number that is returned from GetRdrRules. To
    /// successfully update the current rules, the generation number passed to
    /// UpdateRdrRules needs to be up-to-date.
    UpdateRdrRules(vector<Rdr>:MAX_RULES rules, uint32 generation) -> (Status status);
};
