1
0
mirror of https://github.com/wfjm/w11.git synced 2026-02-27 09:29:02 +00:00

RethBuf: add copy ctor; Rw11CntlDEUNA: add simulated tx/rx loss

- tools
  - src/librw11/RethBuf: add copy constructor
  - src/librw11/Rw11CntlDEUNA: add simulated tx and rx packet loss mechanism
  - src/librwxxtpp/RtclRw11CntlDEUNA: add set/get for txloss/rxloss
This commit is contained in:
wfjm
2023-02-25 14:11:08 +01:00
parent cc7f8365cd
commit ffcef691d8
6 changed files with 128 additions and 19 deletions

View File

@@ -1,9 +1,10 @@
// $Id: RethBuf.cpp 1378 2023-02-23 10:45:17Z mueller $
// $Id: RethBuf.cpp 1379 2023-02-24 09:17:23Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2017-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// Revision History:
// Date Rev Version Comment
// 2023-02-24 1379 1.1.1 add copy constructor
// 2023-02-22 1378 1.1 improved Info/Dump methods
// 2017-04-16 880 1.0 Initial version
// 2017-02-12 850 0.1 First draft
@@ -19,6 +20,7 @@
#include <arpa/inet.h>
#include <sstream>
#include <cstring>
#include "librtools/RosFill.hpp"
#include "librtools/RosPrintf.hpp"
@@ -82,6 +84,15 @@ RethBuf::RethBuf()
fSize(0)
{}
//------------------------------------------+-----------------------------------
//! Copy constructor
RethBuf::RethBuf(const RethBuf& src)
: fTime(src.fTime),
fSize(src.fSize)
{
memcpy(fBuf, src.fBuf, src.fSize);
}
//------------------------------------------+-----------------------------------
//! Destructor
RethBuf::~RethBuf()
@@ -183,9 +194,11 @@ std::string RethBuf::HeaderInfo1() const
auto prot = GetB(kElength+kIpOffProt);
auto tlen = GetS(kElength+kIpOffLen);
auto flags = GetB(kElength+kIpOffFlags);
auto ipsrc = RethTools::IpAddr2String(Buf8()+kElength+kIpOffSrcIP);
auto ipdst = RethTools::IpAddr2String(Buf8()+kElength+kIpOffDstIP);
sos << "IPv4: prot " << RosPrintf(prot,"d",3)
<< ": " << RethTools::IpAddr2String(Buf8()+kElength+kIpOffSrcIP)
<< " > " << RethTools::IpAddr2String(Buf8()+kElength+kIpOffDstIP)
<< ": " << RosPrintf(ipsrc.c_str(),"-s", 15)
<< " > " << RosPrintf(ipdst.c_str(),"-s", 15)
<< " siz: " << RosPrintf(tlen,"d", 4);
if (flags & 0x04) sos << " DF";
if (flags & 0x08) sos << " MF";

View File

@@ -1,9 +1,10 @@
// $Id: RethBuf.hpp 1378 2023-02-23 10:45:17Z mueller $
// $Id: RethBuf.hpp 1379 2023-02-24 09:17:23Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2017-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// Revision History:
// Date Rev Version Comment
// 2023-02-24 1379 1.1.1 add copy constructor
// 2023-02-22 1378 1.1 improved Info/Dump methods
// 2018-12-22 1091 1.0.1 Dump() not longer virtual (-Wnon-virtual-dtor fix)
// 2017-04-17 880 1.0 Initial version
@@ -30,6 +31,7 @@ namespace Retro {
typedef std::shared_ptr<RethBuf> pbuf_t;
RethBuf();
RethBuf(const RethBuf& src);
~RethBuf();
void Clear();

View File

@@ -1,9 +1,10 @@
// $Id: Rw11CntlDEUNA.cpp 1378 2023-02-23 10:45:17Z mueller $
// $Id: Rw11CntlDEUNA.cpp 1379 2023-02-24 09:17:23Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2014-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// Revision History:
// Date Rev Version Comment
// 2023-02-24 1379 0.6.2 add simulated tx and rx packet loss mechanism
// 2023-02-22 1378 0.6.1 use RethBuf::HeaderInfoAll
// 2023-02-21 1377 0.6 add EtherType filter
// 2023-02-20 1376 0.5.11 log transitions into and out of kStateRxPoll
@@ -226,6 +227,8 @@ Rw11CntlDEUNA::Rw11CntlDEUNA()
fMcastCnt(0),
fEtfEnable(false),
fEtfTrace(false),
fTxLoss(0.0),
fRxLoss(0.0),
fPr0Last(0),
fPr1Pcto(false),
fPr1Delua(false),
@@ -248,7 +251,7 @@ Rw11CntlDEUNA::Rw11CntlDEUNA()
fRxDscCur{},
fRxDscNxt{},
fRxPollTime(0.01),
fRxQueLimit(1000),
fRxQueLimit(64),
fRxPollTimer("Rw11CntlDEUNA::fRxPollTimer."),
fRxBufQueue(),
fRxBufCurr(),
@@ -265,7 +268,9 @@ Rw11CntlDEUNA::Rw11CntlDEUNA()
fCtrTxByt(0),
fCtrTxBytMcast(0),
fCtrTxFraAbort(0),
fCtrFraLoop(0)
fCtrFraLoop(0),
fRanEngine(),
fRanGen(0.0,1.0)
{
// must be here because Units have a back-ptr (not available at Rw11CntlBase)
fspUnit[0].reset(new Rw11UnitDEUNA(this, 0)); // single unit controller
@@ -314,6 +319,7 @@ Rw11CntlDEUNA::Rw11CntlDEUNA()
fStats.Define(kStatNRxFraQLDrop, "NRxFraQLDrop", "in frames drop queue lim");
fStats.Define(kStatNRxFraNRDrop, "NRxFraNRDrop", "in frames drop not running");
fStats.Define(kStatNRxFraETDrop, "NRxFraETDrop", "in frames drop etf miss");
fStats.Define(kStatNRxFraLoss, "NRxFraLoss", "in frames loss");
fStats.Define(kStatNRxFra , "NRxFra" , "rcvd frames");
fStats.Define(kStatNRxFraMcast , "NRxFraMcast" , "rcvd bcast+mcast frames");
fStats.Define(kStatNRxFraBcast , "NRxFraBcast" , "rcvd bcast frames");
@@ -329,6 +335,7 @@ Rw11CntlDEUNA::Rw11CntlDEUNA()
fStats.Define(kStatNTxBytMcast , "NTxBytMcast" , "xmit mcast bytes");
fStats.Define(kStatNTxFraAbort , "NTxFraAbort" , "xmit aborted frames");
fStats.Define(kStatNTxFraPad , "NTxFraPad" , "xmit padded frames");
fStats.Define(kStatNTxFraLoss, "NTxFraLoss", "xmit frames loss");
fStats.Define(kStatNFraLoop , "NFraLoop" , "loopback frames");
}
@@ -489,6 +496,30 @@ void Rw11CntlDEUNA::SetRxQueLimit(size_t rxqlim)
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void Rw11CntlDEUNA::SetTxLoss(float txloss)
{
if (txloss < 0.0 || txloss > 0.9)
throw Rexception("Rw11CntlDEUNA::SetTxLoss",
string("Bad args: not in [0.0,0.9]"));
fTxLoss = txloss;
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void Rw11CntlDEUNA::SetRxLoss(float rxloss)
{
if (rxloss < 0.0 || rxloss > 0.9)
throw Rexception("Rw11CntlDEUNA::SetRxLoss",
string("Bad args: not in [0.0,0.9]"));
fRxLoss = rxloss;
return;
}
//--------------------------------------+-----------------------------------
//! FIXME_docs
@@ -570,6 +601,19 @@ bool Rw11CntlDEUNA::RcvCallback(RethBuf::pbuf_t& pbuf)
}
}
if (fRxLoss > 0.0) { // rx loss enabled ?
float ran = fRanGen(fRanEngine);
if (ran < fRxLoss) { // simulated rx loss
fStats.Inc(kStatNRxFraLoss);
if (fTraceLevel>1) {
RlogMsg lmsg(LogFile());
lmsg << "-I " << Name() << ": rlo "
<< pbuf->HeaderInfoAll(fTraceLevel>2, 12) << endl;
}
return true;
}
}
uint64_t macdst = pbuf->MacDestination();
int matchdst = MacFilter(macdst);
@@ -669,6 +713,8 @@ void Rw11CntlDEUNA::Dump(std::ostream& os, int ind, const char* text,
}
os << bl << " fEtfEnable: " << RosPrintf(fEtfEnable) << endl;
os << bl << " fEtfTrace: " << RosPrintf(fEtfTrace) << endl;
os << bl << " fTxLoss: " << RosPrintf(fTxLoss,"f",5,3) << endl;
os << bl << " fRxLoss: " << RosPrintf(fRxLoss,"f",5,3) << endl;
os << bl << " fPr0Last*: " << RosPrintf(fPr0Last,"o0", 6) << endl;
os << bl << " fPr1*: "
@@ -1211,13 +1257,19 @@ bool Rw11CntlDEUNA::ExecGetcmd(RlinkCommandList& clist)
uint16_t txelen, rxelen;
uint16_t txsize, rxsize;
Wlist2UBAddrLen(&udb[0], txbase, txelen);
if (txbase & ~kUBA_M) return false;
txsize = udb[2];
if (txsize <= 1) return false;
Wlist2UBAddrLen(&udb[3], rxbase, rxelen);
if (rxbase & ~kUBA_M) return false;
rxsize = udb[5];
if (rxsize <= 1) return false;
if (txbase & ~kUBA_M || txsize <= 1 ||
rxbase & ~kUBA_M || rxsize <= 1) {
RlogMsg lmsg(LogFile());
lmsg << "-E " << Name() << ": bad WRF"
<< " txbase=" << RosPrintf(txbase,"o", 8)
<< " txsize=" << RosPrintf(txsize,"d", 2)
<< " rxbase=" << RosPrintf(rxbase,"o", 8)
<< " rxsize=" << RosPrintf(rxsize,"d", 2);
return false;
}
fRingValid = true;
fTxRingBase = txbase;
fTxRingELen = txelen;
@@ -1617,10 +1669,19 @@ int Rw11CntlDEUNA::TxRingHandler()
LogFrameInfo('t', fTxBuf); // log transmitted frame
if (unit.HasVirt()) { // attached ?
RerrMsg emsg;
unit.Virt().Snd(fTxBuf, emsg);
// FIXME_code: error handling
}
if (fTxLoss > 0.0 && fRanGen(fRanEngine) < fTxLoss) { // tx loss enabled ?
fStats.Inc(kStatNTxFraLoss);
if (fTraceLevel>1) {
RlogMsg lmsg(LogFile());
lmsg << "-I " << Name() << ": tlo "
<< fTxBuf.HeaderInfoAll(fTraceLevel>2, 12) << endl;
}
} else {
RerrMsg emsg;
unit.Virt().Snd(fTxBuf, emsg);
// FIXME_code: error handling
}
}
LogRingInfo('t','>'); // log final ring dsc state
Server().Exec(clist);

View File

@@ -1,9 +1,10 @@
// $Id: Rw11CntlDEUNA.hpp 1377 2023-02-21 10:05:30Z mueller $
// $Id: Rw11CntlDEUNA.hpp 1379 2023-02-24 09:17:23Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2014-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// Revision History:
// Date Rev Version Comment
// 2023-02-24 1379 0.6.1 add simulated tx and rx packet loss mechanism
// 2023-02-21 1377 0.6 add EtherType filter
// 2017-04-14 875 0.5 Initial version (minimal functions, 211bsd ready)
// 2014-06-09 561 0.1 First draft
@@ -18,6 +19,7 @@
#define included_Retro_Rw11CntlDEUNA 1
#include <deque>
#include <random>
#include "librtools/Rtime.hpp"
#include "librtools/RtimerFd.hpp"
@@ -47,12 +49,16 @@ namespace Retro {
void SetRxQueLimit(size_t rxqlim);
void SetEtfEnable(bool etfena);
void SetEtfTrace(bool etftra);
void SetTxLoss(float txloss);
void SetRxLoss(float txloss);
std::string MacDefault() const;
const Rtime& RxPollTime() const;
size_t RxQueLimit() const;
bool EtfEnable() const;
bool EtfTrace() const;
float TxLoss() const;
float RxLoss() const;
bool Running() const;
@@ -248,6 +254,7 @@ namespace Retro {
kStatNRxFraQLDrop,
kStatNRxFraNRDrop,
kStatNRxFraETDrop,
kStatNRxFraLoss,
kStatNRxFra,
kStatNRxFraMcast,
kStatNRxFraBcast,
@@ -263,6 +270,7 @@ namespace Retro {
kStatNTxBytMcast,
kStatNTxFraAbort,
kStatNTxFraPad,
kStatNTxFraLoss,
kStatNFraLoop,
kDimStat
};
@@ -364,7 +372,9 @@ namespace Retro {
uint64_t fMacList[2+kDimMcast]; //!< MAC list:0=phys,1=bcast,2+=mcast
int fMcastCnt; //!< mcast count
bool fEtfEnable; //!< EtherType filter enable
bool fEtfTrace; //!< EtherType filter trave
bool fEtfTrace; //!< EtherType filter trace
float fTxLoss; //!< tx loss fraction
float fRxLoss; //!< rx loss fraction
uint16_t fPr0Last; //!< last pr0 value
bool fPr1Pcto; //!< pr1 pcto flag
bool fPr1Delua; //!< pr1 delua flag
@@ -405,6 +415,8 @@ namespace Retro {
uint32_t fCtrTxBytMcast; //!< ctr: xmit mcast bytes
uint32_t fCtrTxFraAbort; //!< ctr: xmit aborted frames
uint32_t fCtrFraLoop; //!< ctr: loopback frames
std::default_random_engine fRanEngine; //!< random engine
std::uniform_real_distribution<float> fRanGen; //!< random generator
};
} // end namespace Retro

View File

@@ -1,4 +1,4 @@
// $Id: Rw11CntlDEUNA.ipp 1377 2023-02-21 10:05:30Z mueller $
// $Id: Rw11CntlDEUNA.ipp 1379 2023-02-24 09:17:23Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2017-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -59,6 +59,20 @@ inline bool Rw11CntlDEUNA::EtfTrace() const
return fEtfTrace;
}
//--------------------------------------+-----------------------------------
//! FIXME_docs
inline float Rw11CntlDEUNA::TxLoss() const
{
return fTxLoss;
}
//--------------------------------------+-----------------------------------
//! FIXME_docs
inline float Rw11CntlDEUNA::RxLoss() const
{
return fRxLoss;
}
//--------------------------------------+-----------------------------------
//! FIXME_docs
inline bool Rw11CntlDEUNA::Running() const

View File

@@ -1,9 +1,10 @@
// $Id: RtclRw11CntlDEUNA.cpp 1377 2023-02-21 10:05:30Z mueller $
// $Id: RtclRw11CntlDEUNA.cpp 1379 2023-02-24 09:17:23Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2014-2023 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// Revision History:
// Date Rev Version Comment
// 2023-02-24 1379 1.0.4 add simulated tx and rx packet loss mechanism
// 2023-02-21 1377 1.0.3 add EtherType filter
// 2019-02-23 1114 1.0.2 use std::bind instead of lambda
// 2018-12-15 1082 1.0.1 use lambda instead of boost::bind
@@ -47,6 +48,8 @@ RtclRw11CntlDEUNA::RtclRw11CntlDEUNA()
fGets.Add<size_t> ("rxqlim", bind(&Rw11CntlDEUNA::RxQueLimit, pobj));
fGets.Add<bool> ("etfena", bind(&Rw11CntlDEUNA::EtfEnable, pobj));
fGets.Add<bool> ("etftra", bind(&Rw11CntlDEUNA::EtfTrace, pobj));
fGets.Add<float> ("txloss", bind(&Rw11CntlDEUNA::TxLoss, pobj));
fGets.Add<float> ("rxloss", bind(&Rw11CntlDEUNA::RxLoss, pobj));
fGets.Add<bool> ("run", bind(&Rw11CntlDEUNA::Running, pobj));
fSets.Add<const string&> ("type",
@@ -61,6 +64,10 @@ RtclRw11CntlDEUNA::RtclRw11CntlDEUNA()
bind(&Rw11CntlDEUNA::SetEtfEnable,pobj, _1));
fSets.Add<bool> ("etftra",
bind(&Rw11CntlDEUNA::SetEtfTrace,pobj, _1));
fSets.Add<float> ("txloss",
bind(&Rw11CntlDEUNA::SetTxLoss,pobj, _1));
fSets.Add<float> ("rxloss",
bind(&Rw11CntlDEUNA::SetRxLoss,pobj, _1));
}
//------------------------------------------+-----------------------------------