In-vehicle Network¶
Goals¶
In this example we demonstrate the combined features of Time-Sensitive Networking in a complex in-vehicle network. The network utilizes time-aware shaping, automatic gate scheduling, clock drift, time synchronization, credit-based shaping, per-stream filtering and policying, stream redundancy, unicast and multicast streams, link failure protection, frame preemption, and cut-through switching.
4.4
The Model¶
In this showcase we model the communication network inside a vehicle. The network consists of several Ethernet switches connected in a redundant way and multiple end devices. There are several data flows between the end device applications.
Here is the network:
Here is the configuration:
[General]
network = InVehicleNetworkShowcase
sim-time-limit = 10ms
#abstract-config = true (requires omnet 7)
description = "Ethernet Time-Sensitive Networking (TSN) example with time synchronization, clock drift, time-aware shaping, Z3 SAT based gate scheduling, credit-based shaping, per-stream filtering and policying, stream redundancy, unicast and multicast streams, link failure protection, frame preemption, cut-through switching, etc."
########################
# Scenario Configuration
# optional broken component
*.brokenComponent = ${brokenComponent = "none", "link", "wheel", "camera"}
*.frontSwitch.ethg$o[3].channel.disabled = ${brokenComponent} == "link"
*.frontLeftSwitch.ethg$o[0].channel.disabled = ${brokenComponent} == "link"
*.frontLeftWheel.app[0].source.productionInterval = ${brokenComponent} == "wheel" ? 10us : 500us
*.frontLeftCamera.app[0].source.productionInterval = ${brokenComponent} == "camera" ? 10us : 125us
###########################
# Application Configuration
# CONTENT CLASS PCP RATE TYPE PROTECTION SOURCE DESTINATION VISUALIZATION
# telemetry CDT 6 2.8Mbps unicast 1 link steering engineActuator red
# telemetry CDT 6 2.8Mbps unicast 1 link frontLeftWheel engineActuator red
# telemetry CDT 6 2.8Mbps unicast 1 link frontRightWheel engineActuator red
# telemetry CDT 6 2.8Mbps unicast 1 link reartLeftWheel engineActuator red
# telemetry CDT 6 2.8Mbps unicast 1 link rearRightWheel engineActuator red
# telemetry ClassA 5 10.4Mbps unicast none lidar hud blue
# video ClassA 5 20.8Mbps multicast none frontLeftCamera obu and hud blue
# video ClassA 5 20.8Mbps multicast none frontRightCamera obu and hud blue
# video ClassA 5 20.8Mbps multicast none rearLeftCamera obu and hud blue
# video ClassA 5 20.8Mbps multicast none rearRightCamera obu and hud blue
# navigation ClassB 4 20.8Mbps unicast none hud rearDisplay green
# entertainment ClassB 4 10.4Mbps unicast none obu rearDisplay green
# navigation BestEffort 0 20.8Mbps unicast none obu hud gray
# disable local multicast loop
**.udp.defaultMulticastLoop = false
# steering application
*.steering.numApps = 1
*.steering.app[0].typename = "UdpSourceApp"
*.steering.app[0].source.packetNameFormat = "%M->engineActuator:CDT-%c"
*.steering.app[0].source.packetLength = 175B
*.steering.app[0].source.productionInterval = 500us # ~2.8Mbps
*.steering.app[0].io.destAddress = "engineActuator"
*.steering.app[0].io.destPort = 1000
# wheel applications
*.*Wheel.numApps = 1
*.*Wheel.app[0].typename = "UdpSourceApp"
*.*Wheel.app[0].source.packetNameFormat = "%M->engineActuator:CDT-%c"
*.*Wheel.app[0].source.packetLength = 175B
*.*Wheel.app[0].source.productionInterval = 500us # ~2.8Mbps
*.*Wheel.app[0].io.destAddress = "engineActuator"
*.frontLeftWheel.app[0].io.destPort = 1001
*.frontRightWheel.app[0].io.destPort = 1002
*.rearLeftWheel.app[0].io.destPort = 1003
*.rearRightWheel.app[0].io.destPort = 1004
# lidar application
*.lidar.numApps = 1
*.lidar.app[0].typename = "UdpSourceApp"
*.lidar.app[0].source.packetNameFormat = "%M->hud:ClassA-%c"
*.lidar.app[0].source.packetLength = 325B
*.lidar.app[0].source.productionInterval = 250us # ~10.4Mbps
*.lidar.app[0].io.destAddress = "hud"
*.lidar.app[0].io.destPort = 1000
# camera applications
*.*Camera.numApps = 1
*.*Camera.app[0].typename = "UdpSourceApp"
*.*Camera.app[0].source.packetNameFormat = "%M->hud+obu:ClassA-%c"
*.*Camera.app[0].source.packetLength = 325B
*.*Camera.app[0].source.productionInterval = 125us # ~20.8Mbps
*.*Camera.app[0].io.destAddress = "224.0.0.42" # obu and hud
*.frontLeftCamera.app[0].io.destPort = 1001
*.frontRightCamera.app[0].io.destPort = 1002
*.rearLeftCamera.app[0].io.destPort = 1003
*.rearRightCamera.app[0].io.destPort = 1004
# obu applications
*.obu.numApps = 6
*.obu.app[0].typename = "UdpSourceApp"
*.obu.app[0].display-name = "entertainment"
*.obu.app[0].source.packetNameFormat = "%M->rearDisplay:ClassB-%c"
*.obu.app[0].source.packetLength = 325B
*.obu.app[0].source.productionInterval = 250us # ~10.4Mbps
*.obu.app[0].io.destAddress = "rearDisplay"
*.obu.app[0].io.destPort = 1000
*.obu.app[1].typename = "UdpSourceApp"
*.obu.app[1].display-name = "navigation"
*.obu.app[1].source.packetNameFormat = "%M->hud:BestEffort-%c"
*.obu.app[1].source.packetLength = 325B
*.obu.app[1].source.productionInterval = 125us # ~20.8Mbps
*.obu.app[1].io.destAddress = "hud"
*.obu.app[1].io.destPort = 1005
*.obu.app[2].display-name = "front left camera"
*.obu.app[3].display-name = "front right camera"
*.obu.app[4].display-name = "rear left camera"
*.obu.app[5].display-name = "rear right camera"
*.obu.app[2..5].typename = "UdpSinkApp"
*.obu.app[2..5].io.multicastAddresses = ["224.0.0.42"]
*.obu.app[2].io.localPort = 1001
*.obu.app[3].io.localPort = 1002
*.obu.app[4].io.localPort = 1003
*.obu.app[5].io.localPort = 1004
# rear display applications
*.rearDisplay.numApps = 2
*.rearDisplay.app[*].typename = "UdpSinkApp"
*.rearDisplay.app[0].display-name = "entertainment"
*.rearDisplay.app[1].display-name = "navigation"
*.rearDisplay.app[0].io.localPort = 1000
*.rearDisplay.app[1].io.localPort = 1001
# engine actuator applications
*.engineActuator.numApps = 5
*.engineActuator.app[*].typename = "UdpSinkApp"
*.engineActuator.app[0].display-name = "steering"
*.engineActuator.app[1].display-name = "front left wheel"
*.engineActuator.app[2].display-name = "front right wheel"
*.engineActuator.app[3].display-name = "rear left wheel"
*.engineActuator.app[4].display-name = "rear right wheel"
*.engineActuator.app[0].io.localPort = 1000
*.engineActuator.app[1].io.localPort = 1001
*.engineActuator.app[2].io.localPort = 1002
*.engineActuator.app[3].io.localPort = 1003
*.engineActuator.app[4].io.localPort = 1004
# hud applications
*.hud.numApps = 7
*.hud.app[0].typename = "UdpSourceApp"
*.hud.app[0].display-name = "navigation"
*.hud.app[0].source.packetNameFormat = "%M->rearDisplay:ClassB-%c"
*.hud.app[0].source.packetLength = 325B
*.hud.app[0].source.productionInterval = 250us # ~20.8Mbps
*.hud.app[0].io.destAddress = "rearDisplay"
*.hud.app[0].io.destPort = 1001
*.hud.app[1].display-name = "lidar"
*.hud.app[2].display-name = "front left camera"
*.hud.app[3].display-name = "front right camera"
*.hud.app[4].display-name = "rear left camera"
*.hud.app[5].display-name = "rear right camera"
*.hud.app[6].display-name = "navigation"
*.hud.app[1..6].typename = "UdpSinkApp"
*.hud.app[2..5].io.multicastAddresses = ["224.0.0.42"]
*.hud.app[1].io.localPort = 1000
*.hud.app[2].io.localPort = 1001
*.hud.app[3].io.localPort = 1002
*.hud.app[4].io.localPort = 1003
*.hud.app[5].io.localPort = 1004
*.hud.app[6].io.localPort = 1005
###############################
# Common Ethernet Configuration
# Ethernet links between switches are 1Gbps
*.frontSwitch.eth[0..4].bitrate = 1Gbps
*.frontLeftSwitch.eth[0..1].bitrate = 1Gbps
*.frontRightSwitch.eth[0..1].bitrate = 1Gbps
*.rearSwitch.eth[0..4].bitrate = 1Gbps
*.rearLeftSwitch.eth[0..1].bitrate = 1Gbps
*.rearRightSwitch.eth[0..1].bitrate = 1Gbps
*.hud.eth[0].bitrate = 1Gbps
*.obu.eth[0].bitrate = 1Gbps
# other Ethernet links are 100Mbps
*.*.eth[*].bitrate = 100Mbps
##########################
# Visualizer Configuration
# enable multiple canvas visualizers
*.visualizer.typename = "IntegratedMultiCanvasVisualizer"
# data link activity visualization for multicast packets
*.visualizer.dataLinkVisualizer[0].displayLinks = true
*.visualizer.dataLinkVisualizer[0].activityLevel = "protocol"
*.visualizer.dataLinkVisualizer[0].packetFilter = "*Camera*"
*.visualizer.dataLinkVisualizer[0].lineColor = "blue4"
*.visualizer.dataLinkVisualizer[0].labelColor = "blue4"
# network route activity visualization
*.visualizer.numNetworkRouteVisualizers = 4
*.visualizer.networkRouteVisualizer[*].displayRoutes = true
*.visualizer.networkRouteVisualizer[0].packetFilter = "*steering* or *Wheel*"
*.visualizer.networkRouteVisualizer[0].lineColor = "red4"
*.visualizer.networkRouteVisualizer[1].packetFilter = "*lidar*"
*.visualizer.networkRouteVisualizer[1].lineColor = "blue4"
*.visualizer.networkRouteVisualizer[2].packetFilter = "*rearDisplay*"
*.visualizer.networkRouteVisualizer[2].lineColor = "green4"
*.visualizer.networkRouteVisualizer[3].packetFilter = "*obu->hud*"
*.visualizer.networkRouteVisualizer[3].lineColor = "gray"
[Config StandardEthernet]
description = "Using only standard Ethernet features"
#################################
# Network Node Type Configuration
# use standard Ethernet switches
*.*Switch.typename = "EthernetSwitch"
# use standard Ethernet devices
*.steering.typename = "StandardHost"
*.*Wheel.typename = "StandardHost"
*.lidar.typename = "StandardHost"
*.*Camera.typename = "StandardHost"
*.obu.typename = "StandardHost"
*.rearDisplay.typename = "StandardHost"
*.engineActuator.typename = "StandardHost"
*.hud.typename = "StandardHost"
# disable master clock
*.masterClock.typename = ""
[Config TimeSensitiveNetworkingBase]
#abstract-config = true (requires omnet 7)
description = "Using Time-Sensitive Networking features"
#################################
# Network Node Type Configuration
# use TSN switches
*.*Switch.typename = "TsnSwitch"
# use TSN devices
*.steering.typename = "TsnDevice"
*.*Wheel.typename = "TsnDevice"
*.lidar.typename = "TsnDevice"
*.*Camera.typename = "TsnDevice"
*.obu.typename = "TsnDevice"
*.rearDisplay.typename = "TsnDevice"
*.engineActuator.typename = "TsnDevice"
*.hud.typename = "TsnDevice"
# use TSN clock
*.masterClock.typename = "TsnClock"
#####################
# Clock Configuration
# clocks have a random constant drift in all network nodes
*.*.clock.oscillator.driftRate = uniform(-100ppm, 100ppm)
# application traffic sources use the local clock of the network node
*.*.app[*].source.clockModule = "^.^.clock"
# periodic gates in all traffic shapers use the local clock of the network node
*.*.eth[*].macLayer.queue.transmissionGate[*].clockModule = "^.^.^.^.clock"
####################################
# Time Synchronization Configuration
# enable time synchronization in all network nodes
*.*.hasTimeSynchronization = true
# time synchronization starts from the master clock
*.masterClock.gptp.masterPorts = ["eth0"]
# all Ethernet switches act as a gPTP bridge
*.frontSwitch.gptp.slavePort = "eth8"
*.frontSwitch.gptp.masterPorts = ["eth0", "eth1", "eth2", "eth3", "eth4", "eth5", "eth6", "eth7"]
*.frontLeftSwitch.gptp.masterPorts = ["eth2", "eth3"]
*.frontRightSwitch.gptp.masterPorts = ["eth2", "eth3"]
*.rearSwitch.gptp.masterPorts = ["eth2", "eth3", "eth4", "eth5"]
*.rearLeftSwitch.gptp.masterPorts = ["eth2", "eth3"]
*.rearRightSwitch.gptp.masterPorts = ["eth2", "eth3"]
#############################
# Stream Coding Configuration
# enable outgoing TSN streams
*.*.hasOutgoingStreams = true
###############################
# Traffic Shaping Configuration
# enable egress traffic shaping
*.*Switch.hasEgressTrafficShaping = true
####################################
# Per-stream Filtering Configuration
# enable per-stream filtering
*.*Switch.hasIngressTrafficFiltering = true
#####################################
# Cut-through Switching Configuration
# enable cut-through switching
#*.frontSwitch.hasCutthroughSwitching = true
#*.frontSwitch.hasCutthroughSwitching = true
#*.frontSwitch.eth[0].typename = "LayeredEthernetInterface"
#*.frontSwitch.eth[0].phyLayer.typename = "EthernetStreamingPhyLayer"
##################################
# Frame Preemption Configuration
# enable frame preemption
#*.*Switch.hasFramePreemption = true
#*.*Switch.eth[*].macLayer.typename = "EthernetPreemptingMacLayer"
#*.*Switch.eth[*].phyLayer.typename = "EthernetPreemptingPhyLayer"
##########################
# Visualizer Configuration
# enable multiple canvas visualizers
*.visualizer.typename = "IntegratedMultiCanvasVisualizer"
# display time synchronization packets
*.visualizer.numDataLinkVisualizers = 2
*.visualizer.dataLinkVisualizer[1].displayLinks = true
*.visualizer.dataLinkVisualizer[1].activityLevel = "protocol"
*.visualizer.dataLinkVisualizer[1].packetFilter = "*Gptp*"
*.visualizer.dataLinkVisualizer[1].lineColor = "black"
*.visualizer.dataLinkVisualizer[1].labelColor = "black"
[Config ManualTsn]
description = "Using manual Time-Sensitive Networking configuration"
extends = TimeSensitiveNetworkingBase
#############################
# Stream Coding Configuration
# steering stream identification and coding
*.steering.bridging.streamIdentifier.identifier.mapping = [{stream: "steering", packetFilter: expr(has(udp))}]
*.steering.bridging.streamCoder.encoder.mapping = [{stream: "steering", pcp: 6}]
# wheel stream identification and coding
*.*Wheel.bridging.streamIdentifier.identifier.mapping = [{stream: "wheel", packetFilter: expr(has(udp))}]
*.*Wheel.bridging.streamCoder.encoder.mapping = [{stream: "wheel", pcp: 6}]
# lidar stream identification and coding
*.lidar.bridging.streamIdentifier.identifier.mapping = [{stream: "lidar", packetFilter: expr(has(udp))}]
*.lidar.bridging.streamCoder.encoder.mapping = [{stream: "lidar", pcp: 5}]
# camera stream identification and coding
*.*Camera.bridging.streamIdentifier.identifier.mapping = [{stream: "camera", packetFilter: expr(has(udp))}]
*.*Camera.bridging.streamCoder.encoder.mapping = [{stream: "camera", pcp: 5}]
# TODO add streams from obu and hud
*.*Switch.bridging.streamCoder.decoder.mapping = [{source: "steering", pcp: 6, stream: "steering"},
{source: "frontLeftWheel", pcp: 6, stream: "front left wheel"},
{source: "frontRightWheel", pcp: 6, stream: "front right wheel"},
{source: "rearLeftWheel", pcp: 6, stream: "rear left wheel"},
{source: "rearRightWheel", pcp: 6, stream: "rear right wheel"},
{source: "lidar", pcp: 5, stream: "lidar"},
{source: "frontLeftCamera", pcp: 5, stream: "front left camera"},
{source: "frontRightCamera", pcp: 5, stream: "front right camera"},
{source: "rearLeftCamera", pcp: 5, stream: "rear left camera"},
{source: "rearRightCamera", pcp: 5, stream: "rear right camera"}]
*.*Switch.bridging.streamCoder.encoder.mapping = [{stream: "steering", pcp: 6},
{stream: "front left wheel", pcp: 6},
{stream: "front right wheel", pcp: 6},
{stream: "rear left wheel", pcp: 6},
{stream: "rear right wheel", pcp: 6},
{stream: "lidar", pcp: 5},
{stream: "front left camera", pcp: 5},
{stream: "front right camera", pcp: 5},
{stream: "rear left camera", pcp: 5},
{stream: "rear right camera", pcp: 5}]
####################################
# Per-stream Filtering Configuration
*.*Switch.bridging.streamFilter.ingress.numStreams = 10
*.*Switch.bridging.streamFilter.ingress.classifier.mapping = {"steering": 0,
"front left wheel": 1,
"front right wheel": 2,
"rear left wheel": 3,
"rear right wheel": 4,
"lidar": 5,
"front left camera": 6,
"front right camera": 7,
"rear left camera": 8,
"rear right camera": 9}
*.*Switch.bridging.streamFilter.ingress.meter[*].typename = "SingleRateTwoColorMeter"
*.*Switch.bridging.streamFilter.ingress.meter[0].display-name = "steering"
*.*Switch.bridging.streamFilter.ingress.meter[1].display-name = "front left wheel"
*.*Switch.bridging.streamFilter.ingress.meter[2].display-name = "front right wheel"
*.*Switch.bridging.streamFilter.ingress.meter[3].display-name = "rear left wheel"
*.*Switch.bridging.streamFilter.ingress.meter[4].display-name = "rear right wheel"
*.*Switch.bridging.streamFilter.ingress.meter[5].display-name = "lidar"
*.*Switch.bridging.streamFilter.ingress.meter[6].display-name = "front left camera"
*.*Switch.bridging.streamFilter.ingress.meter[7].display-name = "front right camera"
*.*Switch.bridging.streamFilter.ingress.meter[8].display-name = "rear left camera"
*.*Switch.bridging.streamFilter.ingress.meter[9].display-name = "rear right camera"
*.*Switch.bridging.streamFilter.ingress.meter[0..4].committedInformationRate = 2.8Mbps
*.*Switch.bridging.streamFilter.ingress.meter[0..4].committedBurstSize = 10kB
*.*Switch.bridging.streamFilter.ingress.meter[5].committedInformationRate = 10.4Mbps
*.*Switch.bridging.streamFilter.ingress.meter[5].committedBurstSize = 40kB
*.*Switch.bridging.streamFilter.ingress.meter[6..9].committedInformationRate = 20.8Mbps
*.*Switch.bridging.streamFilter.ingress.meter[6..9].committedBurstSize = 80kB
###############################
# Traffic Shaping Configuration
# credit based shaper for AVB classes
*.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[4..6].typename = "Ieee8021qCreditBasedShaper"
# TODO higher data rates for 1Gbps links
# TODO how do we calculate the data rate limits?
*.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[4].idleSlope = 40Mbps
*.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[5].idleSlope = 40Mbps
*.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[6].idleSlope = 10Mbps
#################################
# Frame Replication Configuration
# enabled stream redundancy
*.*.hasStreamRedundancy = true
[Config AutomaticTsn]
description = "Using automatic Time-Sensitive Networking configuration"
extends = TimeSensitiveNetworkingBase
#################################
# Frame Replication Configuration
# enabled stream redundancy
*.*.hasStreamRedundancy = true
# gate scheduling
*.gateScheduleConfigurator.typename = "AlwaysOpenGateScheduleConfigurator"
*.gateScheduleConfigurator.gateCycleDuration = 500us
# stream redundancy configurator
*.streamRedundancyConfigurator.typename = "StreamRedundancyConfigurator"
# TSN configuration
*.failureProtectionConfigurator.typename = "FailureProtectionConfigurator"
# 54B = 8B (UDP) + 20B (IP) + 14B (ETH MAC) + 4B (ETH FCS) + 8B (ETH PHY)
# 64B = 8B (UDP) + 20B (IP) + 4B (802.1R) + 6B (802.1Q) + 14B (ETH MAC) + 4B (ETH FCS) + 8B (ETH PHY)
*.failureProtectionConfigurator.configuration = [# single link failure protection redundancy for CDT traffic
{name: "frontLeftWheel", application: "app[0]",
source: "frontLeftWheel", destination: "engineActuator",
pcp: 6, gateIndex: 6, packetFilter: "*->*",
packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us,
linkFailureProtection: [{any: 1, of: "not *->engineActuator and not frontLeftWheel->*"}]},
{name: "frontRightWheel", application: "app[0]",
source: "frontRightWheel", destination: "engineActuator",
pcp: 6, gateIndex: 6, packetFilter: "*->*",
packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us,
linkFailureProtection: [{any: 1, of: "not *->engineActuator and not frontRightWheel->*"}]},
{name: "rearLeftWheel", application: "app[0]",
source: "rearLeftWheel", destination: "engineActuator",
pcp: 6, gateIndex: 6, packetFilter: "*->*",
packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us,
linkFailureProtection: [{any: 1, of: "not *->engineActuator and not rearLeftWheel->*"}]},
{name: "rearRightWheel", application: "app[0]",
source: "rearRightWheel", destination: "engineActuator",
pcp: 6, gateIndex: 6, packetFilter: "*->*",
packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us,
linkFailureProtection: [{any: 1, of: "not *->engineActuator and not rearRightWheel->*"}]},
{name: "steering", application: "app[0]",
source: "steering", destination: "engineActuator",
pcp: 6, gateIndex: 6, packetFilter: "*->*",
packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us,
linkFailureProtection: [{any: 1, of: "not *->engineActuator and not steering->*"}]},
# AVB class A streams
# TODO these are not needed because we don't allocate slots for these streams?
{name: "frontLeftCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A",
source: "frontLeftCamera", destination: "hud or obu",
pcp: 5, gateIndex: 5, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms},
{name: "frontRightCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A",
source: "frontRightCamera", destination: "hud or obu",
pcp: 5, gateIndex: 5, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms},
{name: "rearLeftCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A",
source: "rearLeftCamera", destination: "hud or obu",
pcp: 5, gateIndex: 5, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms},
{name: "rearRightCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A",
source: "rearRightCamera", destination: "hud or obu",
pcp: 5, gateIndex: 5, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms},
{name: "lidar", application: "app[0]",
source: "lidar", destination: "hud",
pcp: 5, gateIndex: 5, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms},
# AVB class B streams
{name: "obu", application: "app[0]",
source: "obu", destination: "rearDisplay",
pcp: 4, gateIndex: 4, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 250us, maxLatency: 50ms},
{name: "hud", application: "app[0]",
source: "hud", destination: "rearDisplay",
pcp: 4, gateIndex: 4, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 250us, maxLatency: 50ms},
# best effort streams
{name: "bestEffort", application: "app[0]",
source: "obu", destination: "hud",
pcp: 0, gateIndex: 1, packetFilter: "*->*",
packetLength: 325B + 54B, packetInterval: 125us}]
##########################
# Visualizer Configuration
# gate scheduling visualization
*.visualizer.gateScheduleVisualizer[0].displayGateSchedules = true
*.visualizer.gateScheduleVisualizer[0].displayDuration = 100us
*.visualizer.gateScheduleVisualizer[0].gateFilter = "**.eth[0].queue.transmissionGate[*]"
*.visualizer.gateScheduleVisualizer[0].height = 16
# Stream redundancy visualizer
*.visualizer.numStreamRedundancyConfigurationVisualizers = 1
*.visualizer.streamRedundancyConfigurationVisualizer[0].displayTrees = true
*.visualizer.streamRedundancyConfigurationVisualizer[0].streamFilter = "rearRightWheel"
*.visualizer.streamRedundancyConfigurationVisualizer[0].lineColor = "green4"
# TSN visualizer
*.visualizer.numFailureProtectionConfigurationVisualizers = 1
*.visualizer.failureProtectionConfigurationVisualizer[0].displayTrees = true
*.visualizer.failureProtectionConfigurationVisualizer[0].streamFilter = "rearRightWheel"
*.visualizer.failureProtectionConfigurationVisualizer[0].lineStyle = "dashed"
Standard Ethernet¶
In this configuration we use only standard Ethernet features to have a baseline of statistical results.
Time-Sensitive Networking¶
In this configuration we use advanced Time-Sensitive Networking features to evaluate their performance.
Try It Yourself¶
If you already have INET and OMNeT++ installed, start the IDE by typing
omnetpp
, import the INET project into the IDE, then navigate to the
inet/showcases/tsn/combiningfeatures/invehicle
folder in the Project Explorer. There, you can view
and edit the showcase files, run simulations, and analyze results.
Otherwise, there is an easy way to install INET and OMNeT++ using opp_env, and run the simulation interactively.
Ensure that opp_env
is installed on your system, then execute:
$ opp_env run inet-4.4 --init -w inet-workspace --install --chdir \
-c 'cd inet-4.4.*/showcases/tsn/combiningfeatures/invehicle && inet'
This command creates an inet-workspace
directory, installs the appropriate
versions of INET and OMNeT++ within it, and launches the inet
command in the
showcase directory for interactive simulation.
Alternatively, for a more hands-on experience, you can first set up the workspace and then open an interactive shell:
$ opp_env install --init -w inet-workspace inet-4.4
$ cd inet-workspace
$ opp_env shell
Inside the shell, start the IDE by typing omnetpp
, import the INET project,
then start exploring.