Skip to content

Commit b471d82

Browse files
committed
fix directory data structure error and add validation for sid prefix length
Signed-off-by: BYGX-wcr <[email protected]>
1 parent 4340c7a commit b471d82

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

src/sonic-bgpcfgd/bgpcfgd/managers_srv6.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,16 @@ def sids_set_handler(self, key, data):
5656
locator_name = key.split("|")[0]
5757
ip_prefix = key.split("|")[1].lower()
5858
key = "{}|{}".format(locator_name, ip_prefix)
59+
prefix_len = int(ip_prefix.split("/")[1])
5960

6061
if not self.directory.path_exist(self.db_name, "SRV6_MY_LOCATORS", locator_name):
6162
log_err("Found a SRv6 SID config entry with a locator that does not exist: {} | {}".format(key, data))
6263
return False
64+
65+
locator = self.directory.get(self.db_name, "SRV6_MY_LOCATORS", locator_name)
66+
if locator.block_len + locator.node_len > prefix_len:
67+
log_err("Found a SRv6 SID config entry with an invalid prefix length {} | {}".format(key, data))
68+
return False
6369

6470
if 'action' not in data:
6571
log_err("Found a SRv6 SID config entry that does not specify action: {} | {}".format(key, data))
@@ -80,7 +86,7 @@ def sids_set_handler(self, key, data):
8086
self.cfg_mgr.push_list(cmd_list)
8187
log_debug("{} SRv6 static configuration {}|{} is scheduled for updates. {}".format(self.db_name, self.table_name, key, str(cmd_list)))
8288

83-
self.directory.put(self.db_name, self.table_name, key, (sid, sid_cmd))
89+
self.directory.put(self.db_name, self.table_name, key.replace("/", "\\"), (sid, sid_cmd))
8490
return True
8591

8692
def del_handler(self, key):
@@ -102,18 +108,18 @@ def sids_del_handler(self, key):
102108
ip_prefix = key.split("|")[1].lower()
103109
key = "{}|{}".format(locator_name, ip_prefix)
104110

105-
if not self.directory.path_exist(self.db_name, self.table_name, key):
111+
if not self.directory.path_exist(self.db_name, self.table_name, key.replace("/", "\\")):
106112
log_warn("Encountered a config deletion with a SRv6 SID that does not exist: {}".format(key))
107113
return
108114

109-
_, sid_cmd = self.directory.get(self.db_name, self.table_name, key)
115+
_, sid_cmd = self.directory.get(self.db_name, self.table_name, key.replace("/", "\\"))
110116
cmd_list = ['segment-routing', 'srv6', "static-sids"]
111117
no_sid_cmd = 'no ' + sid_cmd
112118
cmd_list.append(no_sid_cmd)
113119

114120
self.cfg_mgr.push_list(cmd_list)
115121
log_debug("{} SRv6 static configuration {}|{} is scheduled for updates. {}".format(self.db_name, self.table_name, key, str(cmd_list)))
116-
self.directory.remove(self.db_name, self.table_name, key)
122+
self.directory.remove(self.db_name, self.table_name, key.replace("/", "\\"))
117123

118124
class Locator:
119125
def __init__(self, name, data):

src/sonic-bgpcfgd/tests/test_srv6.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ def test_uN_add():
8787
'sid fcbb:bbbb:1::/48 locator loc1 behavior uN'
8888
])
8989

90-
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::/48")
90+
print(loc_mgr.directory.data)
91+
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::\\48")
9192

9293
def test_uDT46_add_vrf1():
9394
loc_mgr, sid_mgr = constructor()
@@ -103,7 +104,8 @@ def test_uDT46_add_vrf1():
103104
'sid fcbb:bbbb:1:f2::/64 locator loc1 behavior uDT46 vrf Vrf1'
104105
])
105106

106-
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::/64")
107+
print(loc_mgr.directory.data)
108+
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::\\64")
107109

108110
def test_uN_del():
109111
loc_mgr, sid_mgr = constructor()
@@ -123,7 +125,7 @@ def test_uN_del():
123125
'no sid fcbb:bbbb:1::/48 locator loc1 behavior uN'
124126
])
125127

126-
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::/48")
128+
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::\\48")
127129

128130
def test_uDT46_del_vrf1():
129131
loc_mgr, sid_mgr = constructor()
@@ -149,8 +151,8 @@ def test_uDT46_del_vrf1():
149151
'no sid fcbb:bbbb:1:f2::/64 locator loc1 behavior uDT46 vrf Vrf1'
150152
])
151153

152-
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::/48")
153-
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::/64")
154+
assert sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1::\\48")
155+
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc1|fcbb:bbbb:1:f2::\\64")
154156

155157
def test_invalid_add():
156158
_, sid_mgr = constructor()
@@ -160,4 +162,4 @@ def test_invalid_add():
160162
'action': 'uN'
161163
}), expected_ret=False, expected_cmds=[])
162164

163-
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc2|fcbb:bbbb:21:f1::/64")
165+
assert not sid_mgr.directory.path_exist(sid_mgr.db_name, sid_mgr.table_name, "loc2|fcbb:bbbb:21:f1::\\64")

0 commit comments

Comments
 (0)