From dfeaea09dcdabcc88754bbde2b6d733e8c9bb14b Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 18 Jul 2024 05:28:25 +0300 Subject: [PATCH] Implement RFC 9072 (sender side) Signed-off-by: Donatas Abraitis --- src/exabgp/bgp/message/open/__init__.py | 15 +++++++++------ .../bgp/message/open/capability/capabilities.py | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/exabgp/bgp/message/open/__init__.py b/src/exabgp/bgp/message/open/__init__.py index 27b8e58cd..b08a8e288 100644 --- a/src/exabgp/bgp/message/open/__init__.py +++ b/src/exabgp/bgp/message/open/__init__.py @@ -31,7 +31,7 @@ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # | BGP Identifier | # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -# | Opt Parm Len | +# |Non-Ext OP Len.|Non-Ext OP Type| Extended Opt. Parm. Length | # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # | | # | Optional Parameters (variable) | @@ -40,11 +40,14 @@ # Optional Parameters: -# 0 1 -# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 -# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... -# | Parm. Type | Parm. Length | Parameter Value (variable) -# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... +# 0 1 2 +# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Parm. Type | Parameter Length | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# ~ Parameter Value (variable) ~ +# | | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @Message.register diff --git a/src/exabgp/bgp/message/open/capability/capabilities.py b/src/exabgp/bgp/message/open/capability/capabilities.py index 521617341..013fa3789 100644 --- a/src/exabgp/bgp/message/open/capability/capabilities.py +++ b/src/exabgp/bgp/message/open/capability/capabilities.py @@ -26,6 +26,7 @@ from exabgp.bgp.message.notification import Notify +from struct import pack # =================================================================== Parameter # @@ -183,6 +184,19 @@ def pack(self): encoded = bytes([k, len(capability)]) + capability parameters += bytes([2, len(encoded)]) + encoded + # If this is an extended optional parameters version, re-encode + # the OPEN message. + if len(parameters) >= 255: + parameters = b'' + for k, capabilities in self.items(): + for capability in capabilities.extract(): + if len(capability) == 0: + continue + encoded = bytes([k, len(capability)]) + capability + parameters += pack('!BH', 2, len(encoded)) + encoded + + return pack('!BBH', 255, 255, len(parameters)) + parameters + return bytes([len(parameters)]) + parameters @staticmethod