summaryrefslogtreecommitdiffhomepage
path: root/ryu/services/protocols/bgp/speaker.py
diff options
context:
space:
mode:
Diffstat (limited to 'ryu/services/protocols/bgp/speaker.py')
-rw-r--r--ryu/services/protocols/bgp/speaker.py41
1 files changed, 32 insertions, 9 deletions
diff --git a/ryu/services/protocols/bgp/speaker.py b/ryu/services/protocols/bgp/speaker.py
index 31553b27..9c185daa 100644
--- a/ryu/services/protocols/bgp/speaker.py
+++ b/ryu/services/protocols/bgp/speaker.py
@@ -24,6 +24,7 @@ from socket import IPPROTO_TCP, TCP_NODELAY
from eventlet import semaphore
from ryu.lib.packet import bgp
+from ryu.lib.packet.bgp import AS_TRANS
from ryu.lib.packet.bgp import BGPMessage
from ryu.lib.packet.bgp import BGPOpen
from ryu.lib.packet.bgp import BGPUpdate
@@ -34,6 +35,7 @@ from ryu.lib.packet.bgp import BGP_MSG_UPDATE
from ryu.lib.packet.bgp import BGP_MSG_KEEPALIVE
from ryu.lib.packet.bgp import BGP_MSG_NOTIFICATION
from ryu.lib.packet.bgp import BGP_MSG_ROUTE_REFRESH
+from ryu.lib.packet.bgp import BGP_CAP_FOUR_OCTET_AS_NUMBER
from ryu.lib.packet.bgp import BGP_CAP_ENHANCED_ROUTE_REFRESH
from ryu.lib.packet.bgp import BGP_CAP_MULTIPROTOCOL
from ryu.lib.packet.bgp import BGP_ERROR_HOLD_TIMER_EXPIRED
@@ -49,7 +51,6 @@ from ryu.services.protocols.bgp.constants import BGP_FSM_OPEN_CONFIRM
from ryu.services.protocols.bgp.constants import BGP_FSM_OPEN_SENT
from ryu.services.protocols.bgp.constants import BGP_VERSION_NUM
from ryu.services.protocols.bgp.protocol import Protocol
-from ryu.services.protocols.bgp.utils.validation import is_valid_old_asn
LOG = logging.getLogger('bgpspeaker.speaker')
@@ -99,7 +100,7 @@ class BgpProtocol(Protocol, Activity):
self._remotename,
self._localname))
Activity.__init__(self, name=activity_name)
- # Intialize instance variables.
+ # Initialize instance variables.
self._peer = None
self._recv_buff = b''
self._socket = socket
@@ -120,6 +121,7 @@ class BgpProtocol(Protocol, Activity):
self.sent_open_msg = None
self.recv_open_msg = None
self._is_bound = False
+ self.cap_four_octet_as_number = False
@property
def is_reactive(self):
@@ -247,12 +249,18 @@ class BgpProtocol(Protocol, Activity):
return afs
def is_mbgp_cap_valid(self, route_family):
- """Returns true if both sides of this protocol have advertise
+ """Returns True if both sides of this protocol have advertise
capability for this address family.
"""
return (self.is_route_family_adv(route_family) and
self.is_route_family_adv_recv(route_family))
+ def is_four_octet_as_number_cap_valid(self):
+ """Returns True if both sides of this protocol have Four-Octet
+ AS number capability."""
+ return (self.cap_four_octet_as_number and
+ self._peer.cap_four_octet_as_number)
+
def _run(self, peer):
"""Sends open message to peer and handles received messages.
@@ -405,11 +413,26 @@ class BgpProtocol(Protocol, Activity):
either one of them we have to end session.
"""
assert open_msg.type == BGP_MSG_OPEN
- # Validate remote ASN.
- remote_asnum = open_msg.my_as
- # Since 4byte AS is not yet supported, we validate AS as old style AS.
- if (not is_valid_old_asn(remote_asnum) or
- remote_asnum != self._peer.remote_as):
+
+ opt_param_cap_map = open_msg.opt_param_cap_map
+
+ # Validate remote AS number.
+ remote_as = open_msg.my_as
+ # Try to get AS number from Four-Octet AS number capability.
+ cap4as = opt_param_cap_map.get(BGP_CAP_FOUR_OCTET_AS_NUMBER, None)
+ if cap4as is None:
+ if remote_as == AS_TRANS:
+ # Raise Bad Peer AS error message, if my_as is AS_TRANS
+ # and without Four-Octet AS number capability.
+ raise bgp.BadPeerAs()
+ self.cap_four_octet_as_number = False
+ else:
+ # Note: Even if the peer has Four-Octet AS number capability,
+ # keep the local capability setting
+ remote_as = cap4as.as_number
+ self.cap_four_octet_as_number = True
+ # Validate remote AS number with local setting.
+ if remote_as != self._peer.remote_as:
raise bgp.BadPeerAs()
# Validate bgp version number.
@@ -426,7 +449,7 @@ class BgpProtocol(Protocol, Activity):
LOG.debug('Received msg from %s << %s', self._remotename, msg)
# If we receive open message we try to bind to protocol
- if (msg.type == BGP_MSG_OPEN):
+ if msg.type == BGP_MSG_OPEN:
if self.state == BGP_FSM_OPEN_SENT:
# Validate open message.
self._validate_open_msg(msg)