// 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 StartServer(StartServerRequest) returns (StartServerResponse) {}
  rpc StopServer(StopServerRequest) returns (StopServerResponse) {}
  rpc GetServer(GetServerRequest) returns (GetServerResponse) {}
  rpc AddNeighbor(AddNeighborRequest) returns (AddNeighborResponse) {}
  rpc DeleteNeighbor(DeleteNeighborRequest) returns (DeleteNeighborResponse) {}
  rpc GetNeighbor(GetNeighborRequest) returns (GetNeighborResponse) {}
  rpc ResetNeighbor(ResetNeighborRequest) returns (ResetNeighborResponse) {}
  rpc SoftResetNeighbor(SoftResetNeighborRequest) returns (SoftResetNeighborResponse) {}
  rpc ShutdownNeighbor(ShutdownNeighborRequest) returns (ShutdownNeighborResponse) {}
  rpc EnableNeighbor(EnableNeighborRequest) returns (EnableNeighborResponse) {}
  rpc DisableNeighbor(DisableNeighborRequest) returns (DisableNeighborResponse) {}
  rpc GetRib(GetRibRequest) returns (GetRibResponse) {}
  rpc GetPath(GetPathRequest) returns (stream Path) {}
  rpc ValidateRib(ValidateRibRequest) returns (ValidateRibResponse) {}
  rpc AddPath(AddPathRequest) returns (AddPathResponse) {}
  rpc DeletePath(DeletePathRequest) returns (DeletePathResponse) {}
  rpc MonitorRib(MonitorRibRequest) returns (stream Destination) {}
  rpc MonitorPeerState(Arguments) returns (stream Peer) {}
  rpc EnableMrt(EnableMrtRequest) returns (EnableMrtResponse) {}
  rpc DisableMrt(DisableMrtRequest) returns (DisableMrtResponse) {}
  rpc InjectMrt(stream InjectMrtRequest) returns (InjectMrtResponse) {}
  rpc AddBmp(AddBmpRequest) returns (AddBmpResponse) {}
  rpc DeleteBmp(DeleteBmpRequest) returns (DeleteBmpResponse) {}
  rpc GetRpki(GetRpkiRequest) returns (GetRpkiResponse) {}
  rpc AddRpki(AddRpkiRequest) returns (AddRpkiResponse) {}
  rpc DeleteRpki(DeleteRpkiRequest) returns (DeleteRpkiResponse) {}
  rpc EnableRpki(EnableRpkiRequest) returns (EnableRpkiResponse) {}
  rpc DisableRpki(DisableRpkiRequest) returns (DisableRpkiResponse) {}
  rpc ResetRpki(ResetRpkiRequest) returns (ResetRpkiResponse) {}
  rpc SoftResetRpki(SoftResetRpkiRequest) returns (SoftResetRpkiResponse) {}
  rpc GetRoa(GetRoaRequest) returns (GetRoaResponse) {}
  rpc EnableZebra(EnableZebraRequest) returns (EnableZebraResponse) {}
  rpc AddVrf(AddVrfRequest) returns (AddVrfResponse) {}
  rpc DeleteVrf(DeleteVrfRequest) returns (DeleteVrfResponse) {}
  rpc GetVrf(GetVrfRequest) returns (GetVrfResponse) {}
  rpc GetDefinedSet(GetDefinedSetRequest) returns (GetDefinedSetResponse) {}
  rpc AddDefinedSet(AddDefinedSetRequest) returns (AddDefinedSetResponse) {}
  rpc DeleteDefinedSet(DeleteDefinedSetRequest) returns (DeleteDefinedSetResponse) {}
  rpc ReplaceDefinedSet(ReplaceDefinedSetRequest) returns (ReplaceDefinedSetResponse) {}
  rpc GetStatement(GetStatementRequest) returns (GetStatementResponse) {}
  rpc AddStatement(AddStatementRequest) returns (AddStatementResponse) {}
  rpc DeleteStatement(DeleteStatementRequest) returns (DeleteStatementResponse) {}
  rpc ReplaceStatement(ReplaceStatementRequest) returns (ReplaceStatementResponse) {}
  rpc GetPolicy(GetPolicyRequest) returns (GetPolicyResponse) {}
  rpc AddPolicy(AddPolicyRequest) returns (AddPolicyResponse) {}
  rpc DeletePolicy(DeletePolicyRequest) returns (DeletePolicyResponse) {}
  rpc ReplacePolicy(ReplacePolicyRequest) returns (ReplacePolicyResponse) {}
  rpc GetPolicyAssignment(GetPolicyAssignmentRequest) returns (GetPolicyAssignmentResponse) {}
  rpc AddPolicyAssignment(AddPolicyAssignmentRequest) returns (AddPolicyAssignmentResponse) {}
  rpc DeletePolicyAssignment(DeletePolicyAssignmentRequest) returns (DeletePolicyAssignmentResponse) {}
  rpc ReplacePolicyAssignment(ReplacePolicyAssignmentRequest) returns (ReplacePolicyAssignmentResponse) {}
  rpc GetRibInfo(GetRibInfoRequest) returns (GetRibInfoResponse) {}
}

// Constants for address families
enum Family {
  _ = 0;
  IPv4 = 65537;
  IPv6 = 131073;
  IPv4_MC = 65538;
  IPv6_MC = 131074;
  IPv4_MPLS = 65540;
  IPv6_MPLS = 131076;
  IPv4_VPN = 65664;
  IPv6_VPN = 131200;
  IPv4_VPN_MC = 65665;
  IPv6_VPN_MC = 131201;
  VPLS = 1638465;
  EVPN = 1638470;
  RTC = 65668;
  IPv4_ENCAP = 65543;
  IPv6_ENCAP = 131079;
  FLOW_SPEC_IPv4 = 65669;
  FLOW_SPEC_IPv6 = 131205;
  FLOW_SPEC_IPv4_VPN = 65670;
  FLOW_SPEC_IPv6_VPN = 131206;
  FLOW_SPEC_L2_VPN = 1638534;
  OPAQUE = 1074594033;
}

message GetNeighborRequest {
  bool enableAdvertised = 1;
  string address        = 2;
}

message GetNeighborResponse {
  repeated Peer peers = 1;
}

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

message AddPathRequest {
  Resource resource = 1;
  string vrf_id = 2;
  Path path = 3;
}

message AddPathResponse {
  bytes uuid = 1;
}

message DeletePathRequest {
  Resource resource = 1;
  string vrf_id = 2;
  uint32 family = 3;
  Path path = 4;
  bytes uuid = 5;
}

message DeletePathResponse {
}

message AddNeighborRequest {
  Peer peer = 1;
}

message AddNeighborResponse {
}

message DeleteNeighborRequest {
  Peer peer = 1;
}

message DeleteNeighborResponse {
}

message ResetNeighborRequest {
  string address = 1;
  string communication = 2;
}

message ResetNeighborResponse {
}

message SoftResetNeighborRequest {
  string address = 1;
  enum SoftResetDirection {
    IN = 0;
    OUT = 1;
    BOTH = 2;
  }
  SoftResetDirection direction = 2;
}

message SoftResetNeighborResponse {
}

message ShutdownNeighborRequest {
  string address = 1;
  string communication = 2;
}

message ShutdownNeighborResponse {
}

message EnableNeighborRequest {
  string address = 1;
}

message EnableNeighborResponse {
}

message DisableNeighborRequest {
  string address = 1;
  string communication = 2;
}

message DisableNeighborResponse {
}

message EnableMrtRequest {
  int32 dump_type = 1;
  string filename = 2;
  uint64 interval = 3;
}

message EnableMrtResponse {
}

message DisableMrtRequest {
}

message DisableMrtResponse {
}

message InjectMrtRequest {
  Resource resource = 1;
  string vrf_id = 2;
  repeated Path paths = 3;
}

message InjectMrtResponse {
}

message AddBmpRequest {
  string address = 1;
  uint32 port = 2;
  enum MonitoringPolicy {
    PRE = 0;
    POST = 1;
    BOTH = 2;
    LOCAL = 3;
    ALL = 4;
  }
  MonitoringPolicy type = 3;
}

message AddBmpResponse {
}

message DeleteBmpRequest {
  string address = 1;
  uint32 port = 2;
}

message DeleteBmpResponse {
}

message MonitorRibRequest {
    Table table = 1;
    bool current = 2;
}

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 GetRpkiRequest {
  uint32 family = 1;
}

message GetRpkiResponse {
  repeated Rpki servers = 1;
}

message AddRpkiRequest {
  string address = 1;
  uint32 port = 2;
  int64 lifetime = 3;
}

message AddRpkiResponse {
}

message DeleteRpkiRequest {
  string address = 1;
  uint32 port = 2;
}

message DeleteRpkiResponse {
}

message EnableRpkiRequest {
  string address = 1;
}

message EnableRpkiResponse {
}

message DisableRpkiRequest {
  string address = 1;
}

message DisableRpkiResponse {
}

message ResetRpkiRequest {
  string address = 1;
}

message ResetRpkiResponse {
}

message SoftResetRpkiRequest {
  string address = 1;
}

message SoftResetRpkiResponse {
}

message EnableZebraRequest {
  string url = 1;
  repeated string route_types = 2;
  uint32 version = 3;
  bool nexthop_trigger_enable = 4;
  uint32 nexthop_trigger_delay = 5;
}

message EnableZebraResponse {
}

message GetVrfRequest {
}

message GetVrfResponse {
  repeated Vrf vrfs = 1;
}

message AddVrfRequest {
  Vrf vrf = 1;
}

message AddVrfResponse {
}

message DeleteVrfRequest {
  Vrf vrf = 1;
}

message DeleteVrfResponse {
}

message GetDefinedSetRequest {
  DefinedType type = 1;
  string name = 2;
}

message GetDefinedSetResponse {
  repeated DefinedSet sets = 1;
}

message AddDefinedSetRequest {
  DefinedSet set = 1;
}

message AddDefinedSetResponse {
}

message DeleteDefinedSetRequest {
  DefinedSet set = 1;
  bool all = 2;
}

message DeleteDefinedSetResponse {
}

message ReplaceDefinedSetRequest {
  DefinedSet set = 1;
}

message ReplaceDefinedSetResponse {
}

message GetStatementRequest {
}

message GetStatementResponse {
  repeated Statement statements = 1;
}

message AddStatementRequest {
  Statement statement = 1;
}

message AddStatementResponse {
}

message DeleteStatementRequest {
  Statement statement = 1;
  bool all = 2;
}

message DeleteStatementResponse {
}

message ReplaceStatementRequest {
  Statement statement = 1;
}

message ReplaceStatementResponse {
}

message GetPolicyRequest {
}

message GetPolicyResponse {
  repeated Policy policies = 1;
}

message AddPolicyRequest {
  Policy policy = 1;
  // if this flag is set, gobgpd won't define new statements
  // but refer existing statements using statement's names in this arguments.
  bool refer_existing_statements = 2;
}

message AddPolicyResponse {
}

message DeletePolicyRequest {
  Policy policy = 1;
  // if this flag is set, gobgpd won't delete any statements
  // even if some statements get not used by any policy by this operation.
  bool preserve_statements = 2;
  bool all = 3;
}

message DeletePolicyResponse {
}

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

message ReplacePolicyResponse {
}

message GetPolicyAssignmentRequest {
  PolicyAssignment assignment = 1;
}

message GetPolicyAssignmentResponse {
  PolicyAssignment assignment = 1;
}

message AddPolicyAssignmentRequest {
  PolicyAssignment assignment = 1;
}

message AddPolicyAssignmentResponse {
}

message DeletePolicyAssignmentRequest {
  PolicyAssignment assignment = 1;
  bool all = 2;
}

message DeletePolicyAssignmentResponse {
}

message ReplacePolicyAssignmentRequest {
  PolicyAssignment assignment = 1;
}

message ReplacePolicyAssignmentResponse {
}

message GetServerRequest {
}

message GetServerResponse {
  Global global = 1;
}

message StartServerRequest {
  Global global = 1;
}

message StartServerResponse {
}

message StopServerRequest {
}

message StopServerResponse {
}

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

message RPKIValidation{
  enum State {
    STATE_NONE = 0;
    STATE_NOT_FOUND = 1;
    STATE_VALID = 2;
    STATE_INVALID = 3;
  }

  enum Reason {
    REASOT_NONE = 0;
    REASON_AS = 1;
    REASON_LENGTH = 2;
  }

  State state = 1;
  Reason reason = 2;
  repeated Roa matched = 3;
  repeated Roa unmatched_as = 4;
  repeated Roa unmatched_length = 5;
}

message Path {
  bytes nlri = 1;
  repeated bytes pattrs = 2;
  int64 age = 3;
  bool best = 4;
  bool is_withdraw = 5;
  int32 validation = 6; // remains for backword compatibility
  RPKIValidation validation_detail = 7;
  bool no_implicit_withdraw = 8;
  uint32 family = 9;
  uint32 source_asn = 10;
  string source_id = 11;
  bool filtered = 12;
  bool stale = 13;
  bool is_from_external = 14;
  string neighbor_ip = 15;
  bytes uuid = 16; // only paths installed by AddPath API have this
  bool is_nexthop_invalid = 17;
  uint32 identifier = 18;
  uint32 local_identifier = 19;
}

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

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

message GetRibRequest {
  Table table = 1;
}

message GetRibResponse {
  Table table = 1;
}

// API representation of table.LookupOption
enum TableLookupOption {
  LOOKUP_EXACT = 0;
  LOOKUP_LONGER = 1;
  LOOKUP_SHORTER = 2;
}

// API representation of table.LookupPrefix
message TableLookupPrefix {
  string prefix = 1;
  TableLookupOption lookup_option = 2;
}

message GetPathRequest {
  Resource type = 1;
  string name = 2;
  uint32 family = 3;
  repeated TableLookupPrefix prefixes = 4;
}

message ValidateRibRequest {
  Resource type = 1;
  uint32 family = 2;
  string prefix = 3;
}

message ValidateRibResponse {
}

message Peer {
  // Note: Regarding to the consistency with OpenConfig model, a list of
  // address family should be removed from here, and should be configured with
  // the list of AfiSafi instead.
  repeated uint32 families = 1;
  ApplyPolicy apply_policy = 2;
  PeerConf conf = 3;
  EbgpMultihop ebgp_multihop = 4;
  RouteReflector route_reflector = 5;
  PeerState info = 6;
  Timers timers = 7;
  Transport transport = 8;
  RouteServer route_server = 9;
  GracefulRestart graceful_restart = 10;
  repeated AfiSafi afi_safis = 11;
  AddPaths add_paths = 12;
}

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

message PrefixLimit {
  uint32 family = 1;
  uint32 max_prefixes = 2;
  uint32 shutdown_threshold_pct = 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;
  enum RemovePrivateAs {
      NONE = 0;
      ALL = 1;
      REPLACE = 2;
  }
  RemovePrivateAs 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;
  // Note: Regarding to the consistency with OpenConfig model, list of
  // PrefixLimit should be removed from here, and list of PrefixLimit in
  // AfiSafi should be used instead.
  repeated PrefixLimit prefix_limits = 14;
  string local_address = 15;
  string neighbor_interface = 16;
  string vrf = 17;
  uint32 allow_own_as = 18;
  bool replace_peer_as = 19;
}

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

message RouteReflector {
  bool route_reflector_client = 1;
  string 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;
  enum AdminState {
      UP = 0;
      DOWN = 1;
      PFX_CT = 2; // prefix counter over limit
  }
  AdminState 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 GracefulRestart {
  bool enabled = 1;
  uint32 restart_time = 2;
  bool helper_only = 3;
  uint32 deferral_time = 4;
  bool notification_enabled = 5;
  bool longlived_enabled = 6;
}

message MpGracefulRestartConfig {
  bool enabled = 1;
}

message MpGracefulRestartState {
  bool enabled = 1;
  bool received = 2;
  bool advertised = 3;
  bool end_of_rib_received = 4;
  bool end_of_rib_sent = 5;
}
message MpGracefulRestart {
  MpGracefulRestartConfig config = 1;
  MpGracefulRestartState state = 2;
}

message AfiSafiConfig {
  uint32 family = 1;
  bool enabled = 2;
}

message AfiSafiState {
  uint32 family = 1;
  bool enabled = 2;
  uint32 total_paths = 3;
  uint32 total_prefixes = 4;
}

message RouteSelectionOptionsConfig {
  bool always_compare_med = 1;
  bool ignore_as_path_length = 2;
  bool external_compare_router_id = 3;
  bool advertise_inactive_routes = 4;
  bool enable_aigp = 5;
  bool ignore_next_hop_igp_metric = 6;
}

message RouteSelectionOptionsState {
  bool always_compare_med = 1;
  bool ignore_as_path_length = 2;
  bool external_compare_router_id = 3;
  bool advertise_inactive_routes = 4;
  bool enable_aigp = 5;
  bool ignore_next_hop_igp_metric = 6;
}

message RouteSelectionOptions {
  RouteSelectionOptionsConfig config = 1;
  RouteSelectionOptionsState state = 2;
}

message UseMultiplePathsConfig {
  bool enabled = 1;
}

message UseMultiplePathsState {
  bool enabled = 1;
}

message EbgpConfig {
  bool allow_multiple_as = 1;
  uint32 maximum_paths = 2;
}

message EbgpState {
  bool allow_multiple_as = 1;
  uint32 maximum_paths = 2;
}

message Ebgp {
  EbgpConfig config = 1;
  EbgpState state = 2;
}

message IbgpConfig {
  uint32 maximum_paths = 1;
}

message IbgpState {
  uint32 maximum_paths = 1;
}

message Ibgp {
  IbgpConfig config = 1;
  IbgpState state = 2;
}

message UseMultiplePaths {
  UseMultiplePathsConfig config = 1;
  UseMultiplePathsState state = 2;
  Ebgp ebgp = 3;
  Ibgp ibgp = 4;
}

message RouteTargetMembershipConfig {
  uint32 deferral_time = 1;
}

message RouteTargetMembershipState {
  uint32 deferral_time = 1;
}

message RouteTargetMembership {
  RouteTargetMembershipConfig config = 1;
  RouteTargetMembershipState state = 2;
}

message LongLivedGracefulRestartConfig {
  bool enabled = 1;
  uint32 restart_time = 2;
}

message LongLivedGracefulRestartState {
  bool enabled = 1;
  bool received = 2;
  bool advertised = 3;
  uint32 peer_restart_time = 4;
  bool peer_restart_timer_expired = 5;
}

message LongLivedGracefulRestart {
  LongLivedGracefulRestartConfig config = 1;
  LongLivedGracefulRestartState state = 2;
}

message AfiSafi {
  MpGracefulRestart mp_graceful_restart = 1;
  AfiSafiConfig config = 2;
  ApplyPolicy apply_policy = 3;
  // TODO:
  // Support the following structures:
  // - Ipv4Unicast
  // - Ipv6Unicast
  // - Ipv4LabelledUnicast
  // - Ipv6LabelledUnicast
  // - L3vpnIpv4Unicast
  // - L3vpnIpv6Unicast
  // - L3vpnIpv4Multicast
  // - L3vpnIpv6Multicast
  // - L2vpnVpls
  // - L2vpnEvpn
  RouteSelectionOptions route_selection_options = 4;
  UseMultiplePaths use_multiple_paths = 5;
  PrefixLimit prefix_limits = 6;
  RouteTargetMembership route_target_membership = 7;
  LongLivedGracefulRestart long_lived_graceful_restart = 8;
  AddPaths add_paths = 9;
}

message AddPathsConfig {
  bool receive = 1;
  uint32 send_max = 2;
}

message AddPathsState {
  bool receive = 1;
  uint32 send_max = 2;
}

message AddPaths {
  AddPathsConfig config = 1;
  AddPathsState state = 2;
}

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;
  LARGE_COMMUNITY = 6;
}

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 RouteType {
    ROUTE_TYPE_NONE = 0;
    ROUTE_TYPE_INTERNAL = 1;
    ROUTE_TYPE_EXTERNAL = 2;
    ROUTE_TYPE_LOCAL = 3;
  }
  RouteType route_type = 8;
  MatchSet large_community_set = 9;
}

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 NexthopAction {
  string address = 1;
  bool self = 2;
}

message LocalPrefAction {
  uint32 value = 1;
}

message Actions {
  RouteAction route_action = 1;
  CommunityAction community = 2;
  MedAction med = 3;
  AsPrependAction as_prepend = 4;
  CommunityAction ext_community = 5;
  NexthopAction nexthop = 6;
  LocalPrefAction local_pref = 7;
  CommunityAction large_community = 8;
}

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 Roa {
  uint32 as = 1;
  uint32 prefixlen = 2;
  uint32 maxlen = 3;
  string prefix = 4;
  RPKIConf conf = 5;
}

message GetRoaRequest {
  uint32 family = 1;
}

message GetRoaResponse {
  repeated Roa roas = 1;
}

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

message Global {
  uint32 as = 1;
  string router_id = 2;
  int32 listen_port = 3;
  repeated string listen_addresses = 4;
  repeated uint32 families = 5;
  bool use_multiple_paths = 6;
}

message TableInfo {
  Resource type = 1;
  string name = 2;
  uint32 family = 3;
  uint64 num_destination = 4;
  uint64 num_path = 5;
  uint64 num_accepted = 6; // only meaningful when type == ADJ_IN
}

message GetRibInfoRequest {
    TableInfo info  = 1;
}

message GetRibInfoResponse {
    TableInfo info = 1;
}
