@@ -691,12 +691,11 @@ sai_status_t ServerSai::processSingleEvent(
691
691
if (op == REDIS_ASIC_STATE_COMMAND_BULK_SET)
692
692
return processBulkQuadEvent (SAI_COMMON_API_BULK_SET, kco);
693
693
694
- // TODO implement
695
- // if (op == REDIS_ASIC_STATE_COMMAND_GET_STATS)
696
- // return processGetStatsEvent(kco);
697
- //
698
- // if (op == REDIS_ASIC_STATE_COMMAND_CLEAR_STATS)
699
- // return processClearStatsEvent(kco);
694
+ if (op == REDIS_ASIC_STATE_COMMAND_GET_STATS)
695
+ return processGetStatsEvent (kco);
696
+
697
+ if (op == REDIS_ASIC_STATE_COMMAND_CLEAR_STATS)
698
+ return processClearStatsEvent (kco);
700
699
701
700
if (op == REDIS_ASIC_STATE_COMMAND_FLUSH)
702
701
return processFdbFlush (kco);
@@ -1737,3 +1736,100 @@ sai_status_t ServerSai::processFdbFlush(
1737
1736
1738
1737
return status;
1739
1738
}
1739
+
1740
+ sai_status_t ServerSai::processClearStatsEvent (
1741
+ _In_ const swss::KeyOpFieldsValuesTuple &kco)
1742
+ {
1743
+ SWSS_LOG_ENTER ();
1744
+
1745
+ const std::string &key = kfvKey (kco);
1746
+
1747
+ sai_object_meta_key_t metaKey;
1748
+ sai_deserialize_object_meta_key (key, metaKey);
1749
+
1750
+ auto info = sai_metadata_get_object_type_info (metaKey.objecttype );
1751
+
1752
+ if (info->isnonobjectid )
1753
+ {
1754
+ SWSS_LOG_THROW (" non object id not supported on clear stats: %s, FIXME" , key.c_str ());
1755
+ }
1756
+
1757
+ std::vector<sai_stat_id_t > counter_ids;
1758
+
1759
+ for (auto &v: kfvFieldsValues (kco))
1760
+ {
1761
+ int32_t val;
1762
+ sai_deserialize_enum (fvField (v), info->statenum , val);
1763
+
1764
+ counter_ids.push_back (val);
1765
+ }
1766
+
1767
+ auto status = m_sai->clearStats (
1768
+ metaKey.objecttype ,
1769
+ metaKey.objectkey .key .object_id ,
1770
+ (uint32_t )counter_ids.size (),
1771
+ counter_ids.data ());
1772
+
1773
+ m_selectableChannel->set (sai_serialize_status (status), {}, REDIS_ASIC_STATE_COMMAND_GETRESPONSE);
1774
+
1775
+ return status;
1776
+ }
1777
+
1778
+ sai_status_t ServerSai::processGetStatsEvent (
1779
+ _In_ const swss::KeyOpFieldsValuesTuple &kco)
1780
+ {
1781
+ SWSS_LOG_ENTER ();
1782
+
1783
+ const std::string &key = kfvKey (kco);
1784
+
1785
+ sai_object_meta_key_t metaKey;
1786
+ sai_deserialize_object_meta_key (key, metaKey);
1787
+
1788
+ // TODO get stats on created object in init view mode could fail
1789
+
1790
+ auto info = sai_metadata_get_object_type_info (metaKey.objecttype );
1791
+
1792
+ if (info->isnonobjectid )
1793
+ {
1794
+ SWSS_LOG_THROW (" non object id not supported on clear stats: %s, FIXME" , key.c_str ());
1795
+ }
1796
+
1797
+ std::vector<sai_stat_id_t > counter_ids;
1798
+
1799
+ for (auto &v: kfvFieldsValues (kco))
1800
+ {
1801
+ int32_t val;
1802
+ sai_deserialize_enum (fvField (v), info->statenum , val);
1803
+
1804
+ counter_ids.push_back (val);
1805
+ }
1806
+
1807
+ std::vector<uint64_t > result (counter_ids.size ());
1808
+
1809
+ auto status = m_sai->getStats (
1810
+ metaKey.objecttype ,
1811
+ metaKey.objectkey .key .object_id ,
1812
+ (uint32_t )counter_ids.size (),
1813
+ counter_ids.data (),
1814
+ result.data ());
1815
+
1816
+ std::vector<swss::FieldValueTuple> entry;
1817
+
1818
+ if (status != SAI_STATUS_SUCCESS)
1819
+ {
1820
+ SWSS_LOG_ERROR (" Failed to get stats" );
1821
+ }
1822
+ else
1823
+ {
1824
+ const auto & values = kfvFieldsValues (kco);
1825
+
1826
+ for (size_t i = 0 ; i < values.size (); i++)
1827
+ {
1828
+ entry.emplace_back (fvField (values[i]), std::to_string (result[i]));
1829
+ }
1830
+ }
1831
+
1832
+ m_selectableChannel->set (sai_serialize_status (status), entry, REDIS_ASIC_STATE_COMMAND_GETRESPONSE);
1833
+
1834
+ return status;
1835
+ }
0 commit comments