Skip to content

Commit 2ca3dd8

Browse files
committed
Support acl_pre_ingress_vlan_table in Lucius.
1 parent bc084b4 commit 2ca3dd8

3 files changed

Lines changed: 71 additions & 12 deletions

File tree

dataplane/saiserver/acl.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,9 +440,6 @@ func (a *acl) createAclEntryFields(req *saipb.CreateAclEntryRequest, id uint64,
440440
}
441441
}
442442
}
443-
if len(aReq.EntryDesc.GetFlow().Fields) == 0 {
444-
return nil, status.Error(codes.InvalidArgument, "either no fields or not unsupports fields in entry req")
445-
}
446443
return aReq, nil
447444
}
448445

@@ -534,6 +531,11 @@ func (a *acl) CreateAclEntry(ctx context.Context, req *saipb.CreateAclEntryReque
534531
fwdconfig.Action(fwdconfig.UpdateAction(fwdpb.UpdateType_UPDATE_TYPE_SET, fwdpb.PacketFieldNum_PACKET_FIELD_NUM_VLAN_TAG).
535532
WithValue(binary.BigEndian.AppendUint16(nil, uint16(req.GetActionSetOuterVlanId().GetUint())))).Build())
536533
}
534+
if req.ActionSetOuterVlanPri != nil {
535+
aReq.Actions = append(aReq.Actions,
536+
fwdconfig.Action(fwdconfig.UpdateAction(fwdpb.UpdateType_UPDATE_TYPE_SET, fwdpb.PacketFieldNum_PACKET_FIELD_NUM_VLAN_PRIORITY).
537+
WithValue([]byte{byte(req.GetActionSetOuterVlanPri().GetUint())})).Build())
538+
}
537539
if req.ActionSetTc != nil {
538540
aReq.Actions = append(aReq.Actions,
539541
fwdconfig.Action(fwdconfig.UpdateAction(fwdpb.UpdateType_UPDATE_TYPE_SET, fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_QOS).

dataplane/saiserver/acl_test.go

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,56 @@ func TestCreateAclEntry(t *testing.T) {
4747
req: &saipb.CreateAclEntryRequest{},
4848
}, {
4949
desc: "no fields",
50-
wantErr: "InvalidArgument",
5150
req: &saipb.CreateAclEntryRequest{
5251
TableId: proto.Uint64(2),
5352
},
53+
want: &fwdpb.TableEntryAddRequest{
54+
ContextId: &fwdpb.ContextId{Id: "foo"},
55+
TableId: &fwdpb.TableId{ObjectId: &fwdpb.ObjectId{Id: "1"}},
56+
EntryDesc: &fwdpb.EntryDesc{
57+
Entry: &fwdpb.EntryDesc_Flow{
58+
Flow: &fwdpb.FlowEntryDesc{
59+
Id: 2,
60+
Priority: math.MaxUint32,
61+
},
62+
},
63+
},
64+
},
65+
}, {
66+
desc: "action set outer vlan pri",
67+
req: &saipb.CreateAclEntryRequest{
68+
TableId: proto.Uint64(2),
69+
ActionSetOuterVlanPri: &saipb.AclActionData{
70+
Parameter: &saipb.AclActionData_Uint{Uint: 5},
71+
},
72+
},
73+
want: &fwdpb.TableEntryAddRequest{
74+
ContextId: &fwdpb.ContextId{Id: "foo"},
75+
TableId: &fwdpb.TableId{ObjectId: &fwdpb.ObjectId{Id: "1"}},
76+
EntryDesc: &fwdpb.EntryDesc{
77+
Entry: &fwdpb.EntryDesc_Flow{
78+
Flow: &fwdpb.FlowEntryDesc{
79+
Id: 2,
80+
Priority: math.MaxUint32,
81+
},
82+
},
83+
},
84+
Actions: []*fwdpb.ActionDesc{{
85+
ActionType: fwdpb.ActionType_ACTION_TYPE_UPDATE,
86+
Action: &fwdpb.ActionDesc_Update{
87+
Update: &fwdpb.UpdateActionDesc{
88+
Type: fwdpb.UpdateType_UPDATE_TYPE_SET,
89+
FieldId: &fwdpb.PacketFieldId{
90+
Field: &fwdpb.PacketField{
91+
FieldNum: fwdpb.PacketFieldNum_PACKET_FIELD_NUM_VLAN_PRIORITY,
92+
},
93+
},
94+
Field: &fwdpb.PacketFieldId{Field: &fwdpb.PacketField{}},
95+
Value: []byte{5},
96+
},
97+
},
98+
}},
99+
},
54100
}, {
55101
desc: "all fields",
56102
req: &saipb.CreateAclEntryRequest{

dataplane/saiserver/tunnel.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,17 @@ var (
114114
ipV6AnyMask = make([]byte, 16)
115115
)
116116

117+
func maskBytes(ip, mask []byte) []byte {
118+
if len(ip) != len(mask) {
119+
return ip
120+
}
121+
out := make([]byte, len(ip))
122+
for i := 0; i < len(ip); i++ {
123+
out[i] = ip[i] & mask[i]
124+
}
125+
return out
126+
}
127+
117128
func termFieldsFromReq(req *saipb.CreateTunnelTermTableEntryRequest) ([]*fwdpb.PacketFieldMaskedBytes, fwdpb.PacketHeaderId, error) {
118129
fields := []*fwdpb.PacketFieldMaskedBytes{}
119130

@@ -151,23 +162,23 @@ func termFieldsFromReq(req *saipb.CreateTunnelTermTableEntryRequest) ([]*fwdpb.P
151162
switch req.GetType() {
152163
case saipb.TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P: // src IP, dst IP
153164
fields = append(fields,
154-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(srcIP, exactMask).Build(),
155-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(dstIP, exactMask).Build(),
165+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(maskBytes(srcIP, exactMask), exactMask).Build(),
166+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(maskBytes(dstIP, exactMask), exactMask).Build(),
156167
)
157168
case saipb.TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2MP: // src IP, dst IP & mask
158169
fields = append(fields,
159-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(srcIP, exactMask).Build(),
160-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(dstIP, dstIPMask).Build(),
170+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(maskBytes(srcIP, exactMask), exactMask).Build(),
171+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(maskBytes(dstIP, dstIPMask), dstIPMask).Build(),
161172
)
162173
case saipb.TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2P: // src IP & mask, dst IP
163174
fields = append(fields,
164-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(srcIP, srcIPMask).Build(),
165-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(dstIP, exactMask).Build(),
175+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(maskBytes(srcIP, srcIPMask), srcIPMask).Build(),
176+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(maskBytes(dstIP, exactMask), exactMask).Build(),
166177
)
167178
case saipb.TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2MP: // src IP & mask, dst IP &mask
168179
fields = append(fields,
169-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(srcIP, srcIPMask).Build(),
170-
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(srcIP, dstIPMask).Build(),
180+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC).WithBytes(maskBytes(srcIP, srcIPMask), srcIPMask).Build(),
181+
fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST).WithBytes(maskBytes(dstIP, dstIPMask), dstIPMask).Build(),
171182
)
172183
default:
173184
return nil, fwdpb.PacketHeaderId_PACKET_HEADER_ID_UNSPECIFIED, status.Errorf(codes.InvalidArgument, "invalid tunnel type: %v", req.GetType())

0 commit comments

Comments
 (0)