@@ -436,6 +436,48 @@ def test_VlanHostIf(self, dvs):
436436 self .dvs_vlan .get_and_verify_vlan_ids (0 )
437437 self .dvs_vlan .get_and_verify_vlan_hostif_ids (len (dvs .asic_db .hostif_name_map ) - 1 )
438438
439+ def test_VlanMemberLinkDown (self , dvs ):
440+
441+ # TODO: add_ip_address has a dependency on cdb within dvs,
442+ # so we still need to setup the db. This should be refactored.
443+ dvs .setup_db ()
444+
445+ vlan = "1000"
446+ vlan_ip = "192.168.0.1/21"
447+ interface = "Ethernet0"
448+ vlan_interface = "Vlan%s" % vlan
449+ server_ip = "192.168.0.100"
450+ vlan_intf_sysctl_param_path = "/proc/sys/net/ipv4/conf/%s/arp_evict_nocarrier" % vlan_interface
451+
452+ self .dvs_vlan .create_vlan (vlan )
453+ vlan_oid = self .dvs_vlan .get_and_verify_vlan_ids (1 )[0 ]
454+ self .dvs_vlan .verify_vlan (vlan_oid , vlan )
455+ self .dvs_vlan .create_vlan_member (vlan , interface )
456+ self .dvs_vlan .verify_vlan_member (vlan_oid , interface )
457+ dvs .set_interface_status (interface , "up" )
458+ dvs .add_ip_address (vlan_interface , vlan_ip )
459+ dvs .runcmd ("ip neigh replace %s lladdr 11:22:33:44:55:66 dev %s nud stale" % (server_ip , vlan_interface ))
460+
461+ neigh_oid = self .dvs_vlan .app_db .wait_for_n_keys ("NEIGH_TABLE" , 1 )[0 ]
462+ assert vlan_interface in neigh_oid and server_ip in neigh_oid
463+
464+ # NOTE: arp_evict_nocarrier is available for kernel >= v5.16 and current
465+ # docker-sonic-vs is based on kernel v5.4.0, so test only if this sysctl
466+ # param is present
467+ rc , res = dvs .runcmd ("cat %s" % vlan_intf_sysctl_param_path )
468+ if rc == 0 :
469+ assert res .strip () == "0"
470+ dvs .set_interface_status (interface , "down" )
471+ neigh_oid = self .dvs_vlan .app_db .wait_for_n_keys ("NEIGH_TABLE" , 1 )[0 ]
472+ assert vlan_interface in neigh_oid and server_ip in neigh_oid
473+
474+ dvs .runcmd ("ip neigh flush all" )
475+ dvs .remove_ip_address (vlan_interface , vlan_ip )
476+ self .dvs_vlan .remove_vlan_member (vlan , interface )
477+ self .dvs_vlan .get_and_verify_vlan_member_ids (0 )
478+ self .dvs_vlan .remove_vlan (vlan )
479+ self .dvs_vlan .get_and_verify_vlan_ids (0 )
480+
439481# Add Dummy always-pass test at end as workaroud
440482# for issue when Flaky fail on final test it invokes module tear-down before retrying
441483def test_nonflaky_dummy ():
0 commit comments