diff --git a/dataplane/saiserver/acl.go b/dataplane/saiserver/acl.go index b53598e0..ef45cb45 100644 --- a/dataplane/saiserver/acl.go +++ b/dataplane/saiserver/acl.go @@ -731,6 +731,17 @@ func (a *acl) GetAclCounterAttribute(ctx context.Context, req *saipb.GetAclCount if err != nil { return nil, err } + if len(count.GetCounters()) == 0 { + slog.WarnContext(ctx, "GetAclCounterAttribute: no counters returned", "oid", req.Oid) + resp := &saipb.GetAclCounterAttributeResponse{ + Attr: &saipb.AclCounterAttribute{ + Packets: proto.Uint64(0), + Bytes: proto.Uint64(0), + }, + } + a.mgr.StoreAttributes(req.GetOid(), resp.GetAttr()) + return resp, nil + } resp := &saipb.GetAclCounterAttributeResponse{ Attr: &saipb.AclCounterAttribute{ Packets: &count.GetCounters()[0].Packets, diff --git a/dataplane/saiserver/acl_test.go b/dataplane/saiserver/acl_test.go index 8284306a..ce2b77b7 100644 --- a/dataplane/saiserver/acl_test.go +++ b/dataplane/saiserver/acl_test.go @@ -749,6 +749,7 @@ func TestGetAclCounterAttribute(t *testing.T) { req *saipb.GetAclCounterAttributeRequest wantErr string want *saipb.GetAclCounterAttributeResponse + replies []*fwdpb.FlowCounterQueryReply }{{ desc: "success", req: &saipb.GetAclCounterAttributeRequest{ @@ -761,15 +762,31 @@ func TestGetAclCounterAttribute(t *testing.T) { Bytes: proto.Uint64(0), }, }, + replies: []*fwdpb.FlowCounterQueryReply{{ + Counters: []*fwdpb.FlowCounter{{ + Packets: 1, + }}, + }}, + }, { + desc: "empty counters", + req: &saipb.GetAclCounterAttributeRequest{ + Oid: 1, + AttrType: []saipb.AclCounterAttr{saipb.AclCounterAttr_ACL_COUNTER_ATTR_PACKETS}, + }, + want: &saipb.GetAclCounterAttributeResponse{ + Attr: &saipb.AclCounterAttribute{ + Packets: proto.Uint64(0), + Bytes: proto.Uint64(0), + }, + }, + replies: []*fwdpb.FlowCounterQueryReply{{ + Counters: []*fwdpb.FlowCounter{}, + }}, }} for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { dplane := &fakeSwitchDataplane{ - flowQueryReplies: []*fwdpb.FlowCounterQueryReply{{ - Counters: []*fwdpb.FlowCounter{{ - Packets: 1, - }}, - }}, + flowQueryReplies: tt.replies, } c, _, stopFn := newTestACL(t, dplane) defer stopFn()