From 82d78a63a1b328c74c4923077d1c16f45cc7580b Mon Sep 17 00:00:00 2001 From: Roy Date: Thu, 15 Jan 2026 23:12:06 +0000 Subject: [PATCH] Add flush operation support in apigen. --- dataplane/apigen/ccgen/ccgen.go | 24 +- dataplane/apigen/saiast/saiast.go | 5 + dataplane/apigen/typeinfo/typeinfo.go | 27 +- dataplane/proto/sai/fdb.pb.go | 486 +++++++++++++------------- dataplane/proto/sai/fdb.proto | 38 +- dataplane/proto/sai/fdb_grpc.pb.go | 68 ++-- dataplane/saiserver/fdb.go | 4 +- dataplane/standalone/sai/enum.cc | 47 ++- dataplane/standalone/sai/enum.h | 127 +++---- dataplane/standalone/sai/fdb.cc | 41 ++- dataplane/standalone/sai/tunnel.cc | 4 +- go.work.sum | 11 + 12 files changed, 514 insertions(+), 368 deletions(-) diff --git a/dataplane/apigen/ccgen/ccgen.go b/dataplane/apigen/ccgen/ccgen.go index ae79cd69d..6a47ff634 100644 --- a/dataplane/apigen/ccgen/ccgen.go +++ b/dataplane/apigen/ccgen/ccgen.go @@ -25,7 +25,6 @@ import ( ) var unsupportedEnum = map[string]struct{}{ - "FDB_FLUSH": {}, "HOSTIF_PACKET": {}, } @@ -243,6 +242,13 @@ lemming::dataplane::sai::{{ .ReturnType }} msg; for(uint32_t i = 0; i < attr_count; i++ ) { {{ template "getattr" .AttrSwitch }} } +{{- else if eq .Operation "flush" }} +lemming::dataplane::sai::{{ .ProtoRequestType }} msg; +msg.set_switch_(switch_id); + for(uint32_t i = 0; i < attr_count; i++ ) { + {{ .AttrConvertInsert }} + {{ template "setattr" .AttrSwitch }} +} {{- end }} return msg; } @@ -417,6 +423,22 @@ return msg; } {{ end }} return SAI_STATUS_SUCCESS; + {{- else if eq .Operation "flush" }} + lemming::dataplane::sai::{{ .ProtoRequestType }} req = {{.ConvertFunc}}(switch_id, {{.Vars}}); + lemming::dataplane::sai::{{ .ProtoResponseType }} resp; + grpc::ClientContext context; + + grpc::Status status = {{ .Client }}->{{ .ProtoRPCName }}(&context, req, &resp); + if (!status.ok()) { + auto it = context.GetServerTrailingMetadata().find("traceparent"); + if (it != context.GetServerTrailingMetadata().end()) { + LOG(ERROR) << "Lucius RPC error: Trace ID " << it->second << " msg: " << status.error_message(); + } else { + LOG(ERROR) << "Lucius RPC error: " << status.error_message(); + } + return SAI_STATUS_FAILURE; + } + return SAI_STATUS_SUCCESS; {{- else }} return SAI_STATUS_NOT_IMPLEMENTED; {{- end }} diff --git a/dataplane/apigen/saiast/saiast.go b/dataplane/apigen/saiast/saiast.go index 2decbffee..e9021f547 100644 --- a/dataplane/apigen/saiast/saiast.go +++ b/dataplane/apigen/saiast/saiast.go @@ -143,6 +143,11 @@ func (sai *SAIAPI) GetFuncMeta(fn *TypeDecl) *FuncMetadata { } } + if meta.Name == "flush_fdb_entries" { + meta.Operation = "flush" + meta.TypeName = "FDB_FLUSH" + } + return meta } diff --git a/dataplane/apigen/typeinfo/typeinfo.go b/dataplane/apigen/typeinfo/typeinfo.go index 025e7482d..a642a4d2a 100644 --- a/dataplane/apigen/typeinfo/typeinfo.go +++ b/dataplane/apigen/typeinfo/typeinfo.go @@ -125,7 +125,7 @@ func Data(doc *docparser.SAIInfo, sai *saiast.SAIAPI, protoPackage, protoGoPacka populateCCInfo(meta, apiName, sai, doc, fn, gFunc) - if gFunc.Operation == getAttrOp { + if gFunc.Operation == getAttrOp || gFunc.Operation == flushOp { enum := genProtoEnum(doc, apiName, meta) if enum != nil { data.APIs[apiName].Enums = append(data.APIs[apiName].Enums, *enum) @@ -134,7 +134,7 @@ func Data(doc *docparser.SAIInfo, sai *saiast.SAIAPI, protoPackage, protoGoPacka data.APIs[apiName].Funcs = append(data.APIs[apiName].Funcs, fns...) data.APIs[apiName].Types = append(data.APIs[apiName].Types, msgs...) } - if gFunc.Operation == createOp { + if gFunc.Operation == createOp || gFunc.Operation == flushOp { convertFn := genConvertFunc(gFunc, meta, doc, sai, fn) data.APIs[apiName].ConvertFuncs = append(data.APIs[apiName].ConvertFuncs, convertFn) } @@ -153,8 +153,12 @@ func genConvertFunc(genFunc *GenFunc, meta *saiast.FuncMetadata, info *docparser ProtoResponseType: genFunc.ProtoResponseType, } paramDefs, paramVars := getParamDefs(sai.Funcs[fn.Typ].Params) - convertFn.Args = strings.Join(paramDefs[1:], ", ") - convertFn.Vars = strings.Join(paramVars[1:], ", ") + startIdx := 1 + if genFunc.Operation == flushOp { + startIdx = 0 + } + convertFn.Args = strings.Join(paramDefs[startIdx:], ", ") + convertFn.Vars = strings.Join(paramVars[startIdx:], ", ") convertFn.AttrSwitch = &AttrSwitch{ Var: "attr_list[i].id", ProtoVar: "msg", @@ -249,6 +253,8 @@ func populateCCInfo(meta *saiast.FuncMetadata, apiName string, sai *saiast.SAIAP } switch genFunc.Operation { + case flushOp: + genFunc.ConvertFunc = strcase.SnakeCase("convert_" + meta.Name) case createOp: genFunc.ConvertFunc = strcase.SnakeCase("convert_create " + meta.TypeName) case getAttrOp: @@ -359,6 +365,7 @@ const ( createOp = "create" getAttrOp = "get_attribute" setAttrOp = "set_attribute" + flushOp = "flush" ) type accessorType int @@ -637,6 +644,18 @@ func genProtoReqResp(docInfo *docparser.SAIInfo, apiName string, meta *saiast.Fu // Handle proto generation switch meta.Operation { + case flushOp: + req.Fields = append(req.Fields, protoTmplField{ + Index: 1, + ProtoType: "uint64", + Name: "switch", + }) + attrs, err := CreateAttrs(2, meta.TypeName, docInfo, docInfo.Attrs[meta.TypeName].CreateFields) + if err != nil { + return nil, nil, err + } + req.Fields = append(req.Fields, attrs...) + req.Option = "option (sai_type) = OBJECT_TYPE_UNSPECIFIED" case createOp: requestIdx := 1 if meta.IsSwitchScoped { diff --git a/dataplane/proto/sai/fdb.pb.go b/dataplane/proto/sai/fdb.pb.go index 1e0921786..6311c0b66 100644 --- a/dataplane/proto/sai/fdb.pb.go +++ b/dataplane/proto/sai/fdb.pb.go @@ -604,27 +604,30 @@ func (x *GetFdbEntryAttributeResponse) GetAttr() *FdbEntryAttribute { return nil } -type CreateFdbEntriesRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Reqs []*CreateFdbEntryRequest `protobuf:"bytes,1,rep,name=reqs,proto3" json:"reqs,omitempty"` +type FlushFdbEntriesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Switch uint64 `protobuf:"varint,1,opt,name=switch,proto3" json:"switch,omitempty"` + BridgePortId *uint64 `protobuf:"varint,2,opt,name=bridge_port_id,json=bridgePortId,proto3,oneof" json:"bridge_port_id,omitempty"` + BvId *uint64 `protobuf:"varint,3,opt,name=bv_id,json=bvId,proto3,oneof" json:"bv_id,omitempty"` + EntryType *FdbFlushEntryType `protobuf:"varint,4,opt,name=entry_type,json=entryType,proto3,enum=lemming.dataplane.sai.FdbFlushEntryType,oneof" json:"entry_type,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *CreateFdbEntriesRequest) Reset() { - *x = CreateFdbEntriesRequest{} +func (x *FlushFdbEntriesRequest) Reset() { + *x = FlushFdbEntriesRequest{} mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateFdbEntriesRequest) String() string { +func (x *FlushFdbEntriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateFdbEntriesRequest) ProtoMessage() {} +func (*FlushFdbEntriesRequest) ProtoMessage() {} -func (x *CreateFdbEntriesRequest) ProtoReflect() protoreflect.Message { +func (x *FlushFdbEntriesRequest) ProtoReflect() protoreflect.Message { mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -636,39 +639,59 @@ func (x *CreateFdbEntriesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateFdbEntriesRequest.ProtoReflect.Descriptor instead. -func (*CreateFdbEntriesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use FlushFdbEntriesRequest.ProtoReflect.Descriptor instead. +func (*FlushFdbEntriesRequest) Descriptor() ([]byte, []int) { return file_dataplane_proto_sai_fdb_proto_rawDescGZIP(), []int{8} } -func (x *CreateFdbEntriesRequest) GetReqs() []*CreateFdbEntryRequest { +func (x *FlushFdbEntriesRequest) GetSwitch() uint64 { if x != nil { - return x.Reqs + return x.Switch } - return nil + return 0 } -type CreateFdbEntriesResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Resps []*CreateFdbEntryResponse `protobuf:"bytes,1,rep,name=resps,proto3" json:"resps,omitempty"` +func (x *FlushFdbEntriesRequest) GetBridgePortId() uint64 { + if x != nil && x.BridgePortId != nil { + return *x.BridgePortId + } + return 0 +} + +func (x *FlushFdbEntriesRequest) GetBvId() uint64 { + if x != nil && x.BvId != nil { + return *x.BvId + } + return 0 +} + +func (x *FlushFdbEntriesRequest) GetEntryType() FdbFlushEntryType { + if x != nil && x.EntryType != nil { + return *x.EntryType + } + return FdbFlushEntryType_FDB_FLUSH_ENTRY_TYPE_UNSPECIFIED +} + +type FlushFdbEntriesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *CreateFdbEntriesResponse) Reset() { - *x = CreateFdbEntriesResponse{} +func (x *FlushFdbEntriesResponse) Reset() { + *x = FlushFdbEntriesResponse{} mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateFdbEntriesResponse) String() string { +func (x *FlushFdbEntriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateFdbEntriesResponse) ProtoMessage() {} +func (*FlushFdbEntriesResponse) ProtoMessage() {} -func (x *CreateFdbEntriesResponse) ProtoReflect() protoreflect.Message { +func (x *FlushFdbEntriesResponse) ProtoReflect() protoreflect.Message { mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -680,39 +703,32 @@ func (x *CreateFdbEntriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateFdbEntriesResponse.ProtoReflect.Descriptor instead. -func (*CreateFdbEntriesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use FlushFdbEntriesResponse.ProtoReflect.Descriptor instead. +func (*FlushFdbEntriesResponse) Descriptor() ([]byte, []int) { return file_dataplane_proto_sai_fdb_proto_rawDescGZIP(), []int{9} } -func (x *CreateFdbEntriesResponse) GetResps() []*CreateFdbEntryResponse { - if x != nil { - return x.Resps - } - return nil -} - -type RemoveFdbEntriesRequest struct { +type CreateFdbEntriesRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Reqs []*RemoveFdbEntryRequest `protobuf:"bytes,1,rep,name=reqs,proto3" json:"reqs,omitempty"` + Reqs []*CreateFdbEntryRequest `protobuf:"bytes,1,rep,name=reqs,proto3" json:"reqs,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RemoveFdbEntriesRequest) Reset() { - *x = RemoveFdbEntriesRequest{} +func (x *CreateFdbEntriesRequest) Reset() { + *x = CreateFdbEntriesRequest{} mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RemoveFdbEntriesRequest) String() string { +func (x *CreateFdbEntriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RemoveFdbEntriesRequest) ProtoMessage() {} +func (*CreateFdbEntriesRequest) ProtoMessage() {} -func (x *RemoveFdbEntriesRequest) ProtoReflect() protoreflect.Message { +func (x *CreateFdbEntriesRequest) ProtoReflect() protoreflect.Message { mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -724,39 +740,39 @@ func (x *RemoveFdbEntriesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RemoveFdbEntriesRequest.ProtoReflect.Descriptor instead. -func (*RemoveFdbEntriesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateFdbEntriesRequest.ProtoReflect.Descriptor instead. +func (*CreateFdbEntriesRequest) Descriptor() ([]byte, []int) { return file_dataplane_proto_sai_fdb_proto_rawDescGZIP(), []int{10} } -func (x *RemoveFdbEntriesRequest) GetReqs() []*RemoveFdbEntryRequest { +func (x *CreateFdbEntriesRequest) GetReqs() []*CreateFdbEntryRequest { if x != nil { return x.Reqs } return nil } -type RemoveFdbEntriesResponse struct { +type CreateFdbEntriesResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - Resps []*RemoveFdbEntryResponse `protobuf:"bytes,1,rep,name=resps,proto3" json:"resps,omitempty"` + Resps []*CreateFdbEntryResponse `protobuf:"bytes,1,rep,name=resps,proto3" json:"resps,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RemoveFdbEntriesResponse) Reset() { - *x = RemoveFdbEntriesResponse{} +func (x *CreateFdbEntriesResponse) Reset() { + *x = CreateFdbEntriesResponse{} mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RemoveFdbEntriesResponse) String() string { +func (x *CreateFdbEntriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RemoveFdbEntriesResponse) ProtoMessage() {} +func (*CreateFdbEntriesResponse) ProtoMessage() {} -func (x *RemoveFdbEntriesResponse) ProtoReflect() protoreflect.Message { +func (x *CreateFdbEntriesResponse) ProtoReflect() protoreflect.Message { mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -768,41 +784,39 @@ func (x *RemoveFdbEntriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RemoveFdbEntriesResponse.ProtoReflect.Descriptor instead. -func (*RemoveFdbEntriesResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateFdbEntriesResponse.ProtoReflect.Descriptor instead. +func (*CreateFdbEntriesResponse) Descriptor() ([]byte, []int) { return file_dataplane_proto_sai_fdb_proto_rawDescGZIP(), []int{11} } -func (x *RemoveFdbEntriesResponse) GetResps() []*RemoveFdbEntryResponse { +func (x *CreateFdbEntriesResponse) GetResps() []*CreateFdbEntryResponse { if x != nil { return x.Resps } return nil } -type CreateFdbFlushRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - BridgePortId *uint64 `protobuf:"varint,1,opt,name=bridge_port_id,json=bridgePortId,proto3,oneof" json:"bridge_port_id,omitempty"` - BvId *uint64 `protobuf:"varint,2,opt,name=bv_id,json=bvId,proto3,oneof" json:"bv_id,omitempty"` - EntryType *int32 `protobuf:"varint,3,opt,name=entry_type,json=entryType,proto3,oneof" json:"entry_type,omitempty"` +type RemoveFdbEntriesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Reqs []*RemoveFdbEntryRequest `protobuf:"bytes,1,rep,name=reqs,proto3" json:"reqs,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *CreateFdbFlushRequest) Reset() { - *x = CreateFdbFlushRequest{} +func (x *RemoveFdbEntriesRequest) Reset() { + *x = RemoveFdbEntriesRequest{} mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateFdbFlushRequest) String() string { +func (x *RemoveFdbEntriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateFdbFlushRequest) ProtoMessage() {} +func (*RemoveFdbEntriesRequest) ProtoMessage() {} -func (x *CreateFdbFlushRequest) ProtoReflect() protoreflect.Message { +func (x *RemoveFdbEntriesRequest) ProtoReflect() protoreflect.Message { mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -814,53 +828,39 @@ func (x *CreateFdbFlushRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateFdbFlushRequest.ProtoReflect.Descriptor instead. -func (*CreateFdbFlushRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use RemoveFdbEntriesRequest.ProtoReflect.Descriptor instead. +func (*RemoveFdbEntriesRequest) Descriptor() ([]byte, []int) { return file_dataplane_proto_sai_fdb_proto_rawDescGZIP(), []int{12} } -func (x *CreateFdbFlushRequest) GetBridgePortId() uint64 { - if x != nil && x.BridgePortId != nil { - return *x.BridgePortId - } - return 0 -} - -func (x *CreateFdbFlushRequest) GetBvId() uint64 { - if x != nil && x.BvId != nil { - return *x.BvId - } - return 0 -} - -func (x *CreateFdbFlushRequest) GetEntryType() int32 { - if x != nil && x.EntryType != nil { - return *x.EntryType +func (x *RemoveFdbEntriesRequest) GetReqs() []*RemoveFdbEntryRequest { + if x != nil { + return x.Reqs } - return 0 + return nil } -type CreateFdbFlushResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Oid uint64 `protobuf:"varint,1,opt,name=oid,proto3" json:"oid,omitempty"` +type RemoveFdbEntriesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Resps []*RemoveFdbEntryResponse `protobuf:"bytes,1,rep,name=resps,proto3" json:"resps,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *CreateFdbFlushResponse) Reset() { - *x = CreateFdbFlushResponse{} +func (x *RemoveFdbEntriesResponse) Reset() { + *x = RemoveFdbEntriesResponse{} mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *CreateFdbFlushResponse) String() string { +func (x *RemoveFdbEntriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateFdbFlushResponse) ProtoMessage() {} +func (*RemoveFdbEntriesResponse) ProtoMessage() {} -func (x *CreateFdbFlushResponse) ProtoReflect() protoreflect.Message { +func (x *RemoveFdbEntriesResponse) ProtoReflect() protoreflect.Message { mi := &file_dataplane_proto_sai_fdb_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -872,16 +872,16 @@ func (x *CreateFdbFlushResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateFdbFlushResponse.ProtoReflect.Descriptor instead. -func (*CreateFdbFlushResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use RemoveFdbEntriesResponse.ProtoReflect.Descriptor instead. +func (*RemoveFdbEntriesResponse) Descriptor() ([]byte, []int) { return file_dataplane_proto_sai_fdb_proto_rawDescGZIP(), []int{13} } -func (x *CreateFdbFlushResponse) GetOid() uint64 { +func (x *RemoveFdbEntriesResponse) GetResps() []*RemoveFdbEntryResponse { if x != nil { - return x.Oid + return x.Resps } - return 0 + return nil } var File_dataplane_proto_sai_fdb_proto protoreflect.FileDescriptor @@ -999,131 +999,135 @@ var file_dataplane_proto_sai_fdb_proto_rawDesc = string([]byte{ 0x3c, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74, 0x72, 0x22, 0x5b, 0x0a, - 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x65, 0x71, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x72, 0x65, 0x71, 0x73, 0x22, 0x5f, 0x0a, 0x18, 0x43, 0x72, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x04, 0x61, 0x74, 0x74, 0x72, 0x22, 0x8f, 0x02, + 0x0a, 0x16, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x12, 0x31, 0x0a, 0x0e, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x06, 0xf0, 0xdc, 0x93, 0xad, 0x0f, 0x01, + 0x48, 0x00, 0x52, 0x0c, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x05, 0x62, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x06, 0xf0, 0xdc, 0x93, 0xad, 0x0f, 0x02, 0x48, 0x01, 0x52, 0x04, 0x62, 0x76, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, + 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, + 0x69, 0x2e, 0x46, 0x64, 0x62, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x42, 0x06, 0xf0, 0xdc, 0x93, 0xad, 0x0f, 0x03, 0x48, 0x02, 0x52, 0x09, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x06, 0xa0, 0xa9, 0x90, + 0xad, 0x0f, 0x00, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x76, 0x5f, 0x69, 0x64, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x19, 0x0a, 0x17, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x22, 0x5b, 0x0a, 0x17, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x65, 0x71, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x04, 0x72, 0x65, 0x71, 0x73, 0x22, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x15, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0e, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x06, 0xf0, 0xdc, 0x93, - 0xad, 0x0f, 0x01, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x50, 0x6f, 0x72, - 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x05, 0x62, 0x76, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x06, 0xf0, 0xdc, 0x93, 0xad, 0x0f, 0x02, 0x48, 0x01, 0x52, - 0x04, 0x62, 0x76, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x06, 0xf0, 0xdc, - 0x93, 0xad, 0x0f, 0x03, 0x48, 0x02, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x88, 0x01, 0x01, 0x3a, 0x06, 0xa0, 0xa9, 0x90, 0xad, 0x0f, 0x2d, 0x42, 0x11, 0x0a, 0x0f, - 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x42, - 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x76, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2a, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x46, 0x64, 0x62, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x03, 0x6f, 0x69, 0x64, 0x2a, 0xad, 0x02, 0x0a, 0x0c, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x41, 0x74, 0x74, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, - 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, - 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x12, 0x20, - 0x0a, 0x1c, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, - 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, - 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, 0x54, - 0x54, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x41, 0x50, 0x5f, 0x49, 0x44, 0x10, - 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, - 0x54, 0x54, 0x52, 0x5f, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, - 0x49, 0x44, 0x10, 0x04, 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, - 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, - 0x41, 0x54, 0x54, 0x52, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x49, 0x50, - 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, - 0x41, 0x54, 0x54, 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x10, - 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, - 0x54, 0x54, 0x52, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x4f, - 0x56, 0x45, 0x10, 0x08, 0x2a, 0x8a, 0x01, 0x0a, 0x0c, 0x46, 0x64, 0x62, 0x46, 0x6c, 0x75, 0x73, - 0x68, 0x41, 0x74, 0x74, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x44, 0x42, 0x5f, 0x46, 0x4c, 0x55, - 0x53, 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x44, 0x42, 0x5f, 0x46, 0x4c, 0x55, - 0x53, 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, 0x5f, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x44, 0x42, 0x5f, - 0x46, 0x4c, 0x55, 0x53, 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x42, 0x56, 0x5f, 0x49, 0x44, - 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x44, 0x42, 0x5f, 0x46, 0x4c, 0x55, 0x53, 0x48, 0x5f, - 0x41, 0x54, 0x54, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, - 0x03, 0x32, 0xce, 0x06, 0x0a, 0x03, 0x46, 0x64, 0x62, 0x12, 0x6f, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x2e, 0x6c, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x65, 0x71, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x04, 0x72, 0x65, 0x71, 0x73, 0x22, 0x5f, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x22, 0x5b, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x65, 0x71, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x04, 0x72, 0x65, 0x71, 0x73, 0x22, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, + 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x43, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, + 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x05, 0x72, 0x65, 0x73, 0x70, 0x73, 0x2a, 0xad, 0x02, 0x0a, 0x0c, 0x46, 0x64, 0x62, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x44, 0x42, 0x5f, 0x45, + 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x44, 0x42, 0x5f, 0x45, + 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, + 0x12, 0x20, 0x0a, 0x1c, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x41, 0x54, + 0x54, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, + 0x41, 0x54, 0x54, 0x52, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x52, 0x41, 0x50, 0x5f, 0x49, + 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, + 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x52, + 0x54, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, + 0x54, 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, + 0x54, 0x41, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, + 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, + 0x49, 0x50, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, + 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, + 0x44, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x44, 0x42, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, + 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, 0x4d, 0x41, 0x43, 0x5f, + 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x08, 0x2a, 0x8a, 0x01, 0x0a, 0x0c, 0x46, 0x64, 0x62, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x41, 0x74, 0x74, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x46, 0x44, 0x42, 0x5f, 0x46, + 0x4c, 0x55, 0x53, 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x44, 0x42, 0x5f, 0x46, + 0x4c, 0x55, 0x53, 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, + 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x44, + 0x42, 0x5f, 0x46, 0x4c, 0x55, 0x53, 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x42, 0x56, 0x5f, + 0x49, 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x44, 0x42, 0x5f, 0x46, 0x4c, 0x55, 0x53, + 0x48, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x10, 0x03, 0x32, 0xd1, 0x06, 0x0a, 0x03, 0x46, 0x64, 0x62, 0x12, 0x6f, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x2e, + 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, - 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, - 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x0e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x2e, 0x6c, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x0e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, + 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x81, 0x01, + 0x0a, 0x14, 0x53, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x53, + 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, - 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x81, 0x01, 0x0a, 0x14, - 0x53, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x53, 0x65, 0x74, - 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, - 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, - 0x2e, 0x53, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x81, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, + 0x61, 0x69, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x6c, 0x65, 0x6d, + 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, + 0x61, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x0f, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x64, + 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x6c, - 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, - 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, + 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, - 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6f, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x12, 0x2c, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x46, 0x64, 0x62, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x46, 0x64, 0x62, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6c, 0x65, 0x6d, 0x6d, - 0x69, 0x6e, 0x67, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x61, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x2e, + 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x64, 0x62, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x75, 0x0a, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x73, 0x61, 0x69, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x46, 0x64, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2f, 0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x61, 0x69, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, }) var ( @@ -1151,16 +1155,17 @@ var file_dataplane_proto_sai_fdb_proto_goTypes = []any{ (*SetFdbEntryAttributeResponse)(nil), // 7: lemming.dataplane.sai.SetFdbEntryAttributeResponse (*GetFdbEntryAttributeRequest)(nil), // 8: lemming.dataplane.sai.GetFdbEntryAttributeRequest (*GetFdbEntryAttributeResponse)(nil), // 9: lemming.dataplane.sai.GetFdbEntryAttributeResponse - (*CreateFdbEntriesRequest)(nil), // 10: lemming.dataplane.sai.CreateFdbEntriesRequest - (*CreateFdbEntriesResponse)(nil), // 11: lemming.dataplane.sai.CreateFdbEntriesResponse - (*RemoveFdbEntriesRequest)(nil), // 12: lemming.dataplane.sai.RemoveFdbEntriesRequest - (*RemoveFdbEntriesResponse)(nil), // 13: lemming.dataplane.sai.RemoveFdbEntriesResponse - (*CreateFdbFlushRequest)(nil), // 14: lemming.dataplane.sai.CreateFdbFlushRequest - (*CreateFdbFlushResponse)(nil), // 15: lemming.dataplane.sai.CreateFdbFlushResponse + (*FlushFdbEntriesRequest)(nil), // 10: lemming.dataplane.sai.FlushFdbEntriesRequest + (*FlushFdbEntriesResponse)(nil), // 11: lemming.dataplane.sai.FlushFdbEntriesResponse + (*CreateFdbEntriesRequest)(nil), // 12: lemming.dataplane.sai.CreateFdbEntriesRequest + (*CreateFdbEntriesResponse)(nil), // 13: lemming.dataplane.sai.CreateFdbEntriesResponse + (*RemoveFdbEntriesRequest)(nil), // 14: lemming.dataplane.sai.RemoveFdbEntriesRequest + (*RemoveFdbEntriesResponse)(nil), // 15: lemming.dataplane.sai.RemoveFdbEntriesResponse (*FdbEntry)(nil), // 16: lemming.dataplane.sai.FdbEntry (FdbEntryType)(0), // 17: lemming.dataplane.sai.FdbEntryType (PacketAction)(0), // 18: lemming.dataplane.sai.PacketAction (*FdbEntryAttribute)(nil), // 19: lemming.dataplane.sai.FdbEntryAttribute + (FdbFlushEntryType)(0), // 20: lemming.dataplane.sai.FdbFlushEntryType } var file_dataplane_proto_sai_fdb_proto_depIdxs = []int32{ 16, // 0: lemming.dataplane.sai.CreateFdbEntryRequest.entry:type_name -> lemming.dataplane.sai.FdbEntry @@ -1173,29 +1178,30 @@ var file_dataplane_proto_sai_fdb_proto_depIdxs = []int32{ 16, // 7: lemming.dataplane.sai.GetFdbEntryAttributeRequest.entry:type_name -> lemming.dataplane.sai.FdbEntry 0, // 8: lemming.dataplane.sai.GetFdbEntryAttributeRequest.attr_type:type_name -> lemming.dataplane.sai.FdbEntryAttr 19, // 9: lemming.dataplane.sai.GetFdbEntryAttributeResponse.attr:type_name -> lemming.dataplane.sai.FdbEntryAttribute - 2, // 10: lemming.dataplane.sai.CreateFdbEntriesRequest.reqs:type_name -> lemming.dataplane.sai.CreateFdbEntryRequest - 3, // 11: lemming.dataplane.sai.CreateFdbEntriesResponse.resps:type_name -> lemming.dataplane.sai.CreateFdbEntryResponse - 4, // 12: lemming.dataplane.sai.RemoveFdbEntriesRequest.reqs:type_name -> lemming.dataplane.sai.RemoveFdbEntryRequest - 5, // 13: lemming.dataplane.sai.RemoveFdbEntriesResponse.resps:type_name -> lemming.dataplane.sai.RemoveFdbEntryResponse - 2, // 14: lemming.dataplane.sai.Fdb.CreateFdbEntry:input_type -> lemming.dataplane.sai.CreateFdbEntryRequest - 4, // 15: lemming.dataplane.sai.Fdb.RemoveFdbEntry:input_type -> lemming.dataplane.sai.RemoveFdbEntryRequest - 6, // 16: lemming.dataplane.sai.Fdb.SetFdbEntryAttribute:input_type -> lemming.dataplane.sai.SetFdbEntryAttributeRequest - 8, // 17: lemming.dataplane.sai.Fdb.GetFdbEntryAttribute:input_type -> lemming.dataplane.sai.GetFdbEntryAttributeRequest - 10, // 18: lemming.dataplane.sai.Fdb.CreateFdbEntries:input_type -> lemming.dataplane.sai.CreateFdbEntriesRequest - 12, // 19: lemming.dataplane.sai.Fdb.RemoveFdbEntries:input_type -> lemming.dataplane.sai.RemoveFdbEntriesRequest - 14, // 20: lemming.dataplane.sai.Fdb.CreateFdbFlush:input_type -> lemming.dataplane.sai.CreateFdbFlushRequest - 3, // 21: lemming.dataplane.sai.Fdb.CreateFdbEntry:output_type -> lemming.dataplane.sai.CreateFdbEntryResponse - 5, // 22: lemming.dataplane.sai.Fdb.RemoveFdbEntry:output_type -> lemming.dataplane.sai.RemoveFdbEntryResponse - 7, // 23: lemming.dataplane.sai.Fdb.SetFdbEntryAttribute:output_type -> lemming.dataplane.sai.SetFdbEntryAttributeResponse - 9, // 24: lemming.dataplane.sai.Fdb.GetFdbEntryAttribute:output_type -> lemming.dataplane.sai.GetFdbEntryAttributeResponse - 11, // 25: lemming.dataplane.sai.Fdb.CreateFdbEntries:output_type -> lemming.dataplane.sai.CreateFdbEntriesResponse - 13, // 26: lemming.dataplane.sai.Fdb.RemoveFdbEntries:output_type -> lemming.dataplane.sai.RemoveFdbEntriesResponse - 15, // 27: lemming.dataplane.sai.Fdb.CreateFdbFlush:output_type -> lemming.dataplane.sai.CreateFdbFlushResponse - 21, // [21:28] is the sub-list for method output_type - 14, // [14:21] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 20, // 10: lemming.dataplane.sai.FlushFdbEntriesRequest.entry_type:type_name -> lemming.dataplane.sai.FdbFlushEntryType + 2, // 11: lemming.dataplane.sai.CreateFdbEntriesRequest.reqs:type_name -> lemming.dataplane.sai.CreateFdbEntryRequest + 3, // 12: lemming.dataplane.sai.CreateFdbEntriesResponse.resps:type_name -> lemming.dataplane.sai.CreateFdbEntryResponse + 4, // 13: lemming.dataplane.sai.RemoveFdbEntriesRequest.reqs:type_name -> lemming.dataplane.sai.RemoveFdbEntryRequest + 5, // 14: lemming.dataplane.sai.RemoveFdbEntriesResponse.resps:type_name -> lemming.dataplane.sai.RemoveFdbEntryResponse + 2, // 15: lemming.dataplane.sai.Fdb.CreateFdbEntry:input_type -> lemming.dataplane.sai.CreateFdbEntryRequest + 4, // 16: lemming.dataplane.sai.Fdb.RemoveFdbEntry:input_type -> lemming.dataplane.sai.RemoveFdbEntryRequest + 6, // 17: lemming.dataplane.sai.Fdb.SetFdbEntryAttribute:input_type -> lemming.dataplane.sai.SetFdbEntryAttributeRequest + 8, // 18: lemming.dataplane.sai.Fdb.GetFdbEntryAttribute:input_type -> lemming.dataplane.sai.GetFdbEntryAttributeRequest + 10, // 19: lemming.dataplane.sai.Fdb.FlushFdbEntries:input_type -> lemming.dataplane.sai.FlushFdbEntriesRequest + 12, // 20: lemming.dataplane.sai.Fdb.CreateFdbEntries:input_type -> lemming.dataplane.sai.CreateFdbEntriesRequest + 14, // 21: lemming.dataplane.sai.Fdb.RemoveFdbEntries:input_type -> lemming.dataplane.sai.RemoveFdbEntriesRequest + 3, // 22: lemming.dataplane.sai.Fdb.CreateFdbEntry:output_type -> lemming.dataplane.sai.CreateFdbEntryResponse + 5, // 23: lemming.dataplane.sai.Fdb.RemoveFdbEntry:output_type -> lemming.dataplane.sai.RemoveFdbEntryResponse + 7, // 24: lemming.dataplane.sai.Fdb.SetFdbEntryAttribute:output_type -> lemming.dataplane.sai.SetFdbEntryAttributeResponse + 9, // 25: lemming.dataplane.sai.Fdb.GetFdbEntryAttribute:output_type -> lemming.dataplane.sai.GetFdbEntryAttributeResponse + 11, // 26: lemming.dataplane.sai.Fdb.FlushFdbEntries:output_type -> lemming.dataplane.sai.FlushFdbEntriesResponse + 13, // 27: lemming.dataplane.sai.Fdb.CreateFdbEntries:output_type -> lemming.dataplane.sai.CreateFdbEntriesResponse + 15, // 28: lemming.dataplane.sai.Fdb.RemoveFdbEntries:output_type -> lemming.dataplane.sai.RemoveFdbEntriesResponse + 22, // [22:29] is the sub-list for method output_type + 15, // [15:22] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_dataplane_proto_sai_fdb_proto_init() } @@ -1206,7 +1212,7 @@ func file_dataplane_proto_sai_fdb_proto_init() { file_dataplane_proto_sai_common_proto_init() file_dataplane_proto_sai_fdb_proto_msgTypes[0].OneofWrappers = []any{} file_dataplane_proto_sai_fdb_proto_msgTypes[4].OneofWrappers = []any{} - file_dataplane_proto_sai_fdb_proto_msgTypes[12].OneofWrappers = []any{} + file_dataplane_proto_sai_fdb_proto_msgTypes[8].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/dataplane/proto/sai/fdb.proto b/dataplane/proto/sai/fdb.proto index c286aaea7..d83e7d6d1 100644 --- a/dataplane/proto/sai/fdb.proto +++ b/dataplane/proto/sai/fdb.proto @@ -20,6 +20,13 @@ enum FdbEntryAttr { FDB_ENTRY_ATTR_ALLOW_MAC_MOVE = 8; } +enum FdbFlushAttr { + FDB_FLUSH_ATTR_UNSPECIFIED = 0; + FDB_FLUSH_ATTR_BRIDGE_PORT_ID = 1; + FDB_FLUSH_ATTR_BV_ID = 2; + FDB_FLUSH_ATTR_ENTRY_TYPE = 3; +} + message CreateFdbEntryRequest { option (sai_type) = OBJECT_TYPE_FDB_ENTRY; FdbEntry entry = 1; @@ -67,6 +74,17 @@ message GetFdbEntryAttributeResponse { FdbEntryAttribute attr = 1; } +message FlushFdbEntriesRequest { + option (sai_type) = OBJECT_TYPE_UNSPECIFIED; + uint64 switch = 1; + optional uint64 bridge_port_id = 2[(attr_enum_value) = 1]; + optional uint64 bv_id = 3[(attr_enum_value) = 2]; + optional FdbFlushEntryType entry_type = 4[(attr_enum_value) = 3]; +} + +message FlushFdbEntriesResponse { +} + message CreateFdbEntriesRequest { repeated CreateFdbEntryRequest reqs = 1; } @@ -89,25 +107,7 @@ service Fdb { rpc RemoveFdbEntry (RemoveFdbEntryRequest) returns (RemoveFdbEntryResponse) {} rpc SetFdbEntryAttribute (SetFdbEntryAttributeRequest) returns (SetFdbEntryAttributeResponse) {} rpc GetFdbEntryAttribute (GetFdbEntryAttributeRequest) returns (GetFdbEntryAttributeResponse) {} + rpc FlushFdbEntries (FlushFdbEntriesRequest) returns (FlushFdbEntriesResponse) {} rpc CreateFdbEntries (CreateFdbEntriesRequest) returns (CreateFdbEntriesResponse) {} rpc RemoveFdbEntries (RemoveFdbEntriesRequest) returns (RemoveFdbEntriesResponse) {} - rpc CreateFdbFlush (CreateFdbFlushRequest) returns (CreateFdbFlushResponse) {} -} - -enum FdbFlushAttr { - FDB_FLUSH_ATTR_UNSPECIFIED = 0; - FDB_FLUSH_ATTR_BRIDGE_PORT_ID = 1; - FDB_FLUSH_ATTR_BV_ID = 2; - FDB_FLUSH_ATTR_ENTRY_TYPE = 3; -} - -message CreateFdbFlushRequest { - option (sai_type) = OBJECT_TYPE_FDB_FLUSH; - optional uint64 bridge_port_id = 1 [(attr_enum_value) = 1]; - optional uint64 bv_id = 2 [(attr_enum_value) = 2]; - optional int32 entry_type = 3 [(attr_enum_value) = 3]; -} - -message CreateFdbFlushResponse { - uint64 oid = 1; } diff --git a/dataplane/proto/sai/fdb_grpc.pb.go b/dataplane/proto/sai/fdb_grpc.pb.go index 29351e7b6..96ebc3667 100755 --- a/dataplane/proto/sai/fdb_grpc.pb.go +++ b/dataplane/proto/sai/fdb_grpc.pb.go @@ -23,9 +23,9 @@ const ( Fdb_RemoveFdbEntry_FullMethodName = "/lemming.dataplane.sai.Fdb/RemoveFdbEntry" Fdb_SetFdbEntryAttribute_FullMethodName = "/lemming.dataplane.sai.Fdb/SetFdbEntryAttribute" Fdb_GetFdbEntryAttribute_FullMethodName = "/lemming.dataplane.sai.Fdb/GetFdbEntryAttribute" + Fdb_FlushFdbEntries_FullMethodName = "/lemming.dataplane.sai.Fdb/FlushFdbEntries" Fdb_CreateFdbEntries_FullMethodName = "/lemming.dataplane.sai.Fdb/CreateFdbEntries" Fdb_RemoveFdbEntries_FullMethodName = "/lemming.dataplane.sai.Fdb/RemoveFdbEntries" - Fdb_CreateFdbFlush_FullMethodName = "/lemming.dataplane.sai.Fdb/CreateFdbFlush" ) // FdbClient is the client API for Fdb service. @@ -36,9 +36,9 @@ type FdbClient interface { RemoveFdbEntry(ctx context.Context, in *RemoveFdbEntryRequest, opts ...grpc.CallOption) (*RemoveFdbEntryResponse, error) SetFdbEntryAttribute(ctx context.Context, in *SetFdbEntryAttributeRequest, opts ...grpc.CallOption) (*SetFdbEntryAttributeResponse, error) GetFdbEntryAttribute(ctx context.Context, in *GetFdbEntryAttributeRequest, opts ...grpc.CallOption) (*GetFdbEntryAttributeResponse, error) + FlushFdbEntries(ctx context.Context, in *FlushFdbEntriesRequest, opts ...grpc.CallOption) (*FlushFdbEntriesResponse, error) CreateFdbEntries(ctx context.Context, in *CreateFdbEntriesRequest, opts ...grpc.CallOption) (*CreateFdbEntriesResponse, error) RemoveFdbEntries(ctx context.Context, in *RemoveFdbEntriesRequest, opts ...grpc.CallOption) (*RemoveFdbEntriesResponse, error) - CreateFdbFlush(ctx context.Context, in *CreateFdbFlushRequest, opts ...grpc.CallOption) (*CreateFdbFlushResponse, error) } type fdbClient struct { @@ -89,30 +89,30 @@ func (c *fdbClient) GetFdbEntryAttribute(ctx context.Context, in *GetFdbEntryAtt return out, nil } -func (c *fdbClient) CreateFdbEntries(ctx context.Context, in *CreateFdbEntriesRequest, opts ...grpc.CallOption) (*CreateFdbEntriesResponse, error) { +func (c *fdbClient) FlushFdbEntries(ctx context.Context, in *FlushFdbEntriesRequest, opts ...grpc.CallOption) (*FlushFdbEntriesResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(CreateFdbEntriesResponse) - err := c.cc.Invoke(ctx, Fdb_CreateFdbEntries_FullMethodName, in, out, cOpts...) + out := new(FlushFdbEntriesResponse) + err := c.cc.Invoke(ctx, Fdb_FlushFdbEntries_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *fdbClient) RemoveFdbEntries(ctx context.Context, in *RemoveFdbEntriesRequest, opts ...grpc.CallOption) (*RemoveFdbEntriesResponse, error) { +func (c *fdbClient) CreateFdbEntries(ctx context.Context, in *CreateFdbEntriesRequest, opts ...grpc.CallOption) (*CreateFdbEntriesResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(RemoveFdbEntriesResponse) - err := c.cc.Invoke(ctx, Fdb_RemoveFdbEntries_FullMethodName, in, out, cOpts...) + out := new(CreateFdbEntriesResponse) + err := c.cc.Invoke(ctx, Fdb_CreateFdbEntries_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *fdbClient) CreateFdbFlush(ctx context.Context, in *CreateFdbFlushRequest, opts ...grpc.CallOption) (*CreateFdbFlushResponse, error) { +func (c *fdbClient) RemoveFdbEntries(ctx context.Context, in *RemoveFdbEntriesRequest, opts ...grpc.CallOption) (*RemoveFdbEntriesResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(CreateFdbFlushResponse) - err := c.cc.Invoke(ctx, Fdb_CreateFdbFlush_FullMethodName, in, out, cOpts...) + out := new(RemoveFdbEntriesResponse) + err := c.cc.Invoke(ctx, Fdb_RemoveFdbEntries_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -127,9 +127,9 @@ type FdbServer interface { RemoveFdbEntry(context.Context, *RemoveFdbEntryRequest) (*RemoveFdbEntryResponse, error) SetFdbEntryAttribute(context.Context, *SetFdbEntryAttributeRequest) (*SetFdbEntryAttributeResponse, error) GetFdbEntryAttribute(context.Context, *GetFdbEntryAttributeRequest) (*GetFdbEntryAttributeResponse, error) + FlushFdbEntries(context.Context, *FlushFdbEntriesRequest) (*FlushFdbEntriesResponse, error) CreateFdbEntries(context.Context, *CreateFdbEntriesRequest) (*CreateFdbEntriesResponse, error) RemoveFdbEntries(context.Context, *RemoveFdbEntriesRequest) (*RemoveFdbEntriesResponse, error) - CreateFdbFlush(context.Context, *CreateFdbFlushRequest) (*CreateFdbFlushResponse, error) } // UnimplementedFdbServer should be embedded to have @@ -151,15 +151,15 @@ func (UnimplementedFdbServer) SetFdbEntryAttribute(context.Context, *SetFdbEntry func (UnimplementedFdbServer) GetFdbEntryAttribute(context.Context, *GetFdbEntryAttributeRequest) (*GetFdbEntryAttributeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFdbEntryAttribute not implemented") } +func (UnimplementedFdbServer) FlushFdbEntries(context.Context, *FlushFdbEntriesRequest) (*FlushFdbEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FlushFdbEntries not implemented") +} func (UnimplementedFdbServer) CreateFdbEntries(context.Context, *CreateFdbEntriesRequest) (*CreateFdbEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateFdbEntries not implemented") } func (UnimplementedFdbServer) RemoveFdbEntries(context.Context, *RemoveFdbEntriesRequest) (*RemoveFdbEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveFdbEntries not implemented") } -func (UnimplementedFdbServer) CreateFdbFlush(context.Context, *CreateFdbFlushRequest) (*CreateFdbFlushResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateFdbFlush not implemented") -} func (UnimplementedFdbServer) testEmbeddedByValue() {} // UnsafeFdbServer may be embedded to opt out of forward compatibility for this service. @@ -252,56 +252,56 @@ func _Fdb_GetFdbEntryAttribute_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Fdb_CreateFdbEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateFdbEntriesRequest) +func _Fdb_FlushFdbEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FlushFdbEntriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(FdbServer).CreateFdbEntries(ctx, in) + return srv.(FdbServer).FlushFdbEntries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Fdb_CreateFdbEntries_FullMethodName, + FullMethod: Fdb_FlushFdbEntries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FdbServer).CreateFdbEntries(ctx, req.(*CreateFdbEntriesRequest)) + return srv.(FdbServer).FlushFdbEntries(ctx, req.(*FlushFdbEntriesRequest)) } return interceptor(ctx, in, info, handler) } -func _Fdb_RemoveFdbEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveFdbEntriesRequest) +func _Fdb_CreateFdbEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateFdbEntriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(FdbServer).RemoveFdbEntries(ctx, in) + return srv.(FdbServer).CreateFdbEntries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Fdb_RemoveFdbEntries_FullMethodName, + FullMethod: Fdb_CreateFdbEntries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FdbServer).RemoveFdbEntries(ctx, req.(*RemoveFdbEntriesRequest)) + return srv.(FdbServer).CreateFdbEntries(ctx, req.(*CreateFdbEntriesRequest)) } return interceptor(ctx, in, info, handler) } -func _Fdb_CreateFdbFlush_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateFdbFlushRequest) +func _Fdb_RemoveFdbEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveFdbEntriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(FdbServer).CreateFdbFlush(ctx, in) + return srv.(FdbServer).RemoveFdbEntries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Fdb_CreateFdbFlush_FullMethodName, + FullMethod: Fdb_RemoveFdbEntries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(FdbServer).CreateFdbFlush(ctx, req.(*CreateFdbFlushRequest)) + return srv.(FdbServer).RemoveFdbEntries(ctx, req.(*RemoveFdbEntriesRequest)) } return interceptor(ctx, in, info, handler) } @@ -329,6 +329,10 @@ var Fdb_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFdbEntryAttribute", Handler: _Fdb_GetFdbEntryAttribute_Handler, }, + { + MethodName: "FlushFdbEntries", + Handler: _Fdb_FlushFdbEntries_Handler, + }, { MethodName: "CreateFdbEntries", Handler: _Fdb_CreateFdbEntries_Handler, @@ -337,10 +341,6 @@ var Fdb_ServiceDesc = grpc.ServiceDesc{ MethodName: "RemoveFdbEntries", Handler: _Fdb_RemoveFdbEntries_Handler, }, - { - MethodName: "CreateFdbFlush", - Handler: _Fdb_CreateFdbFlush_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "dataplane/proto/sai/fdb.proto", diff --git a/dataplane/saiserver/fdb.go b/dataplane/saiserver/fdb.go index 04c3f80c9..2f1350ec7 100644 --- a/dataplane/saiserver/fdb.go +++ b/dataplane/saiserver/fdb.go @@ -38,6 +38,6 @@ func newFdb(mgr *attrmgr.AttrMgr, dataplane switchDataplaneAPI, s *grpc.Server) return f, nil } -func (f *fdb) CreateFdbFlush(ctx context.Context, req *saipb.CreateFdbFlushRequest) (*saipb.CreateFdbFlushResponse, error) { - return &saipb.CreateFdbFlushResponse{}, nil +func (f *fdb) FlushFdbEntries(ctx context.Context, req *saipb.FlushFdbEntriesRequest) (*saipb.FlushFdbEntriesResponse, error) { + return &saipb.FlushFdbEntriesResponse{}, nil } diff --git a/dataplane/standalone/sai/enum.cc b/dataplane/standalone/sai/enum.cc index 1534bbf7d..315b79b39 100644 --- a/dataplane/standalone/sai/enum.cc +++ b/dataplane/standalone/sai/enum.cc @@ -17,8 +17,6 @@ - - lemming::dataplane::sai::AclActionType convert_sai_acl_action_type_t_to_proto(const sai_int32_t val) { switch (val) { @@ -4683,6 +4681,47 @@ void convert_list_sai_fdb_event_t_to_sai(int32_t *list, const google::protobuf:: +lemming::dataplane::sai::FdbFlushAttr convert_sai_fdb_flush_attr_t_to_proto(const sai_int32_t val) { + switch (val) { + + case SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID: return lemming::dataplane::sai::FDB_FLUSH_ATTR_BRIDGE_PORT_ID; + + case SAI_FDB_FLUSH_ATTR_BV_ID: return lemming::dataplane::sai::FDB_FLUSH_ATTR_BV_ID; + + case SAI_FDB_FLUSH_ATTR_ENTRY_TYPE: return lemming::dataplane::sai::FDB_FLUSH_ATTR_ENTRY_TYPE; + + default: return lemming::dataplane::sai::FDB_FLUSH_ATTR_UNSPECIFIED; + } +} +sai_fdb_flush_attr_t convert_sai_fdb_flush_attr_t_to_sai(lemming::dataplane::sai::FdbFlushAttr val) { + switch (val) { + + case lemming::dataplane::sai::FDB_FLUSH_ATTR_BRIDGE_PORT_ID: return SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID; + + case lemming::dataplane::sai::FDB_FLUSH_ATTR_BV_ID: return SAI_FDB_FLUSH_ATTR_BV_ID; + + case lemming::dataplane::sai::FDB_FLUSH_ATTR_ENTRY_TYPE: return SAI_FDB_FLUSH_ATTR_ENTRY_TYPE; + + default: return SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID; + } +} + +google::protobuf::RepeatedField convert_list_sai_fdb_flush_attr_t_to_proto(const sai_s32_list_t &list) { + google::protobuf::RepeatedField proto_list; + for (int i = 0; i < list.count; i++) { + proto_list.Add(convert_sai_fdb_flush_attr_t_to_proto(list.list[i])); + } + return proto_list; +} +void convert_list_sai_fdb_flush_attr_t_to_sai(int32_t *list, const google::protobuf::RepeatedField &proto_list, uint32_t *count) { + for (int i = 0; i < proto_list.size(); i++) { + list[i] = convert_sai_fdb_flush_attr_t_to_sai(static_cast(proto_list[i])); + } + *count = proto_list.size(); +} + + + lemming::dataplane::sai::FdbFlushEntryType convert_sai_fdb_flush_entry_type_t_to_proto(const sai_int32_t val) { switch (val) { @@ -9748,7 +9787,7 @@ lemming::dataplane::sai::NextHopType convert_sai_next_hop_type_t_to_proto(const case SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP: return lemming::dataplane::sai::NEXT_HOP_TYPE_TUNNEL_ENCAP; case SAI_NEXT_HOP_TYPE_SRV6_SIDLIST: return lemming::dataplane::sai::NEXT_HOP_TYPE_SRV6_SIDLIST; - + case SAI_NEXT_HOP_TYPE_IPMC: return lemming::dataplane::sai::NEXT_HOP_TYPE_IPMC; default: return lemming::dataplane::sai::NEXT_HOP_TYPE_UNSPECIFIED; @@ -9764,7 +9803,7 @@ sai_next_hop_type_t convert_sai_next_hop_type_t_to_sai(lemming::dataplane::sai:: case lemming::dataplane::sai::NEXT_HOP_TYPE_TUNNEL_ENCAP: return SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP; case lemming::dataplane::sai::NEXT_HOP_TYPE_SRV6_SIDLIST: return SAI_NEXT_HOP_TYPE_SRV6_SIDLIST; - + case lemming::dataplane::sai::NEXT_HOP_TYPE_IPMC: return SAI_NEXT_HOP_TYPE_IPMC; default: return SAI_NEXT_HOP_TYPE_IP; diff --git a/dataplane/standalone/sai/enum.h b/dataplane/standalone/sai/enum.h index 3c73c86fb..95203c48d 100644 --- a/dataplane/standalone/sai/enum.h +++ b/dataplane/standalone/sai/enum.h @@ -18,129 +18,129 @@ #include "dataplane/proto/sai/common.pb.h" -#include "dataplane/proto/sai/dash_acl.pb.h" - -#include "dataplane/proto/sai/scheduler_group.pb.h" - -#include "dataplane/proto/sai/switch.pb.h" +#include "dataplane/proto/sai/stp.pb.h" #include "dataplane/proto/sai/udf.pb.h" -#include "dataplane/proto/sai/virtual_router.pb.h" +#include "dataplane/proto/sai/bfd.pb.h" -#include "dataplane/proto/sai/hash.pb.h" +#include "dataplane/proto/sai/buffer.pb.h" -#include "dataplane/proto/sai/stp.pb.h" +#include "dataplane/proto/sai/hostif.pb.h" -#include "dataplane/proto/sai/tam.pb.h" +#include "dataplane/proto/sai/l2mc_group.pb.h" -#include "dataplane/proto/sai/dash_pa_validation.pb.h" +#include "dataplane/proto/sai/lag.pb.h" -#include "dataplane/proto/sai/system_port.pb.h" +#include "dataplane/proto/sai/debug_counter.pb.h" -#include "dataplane/proto/sai/fdb.pb.h" +#include "dataplane/proto/sai/poe.pb.h" -#include "dataplane/proto/sai/macsec.pb.h" +#include "dataplane/proto/sai/isolation_group.pb.h" -#include "dataplane/proto/sai/nat.pb.h" +#include "dataplane/proto/sai/dash_meter.pb.h" -#include "dataplane/proto/sai/srv6.pb.h" +#include "dataplane/proto/sai/dash_acl.pb.h" -#include "dataplane/proto/sai/qos_map.pb.h" +#include "dataplane/proto/sai/scheduler_group.pb.h" -#include "dataplane/proto/sai/hostif.pb.h" +#include "dataplane/proto/sai/mcast_fdb.pb.h" -#include "dataplane/proto/sai/l2mc.pb.h" +#include "dataplane/proto/sai/mirror.pb.h" -#include "dataplane/proto/sai/bmtor.pb.h" +#include "dataplane/proto/sai/router_interface.pb.h" #include "dataplane/proto/sai/rpf_group.pb.h" -#include "dataplane/proto/sai/isolation_group.pb.h" +#include "dataplane/proto/sai/scheduler.pb.h" -#include "dataplane/proto/sai/l2mc_group.pb.h" +#include "dataplane/proto/sai/twamp.pb.h" -#include "dataplane/proto/sai/next_hop_group.pb.h" +#include "dataplane/proto/sai/srv6.pb.h" -#include "dataplane/proto/sai/dash_outbound_ca_to_pa.pb.h" +#include "dataplane/proto/sai/dash_eni.pb.h" -#include "dataplane/proto/sai/my_mac.pb.h" +#include "dataplane/proto/sai/dash_direction_lookup.pb.h" -#include "dataplane/proto/sai/ars_profile.pb.h" +#include "dataplane/proto/sai/bmtor.pb.h" -#include "dataplane/proto/sai/dash_outbound_routing.pb.h" +#include "dataplane/proto/sai/port.pb.h" -#include "dataplane/proto/sai/scheduler.pb.h" +#include "dataplane/proto/sai/ars.pb.h" -#include "dataplane/proto/sai/acl.pb.h" +#include "dataplane/proto/sai/bridge.pb.h" -#include "dataplane/proto/sai/next_hop.pb.h" +#include "dataplane/proto/sai/counter.pb.h" -#include "dataplane/proto/sai/dash_vnet.pb.h" +#include "dataplane/proto/sai/next_hop_group.pb.h" -#include "dataplane/proto/sai/dash_inbound_routing.pb.h" +#include "dataplane/proto/sai/queue.pb.h" -#include "dataplane/proto/sai/dash_eni.pb.h" +#include "dataplane/proto/sai/dtel.pb.h" -#include "dataplane/proto/sai/policer.pb.h" +#include "dataplane/proto/sai/hash.pb.h" -#include "dataplane/proto/sai/router_interface.pb.h" +#include "dataplane/proto/sai/route.pb.h" -#include "dataplane/proto/sai/wred.pb.h" +#include "dataplane/proto/sai/dash_outbound_ca_to_pa.pb.h" -#include "dataplane/proto/sai/buffer.pb.h" +#include "dataplane/proto/sai/fdb.pb.h" -#include "dataplane/proto/sai/tunnel.pb.h" +#include "dataplane/proto/sai/macsec.pb.h" -#include "dataplane/proto/sai/bfd.pb.h" +#include "dataplane/proto/sai/system_port.pb.h" -#include "dataplane/proto/sai/dash_vip.pb.h" +#include "dataplane/proto/sai/tunnel.pb.h" + +#include "dataplane/proto/sai/ipmc_group.pb.h" #include "dataplane/proto/sai/ipmc.pb.h" -#include "dataplane/proto/sai/mcast_fdb.pb.h" +#include "dataplane/proto/sai/dash_vip.pb.h" -#include "dataplane/proto/sai/route.pb.h" +#include "dataplane/proto/sai/dash_vnet.pb.h" -#include "dataplane/proto/sai/generic_programmable.pb.h" +#include "dataplane/proto/sai/dash_outbound_routing.pb.h" -#include "dataplane/proto/sai/counter.pb.h" +#include "dataplane/proto/sai/dash_inbound_routing.pb.h" -#include "dataplane/proto/sai/ipsec.pb.h" +#include "dataplane/proto/sai/mpls.pb.h" -#include "dataplane/proto/sai/vlan.pb.h" +#include "dataplane/proto/sai/dash_pa_validation.pb.h" -#include "dataplane/proto/sai/ars.pb.h" +#include "dataplane/proto/sai/policer.pb.h" -#include "dataplane/proto/sai/bridge.pb.h" +#include "dataplane/proto/sai/tam.pb.h" -#include "dataplane/proto/sai/ipmc_group.pb.h" +#include "dataplane/proto/sai/wred.pb.h" -#include "dataplane/proto/sai/mpls.pb.h" +#include "dataplane/proto/sai/my_mac.pb.h" -#include "dataplane/proto/sai/neighbor.pb.h" +#include "dataplane/proto/sai/nat.pb.h" -#include "dataplane/proto/sai/dash_direction_lookup.pb.h" +#include "dataplane/proto/sai/switch.pb.h" -#include "dataplane/proto/sai/queue.pb.h" +#include "dataplane/proto/sai/virtual_router.pb.h" -#include "dataplane/proto/sai/twamp.pb.h" +#include "dataplane/proto/sai/vlan.pb.h" -#include "dataplane/proto/sai/mirror.pb.h" +#include "dataplane/proto/sai/ipsec.pb.h" -#include "dataplane/proto/sai/port.pb.h" +#include "dataplane/proto/sai/neighbor.pb.h" -#include "dataplane/proto/sai/samplepacket.pb.h" +#include "dataplane/proto/sai/next_hop.pb.h" -#include "dataplane/proto/sai/dtel.pb.h" +#include "dataplane/proto/sai/l2mc.pb.h" -#include "dataplane/proto/sai/debug_counter.pb.h" +#include "dataplane/proto/sai/ars_profile.pb.h" -#include "dataplane/proto/sai/poe.pb.h" +#include "dataplane/proto/sai/samplepacket.pb.h" -#include "dataplane/proto/sai/dash_meter.pb.h" +#include "dataplane/proto/sai/generic_programmable.pb.h" -#include "dataplane/proto/sai/lag.pb.h" +#include "dataplane/proto/sai/acl.pb.h" + +#include "dataplane/proto/sai/qos_map.pb.h" extern "C" { @@ -472,6 +472,11 @@ sai_fdb_event_t convert_sai_fdb_event_t_to_sai(lemming::dataplane::sai::FdbEvent google::protobuf::RepeatedField convert_list_sai_fdb_event_t_to_proto(const sai_s32_list_t &list); void convert_list_sai_fdb_event_t_to_sai(int32_t *list, const google::protobuf::RepeatedField &proto_list, uint32_t *count); +lemming::dataplane::sai::FdbFlushAttr convert_sai_fdb_flush_attr_t_to_proto(const sai_int32_t val); +sai_fdb_flush_attr_t convert_sai_fdb_flush_attr_t_to_sai(lemming::dataplane::sai::FdbFlushAttr val); +google::protobuf::RepeatedField convert_list_sai_fdb_flush_attr_t_to_proto(const sai_s32_list_t &list); +void convert_list_sai_fdb_flush_attr_t_to_sai(int32_t *list, const google::protobuf::RepeatedField &proto_list, uint32_t *count); + lemming::dataplane::sai::FdbFlushEntryType convert_sai_fdb_flush_entry_type_t_to_proto(const sai_int32_t val); sai_fdb_flush_entry_type_t convert_sai_fdb_flush_entry_type_t_to_sai(lemming::dataplane::sai::FdbFlushEntryType val); google::protobuf::RepeatedField convert_list_sai_fdb_flush_entry_type_t_to_proto(const sai_s32_list_t &list); diff --git a/dataplane/standalone/sai/fdb.cc b/dataplane/standalone/sai/fdb.cc index a447c7401..ed06c29c2 100644 --- a/dataplane/standalone/sai/fdb.cc +++ b/dataplane/standalone/sai/fdb.cc @@ -73,6 +73,31 @@ switch (attr_list[i].id) { return msg; } +lemming::dataplane::sai::FlushFdbEntriesRequest convert_flush_fdb_entries(sai_object_id_t switch_id, uint32_t attr_count, const sai_attribute_t *attr_list) { + +lemming::dataplane::sai::FlushFdbEntriesRequest msg; +msg.set_switch_(switch_id); + for(uint32_t i = 0; i < attr_count; i++ ) { + + + +switch (attr_list[i].id) { + + case SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID: + msg.set_bridge_port_id(attr_list[i].value.oid); + break; + case SAI_FDB_FLUSH_ATTR_BV_ID: + msg.set_bv_id(attr_list[i].value.oid); + break; + case SAI_FDB_FLUSH_ATTR_ENTRY_TYPE: + msg.set_entry_type(convert_sai_fdb_flush_entry_type_t_to_proto(attr_list[i].value.s32)); + break; +} + +} +return msg; +} + sai_status_t l_create_fdb_entry(const sai_fdb_entry_t *fdb_entry, uint32_t attr_count, const sai_attribute_t *attr_list) { LOG(INFO) << "Func: " << __PRETTY_FUNCTION__; @@ -232,7 +257,21 @@ switch (attr_list[i].id) { sai_status_t l_flush_fdb_entries(sai_object_id_t switch_id, uint32_t attr_count, const sai_attribute_t *attr_list) { LOG(INFO) << "Func: " << __PRETTY_FUNCTION__; - return SAI_STATUS_NOT_IMPLEMENTED; + lemming::dataplane::sai::FlushFdbEntriesRequest req = convert_flush_fdb_entries(switch_id, attr_count, attr_list); + lemming::dataplane::sai::FlushFdbEntriesResponse resp; + grpc::ClientContext context; + + grpc::Status status = fdb->FlushFdbEntries(&context, req, &resp); + if (!status.ok()) { + auto it = context.GetServerTrailingMetadata().find("traceparent"); + if (it != context.GetServerTrailingMetadata().end()) { + LOG(ERROR) << "Lucius RPC error: Trace ID " << it->second << " msg: " << status.error_message(); + } else { + LOG(ERROR) << "Lucius RPC error: " << status.error_message(); + } + return SAI_STATUS_FAILURE; + } + return SAI_STATUS_SUCCESS; } sai_status_t l_create_fdb_entries(uint32_t object_count, const sai_fdb_entry_t *fdb_entry, const uint32_t *attr_count, const sai_attribute_t **attr_list, sai_bulk_op_error_mode_t mode, sai_status_t *object_statuses) { diff --git a/dataplane/standalone/sai/tunnel.cc b/dataplane/standalone/sai/tunnel.cc index 96f0f3173..369e2766a 100644 --- a/dataplane/standalone/sai/tunnel.cc +++ b/dataplane/standalone/sai/tunnel.cc @@ -389,8 +389,8 @@ sai_status_t l_create_tunnel(sai_object_id_t *tunnel_id, sai_object_id_t switch_ lemming::dataplane::sai::CreateTunnelRequest req = convert_create_tunnel(switch_id, attr_count, attr_list); lemming::dataplane::sai::CreateTunnelResponse resp; grpc::ClientContext context; - req.set_switch_(switch_id); - + req.set_switch_(switch_id); + grpc::Status status = tunnel->CreateTunnel(&context, req, &resp); if (!status.ok()) { auto it = context.GetServerTrailingMetadata().find("traceparent"); diff --git a/go.work.sum b/go.work.sum index ef3c144b4..1d30a5266 100644 --- a/go.work.sum +++ b/go.work.sum @@ -238,15 +238,26 @@ go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvS go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= go.universe.tf/metallb v0.13.5/go.mod h1:IWUTqjEK60WJMr50EqeD6AmhT1x3p2Ondt96yTGvtuU= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp/typeparams v0.0.0-20231219180239-dc181d75b848/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488/go.mod h1:fGb/2+tgXXjhjHsTNdVEEMZNWA0quBnfrO+AfoDSAKw= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250102185135-69823020774d/go.mod h1:s4mHJ3FfG8P6A3O+gZ8TVqB3ufjOl9UG3ANCMMwCHmo= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=