267 auto networkNode = node->module;
268 auto macForwardingTable = networkNode->findModuleByPath(
".macTable");
269 auto ieee8021qTagHeaderChecker = networkNode->findModuleByPath(
".ieee8021q.qTagHeaderChecker");
270 auto streamRelay = networkNode->findModuleByPath(
".bridging.streamRelay");
271 if (streamRelay ==
nullptr)
272 streamRelay = networkNode->findModuleByPath(
".ieee8021r.policy.streamRelay");
273 auto streamIdentifierLayer = networkNode->findModuleByPath(
".bridging.streamIdentifier");
274 if (streamIdentifierLayer ==
nullptr)
275 streamIdentifierLayer = networkNode->findModuleByPath(
".ieee8021r.policy.streamIdentifier");
276 auto streamIdentifier = streamIdentifierLayer !=
nullptr ? streamIdentifierLayer->getSubmodule(
"identifier") : streamIdentifierLayer;
277 auto streamMerger = streamRelay !=
nullptr ? streamRelay->getSubmodule(
"merger") :
nullptr;
278 auto streamSplitter = streamRelay !=
nullptr ? streamRelay->getSubmodule(
"splitter") : streamRelay;
279 auto streamCoder = networkNode->findModuleByPath(
".bridging.streamCoder");
280 if (streamCoder ==
nullptr)
281 streamCoder = networkNode->findModuleByPath(
".ieee8021r.policy.streamCoder");
282 auto streamDecoder = streamCoder !=
nullptr ? streamCoder->getSubmodule(
"decoder") :
nullptr;
283 auto streamEncoder = streamCoder !=
nullptr ? streamCoder->getSubmodule(
"encoder") :
nullptr;
284 if (streamIdentifier !=
nullptr && !node->streamIdentifications.empty()) {
285 cValueArray *parameterValue =
new cValueArray();
286 for (
auto& streamIdentification : node->streamIdentifications) {
287 cValueMap *value =
new cValueMap();
288 value->set(
"packetFilter", streamIdentification.packetFilter);
289 value->set(
"stream", streamIdentification.stream);
290 value->set(
"sequenceNumbering", cValue(
true));
291 parameterValue->add(value);
294 streamIdentifier->par(
"mapping") = parameterValue;
296 if (streamDecoder !=
nullptr && !node->streamDecodings.empty()) {
297 cValueArray *parameterValue =
new cValueArray();
298 for (
auto& streamDecoding : node->streamDecodings) {
299 cValueMap *value =
new cValueMap();
300 value->set(
"interface", streamDecoding.networkInterface->getInterfaceName());
301 value->set(
"vlan", streamDecoding.vlanId);
302 value->set(
"stream", streamDecoding.name.c_str());
303 parameterValue->add(value);
306 streamDecoder->par(
"mapping") = parameterValue;
308 if (streamMerger !=
nullptr && !node->streamMergings.empty()) {
309 cValueMap *parameterValue =
new cValueMap();
310 for (
auto& streamMerging : node->streamMergings) {
311 for (
auto inputStream : streamMerging.inputStreams)
312 parameterValue->set(inputStream.c_str(), streamMerging.outputStream.c_str());
315 streamMerger->par(
"mapping") = parameterValue;
317 if (streamSplitter !=
nullptr && !node->streamSplittings.empty()) {
318 cValueMap *parameterValue =
new cValueMap();
319 for (
auto& streamSplitting : node->streamSplittings) {
320 cValueArray *value =
new cValueArray();
321 for (
auto outputStream : streamSplitting.outputStreams)
322 value->add(outputStream.c_str());
323 parameterValue->set(streamSplitting.inputStream.c_str(), value);
326 streamSplitter->par(
"mapping") = parameterValue;
328 if (streamEncoder !=
nullptr && !node->streamEncodings.empty()) {
329 cValueArray *parameterValue =
new cValueArray();
330 std::map<std::string, std::pair<int, int>> mapping;
331 for (
auto& streamEncoding : node->streamEncodings) {
332 auto it = mapping.find(streamEncoding.name);
333 if (it != mapping.end()) {
334 if (it->second.first != streamEncoding.vlanId)
335 throw cRuntimeError(
"Invalid state");
338 mapping[streamEncoding.name] = {streamEncoding.vlanId, streamEncoding.pcp};
340 for (
auto& it : mapping) {
341 cValueMap *value =
new cValueMap();
342 value->set(
"stream", it.first);
343 value->set(
"vlan", it.second.first);
344 value->set(
"pcp", it.second.second);
345 parameterValue->add(value);
348 streamEncoder->par(
"mapping") = parameterValue;
350 if (macForwardingTable !=
nullptr && !node->streamEncodings.empty()) {
351 cValueArray *parameterValue =
new cValueArray();
352 for (
auto& streamEncoding : node->streamEncodings) {
353 cValueMap *value =
new cValueMap();
354 value->set(
"address", streamEncoding.destination.c_str());
355 value->set(
"vlan", streamEncoding.vlanId);
356 value->set(
"interface", streamEncoding.networkInterface->getInterfaceName());
357 parameterValue->add(value);
360 macForwardingTable->par(
"forwardingTable") = parameterValue;
362 if (ieee8021qTagHeaderChecker !=
nullptr) {
363 std::set<int> vlanIds;
364 for (
auto& streamDecoding : node->streamDecodings)
365 vlanIds.insert(streamDecoding.vlanId);
366 cValueArray *parameterValue =
new cValueArray();
367 for (
int vlanId : vlanIds)
368 parameterValue->add(vlanId);
370 ieee8021qTagHeaderChecker->par(
"vlanIdFilter") = parameterValue;