sai_status_t create_mirror_session_fn()

in fboss/agent/hw/sai/fake/FakeSaiMirror.cpp [21:145]


sai_status_t create_mirror_session_fn(
    sai_object_id_t* mirror_session_id,
    sai_object_id_t /* switch_id */,
    uint32_t attr_count,
    const sai_attribute_t* attr_list) {
  auto fs = FakeSai::getInstance();
  std::optional<sai_mirror_session_type_t> type;
  std::optional<sai_object_id_t> monitorPort;
  std::optional<folly::IPAddress> srcIp;
  std::optional<folly::IPAddress> dstIp;
  std::optional<folly::MacAddress> srcMac;
  std::optional<folly::MacAddress> dstMac;
#if SAI_API_VERSION >= SAI_VERSION(1, 7, 0)
  std::optional<sai_uint16_t> udpSrcPort;
  std::optional<sai_uint16_t> udpDstPort;
#endif
  std::optional<uint8_t> ttl;
  std::optional<uint8_t> tos;
  std::optional<sai_erspan_encapsulation_type_t> erspanEncapType;
  std::optional<sai_uint16_t> greProtocolType;
  std::optional<sai_uint16_t> truncateSize;
  std::optional<sai_uint8_t> ipHeaderVersion;

  for (int i = 0; i < attr_count; ++i) {
    switch (attr_list[i].id) {
      case SAI_MIRROR_SESSION_ATTR_TYPE:
        type = static_cast<sai_mirror_session_type_t>(attr_list[i].value.s32);
        break;
      case SAI_MIRROR_SESSION_ATTR_MONITOR_PORT:
        monitorPort = attr_list[i].value.oid;
        break;
      case SAI_MIRROR_SESSION_ATTR_SRC_IP_ADDRESS:
        srcIp = facebook::fboss::fromSaiIpAddress(attr_list[i].value.ipaddr);
        break;
      case SAI_MIRROR_SESSION_ATTR_DST_IP_ADDRESS:
        dstIp = facebook::fboss::fromSaiIpAddress(attr_list[i].value.ipaddr);
        break;
      case SAI_MIRROR_SESSION_ATTR_SRC_MAC_ADDRESS:
        srcMac = facebook::fboss::fromSaiMacAddress(attr_list[i].value.mac);
        break;
      case SAI_MIRROR_SESSION_ATTR_DST_MAC_ADDRESS:
        dstMac = facebook::fboss::fromSaiMacAddress(attr_list[i].value.mac);
        break;
#if SAI_API_VERSION >= SAI_VERSION(1, 7, 0)
      case SAI_MIRROR_SESSION_ATTR_UDP_SRC_PORT:
        udpSrcPort = attr_list[i].value.u16;
        break;
      case SAI_MIRROR_SESSION_ATTR_UDP_DST_PORT:
        udpDstPort = attr_list[i].value.u16;
        break;
#endif
      case SAI_MIRROR_SESSION_ATTR_ERSPAN_ENCAPSULATION_TYPE:
        erspanEncapType = static_cast<sai_erspan_encapsulation_type_t>(
            attr_list[i].value.s32);
        break;
      case SAI_MIRROR_SESSION_ATTR_TRUNCATE_SIZE:
        truncateSize = attr_list[i].value.u16;
        break;
      case SAI_MIRROR_SESSION_ATTR_IPHDR_VERSION:
        ipHeaderVersion = attr_list[i].value.u8;
        break;
      case SAI_MIRROR_SESSION_ATTR_GRE_PROTOCOL_TYPE:
        greProtocolType = attr_list[i].value.u16;
        break;
      case SAI_MIRROR_SESSION_ATTR_TOS:
        tos = attr_list[i].value.u8;
        break;
      case SAI_MIRROR_SESSION_ATTR_TTL:
        ttl = attr_list[i].value.u8;
        break;
      default:
        return SAI_STATUS_INVALID_PARAMETER;
    }
  }

  if (!type || !monitorPort) {
    return SAI_STATUS_INVALID_PARAMETER;
  }
  if (type == SAI_MIRROR_SESSION_TYPE_LOCAL) {
    *mirror_session_id =
        fs->mirrorManager.create(type.value(), monitorPort.value());
  } else if (type == SAI_MIRROR_SESSION_TYPE_ENHANCED_REMOTE) {
    if (!srcIp || !dstIp || !srcMac || !dstMac || !tos || !erspanEncapType ||
        !greProtocolType || !ipHeaderVersion) {
      return SAI_STATUS_INVALID_PARAMETER;
    }
    *mirror_session_id = fs->mirrorManager.create(
        type.value(),
        monitorPort.value(),
        erspanEncapType.value(),
        tos.value(),
        srcIp.value(),
        dstIp.value(),
        srcMac.value(),
        dstMac.value(),
        ipHeaderVersion.value(),
        greProtocolType.value(),
        ttl.has_value() ? ttl.value() : (uint8_t)0,
        truncateSize.has_value() ? truncateSize.value() : (uint16_t)0);
#if SAI_API_VERSION >= SAI_VERSION(1, 7, 0)
  } else if (type == SAI_MIRROR_SESSION_TYPE_SFLOW) {
    if (!srcIp || !dstIp || !srcMac || !dstMac || !tos || !udpSrcPort ||
        !udpDstPort) {
      return SAI_STATUS_INVALID_PARAMETER;
    }
    *mirror_session_id = fs->mirrorManager.create(
        type.value(),
        monitorPort.value(),
        tos.value(),
        srcIp.value(),
        dstIp.value(),
        srcMac.value(),
        dstMac.value(),
        ipHeaderVersion.value(),
        udpSrcPort.value(),
        udpDstPort.value(),
        ttl.has_value() ? ttl.value() : (uint8_t)0,
        truncateSize.has_value() ? truncateSize.value() : (uint16_t)0);
#endif
  } else {
    return SAI_STATUS_INVALID_PARAMETER;
  }

  return SAI_STATUS_SUCCESS;
}