sai_status_t set_acl_entry_attribute_fn()

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