syntax = "proto3"; package xray.app.router.command; option csharp_namespace = "Xray.App.Router.Command"; option go_package = "github.com/xtls/xray-core/app/router/command"; option java_package = "com.xray.app.router.command"; option java_multiple_files = true; import "common/net/network.proto"; import "common/serial/typed_message.proto"; // RoutingContext is the context with information relative to routing process. // It conforms to the structure of xray.features.routing.Context and // xray.features.routing.Route. message RoutingContext { string InboundTag = 1; xray.common.net.Network Network = 2; repeated bytes SourceIPs = 3; repeated bytes TargetIPs = 4; uint32 SourcePort = 5; uint32 TargetPort = 6; string TargetDomain = 7; string Protocol = 8; string User = 9; map Attributes = 10; repeated string OutboundGroupTags = 11; string OutboundTag = 12; } // SubscribeRoutingStatsRequest subscribes to routing statistics channel if // opened by xray-core. // * FieldSelectors selects a subset of fields in routing statistics to return. // Valid selectors: // - inbound: Selects connection's inbound tag. // - network: Selects connection's network. // - ip: Equivalent as "ip_source" and "ip_target", selects both source and // target IP. // - port: Equivalent as "port_source" and "port_target", selects both source // and target port. // - domain: Selects target domain. // - protocol: Select connection's protocol. // - user: Select connection's inbound user email. // - attributes: Select connection's additional attributes. // - outbound: Equivalent as "outbound" and "outbound_group", select both // outbound tag and outbound group tags. // * If FieldSelectors is left empty, all fields will be returned. message SubscribeRoutingStatsRequest { repeated string FieldSelectors = 1; } // TestRouteRequest manually tests a routing result according to the routing // context message. // * RoutingContext is the routing message without outbound information. // * FieldSelectors selects the fields to return in the routing result. All // fields are returned if left empty. // * PublishResult broadcasts the routing result to routing statistics channel // if set true. message TestRouteRequest { RoutingContext RoutingContext = 1; repeated string FieldSelectors = 2; bool PublishResult = 3; } message PrincipleTargetInfo { repeated string tag = 1; } message OverrideInfo { string target = 2; } message BalancerMsg { OverrideInfo override = 5; PrincipleTargetInfo principle_target = 6; } message GetBalancerInfoRequest { string tag = 1; } message GetBalancerInfoResponse { BalancerMsg balancer = 1; } message OverrideBalancerTargetRequest { string balancerTag = 1; string target = 2; } message OverrideBalancerTargetResponse {} message AddRuleRequest { xray.common.serial.TypedMessage config = 1; bool shouldAppend = 2; } message AddRuleResponse {} message RemoveRuleRequest { string ruleTag = 1; } message RemoveRuleResponse {} service RoutingService { rpc SubscribeRoutingStats(SubscribeRoutingStatsRequest) returns (stream RoutingContext) {} rpc TestRoute(TestRouteRequest) returns (RoutingContext) {} rpc GetBalancerInfo(GetBalancerInfoRequest) returns (GetBalancerInfoResponse){} rpc OverrideBalancerTarget(OverrideBalancerTargetRequest) returns (OverrideBalancerTargetResponse) {} rpc AddRule(AddRuleRequest) returns (AddRuleResponse) {} rpc RemoveRule(RemoveRuleRequest) returns (RemoveRuleResponse) {} } message Config {}