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
This commit is contained in:
yaowei 2016-02-22 16:22:01 +08:00
parent 5e8d871fc9
commit f4325cfc85
3 changed files with 5 additions and 10 deletions

View File

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

View File

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

View File

@ -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')