Network91.ned
NED File tutorials/protocol/Network91.ned
| Name | Type | Description |
|---|---|---|
| IApp | module interface | (no description) |
| ClientApp | compound module | (no description) |
| ServerApp | compound module | (no description) |
| ForwardingService | compound module | (no description) |
| DataService | compound module | (no description) |
| Interface | compound module | (no description) |
| Node | compound module | (no description) |
| Host | compound module | (no description) |
| Router | network | (no description) |
| Network91 | network | (no description) |
Source code
// // Copyright (C) 2020 OpenSim Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later // package inet.tutorials.protocol; import inet.common.MessageDispatcher; import inet.networklayer.common.NetworkInterface; import inet.networklayer.common.InterfaceTable; import inet.protocolelement.acknowledgement.ReceiveWithAcknowledge; import inet.protocolelement.acknowledgement.Resending; import inet.protocolelement.acknowledgement.SendWithAcknowledge; import inet.protocolelement.aggregation.SubpacketLengthHeaderBasedAggregator; import inet.protocolelement.aggregation.SubpacketLengthHeaderBasedDeaggregator; import inet.protocolelement.checksum.EthernetFcsHeaderChecker; import inet.protocolelement.checksum.EthernetFcsHeaderInserter; import inet.protocolelement.dispatching.ReceiveWithProtocol; import inet.protocolelement.dispatching.SendWithProtocol; import inet.protocolelement.forwarding.Forwarding; import inet.protocolelement.forwarding.ReceiveWithHopLimit; import inet.protocolelement.forwarding.SendWithHopLimit; import inet.protocolelement.fragmentation.FragmentNumberHeaderBasedDefragmenter; import inet.protocolelement.ordering.Reordering; import inet.protocolelement.ordering.SequenceNumbering; import inet.protocolelement.selectivity.ReceiveAtL3Address; import inet.protocolelement.selectivity.ReceiveAtMacAddress; import inet.protocolelement.selectivity.ReceiveAtPort; import inet.protocolelement.selectivity.SendToL3Address; import inet.protocolelement.selectivity.SendToMacAddress; import inet.protocolelement.selectivity.SendToPort; import inet.protocolelement.transceiver.PacketTransmitter; import inet.queueing.common.PacketMultiplexer; import inet.queueing.contract.IActivePacketSource; import inet.queueing.contract.IPacketQueue; import inet.queueing.contract.IPacketServer; import inet.queueing.contract.IPassivePacketSink; moduleinterface IApp { parameters: @display("i=block/app"); gates: input in; output out; } module ClientApp like IApp { parameters: @display("i=block/app"); gates: input in; output out; submodules: source: <default("ActivePacketSource")> like IActivePacketSource { @display("p=150,100"); } sendToPort: SendToPort { @display("p=150,200"); } sendToL3Address: SendToL3Address { @display("p=150,300"); } connections allowunconnected: source.out --> sendToPort.in; sendToPort.out --> sendToL3Address.in; sendToL3Address.out --> { @display("m=s"); } --> out; } module ServerApp like IApp { parameters: @display("i=block/app"); gates: input in; output out; submodules: sink: <default("PassivePacketSink")> like IPassivePacketSink { @display("p=150,100"); } receiveAtPort: ReceiveAtPort { @display("p=150,200"); } receiveAtL3Address: ReceiveAtL3Address { @display("p=150,300"); } connections allowunconnected: in --> { @display("m=s"); } --> receiveAtL3Address.in; receiveAtL3Address.out --> receiveAtPort.in; receiveAtPort.out --> sink.in; } module ForwardingService { parameters: @display("i=block/routing"); gates: input upperLayerIn @loose; output upperLayerOut @loose; input lowerLayerIn; output lowerLayerOut; submodules: d1: MessageDispatcher { @display("p=300,100"); } forwarding: Forwarding { @display("p=300,200"); } sendWithHopLimit: SendWithHopLimit { @display("p=150,300"); } receiveWithHopLimit: ReceiveWithHopLimit { @display("p=450,300"); } connections: upperLayerIn --> { @display("m=n"); } --> d1.in++; d1.out++ --> forwarding.in; forwarding.out --> d1.in++; d1.out++ --> sendWithHopLimit.in; sendWithHopLimit.out --> { @display("m=s"); } --> lowerLayerOut; lowerLayerIn --> { @display("m=s"); } --> receiveWithHopLimit.in; receiveWithHopLimit.out --> d1.in++; d1.out++ --> { @display("m=n"); } --> upperLayerOut; } module DataService { parameters: @display("i=block/layer"); gates: input upperLayerIn; output upperLayerOut; input lowerLayerIn; output lowerLayerOut; submodules: aggregator: SubpacketLengthHeaderBasedAggregator { @display("p=150,100"); } fragmenter: FragmentNumberHeaderBasedDefragmenter { @display("p=150,200"); } sequenceNumbering: SequenceNumbering { @display("p=150,300"); } queue: <default("DropTailQueue")> like IPacketQueue { @display("p=150,400"); } server: <default("PacketServer")> like IPacketServer { @display("p=150,500"); } deaggregator: SubpacketLengthHeaderBasedDeaggregator { @display("p=450,100"); } defragmenter: FragmentNumberHeaderBasedDefragmenter { @display("p=450,200"); } reordering: Reordering { @display("p=450,300"); } connections: upperLayerIn --> { @display("m=n"); } --> aggregator.in; aggregator.out --> fragmenter.in; fragmenter.out --> sequenceNumbering.in; sequenceNumbering.out --> queue.in; queue.out --> server.in; server.out --> { @display("m=s"); } --> lowerLayerOut; lowerLayerIn --> { @display("m=s"); } --> reordering.in; reordering.out --> defragmenter.in; defragmenter.out --> deaggregator.in; deaggregator.out --> { @display("m=n"); } --> upperLayerOut; } module Interface extends NetworkInterface { parameters: string interfaceTableModule; @class(NetworkInterface); @display("i=block/ifcard"); gates: input upperLayerIn @loose; output upperLayerOut @loose; inout phys; submodules: sendToMacAddress: SendToMacAddress { @display("p=150,100"); } resending: Resending { @display("p=150,200"); } sendWithAcknowledge: SendWithAcknowledge { @display("p=150,300"); } m1: PacketMultiplexer { @display("p=150,400"); } sendWithProtocol: SendWithProtocol { @display("p=150,500"); } fcsInserter: EthernetFcsHeaderInserter { @display("p=150,600"); } transmitter: PacketTransmitter { @display("p=150,700"); } receiveAtMacAddress: ReceiveAtMacAddress { @display("p=450,100"); } receiveWithAcknowledge: ReceiveWithAcknowledge { @display("p=450,200"); } d1: MessageDispatcher { @display("p=450,300"); } receiveWithProtocol: ReceiveWithProtocol { @display("p=450,400"); } fcsChecker: EthernetFcsHeaderChecker { @display("p=450,500"); } connections: upperLayerIn --> { @display("m=n"); } --> sendToMacAddress.in; sendToMacAddress.out --> resending.in; resending.out --> sendWithAcknowledge.in; sendWithAcknowledge.out --> m1.in++; m1.out --> sendWithProtocol.in; sendWithProtocol.out --> fcsInserter.in; fcsInserter.out --> transmitter.in; transmitter.out --> { @display("m=s"); } --> phys$o; phys$i --> { @display("m=s"); } --> fcsChecker.in; fcsChecker.out --> receiveWithProtocol.in; receiveWithProtocol.out --> d1.in++; d1.out++ --> receiveWithAcknowledge.in; receiveWithAcknowledge.out --> receiveAtMacAddress.in; receiveWithAcknowledge.ackOut --> m1.in++; d1.out++ --> sendWithAcknowledge.ackIn; receiveAtMacAddress.out --> { @display("m=n"); } --> upperLayerOut; } module Node { parameters: int numInterfaces = default(0); interface[*].interfaceTableModule = "^.interfaceTable"; @networkNode; gates: inout g[numInterfaces]; submodules: interfaceTable: InterfaceTable { @display("p=150,100"); } app: <default("")> like IApp if typename != "" { @display("p=450,100"); } forwardingService: ForwardingService { @display("p=450,200"); } dataService: DataService { @display("p=450,300"); } d1: MessageDispatcher { @display("p=450,400"); } interface[sizeof(g)]: Interface { @display("p=450,500,row,150"); } connections: app.out --> forwardingService.upperLayerIn if exists(app); forwardingService.upperLayerOut --> app.in if exists(app); forwardingService.lowerLayerOut --> dataService.upperLayerIn; dataService.lowerLayerOut --> d1.in++; d1.out++ --> dataService.lowerLayerIn; dataService.upperLayerOut --> forwardingService.lowerLayerIn; for i=0..sizeof(interface)-1 { interface[i].upperLayerOut --> d1.in++; d1.out++ --> interface[i].upperLayerIn; g[i] <--> { @display("m=s"); } <--> interface[i].phys; } } module Host extends Node { parameters: @display("i=device/pc"); } network Router extends Node { parameters: @display("i=device/router"); } network Network91 { submodules: client: Host { @display("p=100,100"); } router1: Router { @display("p=300,100"); } router2: Router { @display("p=500,100"); } router3: Router { @display("p=400,300"); } server: Host { @display("p=700,300"); } connections: client.g++ <--> { delay = 1ms; } <--> router1.g++; router1.g++ <--> { delay = 1ms; } <--> router2.g++; router1.g++ <--> { delay = 1ms; } <--> router3.g++; router2.g++ <--> { delay = 1ms; } <--> router3.g++; router3.g++ <--> { delay = 1ms; } <--> server.g++; }