type_desc: Define TypeDisp class for re-usability
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
4a8c7245fa
commit
5e8b6c69f2
@ -42,6 +42,7 @@ from ryu.lib.packet import vxlan
|
|||||||
from ryu.lib.packet import mpls
|
from ryu.lib.packet import mpls
|
||||||
from ryu.lib import addrconv
|
from ryu.lib import addrconv
|
||||||
from ryu.lib import type_desc
|
from ryu.lib import type_desc
|
||||||
|
from ryu.lib.type_desc import TypeDisp
|
||||||
from ryu.lib import ip
|
from ryu.lib import ip
|
||||||
from ryu.lib.pack_utils import msg_pack_into
|
from ryu.lib.pack_utils import msg_pack_into
|
||||||
from ryu.utils import binary_str
|
from ryu.utils import binary_str
|
||||||
@ -192,43 +193,6 @@ class _Value(object):
|
|||||||
return struct.pack(self._VALUE_PACK_STR, *args)
|
return struct.pack(self._VALUE_PACK_STR, *args)
|
||||||
|
|
||||||
|
|
||||||
class _TypeDisp(object):
|
|
||||||
_TYPES = {}
|
|
||||||
_REV_TYPES = None
|
|
||||||
_UNKNOWN_TYPE = None
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def register_unknown_type(cls):
|
|
||||||
def _register_type(subcls):
|
|
||||||
cls._UNKNOWN_TYPE = subcls
|
|
||||||
return subcls
|
|
||||||
return _register_type
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def register_type(cls, type_):
|
|
||||||
cls._TYPES = cls._TYPES.copy()
|
|
||||||
|
|
||||||
def _register_type(subcls):
|
|
||||||
cls._TYPES[type_] = subcls
|
|
||||||
cls._REV_TYPES = None
|
|
||||||
return subcls
|
|
||||||
return _register_type
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _lookup_type(cls, type_):
|
|
||||||
try:
|
|
||||||
return cls._TYPES[type_]
|
|
||||||
except KeyError:
|
|
||||||
return cls._UNKNOWN_TYPE
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _rev_lookup_type(cls, targ_cls):
|
|
||||||
if cls._REV_TYPES is None:
|
|
||||||
rev = dict((v, k) for k, v in cls._TYPES.items())
|
|
||||||
cls._REV_TYPES = rev
|
|
||||||
return cls._REV_TYPES[targ_cls]
|
|
||||||
|
|
||||||
|
|
||||||
class BgpExc(Exception):
|
class BgpExc(Exception):
|
||||||
"""Base bgp exception."""
|
"""Base bgp exception."""
|
||||||
|
|
||||||
@ -629,7 +593,7 @@ def pad(binary, len_):
|
|||||||
return binary + b'\0' * (len_ - len(binary))
|
return binary + b'\0' * (len_ - len(binary))
|
||||||
|
|
||||||
|
|
||||||
class _RouteDistinguisher(StringifyMixin, _TypeDisp, _Value):
|
class _RouteDistinguisher(StringifyMixin, TypeDisp, _Value):
|
||||||
_PACK_STR = '!H'
|
_PACK_STR = '!H'
|
||||||
TWO_OCTET_AS = 0
|
TWO_OCTET_AS = 0
|
||||||
IPV4_ADDRESS = 1
|
IPV4_ADDRESS = 1
|
||||||
@ -1039,7 +1003,7 @@ class LabelledVPNIP6AddrPrefix(_LabelledAddrPrefix, _VPNAddrPrefix,
|
|||||||
return "%s:%s" % (self.route_dist, self.prefix)
|
return "%s:%s" % (self.route_dist, self.prefix)
|
||||||
|
|
||||||
|
|
||||||
class EvpnEsi(StringifyMixin, _TypeDisp, _Value):
|
class EvpnEsi(StringifyMixin, TypeDisp, _Value):
|
||||||
"""
|
"""
|
||||||
Ethernet Segment Identifier
|
Ethernet Segment Identifier
|
||||||
"""
|
"""
|
||||||
@ -1286,7 +1250,7 @@ class EvpnASBasedEsi(EvpnEsi):
|
|||||||
self.local_disc = local_disc
|
self.local_disc = local_disc
|
||||||
|
|
||||||
|
|
||||||
class EvpnNLRI(StringifyMixin, _TypeDisp):
|
class EvpnNLRI(StringifyMixin, TypeDisp):
|
||||||
"""
|
"""
|
||||||
BGP Network Layer Reachability Information (NLRI) for EVPN
|
BGP Network Layer Reachability Information (NLRI) for EVPN
|
||||||
"""
|
"""
|
||||||
@ -2122,7 +2086,7 @@ def _get_addr_class(afi, safi):
|
|||||||
return _BinAddrPrefix
|
return _BinAddrPrefix
|
||||||
|
|
||||||
|
|
||||||
class _OptParam(StringifyMixin, _TypeDisp, _Value):
|
class _OptParam(StringifyMixin, TypeDisp, _Value):
|
||||||
_PACK_STR = '!BB' # type, length
|
_PACK_STR = '!BB' # type, length
|
||||||
|
|
||||||
def __init__(self, type_, value=None, length=None):
|
def __init__(self, type_, value=None, length=None):
|
||||||
@ -2169,7 +2133,7 @@ class BGPOptParamUnknown(_OptParam):
|
|||||||
|
|
||||||
|
|
||||||
@_OptParam.register_type(BGP_OPT_CAPABILITY)
|
@_OptParam.register_type(BGP_OPT_CAPABILITY)
|
||||||
class _OptParamCapability(_OptParam, _TypeDisp):
|
class _OptParamCapability(_OptParam, TypeDisp):
|
||||||
_CAP_HDR_PACK_STR = '!BB'
|
_CAP_HDR_PACK_STR = '!BB'
|
||||||
|
|
||||||
def __init__(self, cap_code=None, cap_value=None, cap_length=None,
|
def __init__(self, cap_code=None, cap_value=None, cap_length=None,
|
||||||
@ -2338,7 +2302,7 @@ class BGPWithdrawnRoute(IPAddrPrefix):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class _PathAttribute(StringifyMixin, _TypeDisp, _Value):
|
class _PathAttribute(StringifyMixin, TypeDisp, _Value):
|
||||||
_PACK_STR = '!BB' # flags, type
|
_PACK_STR = '!BB' # flags, type
|
||||||
_PACK_STR_LEN = '!B' # length
|
_PACK_STR_LEN = '!B' # length
|
||||||
_PACK_STR_EXT_LEN = '!H' # length w/ BGP_ATTR_FLAG_EXTENDED_LENGTH
|
_PACK_STR_EXT_LEN = '!H' # length w/ BGP_ATTR_FLAG_EXTENDED_LENGTH
|
||||||
@ -2898,7 +2862,7 @@ class BGPPathAttributeExtendedCommunities(_PathAttribute):
|
|||||||
return self._community_list(3)
|
return self._community_list(3)
|
||||||
|
|
||||||
|
|
||||||
class _ExtendedCommunity(StringifyMixin, _TypeDisp, _Value):
|
class _ExtendedCommunity(StringifyMixin, TypeDisp, _Value):
|
||||||
_PACK_STR = '!B7s' # type high (+ type low), value
|
_PACK_STR = '!B7s' # type high (+ type low), value
|
||||||
_PACK_STR_SIZE = struct.calcsize(_PACK_STR)
|
_PACK_STR_SIZE = struct.calcsize(_PACK_STR)
|
||||||
_SUBTYPE_PACK_STR = '!B' # subtype
|
_SUBTYPE_PACK_STR = '!B' # subtype
|
||||||
@ -3549,7 +3513,7 @@ class BGPPathAttributePmsiTunnel(_PathAttribute):
|
|||||||
return ins
|
return ins
|
||||||
|
|
||||||
|
|
||||||
class _PmsiTunnelId(StringifyMixin, _TypeDisp):
|
class _PmsiTunnelId(StringifyMixin, TypeDisp):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def parse(cls, tunnel_type, buf):
|
def parse(cls, tunnel_type, buf):
|
||||||
@ -3616,7 +3580,7 @@ class BGPNLRI(IPAddrPrefix):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BGPMessage(packet_base.PacketBase, _TypeDisp):
|
class BGPMessage(packet_base.PacketBase, TypeDisp):
|
||||||
"""Base class for BGP-4 messages.
|
"""Base class for BGP-4 messages.
|
||||||
|
|
||||||
An instance has the following attributes at least.
|
An instance has the following attributes at least.
|
||||||
|
@ -17,13 +17,15 @@
|
|||||||
BGP Monitoring Protocol draft-ietf-grow-bmp-07
|
BGP Monitoring Protocol draft-ietf-grow-bmp-07
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import six
|
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
|
from ryu.lib import addrconv
|
||||||
from ryu.lib.packet import packet_base
|
from ryu.lib.packet import packet_base
|
||||||
from ryu.lib.packet import stream_parser
|
from ryu.lib.packet import stream_parser
|
||||||
from ryu.lib.packet.bgp import BGPMessage
|
from ryu.lib.packet.bgp import BGPMessage
|
||||||
from ryu.lib import addrconv
|
from ryu.lib.type_desc import TypeDisp
|
||||||
|
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
|
|
||||||
@ -66,44 +68,7 @@ BMP_PEER_DOWN_REASON_REMOTE_BGP_NOTIFICATION = 3
|
|||||||
BMP_PEER_DOWN_REASON_REMOTE_NO_NOTIFICATION = 4
|
BMP_PEER_DOWN_REASON_REMOTE_NO_NOTIFICATION = 4
|
||||||
|
|
||||||
|
|
||||||
class _TypeDisp(object):
|
class BMPMessage(packet_base.PacketBase, TypeDisp):
|
||||||
_TYPES = {}
|
|
||||||
_REV_TYPES = None
|
|
||||||
_UNKNOWN_TYPE = None
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def register_unknown_type(cls):
|
|
||||||
def _register_type(subcls):
|
|
||||||
cls._UNKNOWN_TYPE = subcls
|
|
||||||
return subcls
|
|
||||||
return _register_type
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def register_type(cls, type_):
|
|
||||||
cls._TYPES = cls._TYPES.copy()
|
|
||||||
|
|
||||||
def _register_type(subcls):
|
|
||||||
cls._TYPES[type_] = subcls
|
|
||||||
cls._REV_TYPES = None
|
|
||||||
return subcls
|
|
||||||
return _register_type
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _lookup_type(cls, type_):
|
|
||||||
try:
|
|
||||||
return cls._TYPES[type_]
|
|
||||||
except KeyError:
|
|
||||||
return cls._UNKNOWN_TYPE
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _rev_lookup_type(cls, targ_cls):
|
|
||||||
if cls._REV_TYPES is None:
|
|
||||||
rev = dict((v, k) for k, v in cls._TYPES.items())
|
|
||||||
cls._REV_TYPES = rev
|
|
||||||
return cls._REV_TYPES[targ_cls]
|
|
||||||
|
|
||||||
|
|
||||||
class BMPMessage(packet_base.PacketBase, _TypeDisp):
|
|
||||||
"""Base class for BGP Monitoring Protocol messages.
|
"""Base class for BGP Monitoring Protocol messages.
|
||||||
|
|
||||||
An instance has the following attributes at least.
|
An instance has the following attributes at least.
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
RFC 2328 OSPF version 2
|
RFC 2328 OSPF version 2
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import six
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -27,13 +27,17 @@ except ImportError:
|
|||||||
# Python 2
|
# Python 2
|
||||||
pass
|
pass
|
||||||
|
|
||||||
from ryu.lib.stringify import StringifyMixin
|
import six
|
||||||
|
|
||||||
|
from ryu.lib import addrconv
|
||||||
from ryu.lib.packet import packet_base
|
from ryu.lib.packet import packet_base
|
||||||
from ryu.lib.packet import packet_utils
|
from ryu.lib.packet import packet_utils
|
||||||
from ryu.lib.packet import stream_parser
|
from ryu.lib.packet import stream_parser
|
||||||
|
from ryu.lib.stringify import StringifyMixin
|
||||||
|
from ryu.lib import type_desc
|
||||||
|
|
||||||
from ryu.lib import addrconv
|
|
||||||
import logging
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
_VERSION = 2
|
_VERSION = 2
|
||||||
|
|
||||||
@ -88,43 +92,6 @@ class InvalidChecksum(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class _TypeDisp(object):
|
|
||||||
_TYPES = {}
|
|
||||||
_REV_TYPES = None
|
|
||||||
_UNKNOWN_TYPE = None
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def register_unknown_type(cls):
|
|
||||||
def _register_type(subcls):
|
|
||||||
cls._UNKNOWN_TYPE = subcls
|
|
||||||
return subcls
|
|
||||||
return _register_type
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def register_type(cls, type_):
|
|
||||||
cls._TYPES = cls._TYPES.copy()
|
|
||||||
|
|
||||||
def _register_type(subcls):
|
|
||||||
cls._TYPES[type_] = subcls
|
|
||||||
cls._REV_TYPES = None
|
|
||||||
return subcls
|
|
||||||
return _register_type
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _lookup_type(cls, type_):
|
|
||||||
try:
|
|
||||||
return cls._TYPES[type_]
|
|
||||||
except KeyError:
|
|
||||||
return cls._UNKNOWN_TYPE
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _rev_lookup_type(cls, targ_cls):
|
|
||||||
if cls._REV_TYPES is None:
|
|
||||||
rev = dict((v, k) for k, v in cls._TYPES.items())
|
|
||||||
cls._REV_TYPES = rev
|
|
||||||
return cls._REV_TYPES[targ_cls]
|
|
||||||
|
|
||||||
|
|
||||||
class LSAHeader(StringifyMixin):
|
class LSAHeader(StringifyMixin):
|
||||||
_HDR_PACK_STR = '!HBB4s4sIHH'
|
_HDR_PACK_STR = '!HBB4s4sIHH'
|
||||||
_HDR_LEN = struct.calcsize(_HDR_PACK_STR)
|
_HDR_LEN = struct.calcsize(_HDR_PACK_STR)
|
||||||
@ -189,7 +156,7 @@ class LSAHeader(StringifyMixin):
|
|||||||
self.ls_seqnum, self.checksum, self.length))
|
self.ls_seqnum, self.checksum, self.length))
|
||||||
|
|
||||||
|
|
||||||
class LSA(_TypeDisp, StringifyMixin):
|
class LSA(type_desc.TypeDisp, StringifyMixin):
|
||||||
def __init__(self, ls_age=0, options=0, type_=OSPF_UNKNOWN_LSA,
|
def __init__(self, ls_age=0, options=0, type_=OSPF_UNKNOWN_LSA,
|
||||||
id_='0.0.0.0', adv_router='0.0.0.0', ls_seqnum=0,
|
id_='0.0.0.0', adv_router='0.0.0.0', ls_seqnum=0,
|
||||||
checksum=0, length=0, opaque_type=OSPF_OPAQUE_TYPE_UNKNOWN,
|
checksum=0, length=0, opaque_type=OSPF_OPAQUE_TYPE_UNKNOWN,
|
||||||
@ -468,7 +435,7 @@ class NSSAExternalLSA(LSA):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ExtendedPrefixTLV(StringifyMixin, _TypeDisp):
|
class ExtendedPrefixTLV(StringifyMixin, type_desc.TypeDisp):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@ -541,7 +508,7 @@ class PrefixSIDSubTLV(ExtendedPrefixTLV):
|
|||||||
self.algorithm, 0, self.range_size, 0, self.index)
|
self.algorithm, 0, self.range_size, 0, self.index)
|
||||||
|
|
||||||
|
|
||||||
class OpaqueBody(StringifyMixin, _TypeDisp):
|
class OpaqueBody(StringifyMixin, type_desc.TypeDisp):
|
||||||
def __init__(self, tlvs=None):
|
def __init__(self, tlvs=None):
|
||||||
tlvs = tlvs if tlvs else []
|
tlvs = tlvs if tlvs else []
|
||||||
self.tlvs = tlvs
|
self.tlvs = tlvs
|
||||||
@ -639,7 +606,7 @@ class ASOpaqueLSA(OpaqueLSA):
|
|||||||
length, opaque_type, opaque_id)
|
length, opaque_type, opaque_id)
|
||||||
|
|
||||||
|
|
||||||
class OSPFMessage(packet_base.PacketBase, _TypeDisp):
|
class OSPFMessage(packet_base.PacketBase, type_desc.TypeDisp):
|
||||||
"""Base class for OSPF version 2 messages.
|
"""Base class for OSPF version 2 messages.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -122,3 +122,40 @@ class UnknownType(TypeDescr):
|
|||||||
return base64.b64encode(data)
|
return base64.b64encode(data)
|
||||||
|
|
||||||
from_user = staticmethod(base64.b64decode)
|
from_user = staticmethod(base64.b64decode)
|
||||||
|
|
||||||
|
|
||||||
|
class TypeDisp(object):
|
||||||
|
_TYPES = {}
|
||||||
|
_REV_TYPES = None
|
||||||
|
_UNKNOWN_TYPE = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register_unknown_type(cls):
|
||||||
|
def _register_type(subcls):
|
||||||
|
cls._UNKNOWN_TYPE = subcls
|
||||||
|
return subcls
|
||||||
|
return _register_type
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register_type(cls, type_):
|
||||||
|
cls._TYPES = cls._TYPES.copy()
|
||||||
|
|
||||||
|
def _register_type(subcls):
|
||||||
|
cls._TYPES[type_] = subcls
|
||||||
|
cls._REV_TYPES = None
|
||||||
|
return subcls
|
||||||
|
return _register_type
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _lookup_type(cls, type_):
|
||||||
|
try:
|
||||||
|
return cls._TYPES[type_]
|
||||||
|
except KeyError:
|
||||||
|
return cls._UNKNOWN_TYPE
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _rev_lookup_type(cls, targ_cls):
|
||||||
|
if cls._REV_TYPES is None:
|
||||||
|
rev = dict((v, k) for k, v in cls._TYPES.items())
|
||||||
|
cls._REV_TYPES = rev
|
||||||
|
return cls._REV_TYPES[targ_cls]
|
||||||
|
Loading…
Reference in New Issue
Block a user