- add payload argument to init.
- fix parser and serialize

Signed-off-by: HIYAMA Manabu <[email protected]>
---
 ryu/lib/packet/tcp.py |   16 ++++++++++++----
 ryu/lib/packet/udp.py |   25 ++++++++++++++++++-------
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/ryu/lib/packet/tcp.py b/ryu/lib/packet/tcp.py
index 81c7933..264a8af 100644
--- a/ryu/lib/packet/tcp.py
+++ b/ryu/lib/packet/tcp.py
@@ -25,7 +25,8 @@ class tcp(packet_base.PacketBase):
     _MIN_LEN = struct.calcsize(_PACK_STR)
 
     def __init__(self, src_port, dst_port, seq, ack, offset,
-                 bits, window_size, csum, urgent, option=None):
+                 bits, window_size, csum, urgent, option=None,
+                 payload=bytearray()):
         super(tcp, self).__init__()
         self.src_port = src_port
         self.dst_port = dst_port
@@ -38,6 +39,7 @@ class tcp(packet_base.PacketBase):
         self.urgent = urgent
         self.length = self.offset * 4
         self.option = option
+        self.payload = payload
 
     @classmethod
     def parser(cls, buf):
@@ -51,9 +53,14 @@ class tcp(packet_base.PacketBase):
         if msg.length > tcp._MIN_LEN:
             msg.option = buf[tcp._MIN_LEN:msg.length]
 
+        if len(buf) > msg.length:
+            msg.payload = buf[msg.length:]
+
         return msg, None
 
     def serialize(self, payload, prev):
+        assert len(self.payload) % 2 == 0
+
         h = bytearray(self.length)
         offset = self.offset << 4
         struct.pack_into(tcp._PACK_STR, h, 0, self.src_port, self.dst_port,
@@ -64,10 +71,11 @@ class tcp(packet_base.PacketBase):
             assert (self.length - tcp._MIN_LEN) >= len(self.option)
             h[tcp._MIN_LEN:tcp._MIN_LEN + len(self.option)] = self.option
 
+        h += self.payload
+
         if self.csum == 0:
-            length = self.length + len(payload)
-            ph = struct.pack('!IIBBH', prev.src, prev.dst, 0, 6, length)
-            f = ph + h + payload
+            ph = struct.pack('!IIBBH', prev.src, prev.dst, 0, 6, len(h))
+            f = ph + h
             if len(f) % 2:
                 f += '\x00'
             self.csum = socket.htons(packet_utils.checksum(f))
diff --git a/ryu/lib/packet/udp.py b/ryu/lib/packet/udp.py
index b949b5c..b565ab7 100644
--- a/ryu/lib/packet/udp.py
+++ b/ryu/lib/packet/udp.py
@@ -24,31 +24,42 @@ class udp(packet_base.PacketBase):
     _PACK_STR = '!HHHH'
     _MIN_LEN = struct.calcsize(_PACK_STR)
 
-    def __init__(self, src_port, dst_port, length, csum=0):
+    def __init__(self, src_port, dst_port, length, csum=0,
+                 payload=bytearray()):
         super(udp, self).__init__()
         self.src_port = src_port
         self.dst_port = dst_port
         self.length = length
         self.csum = csum
+        self.payload = payload
 
     @classmethod
     def parser(cls, buf):
         (src_port, dst_port, length, csum) = struct.unpack_from(cls._PACK_STR,
                                                                 buf)
         msg = cls(src_port, dst_port, length, csum)
+
+        if msg.length > udp._MIN_LEN:
+            msg.payload = buf[udp._MIN_LEN:]
+
         return msg, None
 
     def serialize(self, payload, prev):
+        assert len(self.payload) % 2 == 0
+
         if self.length == 0:
-            self.length = udp._MIN_LEN + len(payload)
-        h = struct.pack(udp._PACK_STR, self.src_port, self.dst_port,
-                        self.length, self.csum)
+            self.length = udp._MIN_LEN + len(self.payload)
+
+        h = bytearray(udp._MIN_LEN)
+        struct.pack_into(udp._PACK_STR, h, 0, self.src_port,
+                         self.dst_port, self.length, self.csum)
+        h += self.payload
+
         if self.csum == 0:
             ph = struct.pack('!IIBBH', prev.src, prev.dst, 0, 17, self.length)
-            f = ph + h + payload
+            f = ph + h
             if len(f) % 2:
                 f += '\x00'
             self.csum = socket.htons(packet_utils.checksum(f))
-            h = struct.pack(udp._PACK_STR, self.src_port, self.dst_port,
-                            self.length, self.csum)
+            struct.pack_into('!H', h, 6, self.csum)
         return h
-- 
1.7.9.5



------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to