summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYAMAMOTO Takashi <yamamoto@valinux.co.jp>2013-10-08 15:29:38 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2013-10-08 16:04:16 +0900
commit20f1dab33038351622764054376108e4a97ba617 (patch)
treeb6ff2cf4c3065f5ba5b778fd29cad2c6d71ff87c
parent78495034e166b762b9711c9485936840bc177137 (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.py51
-rw-r--r--ryu/tests/unit/packet/test_bgp.py10
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"),