Device Emulation (contd.): Fixed bug where DeviceNeighborList.device_index did not match the correct device in PortDeviceList

This commit is contained in:
Srivats P 2016-03-15 18:15:35 +05:30
parent 26ceb2f9df
commit 259dafa3e9
3 changed files with 13 additions and 13 deletions

View File

@ -26,7 +26,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "../common/emulproto.pb.h"
#include <QMap>
#include <qendian.h>
#define __STDC_FORMAT_MACROS
@ -162,16 +161,7 @@ int DeviceManager::deviceCount()
void DeviceManager::getDeviceList(
OstProto::PortDeviceList *deviceList)
{
// We want to return a sorted deviceList. However, deviceList_
// is a QHash (unsorted) instead of a QMap (sorted) because
// QHash is faster. So here we use a temporary QMap to sort the
// list that will be returned
QMap<DeviceKey, Device*> list;
foreach(Device *device, deviceList_) {
list.insert(device->key(), device);
}
foreach(Device *device, list) {
foreach(Device *device, sortedDeviceList_) {
OstEmul::Device *dev =
deviceList->AddExtension(OstEmul::port_device);
device->getConfig(dev);
@ -279,7 +269,7 @@ void DeviceManager::getDeviceNeighbors(
{
int count = 0;
foreach(Device *device, deviceList_) {
foreach(Device *device, sortedDeviceList_) {
OstEmul::DeviceNeighborList *neighList =
neighborList->AddExtension(OstEmul::devices);
neighList->set_device_index(count++);
@ -476,6 +466,7 @@ void DeviceManager::enumerateDevices(
device = new Device(this);
*device = dk;
deviceList_.insert(dk.key(), device);
sortedDeviceList_.insert(dk.key(), device);
dk.setMac(kBcastMac);
bcastList_.insert(dk.key(), device);
@ -491,6 +482,7 @@ void DeviceManager::enumerateDevices(
}
qDebug("enumerate(del): %s", qPrintable(device->config()));
delete device;
sortedDeviceList_.take(dk.key()); // already freed above
dk.setMac(kBcastMac);
bcastList_.take(dk.key()); // device already freed above

View File

@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include "device.h"
#include <QHash>
#include <QMap>
#include <QMultiHash>
#include <QtGlobal>
@ -71,7 +72,8 @@ private:
AbstractPort *port_;
QHash<uint, OstProto::DeviceGroup*> deviceGroupList_;
QHash<DeviceKey, Device*> deviceList_;
QHash<DeviceKey, Device*> deviceList_; // fast access to devices
QMap<DeviceKey, Device*> sortedDeviceList_; // sorted access to devices
QMultiHash<DeviceKey, Device*> bcastList_;
QHash<quint16, uint> tpidList_; // Key: TPID, Value: RefCount
};

View File

@ -1166,6 +1166,12 @@ def test_multiEmulDevPerVlan(request, drone, ports, dut, dut_ports,
assert cap_pkts.count('\n') == 1
os.remove('capture.pcap')
#
# TODO
# * Verify that device_index in OstEmul.DeviceNeighborList matches the
# correct device in OstEmul.PortDeviceList
# * Verify ARP/NDP resolution in a bridging topology
#
import pytest
pytest.main(__file__)