diff --git a/cfgmgr/sflowmgr.cpp b/cfgmgr/sflowmgr.cpp index 98d6a777569..577b0733800 100644 --- a/cfgmgr/sflowmgr.cpp +++ b/cfgmgr/sflowmgr.cpp @@ -82,7 +82,8 @@ void SflowMgr::sflowUpdatePortInfo(Consumer &consumer) if (sflowPortConf == m_sflowPortConfMap.end()) { new_port = true; - port_info.local_conf = false; + port_info.local_rate_cfg = false; + port_info.local_admin_cfg = false; port_info.speed = SFLOW_ERROR_SPEED_STR; port_info.rate = ""; port_info.admin = ""; @@ -111,7 +112,8 @@ void SflowMgr::sflowUpdatePortInfo(Consumer &consumer) auto sflowPortConf = m_sflowPortConfMap.find(key); if (sflowPortConf != m_sflowPortConfMap.end()) { - bool local_cfg = m_sflowPortConfMap[key].local_conf; + bool local_cfg = m_sflowPortConfMap[key].local_rate_cfg || + m_sflowPortConfMap[key].local_admin_cfg; m_sflowPortConfMap.erase(key); if ((m_intfAllConf && m_gEnable) || local_cfg) @@ -128,18 +130,27 @@ void SflowMgr::sflowHandleSessionAll(bool enable) { for (auto it: m_sflowPortConfMap) { - if (!it.second.local_conf) + if (enable) { vector fvs; - sflowGetGlobalInfo(fvs, it.second.speed); - if (enable) + if (it.second.local_rate_cfg || it.second.local_admin_cfg) { - m_appSflowSessionTable.set(it.first, fvs); + sflowGetPortInfo(fvs, it.second); + /* Use global admin state if there is not a local one */ + if (!it.second.local_admin_cfg) { + FieldValueTuple fv1("admin_state", "up"); + fvs.push_back(fv1); + } } else { - m_appSflowSessionTable.del(it.first); + sflowGetGlobalInfo(fvs, it.second.speed); } + m_appSflowSessionTable.set(it.first, fvs); + } + else if (!it.second.local_admin_cfg) + { + m_appSflowSessionTable.del(it.first); } } } @@ -148,7 +159,7 @@ void SflowMgr::sflowHandleSessionLocal(bool enable) { for (auto it: m_sflowPortConfMap) { - if (it.second.local_conf) + if (it.second.local_admin_cfg || it.second.local_rate_cfg) { vector fvs; sflowGetPortInfo(fvs, it.second); @@ -184,7 +195,7 @@ void SflowMgr::sflowGetGlobalInfo(vector &fvs, string speed) void SflowMgr::sflowGetPortInfo(vector &fvs, SflowPortInfo &local_info) { - if (local_info.admin.length() > 0) + if (local_info.local_admin_cfg) { FieldValueTuple fv1("admin_state", local_info.admin); fvs.push_back(fv1); @@ -206,17 +217,23 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector &fv { rate_present = true; m_sflowPortConfMap[alias].rate = fvValue(i); + m_sflowPortConfMap[alias].local_rate_cfg = true; } if (fvField(i) == "admin_state") { admin_present = true; m_sflowPortConfMap[alias].admin = fvValue(i); + m_sflowPortConfMap[alias].local_admin_cfg = true; } } if (!rate_present) { - if (m_sflowPortConfMap[alias].rate == "") + /* Go back to default sample-rate if there is not existing rate OR + * if a local config has been done but the rate has been removed + */ + if (m_sflowPortConfMap[alias].rate == "" || + m_sflowPortConfMap[alias].local_rate_cfg) { string speed = m_sflowPortConfMap[alias].speed; @@ -230,6 +247,7 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector &fv } m_sflowPortConfMap[alias].rate = rate; } + m_sflowPortConfMap[alias].local_rate_cfg = false; FieldValueTuple fv("sample_rate", m_sflowPortConfMap[alias].rate); fvs.push_back(fv); } @@ -238,9 +256,10 @@ void SflowMgr::sflowCheckAndFillValues(string alias, vector &fv { if (m_sflowPortConfMap[alias].admin == "") { - /* By default admin state is enable if not set explicitely */ + /* By default admin state is enable if not set explicitly */ m_sflowPortConfMap[alias].admin = "up"; } + m_sflowPortConfMap[alias].local_admin_cfg = false; FieldValueTuple fv("admin_state", m_sflowPortConfMap[alias].admin); fvs.push_back(fv); } @@ -327,7 +346,6 @@ void SflowMgr::doTask(Consumer &consumer) continue; } sflowCheckAndFillValues(key,values); - m_sflowPortConfMap[key].local_conf = true; m_appSflowSessionTable.set(key, values); } } @@ -357,7 +375,8 @@ void SflowMgr::doTask(Consumer &consumer) else { m_appSflowSessionTable.del(key); - m_sflowPortConfMap[key].local_conf = false; + m_sflowPortConfMap[key].local_rate_cfg = false; + m_sflowPortConfMap[key].local_admin_cfg = false; m_sflowPortConfMap[key].rate = ""; m_sflowPortConfMap[key].admin = ""; diff --git a/cfgmgr/sflowmgr.h b/cfgmgr/sflowmgr.h index 16cd2237988..3f46f45fb0b 100644 --- a/cfgmgr/sflowmgr.h +++ b/cfgmgr/sflowmgr.h @@ -30,7 +30,8 @@ namespace swss { struct SflowPortInfo { - bool local_conf; + bool local_rate_cfg; + bool local_admin_cfg; std::string speed; std::string rate; std::string admin; @@ -50,7 +51,7 @@ class SflowMgr : public Orch Table m_cfgSflowSessionTable; ProducerStateTable m_appSflowTable; ProducerStateTable m_appSflowSessionTable; - SflowPortConfMap m_sflowPortConfMap; + SflowPortConfMap m_sflowPortConfMap; bool m_intfAllConf; bool m_gEnable;