From bb61927fb1f08e9d7bb9ed993e1ebda61c2d925a Mon Sep 17 00:00:00 2001 From: wfjm Date: Tue, 21 Feb 2023 11:07:48 +0100 Subject: [PATCH] Rw11CntlDEUNA: add EtherType filter --- tools/src/librw11/Rw11CntlDEUNA.cpp | 47 +++++++++++++++++++--- tools/src/librw11/Rw11CntlDEUNA.hpp | 12 +++++- tools/src/librw11/Rw11CntlDEUNA.ipp | 37 +++++++++++++++-- tools/src/librwxxtpp/RtclRw11CntlDEUNA.cpp | 11 ++++- 4 files changed, 94 insertions(+), 13 deletions(-) diff --git a/tools/src/librw11/Rw11CntlDEUNA.cpp b/tools/src/librw11/Rw11CntlDEUNA.cpp index 7f7a9818..9c4a4703 100644 --- a/tools/src/librw11/Rw11CntlDEUNA.cpp +++ b/tools/src/librw11/Rw11CntlDEUNA.cpp @@ -1,9 +1,10 @@ -// $Id: Rw11CntlDEUNA.cpp 1376 2023-02-20 15:05:03Z mueller $ +// $Id: Rw11CntlDEUNA.cpp 1377 2023-02-21 10:05:30Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright 2014-2023 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2023-02-21 1377 0.6 add EtherType filter // 2023-02-20 1376 0.5.11 log transitions into and out of kStateRxPoll // 2019-06-15 1164 0.5.10 adapt to new RtimerFd API // 2019-04-19 1133 0.5.9 use ExecWibr() @@ -220,6 +221,10 @@ Rw11CntlDEUNA::Rw11CntlDEUNA() fRxRingSize(0), fRxRingELen(0), fMacDefault(RethTools::String2Mac("08:00:2b:00:00:00")), + fMacList{}, + fMcastCnt(0), + fEtfEnable(false), + fEtfTrace(false), fPr0Last(0), fPr1Pcto(false), fPr1Delua(false), @@ -246,7 +251,20 @@ Rw11CntlDEUNA::Rw11CntlDEUNA() fRxPollTimer("Rw11CntlDEUNA::fRxPollTimer."), fRxBufQueue(), fRxBufCurr(), - fRxBufOffset(0) + fRxBufOffset(0), + fCtrTimeCleared(), + fCtrRxFra(0), + fCtrRxFraMcast(0), + fCtrRxByt(0), + fCtrRxBytMcast(0), + fCtrRxFraLoInt(0), + fCtrRxFraLoBuf(0), + fCtrTxFra(0), + fCtrTxFraMcast(0), + fCtrTxByt(0), + fCtrTxBytMcast(0), + fCtrTxFraAbort(0), + fCtrFraLoop(0) { // must be here because Units have a back-ptr (not available at Rw11CntlBase) fspUnit[0].reset(new Rw11UnitDEUNA(this, 0)); // single unit controller @@ -292,8 +310,9 @@ Rw11CntlDEUNA::Rw11CntlDEUNA() fStats.Define(kStatNRxFraFProm , "NRxFraFProm" , "in frames promiscous"); fStats.Define(kStatNRxFraFUDrop, "NRxFraFUDrop", "in frames drop miss mac"); fStats.Define(kStatNRxFraFMDrop, "NRxFraFMDrop", "in frames drop miss mcast"); - fStats.Define(kStatNRxFraQLDrop, "NRxFraQLDrop", "in frames drop drop"); + 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(kStatNRxFra , "NRxFra" , "rcvd frames"); fStats.Define(kStatNRxFraMcast , "NRxFraMcast" , "rcvd bcast+mcast frames"); fStats.Define(kStatNRxFraBcast , "NRxFraBcast" , "rcvd bcast frames"); @@ -548,11 +567,25 @@ bool Rw11CntlDEUNA::RcvCallback(RethBuf::pbuf_t& pbuf) } if (fTraceLevel>1) { RlogMsg lmsg(LogFile()); - lmsg << "-I " << Name() << ": fdrop " << pbuf->FrameInfo() << endl; + lmsg << "-I " << Name() << ": fdr " << pbuf->FrameInfo() << endl; } return true; } } else { // matched + if (EtfEnable()) { // EtherType filer enabled ? + uint16_t etype = pbuf->Type(); + bool etfok = false; + etfok |= etype == 0x0800; // EtherType APV4 + etfok |= etype == 0x0806; // EtherType ARP + if (!etfok) { // drop by EtherType + fStats.Inc(kStatNRxFraETDrop); + if (fTraceLevel>1 && EtfTrace()) { + RlogMsg lmsg(LogFile()); + lmsg << "-I " << Name() << ": edr " << pbuf->FrameInfo() << endl; + } + return true; + } + } if (matchdst == 0) { fStats.Inc(kStatNRxFraFDst); } else if (matchdst == 1) { @@ -566,7 +599,7 @@ bool Rw11CntlDEUNA::RcvCallback(RethBuf::pbuf_t& pbuf) fStats.Inc(kStatNRxFraQLDrop); if (fTraceLevel>0) { RlogMsg lmsg(LogFile()); - lmsg << "-I " << Name() << ": qdrop " << pbuf->FrameInfo() << endl; + lmsg << "-I " << Name() << ": qdr " << pbuf->FrameInfo() << endl; } return true; } @@ -629,8 +662,10 @@ void Rw11CntlDEUNA::Dump(std::ostream& os, int ind, const char* text, << RosPrintf(fMacList[2+i],"x0",12) << " " << RethTools::Mac2String(fMacList[2+i]) << endl; } + os << bl << " fEtfEnable: " << RosPrintf(fEtfEnable) << endl; + os << bl << " fEtfTrace: " << RosPrintf(fEtfTrace) << endl; - os << bl << " fPr0Last*: " << RosPrintf(fPr0Last,"o0", 6) << endl; + os << bl << " fPr0Last*: " << RosPrintf(fPr0Last,"o0", 6) << endl; os << bl << " fPr1*: " << " Pcto=" << RosPrintf(fPr1Pcto) << " Delua=" << RosPrintf(fPr1Delua) diff --git a/tools/src/librw11/Rw11CntlDEUNA.hpp b/tools/src/librw11/Rw11CntlDEUNA.hpp index 433ac646..d8defc9c 100644 --- a/tools/src/librw11/Rw11CntlDEUNA.hpp +++ b/tools/src/librw11/Rw11CntlDEUNA.hpp @@ -1,9 +1,10 @@ -// $Id: Rw11CntlDEUNA.hpp 1376 2023-02-20 15:05:03Z mueller $ +// $Id: Rw11CntlDEUNA.hpp 1377 2023-02-21 10:05:30Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later -// Copyright 2014-2019 by Walter F.J. Mueller +// Copyright 2014-2023 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 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 // --------------------------------------------------------------------------- @@ -44,10 +45,14 @@ namespace Retro { void SetMacDefault(const std::string& mac); void SetRxPollTime(const Rtime& time); void SetRxQueLimit(size_t rxqlim); + void SetEtfEnable(bool etfena); + void SetEtfTrace(bool etftra); std::string MacDefault() const; const Rtime& RxPollTime() const; size_t RxQueLimit() const; + bool EtfEnable() const; + bool EtfTrace() const; bool Running() const; @@ -242,6 +247,7 @@ namespace Retro { kStatNRxFraFMDrop, kStatNRxFraQLDrop, kStatNRxFraNRDrop, + kStatNRxFraETDrop, kStatNRxFra, kStatNRxFraMcast, kStatNRxFraBcast, @@ -357,6 +363,8 @@ namespace Retro { uint64_t fMacDefault; //!< default MAC 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 uint16_t fPr0Last; //!< last pr0 value bool fPr1Pcto; //!< pr1 pcto flag bool fPr1Delua; //!< pr1 delua flag diff --git a/tools/src/librw11/Rw11CntlDEUNA.ipp b/tools/src/librw11/Rw11CntlDEUNA.ipp index ed2c7549..cf13f334 100644 --- a/tools/src/librw11/Rw11CntlDEUNA.ipp +++ b/tools/src/librw11/Rw11CntlDEUNA.ipp @@ -1,10 +1,11 @@ -// $Id: Rw11CntlDEUNA.ipp 1186 2019-07-12 17:49:59Z mueller $ +// $Id: Rw11CntlDEUNA.ipp 1377 2023-02-21 10:05:30Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later -// Copyright 2017- by Walter F.J. Mueller +// Copyright 2017-2023 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment -// 2017-02-25 856 1.0 Initial version +// 2023-02-21 1377 0.6 add EtherType filter +// 2017-02-25 856 0.5 Initial version // --------------------------------------------------------------------------- /*! @@ -14,6 +15,22 @@ // all method definitions in namespace Retro namespace Retro { +//--------------------------------------+----------------------------------- +//! FIXME_docs +inline void Rw11CntlDEUNA::SetEtfEnable(bool etfena) +{ + fEtfEnable = etfena; + return; +} + +//--------------------------------------+----------------------------------- +//! FIXME_docs +inline void Rw11CntlDEUNA::SetEtfTrace(bool etftra) +{ + fEtfTrace = etftra; + return; +} + //--------------------------------------+----------------------------------- //! FIXME_docs inline const Rtime& Rw11CntlDEUNA::RxPollTime() const @@ -28,6 +45,20 @@ inline size_t Rw11CntlDEUNA::RxQueLimit() const return fRxQueLimit; } +//--------------------------------------+----------------------------------- +//! FIXME_docs +inline bool Rw11CntlDEUNA::EtfEnable() const +{ + return fEtfEnable; +} + +//--------------------------------------+----------------------------------- +//! FIXME_docs +inline bool Rw11CntlDEUNA::EtfTrace() const +{ + return fEtfTrace; +} + //--------------------------------------+----------------------------------- //! FIXME_docs inline bool Rw11CntlDEUNA::Running() const diff --git a/tools/src/librwxxtpp/RtclRw11CntlDEUNA.cpp b/tools/src/librwxxtpp/RtclRw11CntlDEUNA.cpp index eb23664b..50551386 100644 --- a/tools/src/librwxxtpp/RtclRw11CntlDEUNA.cpp +++ b/tools/src/librwxxtpp/RtclRw11CntlDEUNA.cpp @@ -1,9 +1,10 @@ -// $Id: RtclRw11CntlDEUNA.cpp 1186 2019-07-12 17:49:59Z mueller $ +// $Id: RtclRw11CntlDEUNA.cpp 1377 2023-02-21 10:05:30Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later -// Copyright 2014-2019 by Walter F.J. Mueller +// Copyright 2014-2023 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 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 // 2017-04-16 878 1.0 Initial version @@ -44,6 +45,8 @@ RtclRw11CntlDEUNA::RtclRw11CntlDEUNA() fGets.Add ("dpa", bind(&Rw11CntlDEUNA::MacDefault, pobj)); fGets.Add ("rxpoll", bind(&Rw11CntlDEUNA::RxPollTime, pobj)); fGets.Add ("rxqlim", bind(&Rw11CntlDEUNA::RxQueLimit, pobj)); + fGets.Add ("etfena", bind(&Rw11CntlDEUNA::EtfEnable, pobj)); + fGets.Add ("etftra", bind(&Rw11CntlDEUNA::EtfTrace, pobj)); fGets.Add ("run", bind(&Rw11CntlDEUNA::Running, pobj)); fSets.Add ("type", @@ -54,6 +57,10 @@ RtclRw11CntlDEUNA::RtclRw11CntlDEUNA() bind(&Rw11CntlDEUNA::SetRxPollTime,pobj, _1)); fSets.Add ("rxqlim", bind(&Rw11CntlDEUNA::SetRxQueLimit,pobj, _1)); + fSets.Add ("etfena", + bind(&Rw11CntlDEUNA::SetEtfEnable,pobj, _1)); + fSets.Add ("etftra", + bind(&Rw11CntlDEUNA::SetEtfTrace,pobj, _1)); } //------------------------------------------+-----------------------------------