From 6e1d2e9fc5c6aa58defa9b8b752f0499d35174a5 Mon Sep 17 00:00:00 2001 From: Quantum Date: Thu, 31 Oct 2024 21:27:51 -0400 Subject: [PATCH] Simplify peer handling --- aspa/test.py | 32 ++++++++++++++++---------------- aspa/validate.py | 12 +++++------- filter_aspa.conf | 7 +++---- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/aspa/test.py b/aspa/test.py index 8f8019c..aef0cdb 100644 --- a/aspa/test.py +++ b/aspa/test.py @@ -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): diff --git a/aspa/validate.py b/aspa/validate.py index 05dbc75..72bddce 100644 --- a/aspa/validate.py +++ b/aspa/validate.py @@ -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 diff --git a/filter_aspa.conf b/filter_aspa.conf index 4176074..96bd59d 100644 --- a/filter_aspa.conf +++ b/filter_aspa.conf @@ -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; }