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:
parent
5e8d871fc9
commit
f4325cfc85
@ -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(
|
||||
|
@ -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
|
||||
|
||||
|
@ -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')
|
||||
|
Loading…
x
Reference in New Issue
Block a user