ARQ.ned code:
simple Source
{
 parameters:
 @display("i=block/source");
 int limit = default(10000);
 gates:
 input in;
 output out;
}
simple Destination
{
 parameters:
 @display("i=block/sink");
 gates:
 input in;
 output out;
}
network ARQ2
{
 double my_BER;
 @display("bgb=179,108");
 submodules:
 source: Source {
 @display("p=40,42");
 }
 destination: Destination {
 @display("p=124,42");
 }
 connections:
 source.out --> {ber = parent.my_BER; datarate = 100 bps;} --> destination.in;
 destination.out --> {delay = 100 ms;} -->source.in;
}
ARQ2.cc code:
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
class Source:public cSimpleModule
{
private:
    simtime_t timeout;
    cMessage *timeoutEvent;
    cPacket * pkt;
    int limit;
public:
    Source();
    virtual ~Source();
protected:
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};
Define_Module(Source);
Source::Source()
{
    timeoutEvent = nullptr;
}
Source::~Source()
{
    cancelAndDelete(timeoutEvent);
    delete pkt;
}
void Source::initialize()
{
    timeout = 1.0;
    limit = par("limit");
    timeoutEvent = new cMessage("timeoutEvent");
    EV << "Sending initial packet\n";
    pkt = new cPacket("packet");
    pkt -> setBitLength(10);
    send(pkt-> dup(), "out");
    scheduleAt(simTime()+timeout, timeoutEvent);
}
    void Source::handleMessage(cMessage *msg)
    {
        if (msg == timeoutEvent){
        EV << "Timeout expired,re-sending message and restarting timer\n";
        send(pkt->dup(), "out");
        scheduleAt(simTime()+timeout, timeoutEvent);
        }
        else{
            EV << "ACK received\n";
            cancelEvent(timeoutEvent);
            delete msg;
            pkt = nullptr;
            if(limit != 0){
                pkt = new cPacket("packet");
                pkt -> setBitLength (10);
                limit--;
                send(pkt->dup(), "out");
                scheduleAt(simTime()+timeout, timeoutEvent);
            }
        }
    }
class Destination : public cSimpleModule
{
    private:
        cStdDev delay_stat;
        cHistogram hist;
    protected:
        virtual void handleMessage(cMessage *msg) override;
        virtual void finish();
};
Define_Module(Destination);
void Destination::handleMessage(cMessage *msg)
{
    cPacket *pkt_received = check_and_cast<cPacket *>(msg);
    if(pkt_received -> hasBitError()){
        EV << "\"Message\" lost. \n";
        bubble("message lost");
        delete pkt_received;
    }
    else{
        EV << "Message correctly received. Sending back message as ACK. \n";
        simtime_t delay = simTime()-pkt_received -> getCreationTime();
        delay_stat.collect(delay);
        hist.collect(delay);
        send(pkt_received, "out");
    }
}
void Destination::finish(){
    EV<<"Mean delay = " << delay_stat.getMean() << "\n";
    EV<<"Delay variance = " <<delay_stat.getVariance() <<"\n";
    EV<<"Standard Deviation = " << delay_stat.getStddev() << "\n";
    EV<<"Minimum value delay = " << delay_stat.getMin() << "\n";
    EV<<"Maximum delay = "<< delay_stat.getMax() << "\n";
    delay_stat.record();
    hist.record();
}