Skip to content

Commit 44a407b

Browse files
committed
Cleanup rules upon 'down'
1 parent 7b93452 commit 44a407b

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

netsim/providers/clab.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@ def create_linux_bridge( brname: str ) -> bool:
4040
log.print_verbose( f"Enable Linux bridge '{brname}': {status}" )
4141

4242
status = linuxbridge.configure_bridge_forwarding(brname)
43-
if status:
44-
status = external_commands.run_command(
45-
['sudo','nft',f'insert rule ip6 filter DOCKER-USER oifname "{brname}" counter accept'],
46-
check_result=True,return_stdout=True)
47-
log.print_verbose(f"Insert ipv6 nftables rule for Linux bridge '{brname}': {status}")
43+
if status is False:
44+
return False
45+
return insert_ipv6_forwarding_rule( brname )
46+
47+
def insert_ipv6_forwarding_rule( brname: str ) -> bool:
48+
status = external_commands.run_command(
49+
['sudo','nft',f'insert rule ip6 filter DOCKER-USER oifname "{brname}" counter accept'],
50+
check_result=True,return_stdout=True)
51+
log.print_verbose(f"Insert ipv6 nftables rule for Linux bridge '{brname}': {status}")
4852
return status
4953

5054
def destroy_linux_bridge( brname: str ) -> bool:
@@ -53,7 +57,30 @@ def destroy_linux_bridge( brname: str ) -> bool:
5357
if status is False:
5458
return False
5559
log.print_verbose( f"Delete Linux bridge '{brname}': {status}" )
56-
return True
60+
return remove_ipv6_forwarding_rule( brname )
61+
62+
def remove_ipv6_forwarding_rule( brname: str ) -> bool:
63+
status = external_commands.run_command(
64+
['sudo','nft','--handle','--json','list chain ip6 filter DOCKER-USER'],
65+
check_result=True,return_stdout=True)
66+
if status is False:
67+
log.print_verbose( f"remove_ipv6_forwarding_rule failed to list rules for Linux bridge '{brname}'" )
68+
return False
69+
try:
70+
result = json.loads(status)
71+
for rule in result['nftables']:
72+
if 'rule' in rule and rule["rule"]["expr"][0]["match"]["right"]==brname:
73+
handle = rule["rule"]["handle"]
74+
status = external_commands.run_command(
75+
['sudo','nft',f'destroy rule ip6 filter DOCKER-USER handle {handle}'],
76+
check_result=True,return_stdout=True)
77+
log.print_verbose(f"Remove ipv6 nftables rule for Linux bridge '{brname}': {status}")
78+
return status
79+
log.print_verbose( f"remove_ipv6_forwarding_rule did not find any rules for '{brname}'" )
80+
return True
81+
except Exception as ex:
82+
log.print_verbose(ex)
83+
return False
5784

5885
def create_ovs_bridge( brname: str ) -> bool:
5986
status = external_commands.run_command(

0 commit comments

Comments
 (0)