diff --git a/src/inet/linklayer/ieee80211/Ieee80211tsnInterface.ned b/src/inet/linklayer/ieee80211/Ieee80211tsnInterface.ned new file mode 100644 index 00000000000..82c2f8fca0b --- /dev/null +++ b/src/inet/linklayer/ieee80211/Ieee80211tsnInterface.ned @@ -0,0 +1,157 @@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see http://www.gnu.org/licenses/. +// + +package inet.linklayer.ieee80211; + + +// +// Copyright (C) 2006 OpenSim Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// + + +import inet.linklayer.common.IIeee8021dQosClassifier; +import inet.linklayer.contract.IWirelessInterface; +import inet.linklayer.ieee80211.llc.IIeee80211Llc; +import inet.linklayer.ieee80211.mgmt.IIeee80211Agent; +import inet.linklayer.ieee80211.mgmt.IIeee80211Mgmt; +import inet.linklayer.ieee80211.mib.Ieee80211Mib; +import inet.linklayer.ieee8021q.PcpClassifier; +import inet.linklayer.ieee8021q.PcpTrafficClassClassifier; +import inet.networklayer.common.InterfaceTable; +import inet.networklayer.common.NetworkInterface; +import inet.physicallayer.wireless.common.contract.packetlevel.IRadio; +import ned.IdealChannel; + + +// +// This module implements an IEEE 802.11 network interface. It implements +// a large subset of the IEEE 802.11 standard, and may use radio models +// and wireless signal representations of varying levels of detail. +// It is also extremely configurable, and its component structure makes +// it easy to experiment with various details of the protocol. +// +// The main components of the interface are the MAC and the radio submodules. +// Most configuration parameters are in the MAC (~Ieee80211Mac) and its +// numerous subcomponents. Most subcomponents are replaceable to facilitate +// experimentation by using typename assignments in the configuration. +// +// The default radio is ~Ieee80211ScalarRadio, but it can be replaced +// with any of several compatible radio types using typename assignments +// in the configuration. Several radio models of varying levels of detail +// are available, from simple unit disk radio models to layered radio models +// that explicitly model forward error correction, scrambling, symbol +// encoding/decoding, etc, and may represent radio signals with a +// multi-dimensional power density function over time and frequency. +// The INET User Guide elaborates on the possibilities. +// +// The type of the management submodule is also configurable. The type of this +// submodule decides whether the interfaces acts an AP, a STA, or is in ad hoc mode. +// Use ~Ieee80211MgmtSta or ~Ieee80211MgmtStaSimplified for STA, +// ~Ieee80211MgmtAp or ~Ieee80211MgmtApSimplified for AP, and +// ~Ieee80211MgmtAdhoc for ad hoc mode. +// +// The agent submodule is responsible for initiating the process of connecting +// to an AP and similar tasks normally done from "user space". +// +// The LLC submodule is responsible for adding/removing the LLC header on packets. +// +// A classifier is responsible for assigning a 802.1d User Priority (UP) to +// packets, and is only needed if QoS is involved. +// +// The clock submodule would allow clock skew modeling -- this is currently not used. +// +// Note about the implementation: +// +// Despite its appearance, Ieee80211Interface is not a plain compound module. +// It has an underlying custom C++ class that inherits from cModule. +// +module Ieee80211tsnInterface extends NetworkInterface like IWirelessInterface +{ + parameters: + string interfaceTableModule; + string energySourceModule = default(""); + string opMode @enum("a","b","g(erp)","g(mixed)","n(mixed-2.4Ghz)","p","ac") = default("g(mixed)"); + string address @mutable = default("auto"); // MAC address as hex string (12 hex digits), or + // "auto". "auto" values will be replaced by + // a generated MAC address in init stage 0. + string protocol = default(""); + double bitrate @unit(bps) = default(-1bps); + **.opMode = this.opMode; + **.bitrate = this.bitrate; + mac.modeSet = default(this.opMode); + mac.*.rateSelection.dataFrameBitrate = default(this.bitrate); + *.macModule = default(absPath(".mac")); + *.mibModule = default(absPath(".mib")); + *.interfaceTableModule = default(absPath(this.interfaceTableModule)); + *.energySourceModule = default(absPath(this.energySourceModule)); + gates: + input upperLayerIn; + output upperLayerOut; + input radioIn @labels(IWirelessSignal); + submodules: + mib: Ieee80211Mib { + parameters: + @display("p=100,300;is=s"); + } + llc: like IIeee80211Llc { + parameters: + @display("p=300,200"); + } + agent: like IIeee80211Agent if typename != "" { + parameters: + @display("p=700,300"); + } + mgmt: like IIeee80211Mgmt { + parameters: + @display("p=500,300"); + } + mac: like IIeee80211Mac { + parameters: + @display("p=300,300"); + } + radio: like IRadio { + parameters: + @display("p=300,400"); + } + tsnLayer: tsnLayer { + @display("p=421,66"); + } + interfaceTable: InterfaceTable { + @display("p=105,401"); + } + pcpClassifier: PcpClassifier { + @display("p=488,161"); + } + connections: + radioIn --> { @display("m=s"); } --> radio.radioIn; + radio.upperLayerIn <-- mac.lowerLayerOut; + radio.upperLayerOut --> mac.lowerLayerIn; + + mac.mgmtOut --> mgmt.macIn; + mac.mgmtIn <-- mgmt.macOut; + + mgmt.agentOut --> agent.mgmtIn if exists(agent); + mgmt.agentIn <-- agent.mgmtOut if exists(agent); + + llc.upperLayerOut --> { @display("m=n"); } --> upperLayerOut; + llc.lowerLayerOut --> mac.upperLayerIn; + llc.lowerLayerIn <-- mac.upperLayerOut; + + upperLayerIn --> { @display("m=n"); } --> tsnLayer.upperLayerIn; + tsnLayer.lowerLayerOut --> IdealChannel --> pcpClassifier.in; + pcpClassifier.out++ --> IdealChannel --> llc.upperLayerIn; +} diff --git a/src/inet/linklayer/ieee80211/tsnLayer.ned b/src/inet/linklayer/ieee80211/tsnLayer.ned new file mode 100644 index 00000000000..5a4ddb58cc9 --- /dev/null +++ b/src/inet/linklayer/ieee80211/tsnLayer.ned @@ -0,0 +1,77 @@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see http://www.gnu.org/licenses/. +// + +package inet.linklayer.ieee80211; + +import inet.linklayer.common.IIeee8021dQosClassifier; +import inet.linklayer.contract.IWirelessInterface; +import inet.linklayer.ieee80211.llc.IIeee80211Llc; +import inet.linklayer.ieee80211.mgmt.IIeee80211Agent; +import inet.linklayer.ieee80211.mgmt.IIeee80211Mgmt; +import inet.linklayer.ieee80211.mib.Ieee80211Mib; +import inet.linklayer.ieee8021q.Ieee8021qTimeAwareShaper; +import inet.networklayer.common.NetworkInterface; +import inet.physicallayer.wireless.common.contract.packetlevel.IRadio; +import inet.protocolelement.common.PacketEmitter; +import inet.protocolelement.redundancy.StreamCoderLayer; +import inet.protocolelement.redundancy.StreamIdentifier; +import inet.protocolelement.redundancy.StreamIdentifierLayer; +import inet.queueing.common.PacketDelayer; +import inet.queueing.queue.PacketQueue; +import inet.queueing.server.PacketServer; +import ned.IdealChannel; + + +module tsnLayer +{ + @display("bgb=437,530"); + gates: + input upperLayerIn; + output upperLayerOut @loose; + output lowerLayerOut; + input lowerLayerIn @loose; + submodules: + packetDelayer: PacketDelayer { + @display("p=87,75"); + } + streamIdentifierLayer: StreamIdentifierLayer { + @display("p=293,75"); + } + streamCoderLayer: StreamCoderLayer { + @display("p=291,172"); + } + packetServer: PacketServer { + @display("p=291,353"); + } + packetEmitter: PacketEmitter { + @display("p=291,448"); + } + ieee8021qTimeAwareShaper: Ieee8021qTimeAwareShaper { + @display("p=290.496,262.728"); + } + connections allowunconnected: + upperLayerIn --> IdealChannel --> packetDelayer.in; + packetDelayer.out --> IdealChannel --> streamIdentifierLayer.upperLayerIn; + streamIdentifierLayer.lowerLayerOut --> IdealChannel --> streamCoderLayer.upperLayerIn; + streamCoderLayer.upperLayerOut --> IdealChannel --> streamIdentifierLayer.lowerLayerIn; + + + + packetServer.out --> IdealChannel --> packetEmitter.in; + packetEmitter.out --> IdealChannel --> lowerLayerOut; + streamIdentifierLayer.upperLayerOut --> IdealChannel --> upperLayerOut; + streamCoderLayer.lowerLayerOut --> IdealChannel --> ieee8021qTimeAwareShaper.in; + ieee8021qTimeAwareShaper.out --> IdealChannel --> packetServer.in; +} diff --git a/src/inet/node/tsn/TsnAccessPoint.ned b/src/inet/node/tsn/TsnAccessPoint.ned new file mode 100644 index 00000000000..086e45bbb3d --- /dev/null +++ b/src/inet/node/tsn/TsnAccessPoint.ned @@ -0,0 +1,58 @@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see http://www.gnu.org/licenses/. +// + +package inet.node.tsn; + +import inet.linklayer.contract.IIeee8021qLayer; +import inet.node.wireless.AccessPoint; +import ned.IdealChannel; + +module TsnAccessPoint extends AccessPoint +{ + parameters: + @defaultStatistic("gateState:vector"; module="wlan[0].macLayer.queue.transmissionGate[0]"); + // bool hasTimeSynchronization = default(false); // enable IEEE 802.1 AS time synchronization + // bool hasIngressTrafficFiltering = default(false); // enable IEEE 802.1 Qci ingress per-stream filtering + // bool hasEgressTrafficShaping = default(false); // enable IEEE 802.1 egress traffic shaping (credit based shaping, time aware shaping, asynchronous shaping) + // bool hasStreamRedundancy = default(false); // enable IEEE 802.1 CB frame replication and elimination + // bool hasIncomingStreams = default(false); // enable IEEE 802.1 stream decoding + // bool hasOutgoingStreams = default(false); // enable IEEE 802.1 stream identification and stream encoding + // bool hasFramePreemption = default(false); // enable IEEE 802.1 Qbu frame preemption + // //hasGptp = default(hasTimeSynchronization); // enable gPTP protocol + // //gptp.gptpNodeType = default("BRIDGE_NODE"); // configure gPTP bridge node type + // //gptp.slavePort = default("eth0"); // configure default gPTP bridge slave port + // clock.typename = default(hasTimeSynchronization ? "SettableClock" : ""); // e + // wiFiBridgingLayer.streamIdentifier.typename = default(hasOutgoingStreams || hasStreamRedundancy ? "StreamIdentifierLayer" : ""); + // bridging.typename = default("BridgingLayer"); // switch to modular bridging + // bridging.directionReverser.cutthroughBarrier.typename = default(hasCutthroughSwitching ? "EthernetCutthroughBarrier" : ""); // enable cut-through barrier when cut-through switching is enabled + // bridging.streamIdentifier.typename = default(hasOutgoingStreams || hasStreamRedundancy ? "StreamIdentifierLayer" : ""); // enable stream identification when stream redundancy is enabled + // bridging.streamRelay.typename = default(hasStreamRedundancy ? "StreamRelayLayer" : ""); // enable stream merging and stream splitting when stream redundancy is enabled + // bridging.streamFilter.typename = default(hasIngressTrafficFiltering ? "StreamFilterLayer" : ""); // enable stream filtering when ingress per-stream filtering is enabled + // bridging.streamFilter.ingress.typename = default(hasIngressTrafficFiltering ? "SimpleIeee8021qFilter" : ""); // use 802.1 Qci ingress filtering when ingress per-stream filtering is enabled + // bridging.streamCoder.typename = default(hasIncomingStreams || hasOutgoingStreams || hasIngressTrafficFiltering || hasStreamRedundancy ? "StreamCoderLayer" : ""); // enable stream endocing/decoding when stream redundancy is enabled + // + gates: + inout virtual[numWlanInterfaces] @labels(Wireless-conn); + submodules: + iIeee8021q: like IIeee8021qLayer { + @display("p=882,283"); + } + connections: + //bl.out++ --> IdealChannel --> iIeee8021q.upperLayerIn; + li.out++ --> IdealChannel --> iIeee8021q.lowerLayerIn; + iIeee8021q.upperLayerOut --> IdealChannel --> bl.in++; + iIeee8021q.lowerLayerOut --> IdealChannel --> li.in++; + bl.out++ --> IdealChannel --> iIeee8021q.upperLayerIn; +}