This patch implements the following messages on FRRouting:
 - FRR_ZEBRA_VRF_ADD
 - FRR_ZEBRA_VRF_DELETE
 - FRR_ZEBRA_INTERFACE_VRF_UPDATE

Signed-off-by: IWASE Yusuke <iwase.yusu...@gmail.com>
---
 ryu/lib/packet/zebra.py | 79 +++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 74 insertions(+), 5 deletions(-)

diff --git a/ryu/lib/packet/zebra.py b/ryu/lib/packet/zebra.py
index 9e46c30..8b84a15 100644
--- a/ryu/lib/packet/zebra.py
+++ b/ryu/lib/packet/zebra.py
@@ -347,6 +347,11 @@ BFD_STATUS_UNKNOWN = 1 << 0
 BFD_STATUS_DOWN = 1 << 1
 BFD_STATUS_UP = 1 << 2
 
+# Constants in frr/lib/vrf.h
+
+# VRF name length
+VRF_NAMSIZ = 36
+
 
 # Utility functions/classes
 
@@ -3012,11 +3017,75 @@ class 
ZebraRedistributeIPv6Delete(_ZebraRedistributeIPv6):
     """
 
 
-# TODO:
-# Implement the following messages:
-#  - FRR_ZEBRA_VRF_ADD
-#  - FRR_ZEBRA_VRF_DELETE
-#  - FRR_ZEBRA_INTERFACE_VRF_UPDATE
+class _ZebraVrf(_ZebraMessageBody):
+    """
+    Base class for FRR_ZEBRA_VRF_ADD and FRR_ZEBRA_VRF_DELETE message body.
+    """
+    # Zebra VRF Add/Delete message body:
+    #  0                   1                   2                   3
+    #  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+    # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    # | VRF Name (VRF_NAMSIZ bytes length)                            |
+    # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    _HEADER_FMT = '!%ds' % VRF_NAMSIZ
+
+    def __init__(self, vrf_name):
+        super(_ZebraVrf, self).__init__()
+        self.vrf_name = vrf_name
+
+    @classmethod
+    def parse(cls, buf, version=_DEFAULT_FRR_VERSION):
+        vrf_name_bin = buf[:VRF_NAMSIZ]
+        vrf_name = str(six.text_type(vrf_name_bin.strip(b'\x00'), 'ascii'))
+
+        return cls(vrf_name)
+
+    def serialize(self, version=_DEFAULT_FRR_VERSION):
+        return struct.pack(self._HEADER_FMT, self.vrf_name.encode('ascii'))
+
+
+@_FrrZebraMessageBody.register_type(FRR_ZEBRA_VRF_ADD)
+class ZebraVrfAdd(_ZebraVrf):
+    """
+    Message body class for FRR_ZEBRA_VRF_ADD.
+    """
+
+
+@_FrrZebraMessageBody.register_type(FRR_ZEBRA_VRF_DELETE)
+class ZebraVrfDelete(_ZebraVrf):
+    """
+    Message body class for FRR_ZEBRA_VRF_DELETE.
+    """
+
+
+@_FrrZebraMessageBody.register_type(FRR_ZEBRA_INTERFACE_VRF_UPDATE)
+class ZebraInterfaceVrfUpdate(_ZebraMessageBody):
+    """
+    Message body class for FRR_ZEBRA_INTERFACE_VRF_UPDATE.
+    """
+    # Zebra Interface VRF Update message body:
+    #  0                   1                   2                   3
+    #  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+    # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    # | Interface Index                                               |
+    # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    # | VRF ID                        |
+    # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    _HEADER_FMT = '!IH'  # ifindex, vrf_id
+
+    def __init__(self, ifindex, vrf_id):
+        super(ZebraInterfaceVrfUpdate, self).__init__()
+        self.ifindex = ifindex
+        self.vrf_id = vrf_id
+
+    @classmethod
+    def parse(cls, buf, version=_DEFAULT_FRR_VERSION):
+        (ifindex, vrf_id) = struct.unpack_from(cls._HEADER_FMT, buf)
+
+        return cls(ifindex, vrf_id)
+
+    def serialize(self, version=_DEFAULT_FRR_VERSION):
+        return struct.pack(self._HEADER_FMT, self.ifindex, self.vrf_id)
 
 
 class _ZebraBfdClient(_ZebraMessageBody):
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to