- 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