Feature (contd.): Device Emulation - sort the device list returned by getDeviceList() RPC

This commit is contained in:
Srivats P 2015-11-29 21:18:31 +05:30
parent cad62c1fd7
commit dc28dfefd6
3 changed files with 29 additions and 1 deletions

View File

@ -457,3 +457,18 @@ void Device::sendArpRequest(PacketBuffer *pktBuf)
qPrintable(QHostAddress(srcIp).toString()),
qPrintable(QHostAddress(tgtIp).toString()));
}
bool operator<(const DeviceKey &a1, const DeviceKey &a2)
{
int i = 0;
while (i < a1.size()) {
if (uchar(a1.at(i)) < uchar(a2.at(i)))
return true;
if (uchar(a1.at(i)) > uchar(a2.at(i)))
return false;
i++;
}
return false;
}

View File

@ -29,7 +29,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
class DeviceManager;
class PacketBuffer;
typedef QByteArray DeviceKey;
class DeviceKey: public QByteArray
{
};
class Device
{
@ -80,5 +82,6 @@ private: // data
QHash<quint32, quint64> arpTable;
};
bool operator<(const DeviceKey &a1, const DeviceKey &a2);
#endif

View File

@ -25,6 +25,7 @@ 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
@ -138,7 +139,16 @@ 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) {
OstEmul::Device *dev =
deviceList->AddExtension(OstEmul::port_device);
device->getConfig(dev);