in fboss/agent/hw/sai/fake/FakeSaiAcl.cpp [678:881]
sai_status_t get_acl_entry_attribute_fn(
sai_object_id_t acl_entry_id,
uint32_t attr_count,
sai_attribute_t* attr_list) {
auto fs = FakeSai::getInstance();
auto& aclEntry = fs->aclEntryManager.get(acl_entry_id);
for (int i = 0; i < attr_count; ++i) {
switch (attr_list[i].id) {
case SAI_ACL_ENTRY_ATTR_TABLE_ID:
attr_list[i].value.oid = aclEntry.tableId;
break;
case SAI_ACL_ENTRY_ATTR_PRIORITY:
attr_list[i].value.u32 = aclEntry.priority;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_SRC_IPV6:
attr_list[i].value.aclfield.enable = aclEntry.fieldSrcIpV6Enable;
facebook::fboss::toSaiIpAddressV6(
aclEntry.fieldSrcIpV6Data, &attr_list[i].value.aclfield.data.ip6);
facebook::fboss::toSaiIpAddressV6(
aclEntry.fieldSrcIpV6Mask, &attr_list[i].value.aclfield.mask.ip6);
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DST_IPV6:
attr_list[i].value.aclfield.enable = aclEntry.fieldDstIpV6Enable;
facebook::fboss::toSaiIpAddressV6(
aclEntry.fieldDstIpV6Data, &attr_list[i].value.aclfield.data.ip6);
facebook::fboss::toSaiIpAddressV6(
aclEntry.fieldDstIpV6Mask, &attr_list[i].value.aclfield.mask.ip6);
break;
case SAI_ACL_ENTRY_ATTR_FIELD_SRC_IP:
attr_list[i].value.aclfield.enable = aclEntry.fieldSrcIpV4Enable;
attr_list[i].value.aclfield.data.ip4 =
facebook::fboss::toSaiIpAddress(aclEntry.fieldSrcIpV4Data).addr.ip4;
attr_list[i].value.aclfield.mask.ip4 =
facebook::fboss::toSaiIpAddress(aclEntry.fieldSrcIpV4Mask).addr.ip4;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DST_IP:
attr_list[i].value.aclfield.enable = aclEntry.fieldDstIpV4Enable;
attr_list[i].value.aclfield.data.ip4 =
facebook::fboss::toSaiIpAddress(aclEntry.fieldDstIpV4Data).addr.ip4;
attr_list[i].value.aclfield.mask.ip4 =
facebook::fboss::toSaiIpAddress(aclEntry.fieldDstIpV4Mask).addr.ip4;
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:
attr_list[i].value.aclfield.enable = aclEntry.fieldSrcPortEnable;
attr_list[i].value.aclfield.data.oid = aclEntry.fieldSrcPortData;
attr_list[i].value.aclfield.mask.u32 = aclEntry.fieldSrcPortMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_OUT_PORT:
attr_list[i].value.aclfield.enable = aclEntry.fieldOutPortEnable;
attr_list[i].value.aclfield.data.oid = aclEntry.fieldOutPortData;
attr_list[i].value.aclfield.mask.u32 = aclEntry.fieldOutPortMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_L4_SRC_PORT:
attr_list[i].value.aclfield.enable = aclEntry.fieldL4SrcPortEnable;
attr_list[i].value.aclfield.data.u16 = aclEntry.fieldL4SrcPortData;
attr_list[i].value.aclfield.mask.u16 = aclEntry.fieldL4SrcPortMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT:
attr_list[i].value.aclfield.enable = aclEntry.fieldL4DstPortEnable;
attr_list[i].value.aclfield.data.u16 = aclEntry.fieldL4DstPortData;
attr_list[i].value.aclfield.mask.u16 = aclEntry.fieldL4DstPortMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_IP_PROTOCOL:
attr_list[i].value.aclfield.enable = aclEntry.fieldIpProtocolEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldIpProtocolData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldIpProtocolMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_TCP_FLAGS:
attr_list[i].value.aclfield.enable = aclEntry.fieldTcpFlagsEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldTcpFlagsData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldTcpFlagsMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_FRAG:
attr_list[i].value.aclfield.enable = aclEntry.fieldIpFragEnable;
attr_list[i].value.aclfield.data.u32 = aclEntry.fieldIpFragData;
attr_list[i].value.aclfield.mask.u32 = aclEntry.fieldIpFragMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMP_TYPE:
attr_list[i].value.aclfield.enable = aclEntry.fieldIcmpV4TypeEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldIcmpV4TypeData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldIcmpV4TypeMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMP_CODE:
attr_list[i].value.aclfield.enable = aclEntry.fieldIcmpV4CodeEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldIcmpV4CodeData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldIcmpV4CodeMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMPV6_TYPE:
attr_list[i].value.aclfield.enable = aclEntry.fieldIcmpV6TypeEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldIcmpV6TypeData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldIcmpV6TypeMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ICMPV6_CODE:
attr_list[i].value.aclfield.enable = aclEntry.fieldIcmpV6CodeEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldIcmpV6CodeData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldIcmpV6CodeMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DSCP:
attr_list[i].value.aclfield.enable = aclEntry.fieldDscpEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldDscpData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldDscpMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_DST_MAC:
attr_list[i].value.aclfield.enable = aclEntry.fieldDstMacEnable;
facebook::fboss::toSaiMacAddress(
aclEntry.fieldDstMacData, attr_list[i].value.aclfield.data.mac);
facebook::fboss::toSaiMacAddress(
aclEntry.fieldDstMacMask, attr_list[i].value.aclfield.mask.mac);
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_TYPE:
attr_list[i].value.aclfield.enable = aclEntry.fieldIpTypeEnable;
attr_list[i].value.aclfield.data.u32 = aclEntry.fieldIpTypeData;
attr_list[i].value.aclfield.mask.u32 = aclEntry.fieldIpTypeMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_TTL:
attr_list[i].value.aclfield.enable = aclEntry.fieldTtlEnable;
attr_list[i].value.aclfield.data.u8 = aclEntry.fieldTtlData;
attr_list[i].value.aclfield.mask.u8 = aclEntry.fieldTtlMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_FDB_DST_USER_META:
attr_list[i].value.aclfield.enable = aclEntry.fieldFdbDstUserMetaEnable;
attr_list[i].value.aclfield.data.u32 = aclEntry.fieldFdbDstUserMetaData;
attr_list[i].value.aclfield.mask.u32 = aclEntry.fieldFdbDstUserMetaMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_ROUTE_DST_USER_META:
attr_list[i].value.aclfield.enable =
aclEntry.fieldRouteDstUserMetaEnable;
attr_list[i].value.aclfield.data.u32 =
aclEntry.fieldRouteDstUserMetaData;
attr_list[i].value.aclfield.mask.u32 =
aclEntry.fieldRouteDstUserMetaMask;
break;
case SAI_ACL_ENTRY_ATTR_FIELD_NEIGHBOR_DST_USER_META:
attr_list[i].value.aclfield.enable =
aclEntry.fieldNeighborDstUserMetaEnable;
attr_list[i].value.aclfield.data.u32 =
aclEntry.fieldNeighborDstUserMetaData;
attr_list[i].value.aclfield.mask.u32 =
aclEntry.fieldNeighborDstUserMetaMask;
break;
case SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE:
attr_list[i].value.aclfield.enable = aclEntry.fieldEtherTypeEnable;
attr_list[i].value.aclfield.data.u16 = aclEntry.fieldEtherTypeData;
attr_list[i].value.aclfield.mask.u16 = aclEntry.fieldEtherTypeMask;
break;
case SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID:
attr_list[i].value.aclfield.enable = aclEntry.fieldOuterVlanIdEnable;
attr_list[i].value.aclfield.data.u16 = aclEntry.fieldOuterVlanIdData;
attr_list[i].value.aclfield.mask.u16 = aclEntry.fieldOuterVlanIdMask;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION:
attr_list[i].value.aclaction.enable = aclEntry.actionPacketActionEnable;
attr_list[i].value.aclaction.parameter.u32 =
aclEntry.actionPacketActionData;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_COUNTER:
attr_list[i].value.aclaction.enable = aclEntry.actionCounterEnable;
attr_list[i].value.aclaction.parameter.oid = aclEntry.actionCounterData;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_SET_TC:
attr_list[i].value.aclaction.enable = aclEntry.actionSetTCEnable;
attr_list[i].value.aclaction.parameter.u8 = aclEntry.actionSetTCData;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_SET_DSCP:
attr_list[i].value.aclaction.enable = aclEntry.actionSetDSCPEnable;
attr_list[i].value.aclaction.parameter.u8 = aclEntry.actionSetDSCPData;
break;
case SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_INGRESS:
attr_list[i].value.aclaction.enable =
aclEntry.actionMirrorIngressEnable;
attr_list[i].value.aclaction.parameter.objlist.count =
aclEntry.actionMirrorIngressData.size();
attr_list[i].value.aclaction.parameter.objlist.list =
aclEntry.actionMirrorIngressData.data();
break;
case SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_EGRESS:
attr_list[i].value.aclaction.enable = aclEntry.actionMirrorEgressEnable;
attr_list[i].value.aclaction.parameter.objlist.count =
aclEntry.actionMirrorEgressData.size();
attr_list[i].value.aclaction.parameter.objlist.list =
aclEntry.actionMirrorEgressData.data();
break;
case SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW:
attr_list[i].value.aclaction.enable = aclEntry.actionMacsecFlowEnable;
attr_list[i].value.aclaction.parameter.oid =
aclEntry.actionMacsecFlowData;
break;
default:
return SAI_STATUS_NOT_SUPPORTED;
}
}
return SAI_STATUS_SUCCESS;
}