EthernetPlca

Package: inet.physicallayer.wired.ethernet

simple module EthernetPlca

Implements the Ethernet Phyisical Layer Collision Avoidance (PLCA) protocol defined in the IEEE 802.3cg-2019 standard. It can be used to build an Ethernet network interface that can be connected to 10BASE-T1S multidrop links.

The PLCA protocol is implemented with the following features:

  • control state machine (with minor modifications)

  • data state machine (with some modifications)

  • periodic beacons to synchronize cycle start

  • keeping track of the current transmit opportunity

  • various timing parameters (beacon length, to length, etc.)

  • packet bursts with configurable maximum number of packets

  • configurable delay line to temporarily hold the frame from the MAC

  • carrier sense and collision signals

  • various end signal delimiters

The PLCA protocol is implemented with several limitations:

  • PHY collisions are not supported (avoidance assumed)

  • status state machine is not implemented (plca_status)

  • PLCA mode cannot be enabled/disabled dynamically (plca_en), it’s always active

  • PLCA cannot be reset (plca_reset)

  • special handling of local_nodeID 255 is missing

  • beacons are assumed to be never lost (no invalid_beacon_timer)

  • data state machine cannot abort transmissions

  • mixed operation with CSMA/CD nodes on the same multidrop link is not supported

  • controller immediately starts sending a beacon

  • nodes start with waiting to receive a beacon

All EthernetPlca modules in the network interfaces on the same multidrop link must have the same plca_node_count parameter value set. Also, the local_nodeID parameter must be set to a uniqe value in the [0, plca_node_count - 1] range.

This module requires that the modules connected to it implement certain C++ interfaces. The upper layer must be connected to a module implementing the ~IEthernetCsmaMac C++ interface. One such module is the EthernetCsmaMac module. The lower layer must be connected to a module implementing the ~IEthernetCsmaPhy C++ interface. One such module is the EthernetCsmaPhy module.

See also: EthernetCsmaMac, EthernetCsmaPhy, EthernetPlcaInterface

inet.physicallayer.wired.ethernet.EthernetPlcaEthernetPlcasimple

Usage diagram

Inheritance diagram

Used in compound modules

Name

Type

Description

EthernetPlcaInterface

compound module

Implements a network interface that is suitable for use in Ethernet 10BASE-T1S multidrop links. Such a multidrop link uses the Ethernet Phyisical Layer Collision Avoidance (PLCA) protocol. The protocol is defined in the IEEE 802.3cg-2019 standard. This network interface can be used in any network node module (e.g. StandardHost) that allows replacing its network interfaces. All network interfaces on the same multidrop link must use this module.

Extends

Name

Type

Description

SimpleModule

simple module

Base module for all INET simple modules.

Parameters

Name

Type

Default value

Description

displayStringTextFormat

string

“{curID}/{plca_node_count} ({local_nodeID})\n{controlFsmState} - {dataFsmState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

plca_node_count

int

Maximum number of PLCA nodes on the mixing segment receiving transmit opportunities before the node with local_nodeID = 0 generates a new BEACON.

local_nodeID

int

ID representing the PLCA transmit opportunity number assigned to the node.

max_bc

int

0

Maximum number of additional packets the node is allowed to transmit in a single burst.

delay_line_length

int

100

The maximum number of nibbles that the PLCA RS variable delay line can hold.

to_timer_length

int

32b

The transmit opportunity timer should be set equal across the mixing segment for PLCA to work properly.

burst_timer_length

int

128b

This timer determines how long to wait for the MAC to send a new packet before yielding the transmit opportunity. For PLCA burst mode to work properly this timer should be set greater than one IPG.

beacon_timer_length

int

20b

Times the duration of the BEACON signal.

beacon_det_timer_length

int

22b

Timer for detecting received BEACONs.

pending_timer_length

int

512b

Defines the time the PLCA Data state diagram waits in the DELAY_PENDING state before switching to PENDING state.

commit_timer_length

int

288b

Defines the maximum time the PLCA Data state machine is allowed to stay in WAIT_MAC state.

Properties

Name

Value

Description

class

EthernetPlca

display

i=block/rxtx

Gates

Name

Direction

Size

Description

upperLayerIn

input

upperLayerOut

output

lowerLayerIn

input

lowerLayerOut

output

Signals

Name

Type

Unit

Description

carrierSenseChanged

int

emitted when the incoming carrier signal changes, the value is 1 or 0

collisionChanged

int

emitted when the incoming collision signal changes, the value is 1 or 0

controlStateChanged

long

emitted when the state of the control state machine changes, the value is one of DISABLE, RESYNC, RECOVER, SEND_BEACON, SYNCING, WAIT_TO, EARLY_RECEIVE, COMMIT, YIELD, RECEIVE, TRANSMIT, BURST, ABORT, NEXT_TX_OPPORTUNITY

curID

int

emitted when the current transmit opportunity ID changes, the value is the node ID of the owner of the current transmit opportunity

cycleLength

simtime_t

emitted when a cycle ends, the value is the duration of the cycle

dataStateChanged

long

emitted when the state of the data state machine changes, the value is one of WAIT_IDLE, IDLE, RECEIVE, HOLD, COLLIDE, DELAY_PENDING, PENDING, WAIT_MAC, TRANSMIT

numPacketsPerCycle

int

emitted when a cycle ends, the value is the number of packets sent or received during the cycle

numPacketsPerOwnTo

int

emitted when a transmit opportunity ends for this node, the value is the number of packets sent during the transmit opportunity

numPacketsPerTo

int

emitted when a transmit opportunity ends for any node, the value is the number of packets sent or received during the transmit opportunity

ownToLength

simtime_t

emitted when a transmit opportunity ends for this node, the value is the duration of the transmit opportunity

packetInterval

simtime_t

emitted when a packet is sent to the PHY, the value is the time elapsed since the last packet was sent

packetPendingDelay

simtime_t

emitted when a packet is sent to the PHY, the value is the delay from when the packet was received from the MAC

packetReceivedFromLower

inet::Packet

packetSentToLower

inet::Packet

rxCmd

long

emitted when the value of the rx_cmd variable changes, the value is one of NONE, BEACON, COMMIT

toLength

simtime_t

emitted when a transmit opportunity ends for any node, the value is the duration of the transmit opportunity

transmitOpportunityUsed

int

emitted when a transmit opportunity starts, the value is 1 or 0

txCmd

long

emitted when the value of the tx_cmd variable changes, the value is one of NONE, BEACON, COMMIT

Statistics

Name

Title

Source

Record

Unit

Interpolation Mode

Description

carrierSense

carrier sense

carrierSenseChanged

count,vector

sample-hold

the time evolution of the incoming carrier sense signal

collision

collision

collisionChanged

count,vector

sample-hold

the time evolution of the incoming collision signal

controlState

control state

controlStateChanged

count,vector

sample-hold

the time evolution of the state of the control state machine

curID

current transmit opportunity ID

vector

sample-hold

the time evolution of the current transmit opportunity ID

cycleLength

cycle length

vector

none

the time evolution of the cycle length

dataState

data state

dataStateChanged

count,vector

sample-hold

the time evolution of the state of the data state machine

numPacketsPerCycle

number of packets per cycle

vector

none

the time evolution of the number of packets sent or received per cycle

numPacketsPerOwnTo

number of packets per transmit opportunity

vector

none

the time evolution of the number of packets sent per transmit opportunity for this node

numPacketsPerTo

number of packets per transmit opportunity

vector

none

the time evolution of the number of packets sent or received per transmit opportunity for any node

ownToLength

own transmit opportunity length

vector

none

the time evolution of the transmit opportunity length for any node

packetInterval

packet interval

count,histogram,vector

s

none

packetPendingDelay

packet pending delay

count,histogram,vector

s

none

rxCmd

RX command

count,vector

sample-hold

toLength

transmit opportunity length

vector

none

the time evolution of the transmit opportunity length for any node

transmitOpportunityUsed

transmit opportunity used

count,vector

none

txCmd

TX command

count,vector

sample-hold

Source code

//
// Implements the Ethernet Phyisical Layer Collision Avoidance (PLCA)
// protocol defined in the IEEE 802.3cg-2019 standard. It can be used to build an
// Ethernet network interface that can be connected to 10BASE-T1S multidrop links.
//
// The PLCA protocol is implemented with the following features:
//  - control state machine (with minor modifications)
//  - data state machine (with some modifications)
//  - periodic beacons to synchronize cycle start
//  - keeping track of the current transmit opportunity
//  - various timing parameters (beacon length, to length, etc.)
//  - packet bursts with configurable maximum number of packets
//  - configurable delay line to temporarily hold the frame from the MAC
//  - carrier sense and collision signals
//  - various end signal delimiters
//
// The PLCA protocol is implemented with several limitations:
//  - PHY collisions are not supported (avoidance assumed)
//  - status state machine is not implemented (plca_status)
//  - PLCA mode cannot be enabled/disabled dynamically (plca_en), it's always active
//  - PLCA cannot be reset (plca_reset)
//  - special handling of local_nodeID 255 is missing
//  - beacons are assumed to be never lost (no invalid_beacon_timer)
//  - data state machine cannot abort transmissions
//  - mixed operation with CSMA/CD nodes on the same multidrop link is not supported
//  - controller immediately starts sending a beacon
//  - nodes start with waiting to receive a beacon
//
// All ~EthernetPlca modules in the network interfaces on the same multidrop link
// must have the same plca_node_count parameter value set. Also, the local_nodeID
// parameter must be set to a uniqe value in the [0, plca_node_count - 1] range.
//
// This module requires that the modules connected to it implement certain C++
// interfaces. The upper layer must be connected to a module implementing the
// ~IEthernetCsmaMac C++ interface. One such module is the ~EthernetCsmaMac module.
// The lower layer must be connected to a module implementing the ~IEthernetCsmaPhy
// C++ interface. One such module is the ~EthernetCsmaPhy module.
//
// @see ~EthernetCsmaMac, ~EthernetCsmaPhy, ~EthernetPlcaInterface
//
simple EthernetPlca extends SimpleModule like IProtocolLayer
{
    parameters:
        @class(EthernetPlca);
        // Maximum number of PLCA nodes on the mixing segment receiving transmit
        // opportunities before the node with local_nodeID = 0 generates a new
        // BEACON.
        int plca_node_count;
        // ID representing the PLCA transmit opportunity number assigned to the
        // node.
        int local_nodeID;
        // Maximum number of additional packets the node is allowed to transmit
        // in a single burst.
        int max_bc = default(0);
        // The maximum number of nibbles that the PLCA RS variable delay line
        // can hold.
        int delay_line_length = default(100);
        // The transmit opportunity timer should be set equal across the mixing
        // segment for PLCA to work properly.
        int to_timer_length @unit(b) = default(32b);
        // This timer determines how long to wait for the MAC to send a new packet
        // before yielding the transmit opportunity. For PLCA burst mode to work
        // properly this timer should be set greater than one IPG.
        int burst_timer_length @unit(b) = default(128b);
        // Times the duration of the BEACON signal.
        int beacon_timer_length @unit(b) = default(20b);
        // Timer for detecting received BEACONs.
        int beacon_det_timer_length @unit(b) = default(22b);
        // Defines the time the PLCA Data state diagram waits in the DELAY_PENDING
        // state before switching to PENDING state.
        int pending_timer_length @unit(b) = default(512b);
        // Defines the maximum time the PLCA Data state machine is allowed to stay
        // in WAIT_MAC state.
        int commit_timer_length @unit(b) = default(288b);
        // emitted when the current transmit opportunity ID changes, the value
        // is the node ID of the owner of the current transmit opportunity
        @signal[curID](type=int);
        // emitted when the incoming carrier signal changes, the value is 1 or 0
        @signal[carrierSenseChanged](type=int);
        // emitted when the incoming collision signal changes, the value is 1 or 0
        @signal[collisionChanged](type=int);
        // emitted when the state of the control state machine changes, the value is one of DISABLE, RESYNC, RECOVER, SEND_BEACON, SYNCING, WAIT_TO, EARLY_RECEIVE, COMMIT, YIELD, RECEIVE, TRANSMIT, BURST, ABORT, NEXT_TX_OPPORTUNITY
        @signal[controlStateChanged](type=long);
        // emitted when the state of the data state machine changes, the value is one of WAIT_IDLE, IDLE, RECEIVE, HOLD, COLLIDE, DELAY_PENDING, PENDING, WAIT_MAC, TRANSMIT
        @signal[dataStateChanged](type=long);
        // emitted when the value of the rx_cmd variable changes, the value is one of NONE, BEACON, COMMIT
        @signal[rxCmd](type=long);
        // emitted when the value of the tx_cmd variable changes, the value is one of NONE, BEACON, COMMIT
        @signal[txCmd](type=long);
        // emitted when a packet is sent to the PHY, the value is the delay from when the packet was received from the MAC
        @signal[packetPendingDelay](type=simtime_t);
        // emitted when a packet is sent to the PHY, the value is the time elapsed since the last packet was sent
        @signal[packetInterval](type=simtime_t);
        // emitted when a transmit opportunity starts, the value is 1 or 0
        @signal[transmitOpportunityUsed](type=int);
        // emitted when a transmit opportunity ends for any node, the value is the number of packets sent or received during the transmit opportunity
        @signal[numPacketsPerTo](type=int);
        // emitted when a transmit opportunity ends for this node, the value is the number of packets sent during the transmit opportunity
        @signal[numPacketsPerOwnTo](type=int);
        // emitted when a cycle ends, the value is the number of packets sent or received during the cycle
        @signal[numPacketsPerCycle](type=int);
        // emitted when a transmit opportunity ends for any node, the value is the duration of the transmit opportunity
        @signal[toLength](type=simtime_t);
        // emitted when a transmit opportunity ends for this node, the value is the duration of the transmit opportunity
        @signal[ownToLength](type=simtime_t);
        // emitted when a cycle ends, the value is the duration of the cycle
        @signal[cycleLength](type=simtime_t);
        @signal[packetSentToLower](type=inet::Packet);
        @signal[packetReceivedFromLower](type=inet::Packet);
        // the time evolution of the current transmit opportunity ID
        @statistic[curID](title="current transmit opportunity ID"; record=vector; interpolationmode=sample-hold);
        // the time evolution of the incoming carrier sense signal
        @statistic[carrierSense](title="carrier sense"; type=int; source=carrierSenseChanged; record=count,vector; interpolationmode=sample-hold);
        // the time evolution of the incoming collision signal
        @statistic[collision](title="collision"; type=int; source=collisionChanged; record=count,vector; interpolationmode=sample-hold);
        // the time evolution of the state of the control state machine
        @statistic[controlState](title="control state"; type=enum; enum=DISABLE, RESYNC, RECOVER, SEND_BEACON, SYNCING, WAIT_TO, EARLY_RECEIVE, COMMIT, YIELD, RECEIVE, TRANSMIT, BURST, ABORT, NEXT_TX_OPPORTUNITY; source=controlStateChanged; record=count,vector; interpolationmode=sample-hold);
        // the time evolution of the state of the data state machine
        @statistic[dataState](title="data state"; type=enum; enum=WAIT_IDLE, IDLE, RECEIVE, HOLD, COLLIDE, DELAY_PENDING, PENDING, WAIT_MAC, TRANSMIT; source=dataStateChanged; record=count,vector; interpolationmode=sample-hold);
        @statistic[rxCmd](title="RX command"; type=enum; enum=NONE, BEACON, COMMIT; record=count,vector; interpolationmode=sample-hold);
        @statistic[txCmd](title="TX command"; type=enum; enum=NONE, BEACON, COMMIT; record=count,vector; interpolationmode=sample-hold);
        @statistic[packetPendingDelay](title="packet pending delay"; unit=s; record=count,histogram,vector; interpolationmode=none);
        @statistic[packetInterval](title="packet interval"; unit=s; record=count,histogram,vector; interpolationmode=none);
        @statistic[transmitOpportunityUsed](title="transmit opportunity used"; record=count,vector; interpolationmode=none);
        // the time evolution of the number of packets sent or received per transmit opportunity for any node
        @statistic[numPacketsPerTo](title="number of packets per transmit opportunity"; record=vector; interpolationmode=none);
        // the time evolution of the number of packets sent per transmit opportunity for this node
        @statistic[numPacketsPerOwnTo](title="number of packets per transmit opportunity"; record=vector; interpolationmode=none);
        // the time evolution of the number of packets sent or received per cycle
        @statistic[numPacketsPerCycle](title="number of packets per cycle"; record=vector; interpolationmode=none);
        // the time evolution of the transmit opportunity length for any node
        @statistic[toLength](title="transmit opportunity length"; record=vector; interpolationmode=none);
        // the time evolution of the transmit opportunity length for any node
        @statistic[ownToLength](title="own transmit opportunity length"; record=vector; interpolationmode=none);
        // the time evolution of the cycle length
        @statistic[cycleLength](title="cycle length"; record=vector; interpolationmode=none);
        displayStringTextFormat = default("{curID}/{plca_node_count} ({local_nodeID})\n{controlFsmState} - {dataFsmState}");
        @display("i=block/rxtx");
    gates:
        input upperLayerIn @labels(EtherFrame);
        output upperLayerOut @labels(EtherFrame);
        input lowerLayerIn @labels(EtherFrame);
        output lowerLayerOut @labels(EtherFrame);
}

File: src/inet/physicallayer/wired/ethernet/EthernetPlca.ned