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 <smfadi@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Fadi Moukayed 2015-08-28 12:55:56 +02:00 committed by FUJITA Tomonori
parent 7028704b3f
commit 9bca06c31c

View File

@ -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: