std::shared_ptr FlexCounter::createCounterContext()

in syncd/FlexCounter.cpp [2299:2431]


std::shared_ptr<BaseCounterContext> FlexCounter::createCounterContext(
        _In_ const std::string& context_name,
        _In_ const std::string& instance)
{
    SWSS_LOG_ENTER();
    if (context_name == COUNTER_TYPE_PORT)
    {
        auto context = std::make_shared<CounterContext<sai_port_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_PORT, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_WRED_ECN_PORT)
    {
        auto context = std::make_shared<CounterContext<sai_port_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_PORT, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_PORT_DEBUG)
    {
        auto context = std::make_shared<CounterContext<sai_port_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_PORT, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        context->use_sai_stats_capa_query = false;
        context->use_sai_stats_ext = true;

        return context;
    }
    else if (context_name == COUNTER_TYPE_QUEUE)
    {
        auto context = std::make_shared<CounterContext<sai_queue_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_QUEUE, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        context->double_confirm_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_WRED_ECN_QUEUE)
    {
        auto context = std::make_shared<CounterContext<sai_queue_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_QUEUE, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        context->double_confirm_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_PG)
    {
        auto context = std::make_shared<CounterContext<sai_ingress_priority_group_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        context->double_confirm_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_RIF)
    {
        return std::make_shared<CounterContext<sai_router_interface_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_ROUTER_INTERFACE, m_vendorSai.get(), m_statsMode);
    }
    else if (context_name == COUNTER_TYPE_SWITCH_DEBUG)
    {
        auto context = std::make_shared<CounterContext<sai_switch_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_SWITCH, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        context->use_sai_stats_capa_query = false;
        context->use_sai_stats_ext = true;

        return context;
    }
    else if (context_name == COUNTER_TYPE_MACSEC_FLOW)
    {
        auto context = std::make_shared<CounterContext<sai_macsec_flow_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_MACSEC_FLOW, m_vendorSai.get(), m_statsMode);
        context->use_sai_stats_capa_query = false;
        return context;
    }
    else if (context_name == COUNTER_TYPE_MACSEC_SA)
    {
        auto context = std::make_shared<CounterContext<sai_macsec_sa_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_MACSEC_SA, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        context->use_sai_stats_capa_query = false;
        context->dont_clear_support_counter = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_FLOW)
    {
        auto context = std::make_shared<CounterContext<sai_counter_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_COUNTER, m_vendorSai.get(), m_statsMode);
        context->use_sai_stats_capa_query = false;
        context->use_sai_stats_ext = true;

        return context;
    }
    else if (context_name == COUNTER_TYPE_TUNNEL)
    {
        auto context = std::make_shared<CounterContext<sai_tunnel_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_TUNNEL, m_vendorSai.get(), m_statsMode);
        context->use_sai_stats_capa_query = false;
        return context;
    }
    else if (context_name == COUNTER_TYPE_BUFFER_POOL)
    {
        auto context = std::make_shared<CounterContext<sai_buffer_pool_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_BUFFER_POOL, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_ENI)
    {
        auto context = std::make_shared<CounterContext<sai_eni_stat_t>>(context_name, instance, (sai_object_type_t)SAI_OBJECT_TYPE_ENI, m_vendorSai.get(), m_statsMode);
        context->always_check_supported_counters = true;
        return context;
    }
    else if (context_name == COUNTER_TYPE_METER_BUCKET)
    {
        return std::make_shared<DashMeterCounterContext>(context_name, instance, m_vendorSai.get(), m_dbCounters);
    }
    else if (context_name == ATTR_TYPE_QUEUE)
    {
        return std::make_shared<AttrContext<sai_queue_attr_t>>(context_name, instance, SAI_OBJECT_TYPE_QUEUE, m_vendorSai.get(), m_statsMode);
    }
    else if (context_name == ATTR_TYPE_PG)
    {
        return std::make_shared<AttrContext<sai_ingress_priority_group_attr_t>>(context_name, instance, SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, m_vendorSai.get(), m_statsMode);
    }
    else if (context_name == ATTR_TYPE_MACSEC_SA)
    {
        return std::make_shared<AttrContext<sai_macsec_sa_attr_t>>(context_name, instance, SAI_OBJECT_TYPE_MACSEC_SA, m_vendorSai.get(), m_statsMode);
    }
    else if (context_name == ATTR_TYPE_ACL_COUNTER)
    {
        return std::make_shared<AttrContext<sai_acl_counter_attr_t>>(context_name, instance, SAI_OBJECT_TYPE_ACL_COUNTER, m_vendorSai.get(), m_statsMode);
    }
    else if (context_name == COUNTER_TYPE_POLICER)
    {
        return std::make_shared<CounterContext<sai_policer_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_POLICER, m_vendorSai.get(), m_statsMode);
    }
    else if (context_name == COUNTER_TYPE_SRV6)
    {
        return std::make_shared<CounterContext<sai_counter_stat_t>>(context_name, instance, SAI_OBJECT_TYPE_COUNTER, m_vendorSai.get(), m_statsMode);
    }

    SWSS_LOG_THROW("Invalid counter type %s", context_name.c_str());
    // GCC 8.3 requires a return value here
    return nullptr;
}