From 3c966421aeae80594e32e3b0c4169ad6bfa8595a Mon Sep 17 00:00:00 2001 From: Guo-shiuan Wang Date: Wed, 17 Jul 2024 02:01:39 +0000 Subject: [PATCH] Implement L2MC via ACL redirect. --- dataplane/forwarding/protocol/attr.go | 3 + .../forwarding/protocol/metadata/metadata.go | 7 + dataplane/saiserver/acl.go | 5 + dataplane/saiserver/l2.go | 149 +++++++++++++- dataplane/saiserver/ports.go | 1 + dataplane/saiserver/switch.go | 21 ++ proto/forwarding/forwarding_common.pb.go | 187 +++++++++--------- proto/forwarding/forwarding_common.proto | 1 + 8 files changed, 275 insertions(+), 99 deletions(-) diff --git a/dataplane/forwarding/protocol/attr.go b/dataplane/forwarding/protocol/attr.go index 3b43fe4f..445a4e6b 100644 --- a/dataplane/forwarding/protocol/attr.go +++ b/dataplane/forwarding/protocol/attr.go @@ -191,6 +191,9 @@ var FieldAttr = map[fwdpb.PacketFieldNum]struct { fwdpb.PacketFieldNum_PACKET_FIELD_NUM_HOST_PORT_ID: { Sizes: []int{SizeUint64}, }, + fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID: { + Sizes: []int{SizeUint64}, + }, } // GroupAttr contains attributes for each packet header group. diff --git a/dataplane/forwarding/protocol/metadata/metadata.go b/dataplane/forwarding/protocol/metadata/metadata.go index 6a6ff735..c02e7b9e 100644 --- a/dataplane/forwarding/protocol/metadata/metadata.go +++ b/dataplane/forwarding/protocol/metadata/metadata.go @@ -46,6 +46,7 @@ type Metadata struct { outputIface []byte // L3 output interface id. tunnelID []byte // Tunnel ID hostPortID []byte // Host port id + l2mcgid []byte // L2MC Group ID desc *protocol.Desc // Protocol descriptor. } @@ -126,6 +127,8 @@ func (m *Metadata) Field(id fwdpacket.FieldID) ([]byte, error) { return m.tunnelID, nil case fwdpb.PacketFieldNum_PACKET_FIELD_NUM_HOST_PORT_ID: return m.hostPortID, nil + case fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID: + return m.l2mcgid, nil default: return nil, fmt.Errorf("metadata: Field %v failed, unsupported field", id) @@ -232,6 +235,9 @@ func (m *Metadata) updateSet(id fwdpacket.FieldID, arg []byte) (bool, error) { case fwdpb.PacketFieldNum_PACKET_FIELD_NUM_HOST_PORT_ID: m.hostPortID = arg return true, nil + case fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID: + m.l2mcgid = arg + return true, nil default: return false, fmt.Errorf("metadata: UpdateField failed, set unsupported for field %v", id) } @@ -287,6 +293,7 @@ func parse(frame *frame.Frame, desc *protocol.Desc) (protocol.Handler, fwdpb.Pac outputIface: make([]byte, protocol.FieldAttr[fwdpb.PacketFieldNum_PACKET_FIELD_NUM_OUTPUT_IFACE].DefaultSize), tunnelID: make([]byte, protocol.FieldAttr[fwdpb.PacketFieldNum_PACKET_FIELD_NUM_TUNNEL_ID].DefaultSize), hostPortID: make([]byte, protocol.FieldAttr[fwdpb.PacketFieldNum_PACKET_FIELD_NUM_HOST_PORT_ID].DefaultSize), + l2mcgid: make([]byte, protocol.FieldAttr[fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID].DefaultSize), attribute32: make(map[uint8][]byte), attribute24: make(map[uint8][]byte), attribute16: make(map[uint8][]byte), diff --git a/dataplane/saiserver/acl.go b/dataplane/saiserver/acl.go index 7f93ca2d..7de8b852 100644 --- a/dataplane/saiserver/acl.go +++ b/dataplane/saiserver/acl.go @@ -328,6 +328,11 @@ func (a *acl) CreateAclEntry(ctx context.Context, req *saipb.CreateAclEntryReque }, }) } + if req.ActionRedirect != nil { + aReq.Actions = append(aReq.Actions, + fwdconfig.Action(fwdconfig.UpdateAction(fwdpb.UpdateType_UPDATE_TYPE_SET, + fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID).WithUint64Value(req.GetActionRedirect().GetOid())).Build()) + } cpuPortReq := &saipb.GetSwitchAttributeRequest{Oid: switchID, AttrType: []saipb.SwitchAttr{saipb.SwitchAttr_SWITCH_ATTR_CPU_PORT}} resp := &saipb.GetSwitchAttributeResponse{} diff --git a/dataplane/saiserver/l2.go b/dataplane/saiserver/l2.go index 66cd9a73..c334005e 100644 --- a/dataplane/saiserver/l2.go +++ b/dataplane/saiserver/l2.go @@ -16,18 +16,29 @@ package saiserver import ( "context" + "fmt" "google.golang.org/grpc" + "google.golang.org/protobuf/proto" + "github.com/openconfig/lemming/dataplane/forwarding/fwdconfig" "github.com/openconfig/lemming/dataplane/saiserver/attrmgr" + fwdpb "github.com/openconfig/lemming/proto/forwarding" saipb "github.com/openconfig/lemming/dataplane/proto/sai" ) +type l2mcGroupMember struct { + oid uint64 + groupId uint64 + outputId uint64 +} + type l2mcGroup struct { saipb.UnimplementedL2McGroupServer mgr *attrmgr.AttrMgr dataplane switchDataplaneAPI + groups map[uint64]map[uint64]*l2mcGroupMember // OID -> map of Port } func newL2mcGroup(mgr *attrmgr.AttrMgr, dataplane switchDataplaneAPI, s *grpc.Server) *l2mcGroup { @@ -39,25 +50,147 @@ func newL2mcGroup(mgr *attrmgr.AttrMgr, dataplane switchDataplaneAPI, s *grpc.Se return mg } -// TODO: Implement this. -func (mg *l2mcGroup) CreateL2McGroup(context.Context, *saipb.CreateL2McGroupRequest) (*saipb.CreateL2McGroupResponse, error) { +func (mg *l2mcGroup) CreateL2McGroup(ctx context.Context, req *saipb.CreateL2McGroupRequest) (*saipb.CreateL2McGroupResponse, error) { id := mg.mgr.NextID() + // Update internal data + mg.groups[id] = map[uint64]*l2mcGroupMember{} + // Update attributes + l2mcAttrs := &saipb.L2McGroupAttribute{ + L2McOutputCount: proto.Uint32(0), + L2McMemberList: []uint64{}, + } + mg.mgr.StoreAttributes(id, l2mcAttrs) return &saipb.CreateL2McGroupResponse{Oid: id}, nil } -// TODO: Implement this. -func (mg *l2mcGroup) CreateL2McGroupMember(context.Context, *saipb.CreateL2McGroupMemberRequest) (*saipb.CreateL2McGroupMemberResponse, error) { +func (mg *l2mcGroup) CreateL2McGroupMember(ctx context.Context, req *saipb.CreateL2McGroupMemberRequest) (*saipb.CreateL2McGroupMemberResponse, error) { id := mg.mgr.NextID() + // Update table entry + r := fwdconfig.TableEntryAddRequest(mg.dataplane.ID(), L2MCGroupTable).AppendEntry( + fwdconfig.EntryDesc(fwdconfig.ExactEntry(fwdconfig.PacketFieldBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID).WithUint64(req.GetL2McGroupId())))).Build() + for _, p := range mg.groups { + r.Entries[0].Actions = append(r.Entries[0].Actions, &fwdpb.ActionDesc{ + ActionType: fwdpb.ActionType_ACTION_TYPE_MIRROR, + Action: &fwdpb.ActionDesc_Mirror{ + Mirror: &fwdpb.MirrorActionDesc{ + PortId: &fwdpb.PortId{ + ObjectId: &fwdpb.ObjectId{ + Id: fmt.Sprint(p), + }, + }, + }, + }, + }) + } + if _, err := mg.dataplane.TableEntryAdd(ctx, r); err != nil { + return nil, err + } + // Update internal data + if mg.groups[req.GetL2McGroupId()] == nil { + return nil, fmt.Errorf("L2MC group id %q not found", req.GetL2McGroupId()) + } + if _, ok := mg.groups[req.GetL2McGroupId()][req.GetL2McOutputId()]; ok { + return nil, fmt.Errorf("found existing member %q", req.GetL2McOutputId()) + } + mg.groups[req.GetL2McGroupId()][req.GetL2McOutputId()] = &l2mcGroupMember{ + oid: id, + outputId: req.GetL2McOutputId(), + groupId: req.GetL2McGroupId(), + } + // Update L2MC Group member attributes + attr := &saipb.L2McGroupMemberAttribute{ + L2McGroupId: req.L2McGroupId, + L2McOutputId: req.L2McOutputId, + } + mg.mgr.StoreAttributes(id, attr) + // Update L2MC Group Attributes. + gReq := &saipb.GetL2McGroupAttributeRequest{Oid: req.GetL2McGroupId(), AttrType: []saipb.L2McGroupAttr{saipb.L2McGroupAttr_L2MC_GROUP_ATTR_L2MC_MEMBER_LIST, saipb.L2McGroupAttr_L2MC_GROUP_ATTR_L2MC_OUTPUT_COUNT}} + gResp := &saipb.GetL2McGroupAttributeResponse{} + if err := mg.mgr.PopulateAttributes(gReq, gResp); err != nil { + return nil, err + } + gAttrs := gResp.GetAttr() + gAttrs.L2McMemberList = append(gAttrs.GetL2McMemberList(), id) + *gAttrs.L2McOutputCount += 1 + mg.mgr.StoreAttributes(req.GetL2McGroupId(), gAttrs) + // Update Switch Attributes. + swReq := &saipb.GetSwitchAttributeRequest{Oid: req.GetSwitch(), AttrType: []saipb.SwitchAttr{saipb.SwitchAttr_SWITCH_ATTR_AVAILABLE_L2MC_ENTRY}} + swResp := &saipb.GetSwitchAttributeResponse{} + if err := mg.mgr.PopulateAttributes(swReq, swResp); err != nil { + return nil, err + } + attrs := swResp.GetAttr() + *attrs.AvailableL2McEntry = attrs.GetAvailableL2McEntry() - 1 + mg.mgr.StoreAttributes(req.GetSwitch(), attrs) return &saipb.CreateL2McGroupMemberResponse{Oid: id}, nil } -// TODO: Implement this. -func (mg *l2mcGroup) RemoveL2McGroup(context.Context, *saipb.RemoveL2McGroupRequest) (*saipb.RemoveL2McGroupResponse, error) { +func (mg *l2mcGroup) RemoveL2McGroup(ctx context.Context, req *saipb.RemoveL2McGroupRequest) (*saipb.RemoveL2McGroupResponse, error) { + if mg.groups[req.GetOid()] == nil { + return nil, fmt.Errorf("cannot find group %q", req.GetOid()) + } + // Remove all members in the group + for _, p := range mg.groups[req.GetOid()] { + _, err := attrmgr.InvokeAndSave(ctx, mg.mgr, mg.RemoveL2McGroupMember, &saipb.RemoveL2McGroupMemberRequest{ + Oid: p.oid, + }) + if err != nil { + return nil, err + } + } + // Update internal data + delete(mg.groups, req.GetOid()) return &saipb.RemoveL2McGroupResponse{}, nil } -// TODO: Implement this. -func (mg *l2mcGroup) RemoveL2McGroupMember(context.Context, *saipb.RemoveL2McGroupMemberRequest) (*saipb.RemoveL2McGroupMemberResponse, error) { +func (mg *l2mcGroup) RemoveL2McGroupMember(ctx context.Context, req *saipb.RemoveL2McGroupMemberRequest) (*saipb.RemoveL2McGroupMemberResponse, error) { + // Remove table entry. + r := fwdconfig.TableEntryRemoveRequest(mg.dataplane.ID(), L2MCGroupTable).AppendEntry( + fwdconfig.EntryDesc(fwdconfig.ExactEntry(fwdconfig.PacketFieldBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID).WithUint64(req.GetOid())))).Build() + if _, err := mg.dataplane.TableEntryRemove(ctx, r); err != nil { + return nil, err + } + // Update L2MC group attributes + locateMember := func(oid uint64) *l2mcGroupMember { + for _, members := range mg.groups { + for k, v := range members { + if k == oid { + return v + } + } + } + return nil + } + m := locateMember(req.GetOid()) + if m == nil { + return nil, fmt.Errorf("cannot find member with OID %d", req.GetOid()) + } + gReq := &saipb.GetL2McGroupAttributeRequest{Oid: m.groupId, AttrType: []saipb.L2McGroupAttr{saipb.L2McGroupAttr_L2MC_GROUP_ATTR_L2MC_MEMBER_LIST, saipb.L2McGroupAttr_L2MC_GROUP_ATTR_L2MC_OUTPUT_COUNT}} + gResp := &saipb.GetL2McGroupAttributeResponse{} + if err := mg.mgr.PopulateAttributes(gReq, gResp); err != nil { + return nil, err + } + gAttrs := gResp.GetAttr() + newMemList := []uint64{} + for _, i := range gAttrs.GetL2McMemberList() { + if i != req.GetOid() { + newMemList = append(newMemList, i) + } + } + gAttrs.L2McMemberList = newMemList + *gAttrs.L2McOutputCount -= 1 + mg.mgr.StoreAttributes(m.groupId, gAttrs) + // Update Switch Attributes. + swReq := &saipb.GetSwitchAttributeRequest{Oid: 1, AttrType: []saipb.SwitchAttr{saipb.SwitchAttr_SWITCH_ATTR_AVAILABLE_L2MC_ENTRY}} + swResp := &saipb.GetSwitchAttributeResponse{} + if err := mg.mgr.PopulateAttributes(swReq, swResp); err != nil { + return nil, err + } + attrs := swResp.GetAttr() + *attrs.AvailableL2McEntry = attrs.GetAvailableL2McEntry() + 1 + mg.mgr.StoreAttributes(1, attrs) + // Update internal data + delete(mg.groups[m.groupId], req.GetOid()) return &saipb.RemoveL2McGroupMemberResponse{}, nil } diff --git a/dataplane/saiserver/ports.go b/dataplane/saiserver/ports.go index c663fc5b..a2c98749 100644 --- a/dataplane/saiserver/ports.go +++ b/dataplane/saiserver/ports.go @@ -104,6 +104,7 @@ func getL3Pipeline() []*fwdpb.ActionDesc { func getL2Pipeline() []*fwdpb.ActionDesc { return []*fwdpb.ActionDesc{ fwdconfig.Action(fwdconfig.LookupAction(IngressActionTable)).Build(), // Run ingress action. + fwdconfig.Action(fwdconfig.LookupAction(L2MCGroupTable)).Build(), // Check L2MC group. fwdconfig.Action(fwdconfig.DropAction()).Build(), // DROP } } diff --git a/dataplane/saiserver/switch.go b/dataplane/saiserver/switch.go index fdd5cfdf..1e6fa928 100644 --- a/dataplane/saiserver/switch.go +++ b/dataplane/saiserver/switch.go @@ -109,6 +109,7 @@ const ( portToHostifTable = "cpu-output" tunTermTable = "tun-term" VlanTable = "vlan" + L2MCGroupTable = "l2mcg" DefaultVlanId = 1 ) @@ -269,6 +270,26 @@ func (sw *saiSwitch) CreateSwitch(ctx context.Context, _ *saipb.CreateSwitchRequ if _, err := sw.dataplane.TableCreate(ctx, vlanReq); err != nil { return nil, err } + l2mcGroupReq := &fwdpb.TableCreateRequest{ + ContextId: &fwdpb.ContextId{Id: sw.dataplane.ID()}, + Desc: &fwdpb.TableDesc{ + TableType: fwdpb.TableType_TABLE_TYPE_EXACT, + TableId: &fwdpb.TableId{ObjectId: &fwdpb.ObjectId{Id: L2MCGroupTable}}, + Actions: []*fwdpb.ActionDesc{{ActionType: fwdpb.ActionType_ACTION_TYPE_CONTINUE}}, + Table: &fwdpb.TableDesc_Exact{ + Exact: &fwdpb.ExactTableDesc{ + FieldIds: []*fwdpb.PacketFieldId{{ + Field: &fwdpb.PacketField{ + FieldNum: fwdpb.PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID, + }, + }}, + }, + }, + }, + } + if _, err := sw.dataplane.TableCreate(ctx, l2mcGroupReq); err != nil { + return nil, err + } action := &fwdpb.TableCreateRequest{ ContextId: &fwdpb.ContextId{Id: sw.dataplane.ID()}, Desc: &fwdpb.TableDesc{ diff --git a/proto/forwarding/forwarding_common.pb.go b/proto/forwarding/forwarding_common.pb.go index 8e5f1cac..f8a5645a 100644 --- a/proto/forwarding/forwarding_common.pb.go +++ b/proto/forwarding/forwarding_common.pb.go @@ -280,6 +280,7 @@ const ( PacketFieldNum_PACKET_FIELD_NUM_OUTPUT_IFACE PacketFieldNum = 61 PacketFieldNum_PACKET_FIELD_NUM_TUNNEL_ID PacketFieldNum = 62 PacketFieldNum_PACKET_FIELD_NUM_HOST_PORT_ID PacketFieldNum = 63 + PacketFieldNum_PACKET_FIELD_NUM_L2MC_GROUP_ID PacketFieldNum = 64 PacketFieldNum_PACKET_FIELD_NUM_COUNT PacketFieldNum = 1000 ) @@ -330,6 +331,7 @@ var ( 61: "PACKET_FIELD_NUM_OUTPUT_IFACE", 62: "PACKET_FIELD_NUM_TUNNEL_ID", 63: "PACKET_FIELD_NUM_HOST_PORT_ID", + 64: "PACKET_FIELD_NUM_L2MC_GROUP_ID", 1000: "PACKET_FIELD_NUM_COUNT", } PacketFieldNum_value = map[string]int32{ @@ -377,6 +379,7 @@ var ( "PACKET_FIELD_NUM_OUTPUT_IFACE": 61, "PACKET_FIELD_NUM_TUNNEL_ID": 62, "PACKET_FIELD_NUM_HOST_PORT_ID": 63, + "PACKET_FIELD_NUM_L2MC_GROUP_ID": 64, "PACKET_FIELD_NUM_COUNT": 1000, } ) @@ -2717,7 +2720,7 @@ var file_proto_forwarding_forwarding_common_proto_rawDesc = []byte{ 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x49, 0x50, 0x10, 0x13, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x10, 0xe8, 0x07, 0x2a, 0x8d, 0x0c, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x46, + 0x54, 0x10, 0xe8, 0x07, 0x2a, 0xb1, 0x0c, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x43, @@ -2812,98 +2815,100 @@ var file_proto_forwarding_forwarding_common_proto_rawDesc = []byte{ 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x55, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x49, 0x44, 0x10, 0x3e, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x4f, - 0x52, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x3f, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x10, 0xe8, 0x07, 0x2a, 0xda, 0x0a, 0x0a, 0x09, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, - 0x0a, 0x15, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, - 0x53, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, - 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x53, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, - 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, - 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x5f, 0x52, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x53, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, - 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, - 0x53, 0x10, 0x06, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, - 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x07, 0x12, 0x18, - 0x0a, 0x14, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, - 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x08, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, - 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x0a, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x0c, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x4c, 0x49, 0x4d, 0x49, 0x54, - 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0d, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x4c, 0x49, 0x4d, - 0x49, 0x54, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x0e, 0x12, 0x1b, 0x0a, 0x17, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0f, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, 0x43, 0x54, 0x45, - 0x54, 0x53, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, - 0x49, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, - 0x10, 0x11, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x12, 0x12, - 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, - 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x13, 0x12, 0x1c, - 0x0a, 0x18, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, - 0x42, 0x41, 0x44, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x14, 0x12, 0x24, 0x0a, 0x20, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x41, 0x44, - 0x4d, 0x49, 0x4e, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, - 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x5f, 0x52, 0x58, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, - 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x16, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x44, - 0x52, 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x17, 0x12, 0x23, 0x0a, - 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, - 0x10, 0x18, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x5f, 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, - 0x19, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, - 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x1a, 0x12, - 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x4d, 0x49, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x53, 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, - 0x49, 0x44, 0x5f, 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x1c, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x41, 0x50, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x1d, 0x12, 0x21, 0x0a, 0x1d, + 0x52, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x3f, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x4c, 0x32, 0x4d, 0x43, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x49, 0x44, 0x10, 0x40, 0x12, 0x1b, 0x0a, 0x16, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0xe8, 0x07, 0x2a, 0xda, 0x0a, 0x0a, 0x09, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, + 0x5f, 0x52, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x01, 0x12, 0x18, 0x0a, + 0x14, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x4f, + 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, 0x43, + 0x54, 0x45, 0x54, 0x53, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, + 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x06, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, + 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, + 0x5f, 0x54, 0x58, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x08, 0x12, 0x1e, 0x0a, 0x1a, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x44, 0x52, + 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x44, 0x52, + 0x4f, 0x50, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x0a, 0x12, 0x1f, 0x0a, 0x1b, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x0c, 0x12, 0x20, 0x0a, 0x1c, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0d, 0x12, 0x1f, + 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x41, 0x54, + 0x45, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x0e, 0x12, + 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x44, 0x52, + 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0f, 0x12, 0x1a, 0x0a, 0x16, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, + 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x53, 0x10, 0x11, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, + 0x53, 0x10, 0x12, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, + 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, + 0x10, 0x13, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, + 0x5f, 0x52, 0x58, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x14, + 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, + 0x58, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x53, 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x44, 0x52, + 0x4f, 0x50, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x16, 0x12, 0x24, 0x0a, 0x20, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x41, 0x44, 0x4d, + 0x49, 0x4e, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, + 0x17, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, + 0x54, 0x58, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x4f, 0x43, + 0x54, 0x45, 0x54, 0x53, 0x10, 0x18, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, + 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x53, 0x10, 0x19, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, + 0x5f, 0x49, 0x44, 0x5f, 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, + 0x53, 0x10, 0x1a, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, + 0x44, 0x5f, 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x4d, 0x49, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x1c, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x41, 0x50, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x1e, 0x12, - 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x44, 0x45, - 0x43, 0x41, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x53, 0x10, 0x1f, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, - 0x44, 0x5f, 0x44, 0x45, 0x43, 0x41, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, - 0x54, 0x45, 0x54, 0x53, 0x10, 0x20, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, - 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, - 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x21, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x1d, + 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x45, + 0x4e, 0x43, 0x41, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, + 0x53, 0x10, 0x1e, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, + 0x44, 0x5f, 0x44, 0x45, 0x43, 0x41, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x1f, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x43, 0x41, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x20, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x22, 0x12, - 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, - 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x23, - 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, - 0x58, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x24, - 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x52, - 0x58, 0x5f, 0x55, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, - 0x25, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, - 0x52, 0x58, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x55, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x53, 0x10, 0x26, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, - 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x55, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x27, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x55, 0x43, 0x41, - 0x53, 0x54, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x28, 0x12, 0x13, 0x0a, 0x0e, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0xff, - 0x01, 0x42, 0x30, 0x5a, 0x2e, 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, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x4f, 0x43, 0x54, 0x45, 0x54, 0x53, 0x10, 0x21, 0x12, 0x23, + 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x46, 0x4c, 0x4f, + 0x57, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x53, 0x10, 0x22, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, + 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x53, 0x10, 0x23, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, + 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x4f, 0x43, 0x54, 0x45, + 0x54, 0x53, 0x10, 0x24, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, + 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x55, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x53, 0x10, 0x25, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, + 0x5f, 0x49, 0x44, 0x5f, 0x52, 0x58, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x55, 0x43, 0x41, 0x53, 0x54, + 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x26, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x55, 0x43, 0x41, 0x53, + 0x54, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x27, 0x12, 0x23, 0x0a, 0x1f, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x58, 0x5f, 0x4e, 0x4f, 0x4e, + 0x5f, 0x55, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x28, + 0x12, 0x13, 0x0a, 0x0e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x5f, 0x4d, + 0x41, 0x58, 0x10, 0xff, 0x01, 0x42, 0x30, 0x5a, 0x2e, 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, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/forwarding/forwarding_common.proto b/proto/forwarding/forwarding_common.proto index 67082d50..f03c40f6 100644 --- a/proto/forwarding/forwarding_common.proto +++ b/proto/forwarding/forwarding_common.proto @@ -176,6 +176,7 @@ enum PacketFieldNum { PACKET_FIELD_NUM_OUTPUT_IFACE = 61; // Output L3 interface (metadata). PACKET_FIELD_NUM_TUNNEL_ID = 62; // Tunnel ID (metadata). PACKET_FIELD_NUM_HOST_PORT_ID = 63; // Host port id (metadata). + PACKET_FIELD_NUM_L2MC_GROUP_ID = 64; // L2MC Group id (metadata). PACKET_FIELD_NUM_COUNT = 1000; }