Compare commits

..

No commits in common. "6e1d2e9fc5c6aa58defa9b8b752f0499d35174a5" and "e75dd1a667da4a5013365967d94c03830c9709db" have entirely different histories.

3 changed files with 27 additions and 25 deletions

View file

@ -62,33 +62,33 @@ class PeerTest(unittest.TestCase):
])
def test_all_valid(self):
self.assertFalse(self.validator.is_aspa_invalid_peer([64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64502, 64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64503, 64502, 64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64504, 64503, 64502, 64501]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64504, 64503, 64502]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64504, 64503]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64504]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64501, [64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64502, [64502, 64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64503, [64503, 64502, 64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64504, [64504, 64503, 64502, 64501]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64504, [64504, 64503, 64502]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64504, [64504, 64503]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64504, [64504]))
def test_prepend_valid(self):
self.assertFalse(self.validator.is_aspa_invalid_peer([64501, 64500, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64502, 64502, 64501, 64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64503, 64502, 64502, 64501, 64500, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64501, [64501, 64500, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64502, [64502, 64502, 64501, 64501, 64500]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64503, [64503, 64502, 64502, 64501, 64500, 64500]))
def test_some_unknown(self):
self.assertFalse(self.validator.is_aspa_invalid_peer([64505, 64504, 64503, 64502]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64503, 64503, 64502, 64505]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64505, [64505, 64504, 64503, 64502]))
self.assertFalse(self.validator.is_aspa_invalid_peer(64503, [64503, 64503, 64502, 64505]))
def test_all_unknown(self):
self.assertFalse(self.validator.is_aspa_invalid_peer([64506, 64507, 64508]))
self.assertFalse(self.validator.is_aspa_invalid_customer(64506, [64506, 64507, 64508]))
def test_some_invalid(self):
self.assertTrue(self.validator.is_aspa_invalid_peer([64505, 64505, 64503, 64503]))
self.assertTrue(self.validator.is_aspa_invalid_peer([64504, 64503, 64506, 64500]))
self.assertTrue(self.validator.is_aspa_invalid_peer(64505, [64505, 64505, 64503, 64503]))
self.assertTrue(self.validator.is_aspa_invalid_peer(64504, [64504, 64503, 64506, 64500]))
def test_peer_originated(self):
for i in [64500, 64501, 64502, 64503, 64504, 64505]:
self.assertFalse(self.validator.is_aspa_invalid_peer([i]))
self.assertFalse(self.validator.is_aspa_invalid_peer(i, [i]))
class UpstreamTest(unittest.TestCase):
@ -118,7 +118,6 @@ class UpstreamTest(unittest.TestCase):
def test_valid_edge(self):
self.assertFalse(self.validator.is_aspa_invalid_upstream(64530, [64520, 64510]))
self.assertFalse(self.validator.is_aspa_invalid_upstream(64530, [64520, 64521]))
self.assertFalse(self.validator.is_aspa_invalid_upstream(64530, [64520]))
self.assertFalse(self.validator.is_aspa_invalid_upstream(64520, [64510]))

View file

@ -24,8 +24,10 @@ class Validator:
return False
def is_aspa_invalid_peer(self, bgp_path: list[int]) -> bool:
for prev_asn, asn in zip(bgp_path, bgp_path[1:]):
def is_aspa_invalid_peer(self, peer_asn: int, bgp_path: list[int]) -> bool:
remove_peer = list(dropwhile(lambda asn: asn != peer_asn, bgp_path))
for prev_asn, asn in zip(chain([peer_asn], remove_peer), remove_peer):
if prev_asn == asn:
continue
@ -64,11 +66,11 @@ class BirdValidator(Validator):
return False
def is_aspa_invalid_peer(self, bgp_path: list[int]) -> bool:
prev_asn = bgp_path[0]
def is_aspa_invalid_peer(self, peer_asn: int, bgp_path: list[int]) -> bool:
prev_asn = peer_asn
for asn in bgp_path:
if prev_asn != asn and self.is_invalid_pair(prev_asn, asn):
if asn != peer_asn and prev_asn != asn and self.is_invalid_pair(prev_asn, asn):
return True
prev_asn = asn

View file

@ -10,11 +10,12 @@ function is_aspa_invalid_customer() {
return false;
}
function is_aspa_invalid_peer() {
int prev_asn = bgp_path.first;
function is_aspa_invalid_peer(int peer_asn) {
int prev_asn = peer_asn;
for int cur_asn in bgp_path do {
if prev_asn != cur_asn && is_aspa_invalid_pair(prev_asn, cur_asn) then
if cur_asn != peer_asn && prev_asn != cur_asn &&
is_aspa_invalid_pair(prev_asn, cur_asn) then
return true;
prev_asn = cur_asn;
}