From 9bca06c31c675f1064a45bb4ead16f73424fbaa7 Mon Sep 17 00:00:00 2001 From: Fadi Moukayed Date: Fri, 28 Aug 2015 12:55:56 +0200 Subject: [PATCH] packet/igmp: Python 3: truncate IGMP timer fields to integers before packing This patch adds explicit integer conversions to the IGMP timer fields. This is necessary because Python 3's pack(...) does not automatically coerce floating-point values to integers (Python 3 actually throws a struct.error on struct.pack('B', 1.0)). This fixes IgmpQuerier._send_query and IgmpSnooper._do_query under Python 3, and possibly other functions that pass/assign floats to the `maxresp' attribute. Signed-off-by: Fadi Moukayed Signed-off-by: FUJITA Tomonori --- ryu/lib/packet/igmp.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ryu/lib/packet/igmp.py b/ryu/lib/packet/igmp.py index f1d65b0d..cd8f59c7 100644 --- a/ryu/lib/packet/igmp.py +++ b/ryu/lib/packet/igmp.py @@ -119,6 +119,7 @@ where each Group Record has the following internal format: import six import struct +from math import trunc from ryu.lib import addrconv from ryu.lib import stringify @@ -209,7 +210,7 @@ class igmp(packet_base.PacketBase): def serialize(self, payload, prev): hdr = bytearray(struct.pack(self._PACK_STR, self.msgtype, - self.maxresp, self.csum, + trunc(self.maxresp), self.csum, addrconv.ipv4.text_to_bin(self.address))) if self.csum == 0: @@ -299,9 +300,9 @@ class igmpv3_query(igmp): def serialize(self, payload, prev): s_qrv = self.s_flg << 3 | self.qrv buf = bytearray(struct.pack(self._PACK_STR, self.msgtype, - self.maxresp, self.csum, + trunc(self.maxresp), self.csum, addrconv.ipv4.text_to_bin(self.address), - s_qrv, self.qqic, self.num)) + s_qrv, trunc(self.qqic), self.num)) for src in self.srcs: buf.extend(struct.pack('4s', addrconv.ipv4.text_to_bin(src))) if 0 == self.num: