diff options
author | YAMAMOTO Takashi <yamamoto@valinux.co.jp> | 2013-10-08 15:29:38 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2013-10-08 16:04:16 +0900 |
commit | 20f1dab33038351622764054376108e4a97ba617 (patch) | |
tree | b6ff2cf4c3065f5ba5b778fd29cad2c6d71ff87c | |
parent | 78495034e166b762b9711c9485936840bc177137 (diff) |
packet.bgp: implement ROUTE REFRESH message
Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/lib/packet/bgp.py | 51 | ||||
-rw-r--r-- | ryu/tests/unit/packet/test_bgp.py | 10 |
2 files changed, 61 insertions, 0 deletions
diff --git a/ryu/lib/packet/bgp.py b/ryu/lib/packet/bgp.py index b1bc2f26..1d9b8e6a 100644 --- a/ryu/lib/packet/bgp.py +++ b/ryu/lib/packet/bgp.py @@ -811,6 +811,57 @@ class BGPNotification(BGPMessage): return msg +@BGPMessage.register_type(BGP_MSG_ROUTE_REFRESH) +class BGPRouteRefresh(BGPMessage): + """BGP-4 ROUTE REFRESH Message (RFC 2918) encoder/decoder class. + + An instance has the following attributes at least. + Most of them are same to the on-wire counterparts but in host byte + order. + __init__ takes the correspondig args in this order. + + ========================== =============================================== + Attribute Description + ========================== =============================================== + marker Marker field. Ignored when encoding. + len Length field. Ignored when encoding. + type Type field. The default is + BGP_MSG_ROUTE_REFRESH. + afi Address Family Identifier + safi Subsequent Address Family Identifier + ========================== =============================================== + """ + + _PACK_STR = '!HBB' + _MIN_LEN = BGPMessage._HDR_LEN + struct.calcsize(_PACK_STR) + + def __init__(self, + afi, safi, reserved=0, + type_=BGP_MSG_ROUTE_REFRESH, len_=None, marker=None): + super(BGPRouteRefresh, self).__init__(marker=marker, len_=len_, + type_=type_) + self.afi = afi + self.safi = safi + self.reserved = reserved + + @classmethod + def parser(cls, buf): + (afi, reserved, safi,) = struct.unpack_from(cls._PACK_STR, + buffer(buf)) + return { + "afi": afi, + "reserved": reserved, + "safi": safi, + } + + def serialize_tail(self): + # fixup + self.reserved = 0 + + return bytearray(struct.pack(self._PACK_STR, self.afi, + self.reserved, self.safi)) + + class StreamParser(stream_parser.StreamParser): """Streaming parser for BGP-4 messages. diff --git a/ryu/tests/unit/packet/test_bgp.py b/ryu/tests/unit/packet/test_bgp.py index 99db218f..889763d3 100644 --- a/ryu/tests/unit/packet/test_bgp.py +++ b/ryu/tests/unit/packet/test_bgp.py @@ -19,6 +19,8 @@ from nose.tools import eq_ from nose.tools import ok_ from ryu.lib.packet import bgp +from ryu.lib.packet import afi +from ryu.lib.packet import safi class Test_bgp(unittest.TestCase): @@ -115,6 +117,14 @@ class Test_bgp(unittest.TestCase): eq_(len(msg), 21 + len(data)) eq_(rest, '') + def test_route_refresh(self): + msg = bgp.BGPRouteRefresh(afi=afi.IP, safi=safi.MPLS_VPN) + binmsg = msg.serialize() + msg2, rest = bgp.BGPMessage.parser(binmsg) + eq_(str(msg), str(msg2)) + eq_(len(msg), 23) + eq_(rest, '') + def test_stream_parser(self): msgs = [ bgp.BGPNotification(error_code=1, error_subcode=2, data="foo"), |