in fboss/agent/hw/sai/fake/FakeSaiAcl.cpp [440:676]
sai_status_t set_acl_entry_attribute_fn(
sai_object_id_t acl_entry_id,
const sai_attribute_t* attr) {
auto fs = FakeSai::getInstance();
auto& aclEntry = fs->aclEntryManager.get(acl_entry_id);
sai_status_t res;
if (!attr) {
return SAI_STATUS_INVALID_PARAMETER;
}
const auto& aclTable = fs->aclTableManager.get(aclEntry.tableId);
if (!aclTable.entryFieldSupported(*attr)) {
return SAI_STATUS_NOT_SUPPORTED;
}
switch (attr->id) {
case SAI_ACL_ENTRY_ATTR_PRIORITY:
aclEntry.priority = attr->value.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_SRC_IPV6:
aclEntry.fieldSrcIpV6Enable = attr->value.aclfield.enable;
aclEntry.fieldSrcIpV6Data =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.data.ip6);
aclEntry.fieldSrcIpV6Mask =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.mask.ip6);
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DST_IPV6:
aclEntry.fieldDstIpV6Enable = attr->value.aclfield.enable;
aclEntry.fieldDstIpV6Data =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.data.ip6);
aclEntry.fieldDstIpV6Mask =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.mask.ip6);
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_SRC_IP:
aclEntry.fieldSrcIpV4Enable = attr->value.aclfield.enable;
aclEntry.fieldSrcIpV4Data =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.data.ip4);
aclEntry.fieldSrcIpV4Mask =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.mask.ip4);
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DST_IP:
aclEntry.fieldDstIpV4Enable = attr->value.aclfield.enable;
aclEntry.fieldDstIpV4Data =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.data.ip4);
aclEntry.fieldDstIpV4Mask =
facebook::fboss::fromSaiIpAddress(attr->value.aclfield.mask.ip4);
res = SAI_STATUS_SUCCESS;
break;
/*
* Mask is not needed for SAI_ACL_ENTRY_ATTR_FIELD_IN_PORT
* or SAI_ACL_ENTRY_ATTR_FIELD_OUT_PORT.
* Thus, there is no oid field in sai_acl_field_data_mask_t.
* oid is u64, but unfortunately, u64 was not added to
* sai_acl_field_data_mask_t till SAI 1.6, so use u32.
* This will be ignored by the implementation anyway.
*/
case SAI_ACL_ENTRY_ATTR_FIELD_IN_PORT:
case SAI_ACL_ENTRY_ATTR_FIELD_SRC_PORT:
aclEntry.fieldSrcPortEnable = attr->value.aclfield.enable;
aclEntry.fieldSrcPortData = attr->value.aclfield.data.oid;
aclEntry.fieldSrcPortMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_OUT_PORT:
aclEntry.fieldOutPortEnable = attr->value.aclfield.enable;
aclEntry.fieldOutPortData = attr->value.aclfield.data.oid;
aclEntry.fieldOutPortMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_L4_SRC_PORT:
aclEntry.fieldL4SrcPortEnable = attr->value.aclfield.enable;
aclEntry.fieldL4SrcPortData = attr->value.aclfield.data.u16;
aclEntry.fieldL4SrcPortMask = attr->value.aclfield.mask.u16;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT:
aclEntry.fieldL4DstPortEnable = attr->value.aclfield.enable;
aclEntry.fieldL4DstPortData = attr->value.aclfield.data.u16;
aclEntry.fieldL4DstPortMask = attr->value.aclfield.mask.u16;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_IP_PROTOCOL:
aclEntry.fieldIpProtocolEnable = attr->value.aclfield.enable;
aclEntry.fieldIpProtocolData = attr->value.aclfield.data.u8;
aclEntry.fieldIpProtocolMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_TCP_FLAGS:
aclEntry.fieldTcpFlagsEnable = attr->value.aclfield.enable;
aclEntry.fieldTcpFlagsData = attr->value.aclfield.data.u8;
aclEntry.fieldTcpFlagsMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_FRAG:
aclEntry.fieldIpFragEnable = attr->value.aclfield.enable;
aclEntry.fieldIpFragData = attr->value.aclfield.data.u32;
aclEntry.fieldIpFragMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMP_TYPE:
aclEntry.fieldIcmpV4TypeEnable = attr->value.aclfield.enable;
aclEntry.fieldIcmpV4TypeData = attr->value.aclfield.data.u8;
aclEntry.fieldIcmpV4TypeMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMP_CODE:
aclEntry.fieldIcmpV4CodeEnable = attr->value.aclfield.enable;
aclEntry.fieldIcmpV4CodeData = attr->value.aclfield.data.u8;
aclEntry.fieldIcmpV4CodeMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMPV6_TYPE:
aclEntry.fieldIcmpV6TypeEnable = attr->value.aclfield.enable;
aclEntry.fieldIcmpV6TypeData = attr->value.aclfield.data.u8;
aclEntry.fieldIcmpV6TypeMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMPV6_CODE:
aclEntry.fieldIcmpV6CodeEnable = attr->value.aclfield.enable;
aclEntry.fieldIcmpV6CodeData = attr->value.aclfield.data.u8;
aclEntry.fieldIcmpV6CodeMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DSCP:
aclEntry.fieldDscpEnable = attr->value.aclfield.enable;
aclEntry.fieldDscpData = attr->value.aclfield.data.u8;
aclEntry.fieldDscpMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DST_MAC:
aclEntry.fieldDstMacEnable = attr->value.aclfield.enable;
aclEntry.fieldDstMacData =
facebook::fboss::fromSaiMacAddress(attr->value.aclfield.data.mac);
aclEntry.fieldDstMacMask =
facebook::fboss::fromSaiMacAddress(attr->value.aclfield.mask.mac);
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_TYPE:
aclEntry.fieldIpTypeEnable = attr->value.aclfield.enable;
aclEntry.fieldIpTypeData = attr->value.aclfield.data.u32;
aclEntry.fieldIpTypeMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_TTL:
aclEntry.fieldTtlEnable = attr->value.aclfield.enable;
aclEntry.fieldTtlData = attr->value.aclfield.data.u8;
aclEntry.fieldTtlMask = attr->value.aclfield.mask.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_FDB_DST_USER_META:
aclEntry.fieldFdbDstUserMetaEnable = attr->value.aclfield.enable;
aclEntry.fieldFdbDstUserMetaData = attr->value.aclfield.data.u32;
aclEntry.fieldFdbDstUserMetaMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ROUTE_DST_USER_META:
aclEntry.fieldRouteDstUserMetaEnable = attr->value.aclfield.enable;
aclEntry.fieldRouteDstUserMetaData = attr->value.aclfield.data.u32;
aclEntry.fieldRouteDstUserMetaMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_NEIGHBOR_DST_USER_META:
aclEntry.fieldNeighborDstUserMetaEnable = attr->value.aclfield.enable;
aclEntry.fieldNeighborDstUserMetaData = attr->value.aclfield.data.u32;
aclEntry.fieldNeighborDstUserMetaMask = attr->value.aclfield.mask.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE:
aclEntry.fieldEtherTypeEnable = attr->value.aclfield.enable;
aclEntry.fieldEtherTypeData = attr->value.aclfield.data.u16;
aclEntry.fieldEtherTypeMask = attr->value.aclfield.mask.u16;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID:
aclEntry.fieldOuterVlanIdEnable = attr->value.aclfield.enable;
aclEntry.fieldOuterVlanIdData = attr->value.aclfield.data.u16;
aclEntry.fieldOuterVlanIdMask = attr->value.aclfield.mask.u16;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION:
aclEntry.actionPacketActionEnable = attr->value.aclaction.enable;
aclEntry.actionPacketActionData = attr->value.aclaction.parameter.u32;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_COUNTER:
aclEntry.actionCounterEnable = attr->value.aclaction.enable;
aclEntry.actionCounterData = attr->value.aclaction.parameter.oid;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_SET_TC:
aclEntry.actionSetTCEnable = attr->value.aclaction.enable;
aclEntry.actionSetTCData = attr->value.aclaction.parameter.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_SET_DSCP:
aclEntry.actionSetDSCPEnable = attr->value.aclaction.enable;
aclEntry.actionSetDSCPData = attr->value.aclaction.parameter.u8;
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_INGRESS:
aclEntry.actionMirrorIngressEnable = attr->value.aclaction.enable;
aclEntry.actionMirrorIngressData.resize(
attr->value.aclaction.parameter.objlist.count);
std::copy(
attr->value.aclaction.parameter.objlist.list,
attr->value.aclaction.parameter.objlist.list +
attr->value.aclaction.parameter.objlist.count,
std::begin(aclEntry.actionMirrorIngressData));
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_EGRESS:
aclEntry.actionMirrorEgressEnable = attr->value.aclaction.enable;
aclEntry.actionMirrorEgressData.resize(
attr->value.aclaction.parameter.objlist.count);
std::copy(
attr->value.aclaction.parameter.objlist.list,
attr->value.aclaction.parameter.objlist.list +
attr->value.aclaction.parameter.objlist.count,
std::begin(aclEntry.actionMirrorEgressData));
res = SAI_STATUS_SUCCESS;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW:
aclEntry.actionMacsecFlowEnable = attr->value.aclaction.enable;
aclEntry.actionMacsecFlowData = attr->value.aclaction.parameter.oid;
res = SAI_STATUS_SUCCESS;
break;
default:
res = SAI_STATUS_NOT_SUPPORTED;
break;
}
return res;
}