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
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.

Results

Here are the simulation results:

Sources: omnetpp.ini, InVehicleNetworkShowcase.ned

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.

Discussion

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