@@ -327,6 +327,22 @@ def check_kernel_reachable_v6_neigh_num(dvs, number):
327
327
neigh_num = int (output .strip ())
328
328
assert neigh_num == number
329
329
330
+ def check_kernel_stale_neigh_num (dvs , number ):
331
+ (exitcode , output ) = dvs .runcmd (['sh' , '-c' , "ip neigh show nud stale | grep -v 'dev lo' | wc -l" ])
332
+ neigh_num = int (output .strip ())
333
+ assert neigh_num == number
334
+
335
+ def check_kernel_stale_v4_neigh_num (dvs , number ):
336
+ (exitcode , output ) = dvs .runcmd (['sh' , '-c' , "ip -4 neigh show nud stale | grep -v 'dev lo' | wc -l" ])
337
+ neigh_num = int (output .strip ())
338
+ assert neigh_num == number
339
+
340
+ def check_kernel_stale_v6_neigh_num (dvs , number ):
341
+ (exitcode , output ) = dvs .runcmd (['sh' , '-c' , "ip -6 neigh show nud stale | grep -v 'dev lo' | wc -l" ])
342
+ neigh_num = int (output .strip ())
343
+ assert neigh_num == number
344
+
345
+
330
346
def kernel_restore_neighs_done (restoretbl ):
331
347
keys = restoretbl .getKeys ()
332
348
return (len (keys ) > 0 )
@@ -1510,13 +1526,52 @@ def test_routing_WarmRestart(dvs, testlog):
1510
1526
assert rt_key ['dest' ] == "192.168.100.0/24"
1511
1527
1512
1528
1529
+ # macros for number of interfaces and number of neighbors
1530
+ # TBD: NUM_NEIGH_PER_INTF >= 128 ips will cause test framework to hang by default kernel settings
1531
+ # TBD: Need tune gc_thresh1/2/3 at host side of vs docker to support this.
1532
+ NUM_INTF = 8
1533
+ NUM_NEIGH_PER_INTF = 16 #128
1534
+ NUM_OF_NEIGHS = (NUM_INTF * NUM_NEIGH_PER_INTF )
1535
+
1513
1536
# 'ip neigh flush all' won't remove failed entries if number of neighs less than gc_threshold1
1514
1537
# Also it takes time to remove them completly.
1515
1538
# We use arp off/on to do it
1516
1539
def flush_neigh_entries (dvs ):
1517
1540
dvs .runcmd ("ip link set group default arp off" )
1518
1541
dvs .runcmd ("ip link set group default arp on" )
1519
1542
1543
+ # Add neighbor entries on servers connecting to SONiC ports
1544
+ # ping them to get the neighbor entries
1545
+ def setup_initial_neighbors (dvs ):
1546
+ for i in range (8 , 8 + NUM_INTF ):
1547
+ for j in range (NUM_NEIGH_PER_INTF ):
1548
+ dvs .servers [i ].runcmd ("ip addr add {}.0.0.{}/24 dev eth0" .format (i * 4 , j + 2 ))
1549
+ dvs .servers [i ].runcmd ("ip -6 addr add {}00::{}/64 dev eth0" .format (i * 4 ,j + 2 ))
1550
+
1551
+ time .sleep (1 )
1552
+
1553
+ for i in range (8 , 8 + NUM_INTF ):
1554
+ for j in range (NUM_NEIGH_PER_INTF ):
1555
+ dvs .runcmd (['sh' , '-c' , "ping -c 1 -W 0 -q {}.0.0.{} > /dev/null 2>&1" .format (i * 4 ,j + 2 )])
1556
+ dvs .runcmd (['sh' , '-c' , "ping6 -c 1 -W 0 -q {}00::{} > /dev/null 2>&1" .format (i * 4 ,j + 2 )])
1557
+
1558
+ # Del half of the ips and a new half of the ips
1559
+ # note: the first ipv4 can not be deleted only
1560
+ def del_and_add_neighbors (dvs ):
1561
+ for i in range (8 , 8 + NUM_INTF ):
1562
+ for j in range (NUM_NEIGH_PER_INTF / 2 ):
1563
+ dvs .servers [i ].runcmd ("ip addr del {}.0.0.{}/24 dev eth0" .format (i * 4 , j + NUM_NEIGH_PER_INTF / 2 + 2 ))
1564
+ dvs .servers [i ].runcmd ("ip -6 addr del {}00::{}/64 dev eth0" .format (i * 4 ,j + NUM_NEIGH_PER_INTF / 2 + 2 ))
1565
+ dvs .servers [i ].runcmd ("ip addr add {}.0.0.{}/24 dev eth0" .format (i * 4 , j + NUM_NEIGH_PER_INTF + 2 ))
1566
+ dvs .servers [i ].runcmd ("ip -6 addr add {}00::{}/64 dev eth0" .format (i * 4 ,j + NUM_NEIGH_PER_INTF + 2 ))
1567
+
1568
+ #ping new IPs
1569
+ def ping_new_ips (dvs ):
1570
+ for i in range (8 , 8 + NUM_INTF ):
1571
+ for j in range (NUM_NEIGH_PER_INTF / 2 ):
1572
+ dvs .runcmd (['sh' , '-c' , "ping -c 1 -W 0 -q {}.0.0.{} > /dev/null 2>&1" .format (i * 4 ,j + NUM_NEIGH_PER_INTF + 2 )])
1573
+ dvs .runcmd (['sh' , '-c' , "ping6 -c 1 -W 0 -q {}00::{} > /dev/null 2>&1" .format (i * 4 ,j + NUM_NEIGH_PER_INTF + 2 )])
1574
+
1520
1575
def test_system_warmreboot_neighbor_syncup (dvs , testlog ):
1521
1576
1522
1577
appl_db = swsscommon .DBConnector (swsscommon .APPL_DB , dvs .redis_sock , 0 )
@@ -1536,18 +1591,16 @@ def test_system_warmreboot_neighbor_syncup(dvs, testlog):
1536
1591
# Ethernet32/36/.../60, with ip: 32.0.0.1/24... 60.0.0.1/24
1537
1592
# ipv6: 3200::1/64...6000::1/64
1538
1593
# bring up the servers'interfaces and assign NUM_NEIGH_PER_INTF (e,g 128) ips per interface
1539
- # TBD: NUM_NEIGH_PER_INTF >= 128 ips will cause test framework to hang by default settings
1540
- # TBD: Need tune gc_thresh1/2/3 at host side of vs docker to support this.
1541
- NUM_INTF = 8
1542
- NUM_NEIGH_PER_INTF = 64 #128
1543
- NUM_OF_NEIGHS = (NUM_INTF * NUM_NEIGH_PER_INTF )
1544
1594
macs = []
1545
1595
for i in range (8 , 8 + NUM_INTF ):
1546
1596
# set timeout to be the same as real HW
1597
+ # set stale timer bigger to avoid testbed difference related timing issues.
1547
1598
# set ip on server facing interfaces
1548
1599
# bring servers' interface up, save the macs
1549
1600
dvs .runcmd ("sysctl -w net.ipv4.neigh.Ethernet{}.base_reachable_time_ms=1800000" .format (i * 4 ))
1550
1601
dvs .runcmd ("sysctl -w net.ipv6.neigh.Ethernet{}.base_reachable_time_ms=1800000" .format (i * 4 ))
1602
+ dvs .runcmd ("sysctl -w net.ipv4.neigh.Ethernet{}.gc_stale_time=180" .format (i * 4 ))
1603
+ dvs .runcmd ("sysctl -w net.ipv6.neigh.Ethernet{}.gc_stale_time=180" .format (i * 4 ))
1551
1604
dvs .runcmd ("ip addr flush dev Ethernet{}" .format (i * 4 ))
1552
1605
dvs .runcmd ("ifconfig Ethernet{} {}.0.0.1/24 up" .format (i * 4 , i * 4 ))
1553
1606
dvs .runcmd ("ip -6 addr add {}00::1/64 dev Ethernet{}" .format (i * 4 ,i * 4 ))
@@ -1559,21 +1612,8 @@ def test_system_warmreboot_neighbor_syncup(dvs, testlog):
1559
1612
1560
1613
#
1561
1614
# Testcase 1:
1562
- # Add neighbor entries on servers connecting to SONiC ports
1563
- # 128 ipv4 and 128 ipv6 on each server
1564
- # total: 1024 ipv4 and 1024 ipv6
1565
- # ping them to get the neighbor entries
1566
- for i in range (8 , 8 + NUM_INTF ):
1567
- for j in range (NUM_NEIGH_PER_INTF ):
1568
- dvs .servers [i ].runcmd ("ip addr add {}.0.0.{}/24 dev eth0" .format (i * 4 , j + 2 ))
1569
- dvs .servers [i ].runcmd ("ip -6 addr add {}00::{}/64 dev eth0" .format (i * 4 ,j + 2 ))
1570
-
1571
- time .sleep (1 )
1572
-
1573
- for i in range (8 , 8 + NUM_INTF ):
1574
- for j in range (NUM_NEIGH_PER_INTF ):
1575
- dvs .runcmd (['sh' , '-c' , "ping -c 1 -W 0 -q {}.0.0.{} > /dev/null 2>&1" .format (i * 4 ,j + 2 )])
1576
- dvs .runcmd (['sh' , '-c' , "ping6 -c 1 -W 0 -q {}00::{} > /dev/null 2>&1" .format (i * 4 ,j + 2 )])
1615
+ # Setup initial neigbors
1616
+ setup_initial_neighbors (dvs )
1577
1617
1578
1618
# Check the neighbor entries are inserted correctly
1579
1619
db = swsscommon .DBConnector (0 , dvs .redis_sock , 0 )
@@ -1660,15 +1700,9 @@ def test_system_warmreboot_neighbor_syncup(dvs, testlog):
1660
1700
# stop neighsyncd and sairedis.rec
1661
1701
stop_neighsyncd (dvs )
1662
1702
del_entry_tbl (state_db , "NEIGH_RESTORE_TABLE" , "Flags" )
1703
+ time .sleep (3 )
1663
1704
1664
- # Del half of the ips and a new half of the ips
1665
- # note: the first ipv4 can not be deleted only
1666
- for i in range (8 , 8 + NUM_INTF ):
1667
- for j in range (NUM_NEIGH_PER_INTF / 2 ):
1668
- dvs .servers [i ].runcmd ("ip addr del {}.0.0.{}/24 dev eth0" .format (i * 4 , j + NUM_NEIGH_PER_INTF / 2 + 2 ))
1669
- dvs .servers [i ].runcmd ("ip -6 addr del {}00::{}/64 dev eth0" .format (i * 4 ,j + NUM_NEIGH_PER_INTF / 2 + 2 ))
1670
- dvs .servers [i ].runcmd ("ip addr add {}.0.0.{}/24 dev eth0" .format (i * 4 , j + NUM_NEIGH_PER_INTF + 2 ))
1671
- dvs .servers [i ].runcmd ("ip -6 addr add {}00::{}/64 dev eth0" .format (i * 4 ,j + NUM_NEIGH_PER_INTF + 2 ))
1705
+ del_and_add_neighbors (dvs )
1672
1706
1673
1707
flush_neigh_entries (dvs )
1674
1708
time .sleep (3 )
@@ -1684,8 +1718,11 @@ def test_system_warmreboot_neighbor_syncup(dvs, testlog):
1684
1718
# should finish the store within 10 seconds
1685
1719
time .sleep (10 )
1686
1720
1687
- check_kernel_reachable_v4_neigh_num (dvs , NUM_OF_NEIGHS )
1688
- check_kernel_reachable_v6_neigh_num (dvs , NUM_OF_NEIGHS )
1721
+ check_kernel_reachable_v4_neigh_num (dvs , NUM_OF_NEIGHS / 2 )
1722
+ check_kernel_reachable_v6_neigh_num (dvs , NUM_OF_NEIGHS / 2 )
1723
+
1724
+ check_kernel_stale_v4_neigh_num (dvs , NUM_OF_NEIGHS / 2 )
1725
+ check_kernel_stale_v6_neigh_num (dvs , NUM_OF_NEIGHS / 2 )
1689
1726
1690
1727
# check syslog and sairedis.rec file for activities
1691
1728
check_syslog_for_neighbor_entry (dvs , marker , 0 , 0 , "ipv4" )
@@ -1701,14 +1738,14 @@ def test_system_warmreboot_neighbor_syncup(dvs, testlog):
1701
1738
# ping the new ips, should get it into appDB
1702
1739
marker = dvs .add_log_marker ()
1703
1740
1704
- for i in range ( 8 , 8 + NUM_INTF ):
1705
- for j in range ( NUM_NEIGH_PER_INTF / 2 ):
1706
- dvs . runcmd ([ 'sh' , '-c' , "ping -c 1 -W 0 -q {}.0.0.{} > /dev/null 2>&1" . format ( i * 4 , j + NUM_NEIGH_PER_INTF + 2 )] )
1707
- dvs . runcmd ([ 'sh' , '-c' , "ping6 -c 1 -W 0 -q {}00::{} > /dev/null 2>&1" . format ( i * 4 , j + NUM_NEIGH_PER_INTF + 2 )] )
1741
+ ping_new_ips ( dvs )
1742
+
1743
+ check_kernel_reachable_v4_neigh_num ( dvs , NUM_OF_NEIGHS )
1744
+ check_kernel_reachable_v6_neigh_num ( dvs , NUM_OF_NEIGHS )
1708
1745
1746
+ check_kernel_stale_v4_neigh_num (dvs , NUM_OF_NEIGHS / 2 )
1747
+ check_kernel_stale_v6_neigh_num (dvs , NUM_OF_NEIGHS / 2 )
1709
1748
1710
- check_kernel_reachable_v4_neigh_num (dvs , NUM_OF_NEIGHS + NUM_OF_NEIGHS / 2 )
1711
- check_kernel_reachable_v6_neigh_num (dvs , NUM_OF_NEIGHS + NUM_OF_NEIGHS / 2 )
1712
1749
check_redis_neigh_entries (dvs , tbl , 2 * (NUM_OF_NEIGHS + NUM_OF_NEIGHS / 2 ))
1713
1750
1714
1751
(nadd , ndel ) = dvs .CountSubscribedObjects (pubsub )
@@ -1725,6 +1762,10 @@ def test_system_warmreboot_neighbor_syncup(dvs, testlog):
1725
1762
1726
1763
check_kernel_reachable_v4_neigh_num (dvs , NUM_OF_NEIGHS )
1727
1764
check_kernel_reachable_v6_neigh_num (dvs , NUM_OF_NEIGHS )
1765
+
1766
+ check_kernel_stale_v4_neigh_num (dvs , 0 )
1767
+ check_kernel_stale_v6_neigh_num (dvs , 0 )
1768
+
1728
1769
check_redis_neigh_entries (dvs , tbl , 2 * NUM_OF_NEIGHS )
1729
1770
1730
1771
(nadd , ndel ) = dvs .CountSubscribedObjects (pubsub )
0 commit comments