// Copyright (C) 2015-2017 Nippon Telegraph and Telephone Corporation.
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction,
// including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software,
// and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

syntax = "proto3";

package gobgpapi;

// Interface exported by the server.

service GobgpApi {
  rpc GetGlobalConfig(Arguments) returns (Global) {}
  rpc ModGlobalConfig(ModGlobalConfigArguments) returns (Error) {}
  rpc GetNeighbors(Arguments) returns (stream Peer) {}
  rpc GetNeighbor(Arguments) returns (Peer) {}
  rpc ModNeighbor(ModNeighborArguments) returns(Error) {}
  rpc GetRib(Table) returns (Table) {}
  rpc Reset(Arguments) returns (Error) {}
  rpc SoftReset(Arguments) returns (Error) {}
  rpc SoftResetIn(Arguments) returns (Error) {}
  rpc SoftResetOut(Arguments) returns (Error) {}
  rpc Shutdown(Arguments) returns (Error) {}
  rpc Enable(Arguments) returns (Error) {}
  rpc Disable(Arguments) returns (Error) {}
  rpc ModPath(ModPathArguments) returns (ModPathResponse) {}
  rpc ModPaths(stream ModPathsArguments) returns (Error) {}
  rpc MonitorRib(Table) returns (stream Destination) {}
  rpc MonitorBestChanged(Arguments) returns (stream Destination) {}
  rpc MonitorPeerState(Arguments) returns (stream Peer) {}
  rpc MonitorROAValidation(Arguments) returns (stream ROAResult) {}
  rpc GetMrt(MrtArguments) returns (stream MrtMessage) {}
  rpc ModMrt(ModMrtArguments) returns (Error) {}
  rpc ModBmp(ModBmpArguments) returns (Error) {}
  rpc GetRPKI(Arguments) returns (stream RPKI) {}
  rpc ModRPKI(ModRpkiArguments) returns (Error) {}
  rpc GetROA(Arguments) returns (stream ROA) {}
  rpc GetVrfs(Arguments) returns (stream Vrf) {}
  rpc ModVrf(ModVrfArguments) returns (Error) {}
  rpc GetDefinedSet(DefinedSet) returns (DefinedSet) {}
  rpc GetDefinedSets(DefinedSet) returns (stream DefinedSet) {}
  rpc ModDefinedSet(ModDefinedSetArguments) returns (Error) {}
  rpc GetStatement(Statement) returns (Statement) {}
  rpc GetStatements(Statement) returns (stream Statement) {}
  rpc ModStatement(ModStatementArguments) returns (Error) {}
  rpc GetPolicy(Policy) returns (Policy) {}
  rpc GetPolicies(Policy) returns (stream Policy) {}
  rpc ModPolicy(ModPolicyArguments) returns (Error) {}
  rpc GetPolicyAssignment(PolicyAssignment) returns (PolicyAssignment) {}
  rpc ModPolicyAssignment(ModPolicyAssignmentArguments) returns (Error) {}
}

message Error {
    enum ErrorCode {
        SUCCESS = 0;
        FAIL = 1;
    }
    ErrorCode code = 1;
    string msg = 2;
}

message Arguments {
    Resource resource = 1;
    uint32 family = 2;
    string name = 3;
}

message ModPathArguments {
    Operation operation = 1;
    Resource resource = 2;
    string name = 3;
    Path path = 4;
    // uuid field can be only used when operation is DEL
    bytes uuid = 5;
    // family field is only used when operation is DEL_ALL
    uint32 family = 6;
}

message ModPathResponse {
    bytes uuid = 1;
}

message ModPathsArguments {
    Resource resource = 1;
    string name = 2;
    repeated Path paths = 3;
}

message ModNeighborArguments {
    Operation operation = 1;
    Peer peer = 2;
}

message MrtArguments {
    Resource resource = 1;
    uint32 family = 2;
    uint64 interval = 3;
    string neighbor_address = 4;
}

message ModMrtArguments {
    Operation operation = 1;
    int32 dump_type = 2;
    string filename = 3;
    uint64 interval = 4;
}

message ModBmpArguments {
    Operation operation = 1;
    string address = 2;
    uint32 port = 3;
    enum MonitoringPolicy {
        PRE = 0;
        POST = 1;
        BOTH = 2;
    }
    MonitoringPolicy type = 4;
}

message ModRpkiArguments {
    Operation operation = 1;
    string address = 2;
    uint32 port = 3;
}

message ModVrfArguments {
    Operation operation = 1;
    Vrf vrf = 2;
}

message ModDefinedSetArguments {
    Operation operation = 1;
    DefinedSet set = 2;
}

message ModStatementArguments {
    Operation operation = 1;
    Statement statement = 2;
}

message ModPolicyArguments {
    Operation operation = 1;
    Policy policy = 2;
    // if this flag is set, gobgpd won't define new statements
    // but refer existing statements using statement's names in this arguments.
    // this flag only works with Operation_ADD
    bool refer_existing_statements = 3;
    // if this flag is set, gobgpd won't delete any statements
    // even if some statements get not used by any policy by this operation.
    // this flag means nothing if it is used with Operation_ADD
    bool preserve_statements = 4;
}

message ModPolicyAssignmentArguments {
    Operation operation = 1;
    PolicyAssignment assignment = 2;
}

message ModGlobalConfigArguments {
    Operation operation = 1;
    Global global = 2;
}

enum Resource {
    GLOBAL = 0;
    LOCAL = 1;
    ADJ_IN = 2;
    ADJ_OUT = 3;
    VRF = 4;
}

enum Operation {
    ADD = 0;
    DEL = 1;
    DEL_ALL = 2;
    REPLACE = 3;
    ENABLE = 4;
    DISABLE = 5;
    RESET = 6;
    SOFTRESET = 7;
}

message Path {
    bytes nlri = 1;
    repeated bytes pattrs = 2;
    int64 age = 3;
    bool best = 4;
    bool is_withdraw = 5;
    int32 validation = 6;
    bool no_implicit_withdraw = 7;
    uint32 family = 8;
    uint32 source_asn = 9;
    string source_id = 10;
    bool filtered = 11;
    bool stale = 12;
    bool is_from_external = 13;
    string neighbor_ip = 14;
}

message Destination {
    string prefix = 1;
    repeated Path paths = 2;
    bool longer_prefixes = 3;
}

message Table {
    Resource type = 1;
    string name = 2;
    uint32 family = 3;
    repeated Destination destinations = 4;
    bool post_policy = 5;
}

message Peer {
  repeated uint32 families = 2;
  ApplyPolicy apply_policy = 3;
  PeerConf conf = 5;
  EbgpMultihop ebgp_multihop = 6;
  RouteReflector route_reflector = 10;
  PeerState info = 11;
  Timers timers = 12;
  Transport transport = 13;
  RouteServer route_server = 15;
}

message ApplyPolicy {
  PolicyAssignment in_policy = 1;
  PolicyAssignment export_policy = 2;
  PolicyAssignment import_policy = 3;
}

message PeerConf {
  string auth_password = 1;
  string description = 2;
  uint32 local_as = 3;
  string neighbor_address = 4;
  uint32 peer_as = 5;
  string peer_group = 6;
  uint32 peer_type = 7;
  uint32 remove_private_as = 8;
  bool route_flap_damping = 9;
  uint32 send_community = 10;
  repeated bytes remote_cap = 11;
  repeated bytes local_cap = 12;
  string id = 13;
}

message EbgpMultihop {
  bool enabled = 1;
  uint32 multihop_ttl = 2;
}

message RouteReflector {
  bool route_reflector_client = 1;
  uint32 route_reflector_cluster_id = 2;
  }

message PeerState {
  string auth_password = 1;
  string description = 2;
  uint32 local_as = 3;
  Messages messages = 4;
  string neighbor_address = 5;
  uint32 peer_as = 6;
  string peer_group = 7;
  uint32 peer_type = 8;
  Queues queues = 9;
  uint32 remove_private_as = 10;
  bool route_flap_damping = 11;
  uint32 send_community = 12;
  uint32 session_state = 13;
  repeated string supported_capabilities = 14;
  string bgp_state = 15;
  string admin_state = 16;
  uint32 received = 17;
  uint32 accepted = 18;
  uint32 advertised = 19;
  uint32 out_q = 20;
  uint32 flops = 21;
}

message Messages {
  Message received = 1;
  Message sent = 2;
}

message Message {
  uint64 NOTIFICATION = 1;
  uint64 UPDATE = 2;
  uint64 OPEN = 3;
  uint64 KEEPALIVE = 4;
  uint64 REFRESH = 5;
  uint64 DISCARDED = 6;
  uint64 TOTAL = 7;
}

message Queues {
  uint32 input = 1;
  uint32 output = 2;
}

message Timers {
 TimersConfig config =1;
 TimersState state = 2;
}

message TimersConfig{
   uint64 connect_retry = 1;
   uint64 hold_time = 2;
   uint64 keepalive_interval = 3;
   uint64 minimum_advertisement_interval = 4;
}

message TimersState{
   uint64 connect_retry = 1;
   uint64 hold_time = 2;
   uint64 keepalive_interval = 3;
   uint64 minimum_advertisement_interval = 4;
   uint64 negotiated_hold_time = 5;
   uint64 uptime = 6;
   uint64 downtime = 7;
}

message Transport {
  string local_address = 1;
  uint32 local_port = 2;
  bool mtu_discovery = 3;
  bool passive_mode = 4;
  string remote_address = 5;
  uint32 remote_port = 6;
  uint32 tcp_mss = 7;
  }

message RouteServer {
  bool route_server_client = 1;
}

message Prefix {
    string ip_prefix  = 1;
    uint32 mask_length_min = 2;
    uint32 mask_length_max = 3;
}

enum DefinedType {
    PREFIX = 0;
    NEIGHBOR = 1;
    TAG = 2;
    AS_PATH = 3;
    COMMUNITY = 4;
    EXT_COMMUNITY = 5;
}

message DefinedSet {
    DefinedType type = 1;
    string name = 2;
    repeated string list = 3;
    repeated Prefix prefixes = 4;
}

enum MatchType {
    ANY = 0;
    ALL = 1;
    INVERT = 2;
}

message MatchSet {
    MatchType type = 1;
    string name = 2;
}

enum AsPathLengthType {
    EQ = 0;
    GE = 1;
    LE = 2;
}

message AsPathLength {
    AsPathLengthType type = 1;
    uint32 length = 2;
}

message Conditions {
    MatchSet prefix_set = 1;
    MatchSet neighbor_set = 2;
    AsPathLength as_path_length = 3;
    MatchSet as_path_set = 4;
    MatchSet community_set = 5;
    MatchSet ext_community_set = 6;
    int32 rpki_result = 7;
}

enum RouteAction {
    NONE = 0;
    ACCEPT = 1;
    REJECT = 2;
}

enum CommunityActionType {
    COMMUNITY_ADD = 0;
    COMMUNITY_REMOVE = 1;
    COMMUNITY_REPLACE = 2;
}

message CommunityAction {
    CommunityActionType type = 1;
    repeated string communities = 2;
}

enum MedActionType {
    MED_MOD = 0;
    MED_REPLACE = 1;
}

message MedAction {
    MedActionType type = 1;
    int64 value = 2;
}

message AsPrependAction {
    uint32 asn = 1;
    uint32 repeat = 2;
    bool use_left_most = 3;
}

message Actions {
    RouteAction route_action = 1;
    CommunityAction community = 2;
    MedAction med = 3;
    AsPrependAction as_prepend = 4;
    CommunityAction ext_community = 5;
}

message Statement {
    string name = 1;
    Conditions conditions = 2;
    Actions actions = 3;
}

message Policy {
    string name = 1;
    repeated Statement statements = 2;
}

enum PolicyType {
    IN = 0;
    IMPORT = 1;
    EXPORT = 2;
}

message PolicyAssignment {
    PolicyType type = 1;
    Resource resource = 2;
    string name = 3;
    repeated Policy policies = 4;
    RouteAction default = 5;
}

message MrtMessage {
    bytes data = 1;
}

message RPKIConf {
    string address = 1;
    string remote_port = 2;
}

message RPKIState {
    int64 uptime = 1;
    int64 downtime = 2;
    bool  up = 3;
    uint32 record_ipv4 = 4;
    uint32 record_ipv6 = 5;
    uint32 prefix_ipv4 = 6;
    uint32 prefix_ipv6 = 7;
    uint32 serial = 8;
    int64 received_ipv4 = 9;
    int64 received_ipv6 = 10;
    int64 serial_notify = 11;
    int64 cache_reset = 12;
    int64 cache_response = 13;
    int64 end_of_data = 14;
    int64 error = 15;
    int64 serial_query = 16;
    int64 reset_query = 17;
}

message RPKI {
    RPKIConf conf = 1;
    RPKIState state = 2;
}

message ROA {
    uint32 as = 1;
    uint32 prefixlen = 2;
    uint32 maxlen = 3;
    string prefix = 4;
    RPKIConf conf = 5;
}

message ROAResult {
    enum ValidationReason {
        UPDATE = 0;
        WITHDRAW = 1;
        PEER_DOWN = 2;
	REVALIDATE = 3;
    }
    ValidationReason reason = 1;
    string address = 2;
    int64 timestamp = 3;
    bytes aspath_attr = 4;
    uint32 origin_as = 5;
    string prefix = 6;
    enum ValidationResult {
        NONE = 0;
        NOT_FOUND = 1;
        VALID = 2;
        INVALID = 3;
    }
    ValidationResult old_result = 7;
    ValidationResult new_result = 8;
    repeated ROA roas = 9;
}

message Vrf {
    string name = 1;
    bytes rd = 2;
    repeated bytes import_rt = 3;
    repeated bytes export_rt = 4;
}

message Global {
    uint32 as = 1;
    string router_id = 2;
    int32 listen_port = 3;
    repeated string listen_addresses = 4;
    repeated uint32 families = 5;
    uint32 mpls_label_min = 6;
    uint32 mpls_label_max = 7;
    bool collector = 8;
}
