2017-07-14 02:17:44 +05:30

1045 lines
21 KiB
Protocol Buffer

// Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied.
// See the License for the specific language governing permissions and
// limitations under the License.
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 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) {}
}
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;
}
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;
}
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 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;
bytes uuid = 15; // only paths installed by AddPath API have this
bool is_nexthop_invalid = 16;
uint32 identifier = 17;
}
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;
}
message ValidateRibRequest {
Resource type = 1;
uint32 family = 2;
string prefix = 3;
}
message ValidateRibResponse {
}
message Peer {
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;
}
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 mode, 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;
}
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;
}