Table Of Contents
Table Of Contents

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.

INET version: 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
#abstract-config = true (requires omnet 6)
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 6)
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.

Results

Here are the simulation results:

Sources: omnetpp.ini, InVehicleNetworkShowcase.ned

Discussion

Use this page in the GitHub issue tracker for commenting on this showcase.