From 44aaebe613ef95f526a4e11bd58fd58ded31007a Mon Sep 17 00:00:00 2001 From: Matthias Frei Date: Fri, 18 Nov 2022 19:35:03 +0100 Subject: [PATCH] Add Carbon Intensity information to beacons and paths (#129) * Add Carbon Intensity Information to beacons First crude version, just to allow adding _some_ numbers. Note: not merged code paths with bandwidth although this is currently processed identically, as changes to the representation of the carbon intensity information are to be expected. * Add Carbon Intensity to combinator, snet.Path and showpaths * Resolved conflict in daemon protobuf file by incrementing field number. Recreated protobuf generated file. * Resolved conflicts in other places due to diff not matching original, by adding the carbon intentity field in data structures/initializations again to the upstream ones. --- control/beaconing/staticinfo_config.go | 82 +++- control/beaconing/staticinfo_config_test.go | 74 ++++ .../beaconing/testdata/testconfigfile.json | 11 + daemon/internal/servers/grpc.go | 21 +- pkg/daemon/grpc.go | 19 +- pkg/private/xtest/graph/graph.go | 39 +- pkg/proto/control_plane/seg_extensions.pb.go | 323 +++++++++----- pkg/proto/daemon/daemon.pb.go | 413 +++++++++--------- .../extensions/staticinfo/staticinfo.go | 81 +++- .../extensions/staticinfo/staticinfo_test.go | 11 + pkg/snet/path.go | 30 +- private/path/combinator/graph.go | 19 +- .../path/combinator/staticinfo_accumulator.go | 69 ++- .../combinator/staticinfo_accumulator_test.go | 17 + proto/control_plane/v1/seg_extensions.proto | 11 + proto/daemon/v1/daemon.proto | 7 + scion/showpaths/showpaths.go | 60 ++- 17 files changed, 880 insertions(+), 407 deletions(-) diff --git a/control/beaconing/staticinfo_config.go b/control/beaconing/staticinfo_config.go index 3cedd4a72a..39192576e6 100644 --- a/control/beaconing/staticinfo_config.go +++ b/control/beaconing/staticinfo_config.go @@ -38,6 +38,11 @@ type InterfaceBandwidths struct { Intra map[common.IFIDType]uint64 `json:"Intra"` } +type InterfaceCarbonIntensities struct { + Inter uint64 `json:"Inter"` + Intra map[common.IFIDType]uint64 `json:"Intra"` +} + type InterfaceGeodata struct { Longitude float32 `json:"Longitude"` Latitude float32 `json:"Latitude"` @@ -79,12 +84,13 @@ func (l *LinkType) UnmarshalText(text []byte) error { // StaticInfoCfg is used to parse data from config.json. type StaticInfoCfg struct { - Latency map[common.IFIDType]InterfaceLatencies `json:"Latency"` - Bandwidth map[common.IFIDType]InterfaceBandwidths `json:"Bandwidth"` - LinkType map[common.IFIDType]LinkType `json:"LinkType"` - Geo map[common.IFIDType]InterfaceGeodata `json:"Geo"` - Hops map[common.IFIDType]InterfaceHops `json:"Hops"` - Note string `json:"Note"` + Latency map[common.IFIDType]InterfaceLatencies `json:"Latency"` + Bandwidth map[common.IFIDType]InterfaceBandwidths `json:"Bandwidth"` + CarbonIntensity map[common.IFIDType]InterfaceCarbonIntensities `json:"CarbonIntensity"` + LinkType map[common.IFIDType]LinkType `json:"LinkType"` + Geo map[common.IFIDType]InterfaceGeodata `json:"Geo"` + Hops map[common.IFIDType]InterfaceHops `json:"Hops"` + Note string `json:"Note"` } // ParseStaticInfoCfg parses data from a config file into a StaticInfoCfg struct. @@ -120,6 +126,10 @@ func (cfg *StaticInfoCfg) clean() { for _, s := range cfg.Bandwidth { delete(s.Intra, 0) } + delete(cfg.CarbonIntensity, 0) + for _, s := range cfg.CarbonIntensity { + delete(s.Intra, 0) + } delete(cfg.LinkType, 0) delete(cfg.Geo, 0) delete(cfg.Hops, 0) @@ -129,6 +139,7 @@ func (cfg *StaticInfoCfg) clean() { symmetrizeLatency(cfg.Latency) symmetrizeBandwidth(cfg.Bandwidth) + symmetrizeCarbonIntensity(cfg.CarbonIntensity) symmetrizeHops(cfg.Hops) } @@ -178,6 +189,29 @@ func symmetrizeBandwidth(bandwidth map[common.IFIDType]InterfaceBandwidths) { } } +// symmetrizeCarbonIntensity makes the Intra carbon intensity values symmetric +func symmetrizeCarbonIntensity(carbonIntensity map[common.IFIDType]InterfaceCarbonIntensities) { + for i, sub := range carbonIntensity { + delete(sub.Intra, i) // Remove loopy entry + for j, v := range sub.Intra { + if _, ok := carbonIntensity[j]; !ok { + continue + } + if carbonIntensity[j].Intra == nil { + carbonIntensity[j] = InterfaceCarbonIntensities{ + Inter: carbonIntensity[j].Inter, + Intra: make(map[common.IFIDType]uint64), + } + } + vTransposed, ok := carbonIntensity[j].Intra[i] + // Set if not specified or pick more conservative value if both are specified + if !ok || v < vTransposed { + carbonIntensity[j].Intra[i] = v + } + } + } +} + // symmetrizeHops makes the Intra hops values symmetric func symmetrizeHops(hops map[common.IFIDType]InterfaceHops) { for i, sub := range hops { @@ -210,12 +244,13 @@ func (cfg StaticInfoCfg) generate(ifType map[common.IFIDType]topology.LinkType, ingress, egress common.IFIDType) *staticinfo.Extension { return &staticinfo.Extension{ - Latency: cfg.generateLatency(ifType, ingress, egress), - Bandwidth: cfg.generateBandwidth(ifType, ingress, egress), - Geo: cfg.generateGeo(ifType, ingress, egress), - LinkType: cfg.generateLinkType(ifType, egress), - InternalHops: cfg.generateInternalHops(ifType, ingress, egress), - Note: cfg.Note, + Latency: cfg.generateLatency(ifType, ingress, egress), + Bandwidth: cfg.generateBandwidth(ifType, ingress, egress), + CarbonIntensity: cfg.generateCarbonIntensity(ifType, ingress, egress), + Geo: cfg.generateGeo(ifType, ingress, egress), + LinkType: cfg.generateLinkType(ifType, egress), + InternalHops: cfg.generateInternalHops(ifType, ingress, egress), + Note: cfg.Note, } } @@ -265,6 +300,29 @@ func (cfg StaticInfoCfg) generateBandwidth(ifType map[common.IFIDType]topology.L return bw } +// generateCarbonIntensity creates the BandwidthInfo by extracting the relevant values +// from the config. +func (cfg StaticInfoCfg) generateCarbonIntensity(ifType map[common.IFIDType]topology.LinkType, + ingress, egress common.IFIDType) staticinfo.CarbonIntensityInfo { + + ci := staticinfo.CarbonIntensityInfo{ + Intra: make(map[common.IFIDType]uint64), + Inter: make(map[common.IFIDType]uint64), + } + for ifid, v := range cfg.CarbonIntensity[egress].Intra { + if includeIntraInfo(ifType, ifid, ingress, egress) { + ci.Intra[ifid] = v + } + } + for ifid, v := range cfg.CarbonIntensity { + t := ifType[ifid] + if ifid == egress || t == topology.Peer { + ci.Inter[ifid] = v.Inter + } + } + return ci +} + // generateLinkType creates the LinkTypeInfo by extracting the relevant values from // the config. func (cfg StaticInfoCfg) generateLinkType(ifType map[common.IFIDType]topology.LinkType, diff --git a/control/beaconing/staticinfo_config_test.go b/control/beaconing/staticinfo_config_test.go index e68a07734c..713cc2e607 100644 --- a/control/beaconing/staticinfo_config_test.go +++ b/control/beaconing/staticinfo_config_test.go @@ -50,6 +50,10 @@ const ( bandwidth_inter_3 uint64 = 80 bandwidth_inter_5 uint64 = 120 + carbon_intensity_intra_1_2 uint64 = 300 + carbon_intensity_inter_1 uint64 = 780 + carbon_intensity_inter_2 uint64 = 400 + link_type_1 staticinfo.LinkType = staticinfo.LinkTypeDirect link_type_2 staticinfo.LinkType = staticinfo.LinkTypeOpennet link_type_3 staticinfo.LinkType = staticinfo.LinkTypeMultihop @@ -163,6 +167,20 @@ func getTestConfigData() *beaconing.StaticInfoCfg { }, }, }, + CarbonIntensity: map[common.IFIDType]beaconing.InterfaceCarbonIntensities{ + 1: { + Inter: carbon_intensity_inter_1, + Intra: map[common.IFIDType]uint64{ + 2: carbon_intensity_intra_1_2, + }, + }, + 2: { + Inter: carbon_intensity_inter_2, + Intra: map[common.IFIDType]uint64{ + 1: carbon_intensity_intra_1_2, + }, + }, + }, LinkType: map[common.IFIDType]beaconing.LinkType{ 1: beaconing.LinkType(link_type_1), 2: beaconing.LinkType(link_type_2), @@ -270,6 +288,14 @@ func TestGenerateStaticInfo(t *testing.T) { 5: bandwidth_inter_5, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{ + 2: carbon_intensity_intra_1_2, + }, + Inter: map[common.IFIDType]uint64{ + 1: carbon_intensity_inter_1, + }, + }, Geo: staticinfo.GeoInfo{ 1: geo_1, 3: geo_3, @@ -313,6 +339,12 @@ func TestGenerateStaticInfo(t *testing.T) { 5: bandwidth_inter_5, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{}, + Inter: map[common.IFIDType]uint64{ + 2: carbon_intensity_inter_2, + }, + }, Geo: staticinfo.GeoInfo{ 2: geo_2, 3: geo_3, @@ -347,6 +379,10 @@ func TestGenerateStaticInfo(t *testing.T) { 5: bandwidth_inter_5, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{}, + Inter: map[common.IFIDType]uint64{}, + }, Geo: staticinfo.GeoInfo{ 3: geo_3, 5: geo_5, @@ -384,6 +420,14 @@ func TestGenerateStaticInfo(t *testing.T) { 5: bandwidth_inter_5, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{ + 2: carbon_intensity_intra_1_2, + }, + Inter: map[common.IFIDType]uint64{ + 1: carbon_intensity_inter_1, + }, + }, Geo: staticinfo.GeoInfo{ 1: geo_1, 5: geo_5, @@ -423,6 +467,12 @@ func TestGenerateStaticInfo(t *testing.T) { 5: bandwidth_inter_5, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{}, + Inter: map[common.IFIDType]uint64{ + 2: carbon_intensity_inter_2, + }, + }, Geo: staticinfo.GeoInfo{ 2: geo_2, 5: geo_5, @@ -463,6 +513,14 @@ func TestGenerateStaticInfo(t *testing.T) { 2: bandwidth_inter_2, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{ + 1: carbon_intensity_intra_1_2, + }, + Inter: map[common.IFIDType]uint64{ + 2: carbon_intensity_inter_2, + }, + }, Geo: staticinfo.GeoInfo{ 2: geo_2, }, @@ -495,6 +553,12 @@ func TestGenerateStaticInfo(t *testing.T) { 1: bandwidth_inter_1, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{}, + Inter: map[common.IFIDType]uint64{ + 1: carbon_intensity_inter_1, + }, + }, Geo: staticinfo.GeoInfo{ 1: geo_1, }, @@ -527,6 +591,12 @@ func TestGenerateStaticInfo(t *testing.T) { 1: bandwidth_inter_1, }, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{}, + Inter: map[common.IFIDType]uint64{ + 1: carbon_intensity_inter_1, + }, + }, Geo: staticinfo.GeoInfo{ 1: geo_1, 3: geo_3, @@ -554,6 +624,10 @@ func TestGenerateStaticInfo(t *testing.T) { Intra: map[common.IFIDType]uint64{}, Inter: map[common.IFIDType]uint64{}, }, + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{}, + Inter: map[common.IFIDType]uint64{}, + }, Geo: staticinfo.GeoInfo{ 3: geo_3, }, diff --git a/control/beaconing/testdata/testconfigfile.json b/control/beaconing/testdata/testconfigfile.json index f7db44fdc3..2bd569b7af 100644 --- a/control/beaconing/testdata/testconfigfile.json +++ b/control/beaconing/testdata/testconfigfile.json @@ -60,6 +60,17 @@ "Inter": 120 } }, + "CarbonIntensity": { + "1": { + "Inter": 780, + "Intra": { + "2": 300 + } + }, + "2": { + "Inter": 400 + } + }, "Linktype": { "1":"direct", "2":"opennet", diff --git a/daemon/internal/servers/grpc.go b/daemon/internal/servers/grpc.go index dd2cb43bc7..ba05599e7b 100644 --- a/daemon/internal/servers/grpc.go +++ b/daemon/internal/servers/grpc.go @@ -174,16 +174,17 @@ func pathToPB(path snet.Path) *sdpb.Path { Interface: &sdpb.Interface{ Address: &sdpb.Underlay{Address: nextHopStr}, }, - Interfaces: interfaces, - Mtu: uint32(meta.MTU), - Expiration: ×tamppb.Timestamp{Seconds: meta.Expiry.Unix()}, - Latency: latency, - Bandwidth: meta.Bandwidth, - Geo: geo, - LinkType: linkType, - InternalHops: meta.InternalHops, - Notes: meta.Notes, - EpicAuths: epicAuths, + Interfaces: interfaces, + Mtu: uint32(meta.MTU), + Expiration: ×tamppb.Timestamp{Seconds: meta.Expiry.Unix()}, + Latency: latency, + Bandwidth: meta.Bandwidth, + CarbonIntensity: meta.CarbonIntensity, + Geo: geo, + LinkType: linkType, + InternalHops: meta.InternalHops, + Notes: meta.Notes, + EpicAuths: epicAuths, } } diff --git a/pkg/daemon/grpc.go b/pkg/daemon/grpc.go index 26ae049d7b..e227425fbb 100644 --- a/pkg/daemon/grpc.go +++ b/pkg/daemon/grpc.go @@ -280,15 +280,16 @@ func convertPath(p *sdpb.Path, dst addr.IA) (path.Path, error) { }, NextHop: underlayA, Meta: snet.PathMetadata{ - Interfaces: interfaces, - MTU: uint16(p.Mtu), - Expiry: expiry, - Latency: latency, - Bandwidth: p.Bandwidth, - Geo: geo, - LinkType: linkType, - InternalHops: p.InternalHops, - Notes: p.Notes, + Interfaces: interfaces, + MTU: uint16(p.Mtu), + Expiry: expiry, + Latency: latency, + Bandwidth: p.Bandwidth, + CarbonIntensity: p.CarbonIntensity, + Geo: geo, + LinkType: linkType, + InternalHops: p.InternalHops, + Notes: p.Notes, }, } diff --git a/pkg/private/xtest/graph/graph.go b/pkg/private/xtest/graph/graph.go index f608624e5f..1672cbf684 100644 --- a/pkg/private/xtest/graph/graph.go +++ b/pkg/private/xtest/graph/graph.go @@ -372,6 +372,18 @@ func (g *Graph) Bandwidth(a, b uint16) uint64 { return 1000 * uint64(a*b*11939%10000) // value in 0-10_000_000kbps, 0-10Gbps } +// CarbonIntensity returns an arbitrary test carbon intensity value between two +// interfaces. +// Analogous to Latency. +func (g *Graph) CarbonIntensity(a, b uint16) uint64 { + sameIA := (g.parents[a] == g.parents[b]) + if !sameIA && g.links[a] != b { + panic("interfaces must be in the same AS or connected by a link") + } + + return uint64(a * b * 11939 % 5000) // value in 0-5000 grams of CO2 per terabyte +} + // GeoCoordinates returns an arbitrary test GeoCoordinate for the interface func (g *Graph) GeoCoordinates(ifid uint16) staticinfo.GeoCoordinates { ia, ok := g.parents[ifid] @@ -633,6 +645,20 @@ func generateStaticInfo(g *Graph, ia addr.IA, inIF, outIF uint16) *staticinfo.Ex } } + carbonIntensity := staticinfo.CarbonIntensityInfo{} + if outIF != 0 { + carbonIntensity.Intra = make(map[common.IFIDType]uint64) + carbonIntensity.Inter = make(map[common.IFIDType]uint64) + for ifid := range as.IFIDs { + if ifid != outIF { + carbonIntensity.Intra[common.IFIDType(ifid)] = g.CarbonIntensity(ifid, outIF) + } + if ifid == outIF || g.isPeer[ifid] { + carbonIntensity.Inter[common.IFIDType(ifid)] = g.CarbonIntensity(ifid, g.links[ifid]) + } + } + } + geo := make(staticinfo.GeoInfo) for ifid := range as.IFIDs { geo[common.IFIDType(ifid)] = g.GeoCoordinates(ifid) @@ -657,11 +683,12 @@ func generateStaticInfo(g *Graph, ia addr.IA, inIF, outIF uint16) *staticinfo.Ex } return &staticinfo.Extension{ - Latency: latency, - Bandwidth: bandwidth, - Geo: geo, - LinkType: linkType, - InternalHops: internalHops, - Note: fmt.Sprintf("Note %s", ia), + Latency: latency, + Bandwidth: bandwidth, + CarbonIntensity: carbonIntensity, + Geo: geo, + LinkType: linkType, + InternalHops: internalHops, + Note: fmt.Sprintf("Note %s", ia), } } diff --git a/pkg/proto/control_plane/seg_extensions.pb.go b/pkg/proto/control_plane/seg_extensions.pb.go index f072070bfd..8e6b6e165d 100644 --- a/pkg/proto/control_plane/seg_extensions.pb.go +++ b/pkg/proto/control_plane/seg_extensions.pb.go @@ -188,12 +188,13 @@ type StaticInfoExtension struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Latency *LatencyInfo `protobuf:"bytes,1,opt,name=latency,proto3" json:"latency,omitempty"` - Bandwidth *BandwidthInfo `protobuf:"bytes,2,opt,name=bandwidth,proto3" json:"bandwidth,omitempty"` - Geo map[uint64]*GeoCoordinates `protobuf:"bytes,3,rep,name=geo,proto3" json:"geo,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - LinkType map[uint64]LinkType `protobuf:"bytes,4,rep,name=link_type,json=linkType,proto3" json:"link_type,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=proto.control_plane.v1.LinkType"` - InternalHops map[uint64]uint32 `protobuf:"bytes,5,rep,name=internal_hops,json=internalHops,proto3" json:"internal_hops,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` - Note string `protobuf:"bytes,6,opt,name=note,proto3" json:"note,omitempty"` + Latency *LatencyInfo `protobuf:"bytes,1,opt,name=latency,proto3" json:"latency,omitempty"` + Bandwidth *BandwidthInfo `protobuf:"bytes,2,opt,name=bandwidth,proto3" json:"bandwidth,omitempty"` + CarbonIntensity *CarbonIntensityInfo `protobuf:"bytes,7,opt,name=carbon_intensity,json=carbonIntensity,proto3" json:"carbon_intensity,omitempty"` + Geo map[uint64]*GeoCoordinates `protobuf:"bytes,3,rep,name=geo,proto3" json:"geo,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + LinkType map[uint64]LinkType `protobuf:"bytes,4,rep,name=link_type,json=linkType,proto3" json:"link_type,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=proto.control_plane.v1.LinkType"` + InternalHops map[uint64]uint32 `protobuf:"bytes,5,rep,name=internal_hops,json=internalHops,proto3" json:"internal_hops,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Note string `protobuf:"bytes,6,opt,name=note,proto3" json:"note,omitempty"` } func (x *StaticInfoExtension) Reset() { @@ -242,6 +243,13 @@ func (x *StaticInfoExtension) GetBandwidth() *BandwidthInfo { return nil } +func (x *StaticInfoExtension) GetCarbonIntensity() *CarbonIntensityInfo { + if x != nil { + return x.CarbonIntensity + } + return nil +} + func (x *StaticInfoExtension) GetGeo() map[uint64]*GeoCoordinates { if x != nil { return x.Geo @@ -380,6 +388,61 @@ func (x *BandwidthInfo) GetInter() map[uint64]uint64 { return nil } +type CarbonIntensityInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Intra map[uint64]uint64 `protobuf:"bytes,1,rep,name=intra,proto3" json:"intra,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Inter map[uint64]uint64 `protobuf:"bytes,2,rep,name=inter,proto3" json:"inter,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` +} + +func (x *CarbonIntensityInfo) Reset() { + *x = CarbonIntensityInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CarbonIntensityInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CarbonIntensityInfo) ProtoMessage() {} + +func (x *CarbonIntensityInfo) ProtoReflect() protoreflect.Message { + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CarbonIntensityInfo.ProtoReflect.Descriptor instead. +func (*CarbonIntensityInfo) Descriptor() ([]byte, []int) { + return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{5} +} + +func (x *CarbonIntensityInfo) GetIntra() map[uint64]uint64 { + if x != nil { + return x.Intra + } + return nil +} + +func (x *CarbonIntensityInfo) GetInter() map[uint64]uint64 { + if x != nil { + return x.Inter + } + return nil +} + type GeoCoordinates struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -393,7 +456,7 @@ type GeoCoordinates struct { func (x *GeoCoordinates) Reset() { *x = GeoCoordinates{} if protoimpl.UnsafeEnabled { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[5] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -406,7 +469,7 @@ func (x *GeoCoordinates) String() string { func (*GeoCoordinates) ProtoMessage() {} func (x *GeoCoordinates) ProtoReflect() protoreflect.Message { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[5] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -419,7 +482,7 @@ func (x *GeoCoordinates) ProtoReflect() protoreflect.Message { // Deprecated: Use GeoCoordinates.ProtoReflect.Descriptor instead. func (*GeoCoordinates) Descriptor() ([]byte, []int) { - return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{5} + return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{6} } func (x *GeoCoordinates) GetLatitude() float32 { @@ -454,7 +517,7 @@ type DigestExtension struct { func (x *DigestExtension) Reset() { *x = DigestExtension{} if protoimpl.UnsafeEnabled { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[6] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -467,7 +530,7 @@ func (x *DigestExtension) String() string { func (*DigestExtension) ProtoMessage() {} func (x *DigestExtension) ProtoReflect() protoreflect.Message { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[6] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -480,7 +543,7 @@ func (x *DigestExtension) ProtoReflect() protoreflect.Message { // Deprecated: Use DigestExtension.ProtoReflect.Descriptor instead. func (*DigestExtension) Descriptor() ([]byte, []int) { - return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{6} + return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{7} } func (x *DigestExtension) GetEpic() *DigestExtension_Digest { @@ -501,7 +564,7 @@ type PathSegmentUnsignedExtensions struct { func (x *PathSegmentUnsignedExtensions) Reset() { *x = PathSegmentUnsignedExtensions{} if protoimpl.UnsafeEnabled { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[7] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -514,7 +577,7 @@ func (x *PathSegmentUnsignedExtensions) String() string { func (*PathSegmentUnsignedExtensions) ProtoMessage() {} func (x *PathSegmentUnsignedExtensions) ProtoReflect() protoreflect.Message { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[7] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -527,7 +590,7 @@ func (x *PathSegmentUnsignedExtensions) ProtoReflect() protoreflect.Message { // Deprecated: Use PathSegmentUnsignedExtensions.ProtoReflect.Descriptor instead. func (*PathSegmentUnsignedExtensions) Descriptor() ([]byte, []int) { - return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{7} + return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{8} } func (x *PathSegmentUnsignedExtensions) GetEpic() *experimental.EPICDetachedExtension { @@ -548,7 +611,7 @@ type DigestExtension_Digest struct { func (x *DigestExtension_Digest) Reset() { *x = DigestExtension_Digest{} if protoimpl.UnsafeEnabled { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[15] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -561,7 +624,7 @@ func (x *DigestExtension_Digest) String() string { func (*DigestExtension_Digest) ProtoMessage() {} func (x *DigestExtension_Digest) ProtoReflect() protoreflect.Message { - mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[15] + mi := &file_proto_control_plane_v1_seg_extensions_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -574,7 +637,7 @@ func (x *DigestExtension_Digest) ProtoReflect() protoreflect.Message { // Deprecated: Use DigestExtension_Digest.ProtoReflect.Descriptor instead. func (*DigestExtension_Digest) Descriptor() ([]byte, []int) { - return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{6, 0} + return file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP(), []int{7, 0} } func (x *DigestExtension_Digest) GetDigest() []byte { @@ -614,7 +677,7 @@ var file_proto_control_plane_v1_seg_extensions_proto_rawDesc = []byte{ 0x74, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x48, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, - 0x48, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0xb1, 0x05, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x48, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x89, 0x06, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, @@ -624,66 +687,90 @@ var file_proto_control_plane_v1_seg_extensions_proto_rawDesc = []byte{ 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x62, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x12, 0x46, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x49, - 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x6f, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x12, 0x56, 0x0a, 0x09, 0x6c, 0x69, - 0x6e, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x49, 0x6e, 0x66, - 0x6f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x68, - 0x6f, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x48, - 0x6f, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x48, 0x6f, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x1a, 0x5e, 0x0a, 0x08, 0x47, 0x65, - 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x0d, 0x4c, 0x69, - 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, + 0x74, 0x68, 0x12, 0x56, 0x0a, 0x10, 0x63, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x48, 0x6f, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8d, 0x02, 0x0a, 0x0b, 0x4c, - 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x05, 0x69, 0x6e, - 0x74, 0x72, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, - 0x6e, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, - 0x12, 0x44, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x05, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x63, 0x61, 0x72, 0x62, 0x6f, + 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x03, 0x67, 0x65, + 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x67, + 0x65, 0x6f, 0x12, 0x56, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x48, 0x6f, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x48, 0x6f, 0x70, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, + 0x74, 0x65, 0x1a, 0x5e, 0x0a, 0x08, 0x47, 0x65, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x93, 0x02, 0x0a, 0x0d, 0x42, - 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x46, 0x0a, 0x05, - 0x69, 0x6e, 0x74, 0x72, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, - 0x6e, 0x74, 0x72, 0x61, 0x12, 0x46, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x5d, 0x0a, 0x0d, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x48, 0x6f, 0x70, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x8d, 0x02, 0x0a, 0x0b, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, + 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x12, 0x44, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x38, + 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x93, 0x02, 0x0a, 0x0d, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x46, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, - 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x12, 0x46, 0x0a, 0x05, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x38, + 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa5, 0x02, 0x0a, 0x13, 0x43, 0x61, 0x72, + 0x62, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x4c, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, + 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x12, 0x4c, + 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, @@ -739,7 +826,7 @@ func file_proto_control_plane_v1_seg_extensions_proto_rawDescGZIP() []byte { } var file_proto_control_plane_v1_seg_extensions_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_control_plane_v1_seg_extensions_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_proto_control_plane_v1_seg_extensions_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_proto_control_plane_v1_seg_extensions_proto_goTypes = []interface{}{ (LinkType)(0), // 0: proto.control_plane.v1.LinkType (*PathSegmentExtensions)(nil), // 1: proto.control_plane.v1.PathSegmentExtensions @@ -747,41 +834,47 @@ var file_proto_control_plane_v1_seg_extensions_proto_goTypes = []interface{}{ (*StaticInfoExtension)(nil), // 3: proto.control_plane.v1.StaticInfoExtension (*LatencyInfo)(nil), // 4: proto.control_plane.v1.LatencyInfo (*BandwidthInfo)(nil), // 5: proto.control_plane.v1.BandwidthInfo - (*GeoCoordinates)(nil), // 6: proto.control_plane.v1.GeoCoordinates - (*DigestExtension)(nil), // 7: proto.control_plane.v1.DigestExtension - (*PathSegmentUnsignedExtensions)(nil), // 8: proto.control_plane.v1.PathSegmentUnsignedExtensions - nil, // 9: proto.control_plane.v1.StaticInfoExtension.GeoEntry - nil, // 10: proto.control_plane.v1.StaticInfoExtension.LinkTypeEntry - nil, // 11: proto.control_plane.v1.StaticInfoExtension.InternalHopsEntry - nil, // 12: proto.control_plane.v1.LatencyInfo.IntraEntry - nil, // 13: proto.control_plane.v1.LatencyInfo.InterEntry - nil, // 14: proto.control_plane.v1.BandwidthInfo.IntraEntry - nil, // 15: proto.control_plane.v1.BandwidthInfo.InterEntry - (*DigestExtension_Digest)(nil), // 16: proto.control_plane.v1.DigestExtension.Digest - (*experimental.EPICDetachedExtension)(nil), // 17: proto.control_plane.experimental.v1.EPICDetachedExtension + (*CarbonIntensityInfo)(nil), // 6: proto.control_plane.v1.CarbonIntensityInfo + (*GeoCoordinates)(nil), // 7: proto.control_plane.v1.GeoCoordinates + (*DigestExtension)(nil), // 8: proto.control_plane.v1.DigestExtension + (*PathSegmentUnsignedExtensions)(nil), // 9: proto.control_plane.v1.PathSegmentUnsignedExtensions + nil, // 10: proto.control_plane.v1.StaticInfoExtension.GeoEntry + nil, // 11: proto.control_plane.v1.StaticInfoExtension.LinkTypeEntry + nil, // 12: proto.control_plane.v1.StaticInfoExtension.InternalHopsEntry + nil, // 13: proto.control_plane.v1.LatencyInfo.IntraEntry + nil, // 14: proto.control_plane.v1.LatencyInfo.InterEntry + nil, // 15: proto.control_plane.v1.BandwidthInfo.IntraEntry + nil, // 16: proto.control_plane.v1.BandwidthInfo.InterEntry + nil, // 17: proto.control_plane.v1.CarbonIntensityInfo.IntraEntry + nil, // 18: proto.control_plane.v1.CarbonIntensityInfo.InterEntry + (*DigestExtension_Digest)(nil), // 19: proto.control_plane.v1.DigestExtension.Digest + (*experimental.EPICDetachedExtension)(nil), // 20: proto.control_plane.experimental.v1.EPICDetachedExtension } var file_proto_control_plane_v1_seg_extensions_proto_depIdxs = []int32{ 3, // 0: proto.control_plane.v1.PathSegmentExtensions.static_info:type_name -> proto.control_plane.v1.StaticInfoExtension 2, // 1: proto.control_plane.v1.PathSegmentExtensions.hidden_path:type_name -> proto.control_plane.v1.HiddenPathExtension - 7, // 2: proto.control_plane.v1.PathSegmentExtensions.digests:type_name -> proto.control_plane.v1.DigestExtension + 8, // 2: proto.control_plane.v1.PathSegmentExtensions.digests:type_name -> proto.control_plane.v1.DigestExtension 4, // 3: proto.control_plane.v1.StaticInfoExtension.latency:type_name -> proto.control_plane.v1.LatencyInfo 5, // 4: proto.control_plane.v1.StaticInfoExtension.bandwidth:type_name -> proto.control_plane.v1.BandwidthInfo - 9, // 5: proto.control_plane.v1.StaticInfoExtension.geo:type_name -> proto.control_plane.v1.StaticInfoExtension.GeoEntry - 10, // 6: proto.control_plane.v1.StaticInfoExtension.link_type:type_name -> proto.control_plane.v1.StaticInfoExtension.LinkTypeEntry - 11, // 7: proto.control_plane.v1.StaticInfoExtension.internal_hops:type_name -> proto.control_plane.v1.StaticInfoExtension.InternalHopsEntry - 12, // 8: proto.control_plane.v1.LatencyInfo.intra:type_name -> proto.control_plane.v1.LatencyInfo.IntraEntry - 13, // 9: proto.control_plane.v1.LatencyInfo.inter:type_name -> proto.control_plane.v1.LatencyInfo.InterEntry - 14, // 10: proto.control_plane.v1.BandwidthInfo.intra:type_name -> proto.control_plane.v1.BandwidthInfo.IntraEntry - 15, // 11: proto.control_plane.v1.BandwidthInfo.inter:type_name -> proto.control_plane.v1.BandwidthInfo.InterEntry - 16, // 12: proto.control_plane.v1.DigestExtension.epic:type_name -> proto.control_plane.v1.DigestExtension.Digest - 17, // 13: proto.control_plane.v1.PathSegmentUnsignedExtensions.epic:type_name -> proto.control_plane.experimental.v1.EPICDetachedExtension - 6, // 14: proto.control_plane.v1.StaticInfoExtension.GeoEntry.value:type_name -> proto.control_plane.v1.GeoCoordinates - 0, // 15: proto.control_plane.v1.StaticInfoExtension.LinkTypeEntry.value:type_name -> proto.control_plane.v1.LinkType - 16, // [16:16] is the sub-list for method output_type - 16, // [16:16] is the sub-list for method input_type - 16, // [16:16] is the sub-list for extension type_name - 16, // [16:16] is the sub-list for extension extendee - 0, // [0:16] is the sub-list for field type_name + 6, // 5: proto.control_plane.v1.StaticInfoExtension.carbon_intensity:type_name -> proto.control_plane.v1.CarbonIntensityInfo + 10, // 6: proto.control_plane.v1.StaticInfoExtension.geo:type_name -> proto.control_plane.v1.StaticInfoExtension.GeoEntry + 11, // 7: proto.control_plane.v1.StaticInfoExtension.link_type:type_name -> proto.control_plane.v1.StaticInfoExtension.LinkTypeEntry + 12, // 8: proto.control_plane.v1.StaticInfoExtension.internal_hops:type_name -> proto.control_plane.v1.StaticInfoExtension.InternalHopsEntry + 13, // 9: proto.control_plane.v1.LatencyInfo.intra:type_name -> proto.control_plane.v1.LatencyInfo.IntraEntry + 14, // 10: proto.control_plane.v1.LatencyInfo.inter:type_name -> proto.control_plane.v1.LatencyInfo.InterEntry + 15, // 11: proto.control_plane.v1.BandwidthInfo.intra:type_name -> proto.control_plane.v1.BandwidthInfo.IntraEntry + 16, // 12: proto.control_plane.v1.BandwidthInfo.inter:type_name -> proto.control_plane.v1.BandwidthInfo.InterEntry + 17, // 13: proto.control_plane.v1.CarbonIntensityInfo.intra:type_name -> proto.control_plane.v1.CarbonIntensityInfo.IntraEntry + 18, // 14: proto.control_plane.v1.CarbonIntensityInfo.inter:type_name -> proto.control_plane.v1.CarbonIntensityInfo.InterEntry + 19, // 15: proto.control_plane.v1.DigestExtension.epic:type_name -> proto.control_plane.v1.DigestExtension.Digest + 20, // 16: proto.control_plane.v1.PathSegmentUnsignedExtensions.epic:type_name -> proto.control_plane.experimental.v1.EPICDetachedExtension + 7, // 17: proto.control_plane.v1.StaticInfoExtension.GeoEntry.value:type_name -> proto.control_plane.v1.GeoCoordinates + 0, // 18: proto.control_plane.v1.StaticInfoExtension.LinkTypeEntry.value:type_name -> proto.control_plane.v1.LinkType + 19, // [19:19] is the sub-list for method output_type + 19, // [19:19] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_proto_control_plane_v1_seg_extensions_proto_init() } @@ -851,7 +944,7 @@ func file_proto_control_plane_v1_seg_extensions_proto_init() { } } file_proto_control_plane_v1_seg_extensions_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeoCoordinates); i { + switch v := v.(*CarbonIntensityInfo); i { case 0: return &v.state case 1: @@ -863,7 +956,7 @@ func file_proto_control_plane_v1_seg_extensions_proto_init() { } } file_proto_control_plane_v1_seg_extensions_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DigestExtension); i { + switch v := v.(*GeoCoordinates); i { case 0: return &v.state case 1: @@ -875,6 +968,18 @@ func file_proto_control_plane_v1_seg_extensions_proto_init() { } } file_proto_control_plane_v1_seg_extensions_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DigestExtension); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_control_plane_v1_seg_extensions_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PathSegmentUnsignedExtensions); i { case 0: return &v.state @@ -886,7 +991,7 @@ func file_proto_control_plane_v1_seg_extensions_proto_init() { return nil } } - file_proto_control_plane_v1_seg_extensions_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_proto_control_plane_v1_seg_extensions_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DigestExtension_Digest); i { case 0: return &v.state @@ -905,7 +1010,7 @@ func file_proto_control_plane_v1_seg_extensions_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_control_plane_v1_seg_extensions_proto_rawDesc, NumEnums: 1, - NumMessages: 16, + NumMessages: 19, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/proto/daemon/daemon.pb.go b/pkg/proto/daemon/daemon.pb.go index 93b3b19c6f..ec4de1d29a 100644 --- a/pkg/proto/daemon/daemon.pb.go +++ b/pkg/proto/daemon/daemon.pb.go @@ -202,18 +202,19 @@ type Path struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Raw []byte `protobuf:"bytes,1,opt,name=raw,proto3" json:"raw,omitempty"` - Interface *Interface `protobuf:"bytes,2,opt,name=interface,proto3" json:"interface,omitempty"` - Interfaces []*PathInterface `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty"` - Mtu uint32 `protobuf:"varint,4,opt,name=mtu,proto3" json:"mtu,omitempty"` - Expiration *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` - Latency []*durationpb.Duration `protobuf:"bytes,6,rep,name=latency,proto3" json:"latency,omitempty"` - Bandwidth []uint64 `protobuf:"varint,7,rep,packed,name=bandwidth,proto3" json:"bandwidth,omitempty"` - Geo []*GeoCoordinates `protobuf:"bytes,8,rep,name=geo,proto3" json:"geo,omitempty"` - LinkType []LinkType `protobuf:"varint,9,rep,packed,name=link_type,json=linkType,proto3,enum=proto.daemon.v1.LinkType" json:"link_type,omitempty"` - InternalHops []uint32 `protobuf:"varint,10,rep,packed,name=internal_hops,json=internalHops,proto3" json:"internal_hops,omitempty"` - Notes []string `protobuf:"bytes,11,rep,name=notes,proto3" json:"notes,omitempty"` - EpicAuths *EpicAuths `protobuf:"bytes,12,opt,name=epic_auths,json=epicAuths,proto3" json:"epic_auths,omitempty"` + Raw []byte `protobuf:"bytes,1,opt,name=raw,proto3" json:"raw,omitempty"` + Interface *Interface `protobuf:"bytes,2,opt,name=interface,proto3" json:"interface,omitempty"` + Interfaces []*PathInterface `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty"` + Mtu uint32 `protobuf:"varint,4,opt,name=mtu,proto3" json:"mtu,omitempty"` + Expiration *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` + Latency []*durationpb.Duration `protobuf:"bytes,6,rep,name=latency,proto3" json:"latency,omitempty"` + Bandwidth []uint64 `protobuf:"varint,7,rep,packed,name=bandwidth,proto3" json:"bandwidth,omitempty"` + Geo []*GeoCoordinates `protobuf:"bytes,8,rep,name=geo,proto3" json:"geo,omitempty"` + LinkType []LinkType `protobuf:"varint,9,rep,packed,name=link_type,json=linkType,proto3,enum=proto.daemon.v1.LinkType" json:"link_type,omitempty"` + InternalHops []uint32 `protobuf:"varint,10,rep,packed,name=internal_hops,json=internalHops,proto3" json:"internal_hops,omitempty"` + Notes []string `protobuf:"bytes,11,rep,name=notes,proto3" json:"notes,omitempty"` + EpicAuths *EpicAuths `protobuf:"bytes,12,opt,name=epic_auths,json=epicAuths,proto3" json:"epic_auths,omitempty"` + CarbonIntensity []int64 `protobuf:"varint,13,rep,packed,name=carbon_intensity,json=carbonIntensity,proto3" json:"carbon_intensity,omitempty"` } func (x *Path) Reset() { @@ -332,6 +333,13 @@ func (x *Path) GetEpicAuths() *EpicAuths { return nil } +func (x *Path) GetCarbonIntensity() []int64 { + if x != nil { + return x.CarbonIntensity + } + return nil +} + type EpicAuths struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1525,7 +1533,7 @@ var file_proto_daemon_v1_daemon_proto_rawDesc = []byte{ 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, - 0x94, 0x04, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, + 0xbf, 0x04, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x38, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, @@ -1558,201 +1566,204 @@ var file_proto_daemon_v1_daemon_proto_rawDesc = []byte{ 0x70, 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x70, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x73, 0x52, 0x09, 0x65, 0x70, 0x69, - 0x63, 0x41, 0x75, 0x74, 0x68, 0x73, 0x22, 0x45, 0x0a, 0x09, 0x45, 0x70, 0x69, 0x63, 0x41, 0x75, - 0x74, 0x68, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x68, 0x76, 0x66, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x50, 0x68, 0x76, 0x66, - 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6c, 0x68, 0x76, 0x66, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x4c, 0x68, 0x76, 0x66, 0x22, 0x36, 0x0a, - 0x0d, 0x50, 0x61, 0x74, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x15, - 0x0a, 0x06, 0x69, 0x73, 0x64, 0x5f, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x69, 0x73, 0x64, 0x41, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x64, 0x0a, 0x0e, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x22, 0x0a, 0x09, 0x41, - 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x64, 0x5f, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x73, 0x64, 0x41, 0x73, 0x22, - 0x49, 0x0a, 0x0a, 0x41, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, - 0x06, 0x69, 0x73, 0x64, 0x5f, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, - 0x73, 0x64, 0x41, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x22, 0x13, 0x0a, 0x11, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xc4, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x6f, + 0x63, 0x41, 0x75, 0x74, 0x68, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x61, 0x72, 0x62, 0x6f, 0x6e, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x03, + 0x52, 0x0f, 0x63, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, + 0x79, 0x22, 0x45, 0x0a, 0x09, 0x45, 0x70, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x68, 0x76, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x50, 0x68, 0x76, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x6c, 0x68, 0x76, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x61, 0x75, 0x74, 0x68, 0x4c, 0x68, 0x76, 0x66, 0x22, 0x36, 0x0a, 0x0d, 0x50, 0x61, 0x74, 0x68, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x64, + 0x5f, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x73, 0x64, 0x41, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x64, 0x0a, 0x0e, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x22, 0x0a, 0x09, 0x41, 0x53, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x64, 0x5f, 0x61, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x73, 0x64, 0x41, 0x73, 0x22, 0x49, 0x0a, 0x0a, 0x41, 0x53, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x64, 0x5f, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x73, 0x64, 0x41, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x63, + 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x6d, 0x74, 0x75, 0x22, 0x13, 0x0a, 0x11, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x12, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x53, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, + 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x59, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x59, 0x0a, 0x0f, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xba, 0x01, 0x0a, 0x10, + 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x40, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x33, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xba, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4b, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x59, 0x0a, - 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x1b, 0x0a, - 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x24, 0x0a, 0x08, 0x55, 0x6e, - 0x64, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x43, 0x0a, 0x1a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, - 0x0a, 0x06, 0x69, 0x73, 0x64, 0x5f, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x69, 0x73, 0x64, 0x41, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xcf, 0x01, 0x0a, 0x12, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, - 0x73, 0x74, 0x41, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x76, - 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, 0x6c, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x64, 0x72, 0x6b, 0x65, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x64, 0x12, 0x15, 0x0a, - 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, - 0x72, 0x63, 0x49, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x73, - 0x72, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x44, 0x52, 0x4b, 0x65, 0x79, - 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x59, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x1b, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x24, 0x0a, 0x08, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x61, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x43, 0x0a, 0x1a, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x44, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x64, + 0x5f, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x73, 0x64, 0x41, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x1d, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xcf, 0x01, 0x0a, 0x12, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x72, 0x6b, 0x65, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, + 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, 0x72, 0x63, 0x49, 0x61, 0x12, + 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x64, 0x73, 0x74, 0x49, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x68, 0x6f, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x72, 0x63, 0x48, 0x6f, 0x73, + 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, + 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xcf, 0x01, 0x0a, 0x12, 0x44, 0x52, 0x4b, 0x65, 0x79, - 0x41, 0x53, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, - 0x08, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, 0x6c, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x64, 0x72, 0x6b, 0x65, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x64, 0x12, - 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x73, 0x72, 0x63, 0x49, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, 0x61, 0x12, 0x19, 0x0a, - 0x08, 0x64, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x64, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x44, 0x52, 0x4b, - 0x65, 0x79, 0x41, 0x53, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x37, 0x0a, - 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x45, 0x6e, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x22, 0xcf, 0x01, 0x0a, 0x12, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x41, 0x53, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x39, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x72, 0x6b, + 0x65, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, + 0x63, 0x5f, 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, 0x72, 0x63, 0x49, + 0x61, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, + 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x73, 0x74, 0x48, + 0x6f, 0x73, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x41, 0x53, 0x48, + 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x14, 0x44, 0x52, 0x4b, - 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x35, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x76, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x72, 0x6b, 0x65, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, 0x72, 0x63, 0x49, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, - 0x74, 0x5f, 0x69, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, - 0x61, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x64, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x44, 0x52, 0x4b, 0x65, - 0x79, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x37, - 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x45, 0x6e, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x14, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, + 0x74, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, + 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x61, 0x6c, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x64, 0x72, 0x6b, 0x65, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x64, 0x12, 0x15, + 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x73, 0x72, 0x63, 0x49, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x69, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, 0x61, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x72, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x73, 0x74, 0x48, 0x6f, + 0x73, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x2a, 0x6c, 0x0a, 0x08, 0x4c, 0x69, 0x6e, - 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, - 0x52, 0x45, 0x43, 0x54, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x48, 0x4f, 0x50, 0x10, 0x02, 0x12, - 0x16, 0x0a, 0x12, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x45, - 0x4e, 0x5f, 0x4e, 0x45, 0x54, 0x10, 0x03, 0x32, 0xd4, 0x05, 0x0a, 0x0d, 0x44, 0x61, 0x65, 0x6d, - 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x05, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x02, 0x41, 0x53, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x53, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, - 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x73, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, - 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, - 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x72, 0x0a, 0x13, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0b, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x41, 0x53, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x45, + 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x2a, 0x6c, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, + 0x49, 0x4e, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, + 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, + 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x48, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x49, + 0x4e, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x5f, 0x4e, 0x45, 0x54, + 0x10, 0x03, 0x32, 0xd4, 0x05, 0x0a, 0x0d, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x1d, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x74, 0x68, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x02, 0x41, 0x53, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x57, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, + 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x13, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x44, 0x6f, + 0x77, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5a, 0x0a, 0x0b, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x41, 0x53, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x23, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x41, 0x53, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x41, 0x53, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0b, 0x44, + 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x52, 0x4b, + 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x0d, 0x44, 0x52, 0x4b, 0x65, 0x79, + 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, - 0x41, 0x53, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x0b, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x12, - 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x41, 0x53, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, - 0x41, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x0d, - 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x25, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2e, - 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x63, 0x69, - 0x6f, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x63, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x52, 0x4b, 0x65, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x63, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x73, 0x63, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/pkg/segment/extensions/staticinfo/staticinfo.go b/pkg/segment/extensions/staticinfo/staticinfo.go index 12d6089d9b..f980e35cfc 100644 --- a/pkg/segment/extensions/staticinfo/staticinfo.go +++ b/pkg/segment/extensions/staticinfo/staticinfo.go @@ -28,12 +28,13 @@ import ( // Extension is the internal repesentation of the StaticInfoExtension path // segment extension. type Extension struct { - Latency LatencyInfo - Bandwidth BandwidthInfo - Geo GeoInfo - LinkType LinkTypeInfo - InternalHops InternalHopsInfo - Note string + Latency LatencyInfo + Bandwidth BandwidthInfo + CarbonIntensity CarbonIntensityInfo + Geo GeoInfo + LinkType LinkTypeInfo + InternalHops InternalHopsInfo + Note string } // LatencyInfo is the internal repesentation of `latency` in the @@ -50,6 +51,13 @@ type BandwidthInfo struct { Inter map[common.IFIDType]uint64 } +// CarbonIntensityInfo is the internal repesentation of `carbon_intensity` in the +// StaticInfoExtension. +type CarbonIntensityInfo struct { + Intra map[common.IFIDType]uint64 + Inter map[common.IFIDType]uint64 +} + // GeoInfo is the internal repesentation of `geo` in the // StaticInfoExtension. type GeoInfo map[common.IFIDType]GeoCoordinates @@ -88,12 +96,13 @@ func FromPB(pb *cppb.StaticInfoExtension) *Extension { return nil } return &Extension{ - Latency: latencyInfoFromPB(pb.Latency), - Bandwidth: bandwidthInfoFromPB(pb.Bandwidth), - Geo: geoInfoFromPB(pb.Geo), - LinkType: linkTypeInfoFromPB(pb.LinkType), - InternalHops: internalHopsInfoFromPB(pb.InternalHops), - Note: pb.Note, + Latency: latencyInfoFromPB(pb.Latency), + Bandwidth: bandwidthInfoFromPB(pb.Bandwidth), + CarbonIntensity: carbonIntensityInfoFromPB(pb.CarbonIntensity), + Geo: geoInfoFromPB(pb.Geo), + LinkType: linkTypeInfoFromPB(pb.LinkType), + InternalHops: internalHopsInfoFromPB(pb.InternalHops), + Note: pb.Note, } } @@ -133,6 +142,24 @@ func bandwidthInfoFromPB(pb *cppb.BandwidthInfo) BandwidthInfo { } } +func carbonIntensityInfoFromPB(pb *cppb.CarbonIntensityInfo) CarbonIntensityInfo { + if pb == nil || len(pb.Intra) == 0 && len(pb.Inter) == 0 { + return CarbonIntensityInfo{} + } + intra := make(map[common.IFIDType]uint64, len(pb.Intra)) + for ifid, v := range pb.Intra { + intra[common.IFIDType(ifid)] = v + } + inter := make(map[common.IFIDType]uint64, len(pb.Inter)) + for ifid, v := range pb.Inter { + inter[common.IFIDType(ifid)] = v + } + return CarbonIntensityInfo{ + Intra: intra, + Inter: inter, + } +} + func geoInfoFromPB(pb map[uint64]*cppb.GeoCoordinates) GeoInfo { if len(pb) == 0 { return nil @@ -190,12 +217,13 @@ func ToPB(si *Extension) *cppb.StaticInfoExtension { } return &cppb.StaticInfoExtension{ - Latency: latencyInfoToPB(si.Latency), - Bandwidth: bandwidthInfoToPB(si.Bandwidth), - Geo: geoInfoToPB(si.Geo), - LinkType: linkTypeInfoToPB(si.LinkType), - InternalHops: internalHopsInfoToPB(si.InternalHops), - Note: si.Note, + Latency: latencyInfoToPB(si.Latency), + Bandwidth: bandwidthInfoToPB(si.Bandwidth), + CarbonIntensity: carbonIntensityInfoToPB(si.CarbonIntensity), + Geo: geoInfoToPB(si.Geo), + LinkType: linkTypeInfoToPB(si.LinkType), + InternalHops: internalHopsInfoToPB(si.InternalHops), + Note: si.Note, } } @@ -235,6 +263,23 @@ func bandwidthInfoToPB(bwi BandwidthInfo) *cppb.BandwidthInfo { } } +func carbonIntensityInfoToPB(cii CarbonIntensityInfo) *cppb.CarbonIntensityInfo { + if len(cii.Intra) == 0 && len(cii.Inter) == 0 { + return nil + } + intra := make(map[uint64]uint64, len(cii.Intra)) + for ifid, v := range cii.Intra { + intra[uint64(ifid)] = v + } + inter := make(map[uint64]uint64, len(cii.Inter)) + for ifid, v := range cii.Inter { + inter[uint64(ifid)] = v + } + return &cppb.CarbonIntensityInfo{ + Intra: intra, + Inter: inter, + } +} func geoInfoToPB(gi GeoInfo) map[uint64]*cppb.GeoCoordinates { if len(gi) == 0 { return nil diff --git a/pkg/segment/extensions/staticinfo/staticinfo_test.go b/pkg/segment/extensions/staticinfo/staticinfo_test.go index ba5df30c34..9bbfcae8ff 100644 --- a/pkg/segment/extensions/staticinfo/staticinfo_test.go +++ b/pkg/segment/extensions/staticinfo/staticinfo_test.go @@ -54,6 +54,17 @@ func TestRoundtripStaticInfoExtension(t *testing.T) { }, }, }, + "carbon_intensity": { + CarbonIntensity: staticinfo.CarbonIntensityInfo{ + Intra: map[common.IFIDType]uint64{ + 10: 1, // 1g/TB + 11: 1000, + }, + Inter: map[common.IFIDType]uint64{ + 11: 550, + }, + }, + }, "link_type": { LinkType: staticinfo.LinkTypeInfo{ 1: staticinfo.LinkTypeDirect, diff --git a/pkg/snet/path.go b/pkg/snet/path.go index 1a19ad5760..4fcf7b5837 100644 --- a/pkg/snet/path.go +++ b/pkg/snet/path.go @@ -30,6 +30,10 @@ const ( // LatencyUnset is the default value for a Latency entry in PathMetadata for // which no latency was announced. LatencyUnset time.Duration = -1 + + // CarbonIntensityUnset is the default value for a carbon intensity entry in + // PathMetadata for which no value was announced. + CarbonIntensityUnset int64 = -1 ) // DataplanePath is an abstract representation of a SCION dataplane path. @@ -119,6 +123,13 @@ type PathMetadata struct { // A 0-value indicates that the AS did not announce a bandwidth for this hop. Bandwidth []uint64 + // CarbonIntensity lists the carbon intensity between any two consecutive + // interfaces, in grams of CO2 emitted per terabyte of traffic. + // Entry i describes the value between interfaces i and i+1. + // A negative value (CarbonIntensityUnset) indicates that the AS did not + // announce a value for this hop. + CarbonIntensity []int64 + // Geo lists the geographical position of the border routers along the path. // Entry i describes the position of the router for interface i. // A 0-value indicates that the AS did not announce a position for this router. @@ -148,15 +159,16 @@ func (pm *PathMetadata) Copy() *PathMetadata { } return &PathMetadata{ - Interfaces: append(pm.Interfaces[:0:0], pm.Interfaces...), - MTU: pm.MTU, - Expiry: pm.Expiry, - Latency: append(pm.Latency[:0:0], pm.Latency...), - Bandwidth: append(pm.Bandwidth[:0:0], pm.Bandwidth...), - Geo: append(pm.Geo[:0:0], pm.Geo...), - LinkType: append(pm.LinkType[:0:0], pm.LinkType...), - InternalHops: append(pm.InternalHops[:0:0], pm.InternalHops...), - Notes: append(pm.Notes[:0:0], pm.Notes...), + Interfaces: append(pm.Interfaces[:0:0], pm.Interfaces...), + MTU: pm.MTU, + Expiry: pm.Expiry, + Latency: append(pm.Latency[:0:0], pm.Latency...), + Bandwidth: append(pm.Bandwidth[:0:0], pm.Bandwidth...), + CarbonIntensity: append(pm.CarbonIntensity[:0:0], pm.CarbonIntensity...), + Geo: append(pm.Geo[:0:0], pm.Geo...), + LinkType: append(pm.LinkType[:0:0], pm.LinkType...), + InternalHops: append(pm.InternalHops[:0:0], pm.InternalHops...), + Notes: append(pm.Notes[:0:0], pm.Notes...), EpicAuths: EpicAuths{ AuthPHVF: append([]byte(nil), pm.EpicAuths.AuthPHVF...), AuthLHVF: append([]byte(nil), pm.EpicAuths.AuthLHVF...), diff --git a/private/path/combinator/graph.go b/private/path/combinator/graph.go index cfb1e71603..e3ed0cd808 100644 --- a/private/path/combinator/graph.go +++ b/private/path/combinator/graph.go @@ -417,15 +417,16 @@ func (solution *pathSolution) Path() Path { path := Path{ SCIONPath: segments.ScionPath(), Metadata: snet.PathMetadata{ - Interfaces: interfaces, - MTU: mtu, - Expiry: segments.ComputeExpTime(), - Latency: staticInfo.Latency, - Bandwidth: staticInfo.Bandwidth, - Geo: staticInfo.Geo, - LinkType: staticInfo.LinkType, - InternalHops: staticInfo.InternalHops, - Notes: staticInfo.Notes, + Interfaces: interfaces, + MTU: mtu, + Expiry: segments.ComputeExpTime(), + Latency: staticInfo.Latency, + Bandwidth: staticInfo.Bandwidth, + CarbonIntensity: staticInfo.CarbonIntensity, + Geo: staticInfo.Geo, + LinkType: staticInfo.LinkType, + InternalHops: staticInfo.InternalHops, + Notes: staticInfo.Notes, }, Weight: solution.cost, } diff --git a/private/path/combinator/staticinfo_accumulator.go b/private/path/combinator/staticinfo_accumulator.go index f2f7501f39..cfacc6f869 100644 --- a/private/path/combinator/staticinfo_accumulator.go +++ b/private/path/combinator/staticinfo_accumulator.go @@ -59,12 +59,13 @@ func collectMetadata(interfaces []snet.PathInterface, asEntries []seg.ASEntry) s path := pathInfo{interfaces, asEntries, remoteIF} return snet.PathMetadata{ - Latency: collectLatency(path), - Bandwidth: collectBandwidth(path), - Geo: collectGeo(path), - LinkType: collectLinkType(path), - InternalHops: collectInternalHops(path), - Notes: collectNotes(path), + Latency: collectLatency(path), + Bandwidth: collectBandwidth(path), + CarbonIntensity: collectCarbonIntensity(path), + Geo: collectGeo(path), + LinkType: collectLinkType(path), + InternalHops: collectInternalHops(path), + Notes: collectNotes(path), } } @@ -180,6 +181,62 @@ func addHopBandwidth(m map[hopKey]uint64, a, b snet.PathInterface, v uint64) { } } +func collectCarbonIntensity(p pathInfo) []int64 { + // This is identical to collecting latencies. + // 1) + hopCarbonIntensities := make(map[hopKey]uint64) + for _, asEntry := range p.ASEntries { + staticInfo := asEntry.Extensions.StaticInfo + if staticInfo == nil { + continue + } + egIF := snet.PathInterface{ + IA: asEntry.Local, + ID: common.IFIDType(asEntry.HopEntry.HopField.ConsEgress), + } + carbonIntensity := staticInfo.CarbonIntensity + // Egress to other local interfaces + for ifid, v := range carbonIntensity.Intra { + otherIF := snet.PathInterface{IA: asEntry.Local, ID: ifid} + addHopCarbonIntensity(hopCarbonIntensities, egIF, otherIF, v) + } + // Local peer to remote peer interface + for ifid, v := range carbonIntensity.Inter { + localIF := snet.PathInterface{IA: asEntry.Local, ID: ifid} + addHopCarbonIntensity(hopCarbonIntensities, localIF, p.RemoteIF[localIF], v) + } + } + + // 2) + carbonIntensities := make([]int64, len(p.Interfaces)-1) + for i := 0; i+1 < len(p.Interfaces); i++ { + vu, ok := hopCarbonIntensities[makeHopKey(p.Interfaces[i], p.Interfaces[i+1])] + v := int64(vu) + if !ok { + v = snet.CarbonIntensityUnset + } + carbonIntensities[i] = v + } + + return carbonIntensities +} + +// addHopCarbonIntensity adds the bandwidth of hop a-b to the map. Handle conflicting entries by +// chosing the more conservative value (i.e. keep higher value). +func addHopCarbonIntensity(m map[hopKey]uint64, a, b snet.PathInterface, v uint64) { + // Skip incomplete entries; not strictly necessary, we'd just not look this up + if a.ID == 0 || b.ID == 0 { + return + } + if v == 0 { + return + } + k := makeHopKey(a, b) + if vExisting, exists := m[k]; !exists || vExisting < v { + m[k] = v + } +} + func collectGeo(p pathInfo) []snet.GeoCoordinates { ifaceGeos := make(map[snet.PathInterface]snet.GeoCoordinates) for _, asEntry := range p.ASEntries { diff --git a/private/path/combinator/staticinfo_accumulator_test.go b/private/path/combinator/staticinfo_accumulator_test.go index 11966d8229..4fa04efbea 100644 --- a/private/path/combinator/staticinfo_accumulator_test.go +++ b/private/path/combinator/staticinfo_accumulator_test.go @@ -121,6 +121,7 @@ func TestStaticinfo(t *testing.T) { checkGeo(t, g, tc.Path, metadata.Geo) checkLinkType(t, g, tc.Path, metadata.LinkType) checkBandwidth(t, g, tc.Path, metadata.Bandwidth) + checkCarbonIntensity(t, g, tc.Path, metadata.CarbonIntensity) checkInternalHops(t, g, tc.Path, metadata.InternalHops) checkNotes(t, g, tc.Path, metadata.Notes) }) @@ -157,6 +158,22 @@ func checkBandwidth(t *testing.T, g *graph.Graph, assert.Equal(t, expected, bandwidth) } +func checkCarbonIntensity(t *testing.T, g *graph.Graph, + path []snet.PathInterface, carbonIntensity []int64) { + + if len(path) == 0 { + assert.Empty(t, carbonIntensity) + return + } + + expected := []int64{} + for i := 0; i < len(path)-1; i++ { + v := int64(g.CarbonIntensity(uint16(path[i].ID), uint16(path[i+1].ID))) + expected = append(expected, v) + } + assert.Equal(t, expected, carbonIntensity) +} + func checkInternalHops(t *testing.T, g *graph.Graph, path []snet.PathInterface, internalHops []uint32) { diff --git a/proto/control_plane/v1/seg_extensions.proto b/proto/control_plane/v1/seg_extensions.proto index 8ed4765a22..4d077833ff 100644 --- a/proto/control_plane/v1/seg_extensions.proto +++ b/proto/control_plane/v1/seg_extensions.proto @@ -40,6 +40,8 @@ message StaticInfoExtension { LatencyInfo latency = 1; // Approximate, maximum bandwidth for paths based on this ASEntry. BandwidthInfo bandwidth = 2; + // Aproximate carbon intensity. + CarbonIntensityInfo carbon_intensity = 7; // Geographical coordinates describing the location of the routers for // relevant interfaces of this AS. The key is the interface identifier. map geo = 3; @@ -104,6 +106,15 @@ message BandwidthInfo { map inter = 2; } +// CarbonIntensityInfo specifies carbon intensity for the links. +// The separate intra and inter AS information allows to reconstruct values for +// all paths (cross-over, shortcut, peering) based on this ASEntry. +// All values are in grams of CO2 emitted per terabyte of traffic. +message CarbonIntensityInfo { + map intra = 1; + map inter = 2; +} + message GeoCoordinates { // Latitude of the geographic coordinate, in the WGS 84 datum. float latitude = 1; diff --git a/proto/daemon/v1/daemon.proto b/proto/daemon/v1/daemon.proto index 3fb8632000..c7a4028ce2 100644 --- a/proto/daemon/v1/daemon.proto +++ b/proto/daemon/v1/daemon.proto @@ -104,6 +104,13 @@ message Path { repeated string notes = 11; // EpicAuths contains the EPIC authenticators used to calculate the PHVF and LHVF. EpicAuths epic_auths = 12; + // Carbon intensity lists the carbon intensity of any two consecutive + // interfaces. + // The unit is grams of CO2 emitted per terabyte traffic sent (or + // equivalently, milligrams of CO2 per gigabyte). + // Entry i describes the carbon intensity between interface i and i+1. + // Consequently, there are N-1 entries for N interfaces. + repeated int64 carbon_intensity = 13; } message EpicAuths { diff --git a/scion/showpaths/showpaths.go b/scion/showpaths/showpaths.go index 37e328fd31..c81b2b4968 100644 --- a/scion/showpaths/showpaths.go +++ b/scion/showpaths/showpaths.go @@ -44,17 +44,18 @@ type Result struct { // Path holds information about the discovered path. type Path struct { - FullPath snet.Path `json:"-" yaml:"-"` - Fingerprint string `json:"fingerprint" yaml:"fingerprint"` - Hops []Hop `json:"hops" yaml:"hops"` - Sequence string `json:"sequence" yaml:"sequence"` - NextHop string `json:"next_hop" yaml:"next_hop"` - Expiry time.Time `json:"expiry" yaml:"expiry"` - MTU uint16 `json:"mtu" yaml:"mtu"` - Latency []time.Duration `json:"latency" yaml:"latency"` - Status string `json:"status,omitempty" yaml:"status,omitempty"` - StatusInfo string `json:"status_info,omitempty" yaml:"status_info,omitempty"` - Local netip.Addr `json:"local_ip,omitempty" yaml:"local_ip,omitempty"` + FullPath snet.Path `json:"-" yaml:"-"` + Fingerprint string `json:"fingerprint" yaml:"fingerprint"` + Hops []Hop `json:"hops" yaml:"hops"` + Sequence string `json:"sequence" yaml:"sequence"` + NextHop string `json:"next_hop" yaml:"next_hop"` + Expiry time.Time `json:"expiry" yaml:"expiry"` + MTU uint16 `json:"mtu" yaml:"mtu"` + Latency []time.Duration `json:"latency" yaml:"latency"` + CarbonIntensity []int64 `json:"carbon_intensity"` + Status string `json:"status,omitempty" yaml:"status,omitempty"` + StatusInfo string `json:"status_info,omitempty" yaml:"status_info,omitempty"` + Local netip.Addr `json:"local_ip,omitempty" yaml:"local_ip,omitempty"` } // Hop represents an hop on the path. @@ -104,6 +105,7 @@ func (r Result) Human(w io.Writer, showExtendedMetadata, colored bool) { entries = append(entries, filteredKeyValues(cs, "Latency", humanLatency(meta), "Bandwidth", humanBandwidth(meta), + "CarbonIntensity", humanCarbonIntensity(meta), "Geo", humanGeo(meta, cs), "LinkType", humanLinkType(meta), "InternalHops", humanInternalHops(meta), @@ -185,6 +187,27 @@ func humanBandwidth(p *snet.PathMetadata) string { return "" } +// humanCarbonIntensity summarizes the carbon intensity information in the meta +// data in a human readable string. Returns empty string if no information is +// available. +func humanCarbonIntensity(p *snet.PathMetadata) string { + complete := true + var tot int64 = 0 + for _, v := range p.CarbonIntensity { + complete = complete && v >= 0 + if v >= 0 { + tot += v + } + } + if complete { + return fmt.Sprintf("%dgCO2/TB", tot) + } + if tot > 0 { + return fmt.Sprintf(">%dgCO2/TB (information incomplete)", tot) + } + return "" +} + // humanGeo summarizes the geographical information in the meta data in a human // readable string. Returns empty string if no information is available. func humanGeo(p *snet.PathMetadata, cs path.ColorScheme) string { @@ -381,13 +404,14 @@ func Run(ctx context.Context, dst addr.IA, cfg Config) (*Result, error) { } pathMeta := path.Metadata() rpath := Path{ - FullPath: path, - Fingerprint: fingerprint, - NextHop: nextHop, - Expiry: pathMeta.Expiry, - MTU: pathMeta.MTU, - Latency: pathMeta.Latency, - Hops: []Hop{}, + FullPath: path, + Fingerprint: fingerprint, + NextHop: nextHop, + Expiry: pathMeta.Expiry, + MTU: pathMeta.MTU, + Latency: pathMeta.Latency, + CarbonIntensity: pathMeta.CarbonIntensity, + Hops: []Hop{}, } for _, hop := range path.Metadata().Interfaces { rpath.Hops = append(rpath.Hops, Hop{IA: hop.IA, IfID: hop.ID})