146 auto entry = check_and_cast<cValueMap *>(
configuration->get(
k).objectValue());
149 cModule *source = sourceNode->
module;
152 cModule *destination = destinationNode->
module;
153 PatternMatcher sourceMatcher(entry->get(
"source").stringValue(),
true,
false,
false);
154 PatternMatcher destinationMatcher(entry->get(
"destination").stringValue(),
true,
false,
false);
155 if (sourceMatcher.matches(sourceNode->module->getFullPath().c_str()) &&
156 destinationMatcher.matches(destinationNode->module->getFullPath().c_str()))
158 int pcp = entry->get(
"pcp").intValue();
159 int gateIndex = entry->get(
"gateIndex").intValue();
160 b packetLength =
b(entry->get(
"packetLength").doubleValueInUnit(
"b"));
161 simtime_t packetInterval = entry->get(
"packetInterval").doubleValueInUnit(
"s");
162 simtime_t maxLatency = entry->containsKey(
"maxLatency") ? entry->get(
"maxLatency").doubleValueInUnit(
"s") : -1;
163 simtime_t maxJitter = entry->containsKey(
"maxJitter") ? entry->get(
"maxJitter").doubleValueInUnit(
"s") : 0;
164 bps datarate = packetLength /
s(packetInterval.dbl());
165 auto startDevice = input.getDevice(source);
166 auto endDevice = input.getDevice(destination);
167 auto startApplication =
new Input::Application();
168 auto startApplicationModule = startDevice->module->getModuleByPath((std::string(
".") + std::string(entry->get(
"application").stringValue())).c_str());
169 if (startApplicationModule ==
nullptr)
170 throw cRuntimeError(
"Cannot find flow start application, path = %s", entry->get(
"application").stringValue());
171 startApplication->module = startApplicationModule;
172 startApplication->device = startDevice;
173 startApplication->pcp = pcp;
174 startApplication->packetLength = packetLength;
175 startApplication->packetInterval = packetInterval;
176 startApplication->maxLatency = maxLatency;
177 startApplication->maxJitter = maxJitter;
178 input.applications.push_back(startApplication);
180 auto flow =
new Input::Flow();
181 flow->name = entry->containsKey(
"name") ? entry->get(
"name").stringValue() : (std::string(
"flow") + std::to_string(flowIndex++)).c_str();
182 flow->gateIndex = gateIndex;
183 flow->startApplication = startApplication;
184 flow->endDevice = endDevice;
185 cValueArray *pathFragments;
186 if (entry->containsKey(
"pathFragments"))
187 pathFragments = check_and_cast<cValueArray *>(entry->get(
"pathFragments").objectValue());
189 auto pathFragment =
new cValueArray();
191 pathFragment->add(node->module->getFullName());
192 pathFragments =
new cValueArray();
193 pathFragments->add(pathFragment);
195 for (
int l = 0; l < pathFragments->size(); l++) {
196 auto path =
new Input::PathFragment();
197 auto pathFragment = check_and_cast<cValueArray *>(pathFragments->get(l).objectValue());
198 for (
int m = 0;
m < pathFragment->size();
m++) {
199 for (
auto networkNode : input.networkNodes) {
200 auto name = pathFragment->get(
m).stdstringValue();
201 int index = name.find(
'.');
202 auto nodeName = index != std::string::npos ? name.substr(0, index) : name;
203 auto interfaceName = index != std::string::npos ? name.substr(index + 1) :
"";
204 if (networkNode->module->getFullName() == nodeName) {
205 if (
m != pathFragment->size() - 1) {
206 auto startNode = networkNode;
207 auto endNodeName = pathFragment->get(
m + 1).stdstringValue();
208 int index = endNodeName.find(
'.');
209 endNodeName = index != std::string::npos ? endNodeName.substr(0, index) : endNodeName;
210 auto outputPort = *std::find_if(startNode->ports.begin(), startNode->ports.end(), [&] (
const auto& port) {
211 return port->endNode->module->getFullName() == endNodeName && (interfaceName ==
"" || interfaceName == check_and_cast<NetworkInterface *>(port->module)->getInterfaceName());
213 path->outputPorts.push_back(outputPort);
214 path->inputPorts.push_back(outputPort->otherPort);
216 path->networkNodes.push_back(networkNode);
221 flow->pathFragments.push_back(path);
223 if (!entry->containsKey(
"pathFragments"))
224 delete pathFragments;
225 input.flows.push_back(flow);
230 std::sort(input.flows.begin(), input.flows.end(), [] (
const Input::Flow *r1,
const Input::Flow *r2) {
231 return r1->startApplication->pcp > r2->startApplication->pcp;