Skip to content

Commit 97f70d1

Browse files
NAT : Update the CRM used counters for SNAT and DNAT entries (sonic-net#1655)
Issue : CRM used counters are not getting updated for SNAT and DNAT entries Steps to recreate: Add a static NAT entry and verify the CRM counters root@sonic:/home/admin# config nat feature enable root@sonic:/home/admin# config interface ip add Ethernet9 12.12.0.1/24 root@sonic:/home/admin# config interface ip add Ethernet11 125.56.90.12/24 root@sonic:/home/admin# config nat add interface Ethernet11 -nat_zone 1 root@sonic:/home/admin# root@sonic:/home/admin# config nat add static basic 125.56.90.8 12.12.0.2 root@sonic:/home/admin# show nat translations Static NAT Entries ..................... 2 Static NAPT Entries ..................... 0 Dynamic NAT Entries ..................... 0 Dynamic NAPT Entries ..................... 0 Static Twice NAT Entries ..................... 0 Static Twice NAPT Entries ..................... 0 Dynamic Twice NAT Entries ..................... 0 Dynamic Twice NAPT Entries ..................... 0 Total SNAT/SNAPT Entries ..................... 1 Total DNAT/DNAPT Entries ..................... 1 Total Entries ..................... 2 Protocol Source Destination Translated Source Translated Destination ---------- --------- ------------- ------------------- ------------------------ all 12.12.0.2 --- 125.56.90.8 --- all --- 125.56.90.8 --- 12.12.0.2 root@sonic:/home/admin# =============After polling interval of 300 seconds ======== root@sonic:/home/admin# crm show resources snat Resource Name Used Count Available Count --------------- ------------ ----------------- snat_entry 0 1024 root@sonic:/home/admin# root@sonic:/home/admin# crm show resources dnat Resource Name Used Count Available Count --------------- ------------ ----------------- dnat_entry 0 1024 root@sonic:/home/admin# Fix: Increment/Decrement the crm used counters for snat/dnat entries when entry is created/deleted. Repeated the same steps to add static nat entry like above and verified the crm counters. root@sonic:/home/admin# crm show resources dnat Resource Name Used Count Available Count --------------- ------------ ----------------- dnat_entry 1 1023 root@sonic:/home/admin# crm show resources snat Resource Name Used Count Available Count --------------- ------------ ----------------- snat_entry 1 1023 root@sonic:/home/admin# Signed-off-by: Akhilesh Samineni akhilesh.samineni@broadcom.com
1 parent a4e05a7 commit 97f70d1

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
lines changed

orchagent/natorch.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
#include "natorch.h"
2727
#include "notifier.h"
2828
#include "sai_serialize.h"
29+
#include "crmorch.h"
2930

31+
extern CrmOrch *gCrmOrch;
3032
extern PortsOrch *gPortsOrch;
3133
extern sai_object_id_t gSwitchId;
3234
extern sai_switch_api_t *sai_switch_api;
@@ -790,6 +792,7 @@ bool NatOrch::addHwDnatEntry(const IpAddress &ip_address)
790792

791793
updateNatCounters(ip_address, 0, 0);
792794
m_natEntries[ip_address].addedToHw = true;
795+
gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_DNAT_ENTRY);
793796

794797
if (entry.entry_type == "static")
795798
{
@@ -876,6 +879,7 @@ bool NatOrch::addHwDnaptEntry(const NaptEntryKey &key)
876879

877880
m_naptEntries[key].addedToHw = true;
878881
updateNaptCounters(key.prototype.c_str(), key.ip_address, key.l4_port, 0, 0);
882+
gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_DNAT_ENTRY);
879883

880884
if (entry.entry_type == "static")
881885
{
@@ -947,6 +951,7 @@ bool NatOrch::removeHwDnatEntry(const IpAddress &dstIp)
947951
entry.entry_type.c_str(), dstIp.to_string().c_str(), entry.translated_ip.to_string().c_str());
948952

949953
deleteNatCounters(dstIp);
954+
gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_DNAT_ENTRY);
950955

951956
if (entry.entry_type == "static")
952957
{
@@ -1138,6 +1143,7 @@ bool NatOrch::removeHwDnaptEntry(const NaptEntryKey &key)
11381143
entry.translated_ip.to_string().c_str(), entry.translated_l4_port);
11391144

11401145
deleteNaptCounters(key.prototype.c_str(), key.ip_address, key.l4_port);
1146+
gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_DNAT_ENTRY);
11411147

11421148
if (entry.entry_type == "static")
11431149
{
@@ -1336,6 +1342,7 @@ bool NatOrch::addHwSnatEntry(const IpAddress &ip_address)
13361342
updateNatCounters(ip_address, 0, 0);
13371343
m_natEntries[ip_address].addedToHw = true;
13381344
m_natEntries[ip_address].activeTime = time_now.tv_sec;
1345+
gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_SNAT_ENTRY);
13391346

13401347
if (entry.entry_type == "static")
13411348
{
@@ -1514,6 +1521,7 @@ bool NatOrch::addHwSnaptEntry(const NaptEntryKey &keyEntry)
15141521
m_naptEntries[keyEntry].activeTime = time_now.tv_sec;
15151522

15161523
updateNaptCounters(keyEntry.prototype.c_str(), keyEntry.ip_address, keyEntry.l4_port, 0, 0);
1524+
gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_SNAT_ENTRY);
15171525

15181526
if (entry.entry_type == "static")
15191527
{
@@ -1670,6 +1678,7 @@ bool NatOrch::removeHwSnatEntry(const IpAddress &ip_address)
16701678
}
16711679
deleteNatCounters(ip_address);
16721680
m_natEntries.erase(ip_address);
1681+
gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_SNAT_ENTRY);
16731682

16741683
if (entry.entry_type == "static")
16751684
{
@@ -1760,6 +1769,7 @@ bool NatOrch::removeHwSnaptEntry(const NaptEntryKey &keyEntry)
17601769
}
17611770
deleteNaptCounters(keyEntry.prototype.c_str(), keyEntry.ip_address, keyEntry.l4_port);
17621771
m_naptEntries.erase(keyEntry);
1772+
gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_SNAT_ENTRY);
17631773

17641774
if (entry.entry_type == "static")
17651775
{

tests/test_nat.py

+75-3
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,6 @@ def test_DelTwiceNaPtStaticEntry(self, dvs, testlog):
287287
#check the entry is not there in asic db
288288
self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_NAT_ENTRY", 0)
289289

290-
# clear interfaces
291-
self.clear_interfaces(dvs)
292-
293290
def test_VerifyConntrackTimeoutForNatEntry(self, dvs, testlog):
294291
# get neighbor and arp entry
295292
dvs.servers[0].runcmd("ping -c 1 18.18.18.2")
@@ -353,6 +350,81 @@ def test_DoNotNatAclAction(self, dvs_acl, testlog):
353350
dvs_acl.remove_acl_table(L3_TABLE_NAME)
354351
dvs_acl.verify_acl_table_count(0)
355352

353+
def test_CrmSnatAndDnatEntryUsedCount(self, dvs, testlog):
354+
# initialize
355+
self.setup_db(dvs)
356+
357+
# get neighbor and arp entry
358+
dvs.servers[0].runcmd("ping -c 1 18.18.18.2")
359+
360+
# set pooling interval to 1
361+
dvs.runcmd("crm config polling interval 1")
362+
363+
dvs.setReadOnlyAttr('SAI_OBJECT_TYPE_SWITCH', 'SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY', '1000')
364+
dvs.setReadOnlyAttr('SAI_OBJECT_TYPE_SWITCH', 'SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY', '1000')
365+
366+
time.sleep(2)
367+
368+
# get snat counters
369+
used_snat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_snat_entry_used')
370+
avail_snat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_snat_entry_available')
371+
372+
# get dnat counters
373+
used_dnat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_dnat_entry_used')
374+
avail_dnat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_dnat_entry_available')
375+
376+
# add a static nat entry
377+
dvs.runcmd("config nat add static basic 67.66.65.1 18.18.18.2")
378+
379+
#check the entry in asic db, 3 keys = SNAT, DNAT and DNAT_Pool
380+
keys = self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_NAT_ENTRY", 3)
381+
for key in keys:
382+
if (key.find("dst_ip:67.66.65.1")) or (key.find("src_ip:18.18.18.2")):
383+
assert True
384+
else:
385+
assert False
386+
387+
dvs.setReadOnlyAttr('SAI_OBJECT_TYPE_SWITCH', 'SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY', '999')
388+
dvs.setReadOnlyAttr('SAI_OBJECT_TYPE_SWITCH', 'SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY', '999')
389+
390+
time.sleep(2)
391+
392+
# get snat counters
393+
new_used_snat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_snat_entry_used')
394+
new_avail_snat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_snat_entry_available')
395+
396+
# get dnat counters
397+
new_used_dnat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_dnat_entry_used')
398+
new_avail_dnat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_dnat_entry_available')
399+
400+
assert new_used_snat_counter - used_snat_counter == 1
401+
assert avail_snat_counter - new_avail_snat_counter == 1
402+
assert new_used_dnat_counter - used_dnat_counter == 1
403+
assert avail_dnat_counter - new_avail_dnat_counter == 1
404+
405+
# delete a static nat entry
406+
dvs.runcmd("config nat remove static basic 67.66.65.1 18.18.18.2")
407+
408+
dvs.setReadOnlyAttr('SAI_OBJECT_TYPE_SWITCH', 'SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY', '1000')
409+
dvs.setReadOnlyAttr('SAI_OBJECT_TYPE_SWITCH', 'SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY', '1000')
410+
411+
time.sleep(2)
412+
413+
# get snat counters
414+
new_used_snat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_snat_entry_used')
415+
new_avail_snat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_snat_entry_available')
416+
417+
# get dnat counters
418+
new_used_dnat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_dnat_entry_used')
419+
new_avail_dnat_counter = dvs.getCrmCounterValue('STATS', 'crm_stats_dnat_entry_available')
420+
421+
assert new_used_snat_counter == used_snat_counter
422+
assert new_avail_snat_counter == avail_snat_counter
423+
assert new_used_dnat_counter == used_dnat_counter
424+
assert new_avail_dnat_counter == avail_dnat_counter
425+
426+
# clear interfaces
427+
self.clear_interfaces(dvs)
356428

357429
# Add Dummy always-pass test at end as workaroud
358430
# for issue when Flaky fail on final test it invokes module tear-down before retrying

0 commit comments

Comments
 (0)