The patch teaches packet library to truncate padding octets. The protocol class that knows its payload length should set its payload length as payload_length > 0 attributes. Then, the packet.parser truncates its payload. If payload_length = 0, do nothing.
Cc: YAMAMOTO Takashi <yamam...@valinux.co.jp> Cc: Shaun Crampton <shaun.cramp...@metaswitch.com> Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> --- Changes v1 -> v2: - typo in ipv4 - s/payload_length_/payload_length/g --- ryu/lib/packet/ipv4.py | 2 ++ ryu/lib/packet/lldp.py | 1 + ryu/lib/packet/packet.py | 4 ++++ ryu/lib/packet/packet_base.py | 1 + ryu/lib/packet/udp.py | 2 ++ 5 files changed, 10 insertions(+) diff --git a/ryu/lib/packet/ipv4.py b/ryu/lib/packet/ipv4.py index 09ed734..823c480 100644 --- a/ryu/lib/packet/ipv4.py +++ b/ryu/lib/packet/ipv4.py @@ -83,6 +83,8 @@ class ipv4(packet_base.PacketBase): self.length = header_length * 4 self.option = option + self.payload_length = total_length + @classmethod def parser(cls, buf): (version, tos, total_length, identification, flags, ttl, proto, csum, diff --git a/ryu/lib/packet/lldp.py b/ryu/lib/packet/lldp.py index f343359..b4fc931 100644 --- a/ryu/lib/packet/lldp.py +++ b/ryu/lib/packet/lldp.py @@ -116,6 +116,7 @@ class lldp(packet_base.PacketBase): length += LLDP_TLV_SIZE + tlv.len self.length = length + self.payload_length = length # at least it must have chassis id, port id, ttl and end def _tlvs_len_valid(self): diff --git a/ryu/lib/packet/packet.py b/ryu/lib/packet/packet.py index f5fd82d..da1077b 100644 --- a/ryu/lib/packet/packet.py +++ b/ryu/lib/packet/packet.py @@ -46,6 +46,10 @@ class Packet(object): if proto: self.parsed_bytes += proto.length self.protocols.append(proto) + if proto.payload_length > 0: + truncation_length = (self.parsed_bytes + + proto.payload_length) + self.data = self.data[:truncation_length] if len(self.data) > self.parsed_bytes: self.protocols.append(self.data[self.parsed_bytes:]) diff --git a/ryu/lib/packet/packet_base.py b/ryu/lib/packet/packet_base.py index b0aeca0..33b5984 100644 --- a/ryu/lib/packet/packet_base.py +++ b/ryu/lib/packet/packet_base.py @@ -37,6 +37,7 @@ class PacketBase(object): def __init__(self): super(PacketBase, self).__init__() self.length = 0 + self.payload_length = 0 self.protocol_name = self.__class__.__name__ @classmethod diff --git a/ryu/lib/packet/udp.py b/ryu/lib/packet/udp.py index c1bb10c..7084697 100644 --- a/ryu/lib/packet/udp.py +++ b/ryu/lib/packet/udp.py @@ -49,6 +49,8 @@ class udp(packet_base.PacketBase): self.csum = csum self.length = udp._MIN_LEN + self.payload_length = total_length + @classmethod def parser(cls, buf): (src_port, dst_port, total_length, csum) = struct.unpack_from( -- 1.7.10.4 ------------------------------------------------------------------------------ How ServiceNow helps IT people transform IT departments: 1. A cloud service to automate IT design, transition and operations 2. Dashboards that offer high-level views of enterprise services 3. A single system of record for all IT processes http://p.sf.net/sfu/servicenow-d2d-j _______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel