From f4325cfc85ab8c60e9a995c3fc8d00c102a24268 Mon Sep 17 00:00:00 2001 From: yaowei Date: Mon, 22 Feb 2016 16:22:01 +0800 Subject: [PATCH] Fix pcap driver miss packets issue pcap driver miss some packets when checking dhcp on comp and this problem happened randomly. Change api timeout from thread sleep to pcap original timeout. Change-Id: Ib77ec1258959dba56d637bc5da0a28a8d28287d9 --- steth/agent/api.py | 9 ++------- steth/agent/drivers/pcap_driver.py | 4 ++-- steth/tests/unit/agent/drivers/test_pcap.py | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/steth/agent/api.py b/steth/agent/api.py index 9f9c224..ab9dab4 100644 --- a/steth/agent/api.py +++ b/steth/agent/api.py @@ -14,7 +14,6 @@ # under the License. import re -import time from netaddr import IPNetwork from steth.agent.common import utils as agent_utils from steth.agent.drivers import iperf as iperf_driver @@ -187,6 +186,7 @@ class AgentApi(object): phy_iface, net_type='vlan'): try: pcap = pcap_driver.PcapDriver() + scapy = scapy_driver.ScapyDriver() filter = '(udp and (port 68 or 67) and ether host %s)' % port_mac listeners = pcap.setup_listener_on_comp(port_id, filter) if not cmp(net_type, 'vlan'): @@ -194,18 +194,13 @@ class AgentApi(object): else: # TODO(yaowei) vxlan subinterface raise Exception("network type %s not supported." % net_type) - scapy = scapy_driver.ScapyDriver() scapy.send_dhcp_over_qvb(port_id, port_mac) - # NOTE(yaowei) thread sleep 2 seconds wait for dhcp reply. - time.sleep(2) - map(pcap.set_nonblock, listeners) - pcap.set_nonblock(phy_listener) data = dict() for listener in listeners: vif_pre = listener.name[:constants.VIF_PREFIX_LEN] data[vif_pre] = [] for packet in listener.readpkts(): - data[vif_pre].extend(scapy.get_dhcp_mt(str(packet[1]))) + data[vif_pre].append(scapy.get_dhcp_mt(str(packet[1]))) data[phy_listener.name] = [] for packet in phy_listener.readpkts(): data[phy_listener.name].append( diff --git a/steth/agent/drivers/pcap_driver.py b/steth/agent/drivers/pcap_driver.py index 1b6a620..0afa341 100644 --- a/steth/agent/drivers/pcap_driver.py +++ b/steth/agent/drivers/pcap_driver.py @@ -23,8 +23,8 @@ LOG = log.get_logger() class PcapDriver(object): - def setup_listener(self, iface, filter): - listener = pcap.pcap(iface) + def setup_listener(self, iface, filter, timeout=2): + listener = pcap.pcap(iface, timeout_ms=timeout * 1000) listener.setfilter(filter) return listener diff --git a/steth/tests/unit/agent/drivers/test_pcap.py b/steth/tests/unit/agent/drivers/test_pcap.py index 6624d32..ffb0220 100644 --- a/steth/tests/unit/agent/drivers/test_pcap.py +++ b/steth/tests/unit/agent/drivers/test_pcap.py @@ -31,7 +31,7 @@ class TestPcapDriver(unittest.TestCase): @mock.patch('pcap.pcap') def test_setup_listener(self, pcap): self.pcap_dri.setup_listener(self.iface, self.filter) - pcap.assert_called_with(self.iface) + pcap.assert_called_with(self.iface, timeout_ms=2000) pcap(self.iface).setfilter.assert_called_with(self.filter) @mock.patch('steth.agent.drivers.pcap_driver.PcapDriver.setup_listener')