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