summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/lib/packet/bgp.py74
1 files changed, 45 insertions, 29 deletions
diff --git a/ryu/lib/packet/bgp.py b/ryu/lib/packet/bgp.py
index 27277b83..2b8e42c8 100644
--- a/ryu/lib/packet/bgp.py
+++ b/ryu/lib/packet/bgp.py
@@ -23,18 +23,12 @@ RFC 4271 BGP-4
# - RFC 4364 BGP/MPLS IP Virtual Private Networks (VPNs)
import abc
-import six
-import struct
import copy
-import netaddr
+import functools
import numbers
-
-try:
- # Python 3
- from functools import reduce
-except ImportError:
- # Python 2
- pass
+import six
+import socket
+import struct
from ryu.lib.stringify import StringifyMixin
from ryu.lib.packet import afi as addr_family
@@ -44,6 +38,8 @@ from ryu.lib.packet import stream_parser
from ryu.lib import addrconv
from ryu.lib.pack_utils import msg_pack_into
+reduce = six.moves.reduce
+
BGP_MSG_OPEN = 1
BGP_MSG_UPDATE = 2
BGP_MSG_NOTIFICATION = 3
@@ -571,13 +567,17 @@ class OutOfResource(BgpExc):
SUB_CODE = BGP_ERROR_SUB_OUT_OF_RESOURCES
+@functools.total_ordering
class RouteFamily(StringifyMixin):
def __init__(self, afi, safi):
self.afi = afi
self.safi = safi
- def __cmp__(self, other):
- return cmp((other.afi, other.safi), (self.afi, self.safi))
+ def __lt__(self, other):
+ return (self.afi, self.safi) < (other.afi, other.safi)
+
+ def __eq__(self, other):
+ return (self.afi, self.safi) == (other.afi, other.safi)
# Route Family Singleton
RF_IPv4_UC = RouteFamily(addr_family.IP, subaddr_family.UNICAST)
@@ -809,7 +809,8 @@ class _LabelledAddrPrefix(_AddrPrefix):
@classmethod
def _label_from_bin(cls, bin):
- (b1, b2, b3) = struct.unpack_from(cls._LABEL_PACK_STR, six.binary_type(bin))
+ (b1, b2, b3) = struct.unpack_from(cls._LABEL_PACK_STR,
+ six.binary_type(bin))
rest = bin[struct.calcsize(cls._LABEL_PACK_STR):]
return (b1 << 16) | (b2 << 8) | b3, rest
@@ -1014,6 +1015,7 @@ class LabelledVPNIP6AddrPrefix(_LabelledAddrPrefix, _VPNAddrPrefix,
return "%s:%s" % (self.route_dist, self.prefix)
+@functools.total_ordering
class RouteTargetMembershipNLRI(StringifyMixin):
"""Route Target Membership NLRI.
@@ -1083,11 +1085,14 @@ class RouteTargetMembershipNLRI(StringifyMixin):
return True
return False
- def __cmp__(self, other):
- return cmp(
- (self._origin_as, self._route_target),
- (other.origin_as, other.route_target),
- )
+ def __lt__(self, other):
+ return ((self.origin_as, self.route_target) <
+ (other.origin_as, other.route_target))
+
+ def __eq__(self, other):
+ return ((self.origin_as, self.route_target) ==
+ (other.origin_as, other.route_target))
+ return (self.afi, self.safi) == (other.afi, other.safi)
@classmethod
def parser(cls, buf):
@@ -1111,7 +1116,10 @@ class RouteTargetMembershipNLRI(StringifyMixin):
# RT Nlri is 12 octets
return struct.pack('B', (8 * 12)) + rt_nlri
-_addr_class_key = lambda x: (x.afi, x.safi)
+
+def _addr_class_key(route_family):
+ return (route_family.afi, route_family.safi)
+
_ADDR_CLASSES = {
_addr_class_key(RF_IPv4_UC): IPAddrPrefix,
@@ -1144,7 +1152,8 @@ class _OptParam(StringifyMixin, _TypeDisp, _Value):
@classmethod
def parser(cls, buf):
- (type_, length) = struct.unpack_from(cls._PACK_STR, six.binary_type(buf))
+ (type_, length) = struct.unpack_from(cls._PACK_STR,
+ six.binary_type(buf))
rest = buf[struct.calcsize(cls._PACK_STR):]
value = bytes(rest[:length])
rest = rest[length:]
@@ -1267,7 +1276,8 @@ class BGPOptParamCapabilityGracefulRestart(_OptParamCapability):
@classmethod
def parse_cap_value(cls, buf):
- (restart, ) = struct.unpack_from(cls._CAP_PACK_STR, six.binary_type(buf))
+ (restart, ) = struct.unpack_from(cls._CAP_PACK_STR,
+ six.binary_type(buf))
buf = buf[2:]
l = []
while len(buf) >= 4:
@@ -1278,7 +1288,6 @@ class BGPOptParamCapabilityGracefulRestart(_OptParamCapability):
def serialize_cap_value(self):
buf = bytearray()
msg_pack_into(self._CAP_PACK_STR, buf, 0, self.flags << 12 | self.time)
- tuples = self.tuples
i = 0
offset = 2
for i in self.tuples:
@@ -1298,7 +1307,8 @@ class BGPOptParamCapabilityFourOctetAsNumber(_OptParamCapability):
@classmethod
def parse_cap_value(cls, buf):
- (as_number, ) = struct.unpack_from(cls._CAP_PACK_STR, six.binary_type(buf))
+ (as_number, ) = struct.unpack_from(cls._CAP_PACK_STR,
+ six.binary_type(buf))
return {'as_number': as_number}
def serialize_cap_value(self):
@@ -1363,7 +1373,8 @@ class _PathAttribute(StringifyMixin, _TypeDisp, _Value):
@classmethod
def parser(cls, buf):
- (flags, type_) = struct.unpack_from(cls._PACK_STR, six.binary_type(buf))
+ (flags, type_) = struct.unpack_from(cls._PACK_STR,
+ six.binary_type(buf))
rest = buf[struct.calcsize(cls._PACK_STR):]
if (flags & BGP_ATTR_FLAG_EXTENDED_LENGTH) != 0:
len_pack_str = cls._PACK_STR_EXT_LEN
@@ -1578,7 +1589,8 @@ class BGPPathAttributeNextHop(_PathAttribute):
@classmethod
def parse_value(cls, buf):
- (ip_addr,) = struct.unpack_from(cls._VALUE_PACK_STR, six.binary_type(buf))
+ (ip_addr,) = struct.unpack_from(cls._VALUE_PACK_STR,
+ six.binary_type(buf))
return {
'value': addrconv.ipv4.bin_to_text(ip_addr),
}
@@ -2116,7 +2128,8 @@ class BGPPathAttributeMpUnreachNLRI(_PathAttribute):
@classmethod
def parse_value(cls, buf):
- (afi, safi,) = struct.unpack_from(cls._VALUE_PACK_STR, six.binary_type(buf))
+ (afi, safi,) = struct.unpack_from(cls._VALUE_PACK_STR,
+ six.binary_type(buf))
binnlri = buf[struct.calcsize(cls._VALUE_PACK_STR):]
addr_cls = _get_addr_class(afi, safi)
nlri = []
@@ -2260,9 +2273,12 @@ class BGPOpen(BGPMessage):
@classmethod
def parser(cls, buf):
- (version, my_as, hold_time,
- bgp_identifier, opt_param_len) = struct.unpack_from(cls._PACK_STR,
- six.binary_type(buf))
+ (version,
+ my_as,
+ hold_time,
+ bgp_identifier,
+ opt_param_len) = struct.unpack_from(cls._PACK_STR,
+ six.binary_type(buf))
rest = buf[struct.calcsize(cls._PACK_STR):]
binopts = rest[:opt_param_len]
opt_param = []