[General] network = inet.networks.tsn.TsnLinearNetwork sim-time-limit = 10s record-eventlog = true description = "Traffic shaping using mixed asynchronous and credit-based shapers" #################### # Flow Configuration # # Traffic class Packet interval Filter data rate Shaper data rate Channel data rate Priority Shaping # Best Effort 200us ~41.12Mbps ~41.68Mbps ~42.68Mbps 0 CBS # Video 400us ~20.56Mbps ~20.84Mbps ~21.34Mbps 4 ATS # # Applicaion packet length: 1000B # Packet length in asynchronous shaper filter (bridging layer 802.1Q ingress filter): 1028B = 1000B (APP) + 8B (UDP) + 20B (IP) # Data rate in asynchronous shaper filter: 1028B * 8 / Packet interval = 41.12Mbps / 20.56Mbps # Data rate in asynchronous shaper queue: 1046B * 8 / Packet interval = 41.84Mbps / 20.92Mbps # Channel packet length: 1054B = 1000B (APP) + 8B (UDP) + 20B (IP) + 14B (ETH MAC) + 4B (ETH FCS) + 8B (ETH PHY) # Channel data rate = (1054B + 12B (IFG) + 1B (cushion)) * 8 / Packet interval = 42.68Mbps / 21.34Mbps #################### # client applications *.client.numApps = 2 *.client.app[*].typename = "UdpSourceApp" *.client.app[0].display-name = "best effort" *.client.app[1].display-name = "video" *.client.app[*].io.destAddress = "server" *.client.app[0].io.destPort = 1000 *.client.app[1].io.destPort = 1001 *.client.app[*].source.packetLength = 1000B# - 54B # 42B = 8B (UDP) + 20B (IP) + 14B (ETH MAC) + 4B (ETH FCS) + 8B (ETH PHY) *.client.app[0].source.productionInterval = replaceUnit(sin(dropUnit(simTime() * 1)) + sin(dropUnit(simTime() * 8)) + 5, "ms") / 25 # ~40Mbps *.client.app[1].source.productionInterval = replaceUnit(sin(dropUnit(simTime() * 2)) + 5, "ms") / 12.5 # ~20Mbps # server applications *.server.numApps = 2 *.server.app[*].typename = "UdpSinkApp" *.server.app[0].display-name = "best effort" *.server.app[1].display-name = "video" *.server.app[0].io.localPort = 1000 *.server.app[1].io.localPort = 1001 # enable outgoing streams *.client.hasOutgoingStreams = true # client stream identification *.client.bridging.streamIdentifier.identifier.mapping = [{stream: "best effort", packetFilter: expr(udp.destPort == 1000)}, {stream: "video", packetFilter: expr(udp.destPort == 1001)}] # client stream encoding *.client.bridging.streamCoder.encoder.mapping = [{stream: "best effort", pcp: 0}, {stream: "video", pcp: 4}] # disable forwarding IEEE 802.1Q C-Tag *.switch.bridging.directionReverser.reverser.excludeEncapsulationProtocols = ["ieee8021qctag"] # switch stream decoding *.switch.bridging.streamCoder.decoder.mapping = [{pcp: 0, stream: "best effort"}, {pcp: 4, stream: "video"}] # enable ingress per-stream filtering *.switch.hasIngressTrafficFiltering = true # per-stream filtering for video stream *.switch.bridging.streamFilter.ingress.numStreams = 1 *.switch.bridging.streamFilter.ingress.classifier.mapping = {video: 0} *.switch.bridging.streamFilter.ingress.*[0].display-name = "video" *.switch.bridging.streamFilter.ingress.meter[0].typename = "EligibilityTimeMeter" *.switch.bridging.streamFilter.ingress.meter[0].committedInformationRate = 20.84Mbps # shaper data rate *.switch.bridging.streamFilter.ingress.meter[0].committedBurstSize = 10kB *.switch.bridging.streamFilter.ingress.meter[0].packetOverheadLength = 18B # 1046-1028 (14 MAC header + 4 FCS) *.switch.bridging.streamFilter.ingress.filter[0].typename = "EligibilityTimeFilter" # enable egress traffic shaping *.switch.hasEgressTrafficShaping = true # traffic classes *.switch.eth[*].macLayer.queue.numTrafficClasses = 2 # credit-based traffic shaping *.switch.eth[*].macLayer.queue.*[0].display-name = "best effort" *.switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[0].typename = "Ieee8021qCreditBasedShaper" *.switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[0].idleSlope = 42.64Mbps # channel data rate # asynchronous traffic shaping *.switch.eth[*].macLayer.queue.*[1].display-name = "video" *.switch.eth[*].macLayer.queue.queue[1].typename = "EligibilityTimeQueue" *.switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[1].typename = "Ieee8021qAsynchronousShaper"