Compare commits

...

2 commits

Author SHA1 Message Date
Quantum 6e1d2e9fc5 Simplify peer handling 2024-10-31 21:27:51 -04:00
Quantum e51cb3edb5 Add case for when AS path ends on a peer 2024-10-31 21:13:45 -04:00
3 changed files with 25 additions and 27 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, [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]))
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]))
def test_prepend_valid(self):
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]))
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]))
def test_some_unknown(self):
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]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64505, 64504, 64503, 64502]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64503, 64503, 64502, 64505]))
def test_all_unknown(self):
self.assertFalse(self.validator.is_aspa_invalid_customer(64506, [64506, 64507, 64508]))
self.assertFalse(self.validator.is_aspa_invalid_peer([64506, 64507, 64508]))
def test_some_invalid(self):
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]))
self.assertTrue(self.validator.is_aspa_invalid_peer([64505, 64505, 64503, 64503]))
self.assertTrue(self.validator.is_aspa_invalid_peer([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, [i]))
self.assertFalse(self.validator.is_aspa_invalid_peer([i]))
class UpstreamTest(unittest.TestCase):
@ -118,6 +118,7 @@ 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,10 +24,8 @@ class Validator:
return False
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):
def is_aspa_invalid_peer(self, bgp_path: list[int]) -> bool:
for prev_asn, asn in zip(bgp_path, bgp_path[1:]):
if prev_asn == asn:
continue
@ -66,11 +64,11 @@ class BirdValidator(Validator):
return False
def is_aspa_invalid_peer(self, peer_asn: int, bgp_path: list[int]) -> bool:
prev_asn = peer_asn
def is_aspa_invalid_peer(self, bgp_path: list[int]) -> bool:
prev_asn = bgp_path[0]
for asn in bgp_path:
if asn != peer_asn and prev_asn != asn and self.is_invalid_pair(prev_asn, asn):
if prev_asn != asn and self.is_invalid_pair(prev_asn, asn):
return True
prev_asn = asn

View file

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