in syncd/Syncd.cpp [1125:1448]
sai_status_t Syncd::processBulkCreateEntry(
_In_ sai_object_type_t objectType,
_In_ const std::vector<std::string>& objectIds,
_In_ const std::vector<std::shared_ptr<SaiAttributeList>>& attributes,
_Out_ std::vector<sai_status_t>& statuses)
{
SWSS_LOG_ENTER();
sai_status_t status = SAI_STATUS_SUCCESS;
uint32_t object_count = (uint32_t) objectIds.size();
if (!object_count)
{
SWSS_LOG_ERROR("container with objectIds is empty in processBulkCreateEntry");
return SAI_STATUS_FAILURE;
}
sai_bulk_op_error_mode_t mode = SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR;
std::vector<uint32_t> attr_counts(object_count);
std::vector<const sai_attribute_t*> attr_lists(object_count);
for (uint32_t idx = 0; idx < object_count; idx++)
{
attr_counts[idx] = attributes[idx]->get_attr_count();
attr_lists[idx] = attributes[idx]->get_attr_list();
}
switch ((int)objectType)
{
case SAI_OBJECT_TYPE_ROUTE_ENTRY:
{
std::vector<sai_route_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_route_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].vr_id = m_translator->translateVidToRid(entries[it].vr_id);
}
static PerformanceIntervalTimer timer("Syncd::processBulkCreateEntry(route_entry) CREATE");
timer.start();
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
timer.stop();
timer.inc(object_count);
}
break;
case SAI_OBJECT_TYPE_NEIGHBOR_ENTRY:
{
std::vector<sai_neighbor_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_neighbor_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].rif_id = m_translator->translateVidToRid(entries[it].rif_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_FDB_ENTRY:
{
std::vector<sai_fdb_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_fdb_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].bv_id = m_translator->translateVidToRid(entries[it].bv_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_NAT_ENTRY:
{
std::vector<sai_nat_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_nat_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].vr_id = m_translator->translateVidToRid(entries[it].vr_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_INSEG_ENTRY:
{
std::vector<sai_inseg_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_inseg_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_MY_SID_ENTRY:
{
std::vector<sai_my_sid_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_my_sid_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].vr_id = m_translator->translateVidToRid(entries[it].vr_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY:
{
std::vector<sai_direction_lookup_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_direction_lookup_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:
{
std::vector<sai_eni_ether_address_map_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_eni_ether_address_map_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_VIP_ENTRY:
{
std::vector<sai_vip_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_vip_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:
{
std::vector<sai_inbound_routing_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_inbound_routing_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].eni_id = m_translator->translateVidToRid(entries[it].eni_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:
{
std::vector<sai_pa_validation_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_pa_validation_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].vnet_id = m_translator->translateVidToRid(entries[it].vnet_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:
{
std::vector<sai_outbound_routing_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_outbound_routing_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].outbound_routing_group_id = m_translator->translateVidToRid(entries[it].outbound_routing_group_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
case SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:
{
std::vector<sai_outbound_ca_to_pa_entry_t> entries(object_count);
for (uint32_t it = 0; it < object_count; it++)
{
sai_deserialize_outbound_ca_to_pa_entry(objectIds[it], entries[it]);
entries[it].switch_id = m_translator->translateVidToRid(entries[it].switch_id);
entries[it].dst_vnet_id = m_translator->translateVidToRid(entries[it].dst_vnet_id);
}
status = m_vendorSai->bulkCreate(
object_count,
entries.data(),
attr_counts.data(),
attr_lists.data(),
mode,
statuses.data());
}
break;
default:
return SAI_STATUS_NOT_SUPPORTED;
}
return status;
}