-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNetworkConfigurator.cpp
More file actions
63 lines (57 loc) · 2.68 KB
/
Copy pathNetworkConfigurator.cpp
File metadata and controls
63 lines (57 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//
// This file is part of the LOTI distribution (https://github.com/levy/loti/).
// Copyright (c) 2018 Levente Mészáros.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#include "inet/networklayer/common/L3AddressResolver.h"
#include "inet/networklayer/ipv4/Ipv4InterfaceData.h"
#include "NetworkConfigurator.h"
namespace loti {
Define_Module(NetworkConfigurator);
void NetworkConfigurator::initialize(int stage)
{
if (stage == INITSTAGE_STATIC_ROUTING) {
cTopology topology;
L3AddressResolver resolver;
topology.extractByProperty("networkNode");
for (int i = 0; i < topology.getNumNodes(); i++) {
auto destinationNode = topology.getNode(i);
auto destinationDaemon = findDaemon(destinationNode->getModule());
networkNodes.push_back(destinationNode->getModule());
topology.calculateUnweightedSingleShortestPathsTo(destinationNode);
for (int j = 0; j < topology.getNumNodes(); j++) {
auto sourceNode = topology.getNode(j);
if (destinationNode == sourceNode)
continue;
if (sourceNode->getNumPaths() == 0)
continue;
auto sourceDaemon = findDaemon(sourceNode->getModule());
auto linkOut = sourceNode->getPath(0);
auto nextHopModule = linkOut->getRemoteNode()->getModule();
auto nextHopDaemon = findDaemon(nextHopModule);
auto nextHopInterfaceTable = resolver.findInterfaceTableOf(nextHopModule);
auto nextHopInterfaceEntry = nextHopInterfaceTable->findInterfaceByNodeInputGateId(linkOut->getRemoteGateId());
auto nextHopIpAddress = nextHopInterfaceEntry->getProtocolData<Ipv4InterfaceData>()->getIPAddress();
sourceDaemon->learnRoute(destinationDaemon->nodeId(), nextHopDaemon->nodeId());
sourceDaemon->addNeighbor(nextHopDaemon->nodeId(), nextHopIpAddress);
}
}
WATCH_VECTOR(networkNodes);
}
}
Daemon *NetworkConfigurator::findDaemon(const cModule *networkNode)
{
return check_and_cast<Daemon *>(networkNode->getSubmodule("app", 0));
}
}