sai_status_t get_acl_entry_attribute_fn()

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;
}