Signed-off-by: Yuichi Ito <[email protected]>
---
 ryu/lib/packet/sctp.py             |  117 ++++++++++++++++++++++++++++--------
 ryu/tests/unit/packet/test_sctp.py |   72 ++++++++++------------
 2 files changed, 123 insertions(+), 66 deletions(-)

diff --git a/ryu/lib/packet/sctp.py b/ryu/lib/packet/sctp.py
index 8c1a20b..f44f4da 100644
--- a/ryu/lib/packet/sctp.py
+++ b/ryu/lib/packet/sctp.py
@@ -81,6 +81,7 @@ class sctp(packet_base.PacketBase):
     dst_port       Destination Port
     vtag           Verification Tag
     csum           Checksum
+                   (0 means automatically-calculate when encoding)
     chunks         a list of derived classes of ryu.lib.packet.sctp.chunk.
     ============== =====================================================
     """
@@ -97,7 +98,7 @@ class sctp(packet_base.PacketBase):
             return cls
         return _register_chunk_type(args[0])

-    def __init__(self, src_port, dst_port, vtag, csum, chunks=None):
+    def __init__(self, src_port=0, dst_port=0, vtag=0, csum=0, chunks=None):
         super(sctp, self).__init__()
         self.src_port = src_port
         self.dst_port = dst_port
@@ -250,8 +251,8 @@ class chunk_init_base(chunk):
     _PACK_STR = '!BBHIIHHI'
     _MIN_LEN = struct.calcsize(_PACK_STR)

-    def __init__(self, flags, length, init_tag, a_rwnd, os, mis, i_tsn,
-                 params=None):
+    def __init__(self, flags=0, length=0, init_tag=0, a_rwnd=0, os=0,
+                 mis=0, i_tsn=0, params=None):
         super(chunk_init_base, self).__init__(self.chunk_type(), length)
         self.flags = flags
         self.init_tag = init_tag
@@ -289,6 +290,9 @@ class chunk_init_base(chunk):
             self.i_tsn))
         for one in self.params:
             buf.extend(one.serialize())
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
         return str(buf)


@@ -296,11 +300,12 @@ class chunk_heartbeat_base(chunk):

     __metaclass__ = abc.ABCMeta

-    def __init__(self, flags, length, info):
+    def __init__(self, flags=0, length=0, info=None):
         super(chunk_heartbeat_base, self).__init__(
             self.chunk_type(), length)
         self.flags = flags
-        assert isinstance(info, param)
+        if info is not None:
+            assert isinstance(info, param)
         self.info = info

     @classmethod
@@ -316,7 +321,11 @@ class chunk_heartbeat_base(chunk):
         buf = bytearray(struct.pack(
             self._PACK_STR, self.chunk_type(), self.flags,
             self.length))
-        buf.extend(self.info.serialize())
+        if self.info is not None:
+            buf.extend(self.info.serialize())
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
         return str(buf)


@@ -324,7 +333,7 @@ class chunk_ack_base(chunk):

     __metaclass__ = abc.ABCMeta

-    def __init__(self, flags, length):
+    def __init__(self, flags=0, length=0):
         super(chunk_ack_base, self).__init__(self.chunk_type(), length)
         self.flags = flags

@@ -334,6 +343,8 @@ class chunk_ack_base(chunk):
         return cls(flags, length)

     def serialize(self):
+        if 0 == self.length:
+            self.length = self._MIN_LEN
         buf = struct.pack(
             self._PACK_STR, self.chunk_type(), self.flags,
             self.length)
@@ -346,7 +357,7 @@ class chunk_ecn_base(chunk):
     _PACK_STR = '!BBHI'
     _MIN_LEN = struct.calcsize(_PACK_STR)

-    def __init__(self, flags, length, low_tsn):
+    def __init__(self, flags=0, length=0, low_tsn=0):
         super(chunk_ecn_base, self).__init__(self.chunk_type(), length)
         self.flags = flags
         self.low_tsn = low_tsn
@@ -357,6 +368,8 @@ class chunk_ecn_base(chunk):
         return cls(flags, length, low_tsn)

     def serialize(self):
+        if 0 == self.length:
+            self.length = self._MIN_LEN
         buf = struct.pack(
             self._PACK_STR, self.chunk_type(), self.flags, self.length,
             self.low_tsn)
@@ -383,6 +396,7 @@ class chunk_data(chunk):
     begin          if set to '1', this chunk is the first fragment.
     end            if set to '1', this chunk is the last fragment.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     tsn            Transmission Sequence Number.
     sid            stream id.
     seq            the sequence number.
@@ -399,11 +413,12 @@ class chunk_data(chunk):
     def chunk_type(cls):
         return TYPE_DATA

-    def __init__(self, unordered, begin, end, length, tsn, sid, seq,
-                 payload_id, payload_data):
+    def __init__(self, unordered=0, begin=0, end=0, length=0, tsn=0,
+                 sid=0, seq=0, payload_id=0, payload_data=None):
         assert (1 == unordered | 1)
         assert (1 == begin | 1)
         assert (1 == end | 1)
+        assert (payload_data is not None)
         super(chunk_data, self).__init__(self.chunk_type(), length)
         self.unordered = unordered
         self.begin = begin
@@ -435,6 +450,9 @@ class chunk_data(chunk):
             self._PACK_STR, self.chunk_type(), flags, self.length,
             self.tsn, self.sid, self.seq, self.payload_id))
         buf.extend(self.payload_data)
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
         return str(buf)


@@ -456,6 +474,7 @@ class chunk_init(chunk_init_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     init_tag       the tag that be used as Verification Tag.
     a_rwnd         Advertised Receiver Window Credit.
     os             number of outbound streams.
@@ -505,6 +524,7 @@ class chunk_init_ack(chunk_init_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     init_tag       the tag that be used as Verification Tag.
     a_rwnd         Advertised Receiver Window Credit.
     os             number of outbound streams.
@@ -554,6 +574,7 @@ class chunk_sack(chunk):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     tsn_ack        TSN of the last DATA chunk received in sequence
                    before a gap.
     a_rwnd         Advertised Receiver Window Credit.
@@ -577,8 +598,8 @@ class chunk_sack(chunk):
     def chunk_type(cls):
         return TYPE_SACK

-    def __init__(self, flags, length, tsn_ack, a_rwnd, gapack_num,
-                 duptsn_num, gapacks=None, duptsns=None):
+    def __init__(self, flags=0, length=0, tsn_ack=0, a_rwnd=0,
+                 gapack_num=0, duptsn_num=0, gapacks=None, duptsns=None):
         super(chunk_sack, self).__init__(self.chunk_type(), length)
         self.flags = flags
         self.tsn_ack = tsn_ack
@@ -623,6 +644,9 @@ class chunk_sack(chunk):
             buf.extend(struct.pack(chunk_sack._GAPACK_STR, one[0], one[1]))
         for one in self.duptsns:
             buf.extend(struct.pack(chunk_sack._DUPTSN_STR, one))
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
         return str(buf)


@@ -645,6 +669,7 @@ class chunk_heartbeat(chunk_heartbeat_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     info           ryu.lib.packet.sctp.param_heartbeat.
     ============== =====================================================
     """
@@ -687,6 +712,7 @@ class chunk_heartbeat_ack(chunk_heartbeat_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     info           ryu.lib.packet.sctp.param_heartbeat.
     ============== =====================================================
     """
@@ -729,6 +755,7 @@ class chunk_abort(chunk):
     tflag          '0' means the Verification tag is normal. '1' means
                    the Verification tag is copy of the sender.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     causes         a list of derived classes of ryu.lib.packet.sctp.causes.
     ============== =====================================================
     """
@@ -748,7 +775,7 @@ class chunk_abort(chunk):
     def chunk_type(cls):
         return TYPE_ABORT

-    def __init__(self, tflag, length, causes=None):
+    def __init__(self, tflag=0, length=0, causes=None):
         super(chunk_abort, self).__init__(self.chunk_type(), length)
         assert (1 == tflag | 1)
         self.tflag = tflag
@@ -780,6 +807,9 @@ class chunk_abort(chunk):
             self._PACK_STR, self.chunk_type(), flags, self.length))
         for one in self.causes:
             buf.extend(one.serialize())
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
         return str(buf)


@@ -802,6 +832,7 @@ class chunk_shutdown(chunk):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     tsn_ack        TSN of the last DATA chunk received in sequence
                    before a gap.
     ============== =====================================================
@@ -814,7 +845,7 @@ class chunk_shutdown(chunk):
     def chunk_type(cls):
         return TYPE_SHUTDOWN

-    def __init__(self, flags, length, tsn_ack):
+    def __init__(self, flags=0, length=0, tsn_ack=0):
         super(chunk_shutdown, self).__init__(self.chunk_type(), length)
         self.flags = flags
         self.tsn_ack = tsn_ack
@@ -827,6 +858,8 @@ class chunk_shutdown(chunk):
         return msg

     def serialize(self):
+        if 0 == self.length:
+            self.length = self._MIN_LEN
         buf = struct.pack(
             self._PACK_STR, self.chunk_type(), self.flags,
             self.length, self.tsn_ack)
@@ -852,6 +885,7 @@ class chunk_shutdown_ack(chunk_ack_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     ============== =====================================================
     """

@@ -878,6 +912,7 @@ class chunk_error(chunk):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     causes         a list of derived classes of ryu.lib.packet.sctp.causes.
     ============== =====================================================
     """
@@ -897,7 +932,7 @@ class chunk_error(chunk):
     def chunk_type(cls):
         return TYPE_ERROR

-    def __init__(self, flags, length, causes=None):
+    def __init__(self, flags=0, length=0, causes=None):
         super(chunk_error, self).__init__(self.chunk_type(), length)
         self.flags = flags
         causes = causes or []
@@ -926,6 +961,9 @@ class chunk_error(chunk):
             self._PACK_STR, self.chunk_type(), self.flags, self.length))
         for one in self.causes:
             buf.extend(one.serialize())
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
         return str(buf)


@@ -947,6 +985,7 @@ class chunk_cookie_echo(chunk):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     cookie         cookie data.
     ============== =====================================================
     """
@@ -958,7 +997,7 @@ class chunk_cookie_echo(chunk):
     def chunk_type(cls):
         return TYPE_COOKIE_ECHO

-    def __init__(self, flags, length, cookie):
+    def __init__(self, flags=0, length=0, cookie=None):
         super(chunk_cookie_echo, self).__init__(self.chunk_type(), length)
         self.flags = flags
         self.cookie = cookie
@@ -966,15 +1005,25 @@ class chunk_cookie_echo(chunk):
     @classmethod
     def parser(cls, buf):
         (_, flags, length) = struct.unpack_from(cls._PACK_STR, buf)
-        fmt = '%ds' % (length - cls._MIN_LEN)
-        (cookie, ) = struct.unpack_from(fmt, buf, cls._MIN_LEN)
+        _len = length - cls._MIN_LEN
+        cookie = None
+        if _len:
+            fmt = '%ds' % _len
+            (cookie, ) = struct.unpack_from(fmt, buf, cls._MIN_LEN)
         return cls(flags, length, cookie)

     def serialize(self):
         buf = bytearray(struct.pack(
             self._PACK_STR, self.chunk_type(), self.flags,
             self.length))
-        buf.extend(self.cookie)
+        if self.cookie is not None:
+            buf.extend(self.cookie)
+        if 0 == self.length:
+            self.length = len(buf)
+            struct.pack_into('!H', buf, 2, self.length)
+        mod = len(buf) % 4
+        if mod:
+            buf.extend(bytearray(4 - mod))
         return str(buf)


@@ -997,6 +1046,7 @@ class chunk_cookie_ack(chunk_ack_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     ============== =====================================================
     """

@@ -1023,6 +1073,7 @@ class chunk_ecn_echo(chunk_ecn_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     low_tsn        the lowest TSN.
     ============== =====================================================
     """
@@ -1050,6 +1101,7 @@ class chunk_cwr(chunk_ecn_base):
     ============== =====================================================
     flags          set to '0'. this field will be ignored.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     low_tsn        the lowest TSN.
     ============== =====================================================
     """
@@ -1079,6 +1131,7 @@ class chunk_shutdown_complete(chunk):
     tflag          '0' means the Verification tag is normal. '1' means
                    the Verification tag is copy of the sender.
     length         length of this chunk containing this header.
+                   (0 means automatically-calculate when encoding)
     ============== =====================================================
     """

@@ -1089,7 +1142,7 @@ class chunk_shutdown_complete(chunk):
     def chunk_type(cls):
         return TYPE_SHUTDOWN_COMPLETE

-    def __init__(self, tflag, length):
+    def __init__(self, tflag=0, length=0):
         assert (1 == tflag | 1)
         super(chunk_shutdown_complete, self).__init__(
             self.chunk_type(), length)
@@ -1103,6 +1156,8 @@ class chunk_shutdown_complete(chunk):
         return msg

     def serialize(self):
+        if 0 == self.length:
+            self.length = self._MIN_LEN
         buf = struct.pack(
             self._PACK_STR, self.chunk_type(),
             self.tflag, self.length)
@@ -1152,7 +1207,7 @@ class cause_with_value(cause):

     __metaclass__ = abc.ABCMeta

-    def __init__(self, value, length=0):
+    def __init__(self, value=None, length=0):
         super(cause_with_value, self).__init__(length)
         self.value = value

@@ -1168,7 +1223,7 @@ class cause_with_value(cause):
     def serialize(self):
         buf = bytearray(struct.pack(
             self._PACK_STR, self.cause_code(), self.length))
-        if self.value:
+        if self.value is not None:
             buf.extend(self.value)
         if 0 == self.length:
             self.length = len(buf)
@@ -1210,6 +1265,9 @@ class cause_invalid_stream_id(cause_with_value):
     def cause_code(cls):
         return CCODE_INVALID_STREAM_ID

+    def __init__(self, value=0, length=0):
+        super(cause_invalid_stream_id, self).__init__(value, length)
+
     @classmethod
     def parser(cls, buf):
         (_, length, value) = struct.unpack_from(cls._PACK_STR, buf)
@@ -1612,7 +1670,7 @@ class cause_restart_with_new_addr(cause_with_value):
     def cause_code(cls):
         return CCODE_RESTART_WITH_NEW_ADDR

-    def __init__(self, value, length=0):
+    def __init__(self, value=None, length=0):
         if not isinstance(value, list):
             value = [value]
         super(cause_restart_with_new_addr, self).__init__(value, length)
@@ -1720,7 +1778,7 @@ class param(stringify.StringifyMixin):
     def param_type(cls):
         pass

-    def __init__(self, value, length=0):
+    def __init__(self, value=None, length=0):
         self.length = length
         self.value = value

@@ -1866,6 +1924,9 @@ class param_cookie_preserve(param):
     def param_type(cls):
         return PTYPE_COOKIE_PRESERVE

+    def __init__(self, value=0, length=0):
+        super(param_cookie_preserve, self).__init__(value, length)
+
     @classmethod
     def parser(cls, buf):
         (_, length, value) = struct.unpack_from(cls._PACK_STR, buf)
@@ -1973,7 +2034,7 @@ class param_supported_addr(param):
     def param_type(cls):
         return PTYPE_SUPPORTED_ADDR

-    def __init__(self, value, length=0):
+    def __init__(self, value=None, length=0):
         if not isinstance(value, list):
             value = [value]
         for one in value:
@@ -2037,6 +2098,9 @@ class param_ipv4(param):
     def param_type(cls):
         return PTYPE_IPV4

+    def __init__(self, value='127.0.0.1', length=0):
+        super(param_ipv4, self).__init__(value, length)
+
     @classmethod
     def parser(cls, buf):
         (_, length) = struct.unpack_from(cls._PACK_STR, buf)
@@ -2089,6 +2153,9 @@ class param_ipv6(param):
     def param_type(cls):
         return PTYPE_IPV6

+    def __init__(self, value='::1', length=0):
+        super(param_ipv6, self).__init__(value, length)
+
     @classmethod
     def parser(cls, buf):
         (_, length) = struct.unpack_from(cls._PACK_STR, buf)
diff --git a/ryu/tests/unit/packet/test_sctp.py 
b/ryu/tests/unit/packet/test_sctp.py
index 6f6132a..ad50fda 100644
--- a/ryu/tests/unit/packet/test_sctp.py
+++ b/ryu/tests/unit/packet/test_sctp.py
@@ -60,8 +60,8 @@ class Test_sctp(unittest.TestCase):
         self.payload_data = '\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a'

         self.data = sctp.chunk_data(
-            self.unordered, self.begin, self.end, self.length, self.tsn,
-            self.sid, self.seq, self.payload_id, self.payload_data)
+            unordered=self.unordered, begin=self.begin, end=self.end,
+            tsn=self.tsn, sid=self.sid, payload_data=self.payload_data)

         self.chunks = [self.data]

@@ -89,12 +89,13 @@ class Test_sctp(unittest.TestCase):
         self.p_support_type = sctp.param_supported_addr(
             [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, sctp.PTYPE_COOKIE_PRESERVE,
              sctp.PTYPE_ECN, sctp.PTYPE_HOST_ADDR])
+        self.params = [
+            self.p_ipv4, self.p_ipv6, self.p_cookie_preserve,
+            self.p_ecn, self.p_host_addr, self.p_support_type]

         self.init = sctp.chunk_init(
-            self.flags, self.length, self.init_tag, self.a_rwnd,
-            self.os, self.mis, self.i_tsn,
-            [self.p_ipv4, self.p_ipv6, self.p_cookie_preserve,
-             self.p_ecn, self.p_host_addr, self.p_support_type])
+            init_tag=self.init_tag, a_rwnd=self.a_rwnd, os=self.os,
+            mis=self.mis, i_tsn=self.i_tsn, params=self.params)

         self.chunks = [self.init]

@@ -131,12 +132,13 @@ class Test_sctp(unittest.TestCase):
             '\xff\xff\x00\x04')
         self.p_ecn = sctp.param_ecn()
         self.p_host_addr = sctp.param_host_addr('test host\x00')
+        self.params = [
+            self.p_state_cookie, self.p_ipv4, self.p_ipv6,
+            self.p_unrecognized_param, self.p_ecn, self.p_host_addr]

         self.init_ack = sctp.chunk_init_ack(
-            self.flags, self.length, self.init_tag, self.a_rwnd,
-            self.os, self.mis, self.i_tsn,
-            [self.p_state_cookie, self.p_ipv4, self.p_ipv6,
-             self.p_unrecognized_param, self.p_ecn, self.p_host_addr])
+            init_tag=self.init_tag, a_rwnd=self.a_rwnd, os=self.os,
+            mis=self.mis, i_tsn=self.i_tsn, params=self.params)

         self.chunks = [self.init_ack]

@@ -167,8 +169,9 @@ class Test_sctp(unittest.TestCase):
         self.duptsns = [123458, 123466, 123476, 123507, 123518]

         self.sack = sctp.chunk_sack(
-            self.flags, self.length, self.tsn_ack, self.a_rwnd,
-            self.gapack_num, self.duptsn_num, self.gapacks, self.duptsns)
+            tsn_ack=self.tsn_ack, a_rwnd=self.a_rwnd,
+            gapack_num=self.gapack_num, duptsn_num=self.duptsn_num,
+            gapacks=self.gapacks, duptsns=self.duptsns)

         self.chunks = [self.sack]

@@ -189,8 +192,7 @@ class Test_sctp(unittest.TestCase):

         self.p_heartbeat = sctp.param_heartbeat('\x01\x02\x03\x04')

-        self.heartbeat = sctp.chunk_heartbeat(
-            self.flags, self.length, self.p_heartbeat)
+        self.heartbeat = sctp.chunk_heartbeat(info=self.p_heartbeat)

         self.chunks = [self.heartbeat]

@@ -209,8 +211,7 @@ class Test_sctp(unittest.TestCase):
         self.p_heartbeat = sctp.param_heartbeat(
             '\xff\xee\xdd\xcc\xbb\xaa\x99\x88')

-        self.heartbeat_ack = sctp.chunk_heartbeat_ack(
-            self.flags, self.length, self.p_heartbeat)
+        self.heartbeat_ack = sctp.chunk_heartbeat_ack(info=self.p_heartbeat)

         self.chunks = [self.heartbeat_ack]

@@ -258,7 +259,7 @@ class Test_sctp(unittest.TestCase):
             self.c_restart_with_new_addr, self.c_user_initiated_abort,
             self.c_protocol_violation]

-        self.abort = sctp.chunk_abort(self.tflag, self.length, self.causes)
+        self.abort = sctp.chunk_abort(causes=self.causes)

         self.chunks = [self.abort]

@@ -294,8 +295,7 @@ class Test_sctp(unittest.TestCase):
         self.length = 8
         self.tsn_ack = 123456

-        self.shutdown = sctp.chunk_shutdown(
-            self.flags, self.length, self.tsn_ack)
+        self.shutdown = sctp.chunk_shutdown(tsn_ack=self.tsn_ack)

         self.chunks = [self.shutdown]

@@ -309,8 +309,7 @@ class Test_sctp(unittest.TestCase):
         self.flags = 0
         self.length = 4

-        self.shutdown_ack = sctp.chunk_shutdown_ack(
-            self.flags, self.length)
+        self.shutdown_ack = sctp.chunk_shutdown_ack()

         self.chunks = [self.shutdown_ack]

@@ -356,7 +355,7 @@ class Test_sctp(unittest.TestCase):
             self.c_restart_with_new_addr, self.c_user_initiated_abort,
             self.c_protocol_violation]

-        self.error = sctp.chunk_error(self.flags, self.length, self.causes)
+        self.error = sctp.chunk_error(causes=self.causes)

         self.chunks = [self.error]

@@ -392,8 +391,7 @@ class Test_sctp(unittest.TestCase):
         self.length = 8
         self.cookie = '\x12\x34\x56\x78'

-        self.cookie_echo = sctp.chunk_cookie_echo(
-            self.flags, self.length, self.cookie)
+        self.cookie_echo = sctp.chunk_cookie_echo(cookie=self.cookie)

         self.chunks = [self.cookie_echo]

@@ -407,8 +405,7 @@ class Test_sctp(unittest.TestCase):
         self.flags = 0
         self.length = 4

-        self.cookie_ack = sctp.chunk_cookie_ack(
-            self.flags, self.length)
+        self.cookie_ack = sctp.chunk_cookie_ack()

         self.chunks = [self.cookie_ack]

@@ -423,8 +420,7 @@ class Test_sctp(unittest.TestCase):
         self.length = 8
         self.low_tsn = 123456

-        self.ecn_echo = sctp.chunk_ecn_echo(
-            self.flags, self.length, self.low_tsn)
+        self.ecn_echo = sctp.chunk_ecn_echo(low_tsn=self.low_tsn)

         self.chunks = [self.ecn_echo]

@@ -439,8 +435,7 @@ class Test_sctp(unittest.TestCase):
         self.length = 8
         self.low_tsn = 123456

-        self.cwr = sctp.chunk_cwr(
-            self.flags, self.length, self.low_tsn)
+        self.cwr = sctp.chunk_cwr(low_tsn=self.low_tsn)

         self.chunks = [self.cwr]

@@ -454,8 +449,7 @@ class Test_sctp(unittest.TestCase):
         self.tflag = 0
         self.length = 4

-        self.shutdown_complete = sctp.chunk_shutdown_complete(
-            self.tflag, self.length)
+        self.shutdown_complete = sctp.chunk_shutdown_complete()

         self.chunks = [self.shutdown_complete]

@@ -476,9 +470,7 @@ class Test_sctp(unittest.TestCase):
         self.s_duptsns = None

         self.sack = sctp.chunk_sack(
-            self.s_flags, self.s_length, self.s_tsn_ack, self.s_a_rwnd,
-            self.s_gapack_num, self.s_duptsn_num, self.s_gapacks,
-            self.s_duptsns)
+            tsn_ack=self.s_tsn_ack, a_rwnd=self.s_a_rwnd)

         self.d1_unordered = 0
         self.d1_begin = 1
@@ -491,9 +483,8 @@ class Test_sctp(unittest.TestCase):
         self.d1_payload_data = '\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a'

         self.data1 = sctp.chunk_data(
-            self.d1_unordered, self.d1_begin, self.d1_end,
-            self.d1_length, self.d1_tsn, self.d1_sid, self.d1_seq,
-            self.d1_payload_id, self.d1_payload_data)
+            begin=self.d1_begin, tsn=self.d1_tsn, sid=self.d1_sid,
+            payload_data=self.d1_payload_data)

         self.d2_unordered = 0
         self.d2_begin = 0
@@ -506,9 +497,8 @@ class Test_sctp(unittest.TestCase):
         self.d2_payload_data = '\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a'

         self.data2 = sctp.chunk_data(
-            self.d2_unordered, self.d2_begin, self.d2_end,
-            self.d2_length, self.d2_tsn, self.d2_sid, self.d2_seq,
-            self.d2_payload_id, self.d2_payload_data)
+            end=self.d2_end, tsn=self.d2_tsn, sid=self.d2_sid,
+            seq=self.d2_seq, payload_data=self.d2_payload_data)

         self.chunks = [self.sack, self.data1, self.data2]

-- 
1.7.10.4


------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60135991&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to