sai_status_t Syncd::processBulkSetEntry()

in syncd/Syncd.cpp [1733:1891]


sai_status_t Syncd::processBulkSetEntry(
        _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;

    std::vector<sai_attribute_t> attr_lists;

    uint32_t object_count = (uint32_t) objectIds.size();

    if (!object_count)
    {
        SWSS_LOG_ERROR("container with objectIds is empty in processBulkSetEntry");
        return SAI_STATUS_FAILURE;
    }

    sai_bulk_op_error_mode_t mode = SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR;

    for (uint32_t it = 0; it < object_count; it++)
    {
        attr_lists.push_back(attributes[it]->get_attr_list()[0]);
    }

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

            status = m_vendorSai->bulkSet(
                    object_count,
                    entries.data(),
                    attr_lists.data(),
                    mode,
                    statuses.data());

        }
        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->bulkSet(
                    object_count,
                    entries.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->bulkSet(
                    object_count,
                    entries.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->bulkSet(
                    object_count,
                    entries.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->bulkSet(
                    object_count,
                    entries.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->bulkSet(
                    object_count,
                    entries.data(),
                    attr_lists.data(),
                    mode,
                    statuses.data());

        }
        break;

        default:
            return SAI_STATUS_NOT_SUPPORTED;
    }

    return status;
}