From 663496ad2c00715b79d934499b20400036d3239e Mon Sep 17 00:00:00 2001 From: Teja Tamboli Date: Wed, 25 Feb 2026 19:46:18 +0000 Subject: [PATCH] Added support for ipv6 in acl --- dataplane/saiserver/acl.go | 30 ++++++++++++++++++++++++++++++ dataplane/saiserver/routing.go | 20 ++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/dataplane/saiserver/acl.go b/dataplane/saiserver/acl.go index e026e8bd..0b592cee 100644 --- a/dataplane/saiserver/acl.go +++ b/dataplane/saiserver/acl.go @@ -275,6 +275,36 @@ func (a *acl) createAclEntryFields(req *saipb.CreateAclEntryRequest, id uint64, Masks: ipv6Mask, }) } + srcIpv6Field := false + srcIpv6Addr := make([]byte, 16) + srcIpv6Mask := make([]byte, 16) + if req.GetFieldSrcIpv6Word0() != nil { // Word0 is supposed to match 0:0:0:0:0:0:ffff:ffff + srcIpv6Field = true + copy(srcIpv6Addr[12:16], req.GetFieldSrcIpv6Word0().GetDataIp()[12:16]) + copy(srcIpv6Mask[12:16], req.GetFieldSrcIpv6Word0().GetMaskIp()[12:16]) + } + if req.GetFieldSrcIpv6Word1() != nil { // Word1 is supposed to match 0:0:0:0:ffff:ffff:: + srcIpv6Field = true + copy(srcIpv6Addr[8:12], req.GetFieldSrcIpv6Word1().GetDataIp()[8:12]) + copy(srcIpv6Mask[8:12], req.GetFieldSrcIpv6Word1().GetMaskIp()[8:12]) + } + if req.GetFieldSrcIpv6Word2() != nil { // Word2 is supposed to match 0:0:ffff:ffff: + srcIpv6Field = true + copy(srcIpv6Addr[4:8], req.GetFieldSrcIpv6Word2().GetDataIp()[4:8]) + copy(srcIpv6Mask[4:8], req.GetFieldSrcIpv6Word2().GetMaskIp()[4:8]) + } + if req.GetFieldSrcIpv6Word3() != nil { // Word3 is supposed to match ffff:ffff:: + srcIpv6Field = true + copy(srcIpv6Addr[0:4], req.GetFieldSrcIpv6Word3().GetDataIp()[0:4]) + copy(srcIpv6Mask[0:4], req.GetFieldSrcIpv6Word3().GetMaskIp()[0:4]) + } + if srcIpv6Field { + aReq.EntryDesc.GetFlow().Fields = append(aReq.EntryDesc.GetFlow().Fields, &fwdpb.PacketFieldMaskedBytes{ + FieldId: &fwdpb.PacketFieldId{Field: &fwdpb.PacketField{FieldNum: fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC}}, + Bytes: srcIpv6Addr, + Masks: srcIpv6Mask, + }) + } if req.GetFieldDstMac() != nil { aReq.EntryDesc.GetFlow().Fields = append(aReq.EntryDesc.GetFlow().Fields, &fwdpb.PacketFieldMaskedBytes{ FieldId: &fwdpb.PacketFieldId{Field: &fwdpb.PacketField{FieldNum: fwdpb.PacketFieldNum_PACKET_FIELD_NUM_ETHER_MAC_DST}}, diff --git a/dataplane/saiserver/routing.go b/dataplane/saiserver/routing.go index e30547d0..f1759170 100644 --- a/dataplane/saiserver/routing.go +++ b/dataplane/saiserver/routing.go @@ -712,6 +712,9 @@ func (r *route) SetRouteEntryAttribute(ctx context.Context, req *saipb.SetRouteE if err != nil { return nil, err } + if r.mgr.GetType(string(pBytes)) == saipb.ObjectType_OBJECT_TYPE_NULL { + return nil, status.Errorf(codes.NotFound, "route entry not found") + } if err := r.mgr.PopulateAllAttributes(string(pBytes), resp.Attr); err != nil { return nil, err } @@ -827,6 +830,23 @@ func (r *route) SetRouteEntryAttribute(ctx context.Context, req *saipb.SetRouteE return &saipb.SetRouteEntryAttributeResponse{}, nil } +func (r *route) GetRouteEntryAttribute(ctx context.Context, req *saipb.GetRouteEntryAttributeRequest) (*saipb.GetRouteEntryAttributeResponse, error) { + resp := &saipb.GetRouteEntryAttributeResponse{ + Attr: &saipb.RouteEntryAttribute{}, + } + pBytes, err := proto.MarshalOptions{Deterministic: true}.Marshal(req.GetEntry()) + if err != nil { + return nil, err + } + if r.mgr.GetType(string(pBytes)) == saipb.ObjectType_OBJECT_TYPE_NULL { + return nil, status.Errorf(codes.NotFound, "route entry not found") + } + if err := r.mgr.PopulateAllAttributes(string(pBytes), resp.Attr); err != nil { + return nil, err + } + return resp, nil +} + func (r *route) CreateRouteEntries(ctx context.Context, re *saipb.CreateRouteEntriesRequest) (*saipb.CreateRouteEntriesResponse, error) { var errs errlist.List resp := &saipb.CreateRouteEntriesResponse{}