Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [START][2023-03-13 11:23:33] LSP logging initiated
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.022] clangd version 15.0.6 (https://github.com/llvm/llvm-project 088f33605d8a61ff519c580a71b1dd57d16a03f8)\nI[11:23:33.023] Features: linux+grpc\nI[11:23:33.023] PID: 12523\nI[11:23:33.023] Working directory: /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop\nI[11:23:33.023] argv[0]: clangd\nI[11:23:33.023] argv[1]: --log=verbose\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.024] User config file is /home/xenlauz/.config/clangd/config.yaml\nI[11:23:33.025] Starting LSP over stdin/stdout\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.027] <<< {"id":1,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"callHierarchy":{"dynamicRegistration":false},"offsetEncoding":["utf-8","utf-16"],"textDocument":{"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","Empty","QuickFix","Refactor","RefactorExtract","RefactorInline","RefactorRewrite","Source","SourceOrganizeImports","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"dataSupport":true,"dynamicRegistration":false,"isPreferredSupport":true,"resolveSupport":{"properties":["edit"]}},"completion":{"completionItem":{"commitCharactersSupport":false,"deprecatedSupport":false,"documentationFormat":["markdown","plaintext"],"preselectSupport":false,"snippetSupport":false},"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"contextSupport":false,"dynamicRegistration":false,"editsNearCursor":true},"declaration":{"linkSupport":true},"definition":{"linkSupport":true},"documentHighlight":{"dynamicRegistration":false},"documentSymbol":{"dynamicRegistration":false,"hierarchicalDocumentSymbolSupport":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}},"hover":{"contentFormat":["markdown","plaintext"],"dynamicRegistration":false},"implementation":{"linkSupport":true},"publishDiagnostics":{"relatedInformation":true,"tagSupport":{"valueSet":[1,2]}},"references":{"dynamicRegistration":false},"rename":{"dynamicRegistration":false,"prepareSupport":true},"signatureHelp":{"dynamicRegistration":false,"signatureInformation":{"activeParameterSupport":true,"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true}}},"synchronization":{"didSave":true,"dynamicRegistration":false,"willSave":false,"willSaveWaitUntil":false},"typeDefinition":{"linkSupport":true}},"window":{"showDocument":{"support":false},"showMessage":{"messageActionItem":{"additionalPropertiesSupport":false}},"workDoneProgress":true},"workspace":{"applyEdit":true,"configuration":true,"symbol":{"dynamicRegistration":false,"hierarchicalWorkspaceSymbolSupport":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}},"workspaceEdit":{"resourceOperations":["rename","create","delete"]},"workspaceFolders":true}},"clientInfo":{"name":"Neovim","version":"0.8.1"},"initializationOptions":{},"processId":12496,"rootPath":"/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop","rootUri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop","trace":"off","workspaceFolders":[{"name":"/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop","uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop"}]}}\n\nI[11:23:33.027] <-- initialize(1)\nI[11:23:33.032] --> reply:initialize(1) 5 ms\nV[11:23:33.033] >>> {"id":1,"jsonrpc":"2.0","result":{"capabilities":{"astProvider":true,"callHierarchyProvider":true,"clangdInlayHintsProvider":true,"codeActionProvider":{"codeActionKinds":["quickfix","refactor","info"]},"compilationDatabase":{"automaticReload":true},"completionProvider":{"resolveProvider":false,"triggerCharacters":[".","<",">",":","\\"","/","*"]},"declarationProvider":true,"definitionProvider":true,"documentFormattingProvider":true,"documentHighlightProvider":true,"documentLinkProvider":{"resolveProvider":false},"documentOnTypeFormattingProvider":{"firstTriggerCharacter":"\\n","moreTriggerCharacter":[]},"documentRangeFormattingProvider":true,"documentSymbolProvider":true,"executeCommandProvider":{"commands":["clangd.applyFix","clangd.applyTweak"]},"hoverProvider":true,"implementationProvider":true,"inlayHintProvider":true,"memoryUsageProvider":true,"referencesProvider":true,"renameProvider":{"prepareProvider":true},"selectionRangeProvider":true,"semanticTokensProvider":{"full":{"delta":true},"legend":{"tokenModifiers":["declaration","deprecated","deduced","readonly","static","abstract","virtual","dependentName","defaultLibrary","usedAsMutableReference","functionScope","classScope","fileScope","globalScope"],"tokenTypes":["variable","variable","parameter","function","method","function","property","variable","class","interface","enum","enumMember","type","type","unknown","namespace","typeParameter","concept","type","macro","comment"]},"range":false},"signatureHelpProvider":{"triggerCharacters":["(",")","{","}","<",">",","]},"standardTypeHierarchyProvider":true,"textDocumentSync":{"change":2,"openClose":true,"save":true},"typeDefinitionProvider":true,"typeHierarchyProvider":true,"workspaceSymbolProvider":true},"offsetEncoding":"utf-8","serverInfo":{"name":"clangd","version":"clangd version 15.0.6 (https://github.com/llvm/llvm-project 088f33605d8a61ff519c580a71b1dd57d16a03f8) linux+grpc x86_64-unknown-linux-gnu"}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.078] <<< {"jsonrpc":"2.0","method":"initialized","params":{}}\n\nI[11:23:33.078] <-- initialized\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.083] <<< {\"jsonrpc\":\"2.0\",\"method\":\"textDocument/didOpen\",\"params\":{\"textDocument\":{\"languageId\":\"cpp\",\"text\":\"//======================================================================================================================\\n//! @file main.cpp\\n//! @author Žiga Lausegger ([email protected])\\n//! @author Urban Križman ([email protected])\\n//! @date 2023-23-01\\n//! @brief Testing of ethernet over SPI driver for KSZ8851SNL.\\n//! @copyright Copyright (c) SICK AG\\n//======================================================================================================================\\n\\n\\n// ------ Includes ---------------------------------------------------------------------------------------------------\\n////#include \\\"Ksz8851snlDriverTests.h\\\"\\n\\n#include <euler/driver/ResultCode.h>\\n#include <euler/driver/ethernet/IEthernetDriver.h>\\n#include <euler/driver/gpio/IGpioDriver.h>\\n#include <euler/threading/Signal.h>\\n#include <euler/threading/Timeout.h>\\n\\n#include <vector>\\n#include <cstdint>\\n#include <iostream>\\n#include <string>\\n#include <ios>\\n#include <iomanip>\\n#include <algorithm>\\n#include <utility>\\n#include <cmsis_os2.h>\\n\\n\\n// ------ Namespaces---------------------------------------------------------------------------------------------------\\nnamespace euler\\n{\\nnamespace driver\\n{\\nnamespace ethernet\\n{\\n\\n\\n// ------ Forward declarations --------------------------------------------------------------------------------------\\nvoid runTests(IBase_latest*, gpio::IBase_latest*);\\nbool resetTarget(gpio::IBase_latest*);\\nvoid a1TestReset(IBase_latest*, gpio::IBase_latest*);\\nvoid b1TestUnicastAddress(IBase_latest*);\\nvoid b2TestMulticastAddress(IBase_latest*);\\nvoid b3TestBroadcastAddress(IBase_latest*);\\nvoid b4TestNoAddress(IBase_latest*);\\nvoid b5TestHardwareAddress(IBase_latest*);\\nvoid c1TestLoopbackLinkStates(IBase_latest*);\\nvoid d1TestSingleBufferBlockingTxRx(IBase_latest*);\\nvoid d2TestMultiBufferBlockingTxRx(IBase_latest*);\\nvoid e1TestSingleBufferNonblockingTxRxSignals(IBase_latest*);\\nvoid e2TestSingleBufferNonblockingInterruptSignal(IBase_latest*);\\nvoid e3TestSingleBufferNonblockingTxRx(IBase_latest*);\\nvoid e4TestMultiBufferNonblockingTxRx(IBase_latest*);\\nvoid f1TestNonblockingTxFramesTooLarge(IBase_latest*);\\nvoid f2TestNonblockingTxOfFramesTooBig(IBase_latest*);\\nvoid f3TestBlockingErrorOnBuffDescTooSmall(IBase_latest*);\\nvoid f4TestNonblockingErrorOnBuffDescTooSmall(IBase_latest*);\\nvoid f5TestNullptrAsBuffDesc(IBase_latest*);\\nvoid f6TestBufferDescWithLengthAndWithoutpData(IBase_latest*);\\nvoid f7TestMultiBufferDescWithLengthAndWithoutpData(IBase_latest*);\\nvoid f8TestBufferDescWithpDataAndWithoutLength(IBase_latest*);\\nvoid f9TestMultiBufferDescWithpDataAndWithoutLength(IBase_latest*);\\nvoid f10TestMultiBufferDescInCircularFormation(IBase_latest*);\\nvoid f11TestCallNonblockingFuncBeforeTxComplete(IBase_latest*);\\nvoid f12TestCallNonblockingFuncBeforeRxComplete(IBase_latest*);\\nvoid f13TestTxBufferFull(IBase_latest*);\\nvoid g1TestFiltering(IBase_latest*);\\nvoid g2TestCrcLevel2(IBase_latest*);\\nvoid g3TestCrcLevel3And4(IBase_latest*);\\nvoid printMacAddress(std::string, MacAddress&);\\nbool areMacAddrEqual(MacAddress&, MacAddress&);\\nbool flagTimeout(bool&, const uint32_t);\\nstd::string convertResultCode2Str(ResultCode);\\nstd::string convertInterrupt2Str(Interrupt);\\nint waitForAvailableFrames(IBase_latest*);\\nint compareBufferDescriptors(BufferDescriptor, BufferDescriptor);\\nvoid populateBuffer(BufferDescriptor&, int);\\n\\n\\n// ------ Globals ----------------------------------------------------------------------------------------------------\\n// TX buffer where data for transmission will be and empty RX buffer. Hardware TX buffer is 6 kiB and RX buffer is\\n// 12 kiB, but because standards limit us to sending max 2000 B frames and KSZ8851SNL ethernet driver also needs to add\\n// 4 dummy bytes at the front of these 2000 B so we are left with 1996 B that we can send while we can receive 2000 B.\\nconstexpr int g_kTxLimit1{1996};\\nstatic std::array<uint8_t, g_kTxLimit1> g_txBuffer{0};\\nconstexpr int g_kTxLimit4{499};\\nstatic std::array<uint8_t, g_kTxLimit4> g_txBufferA{0};\\nstatic std::array<uint8_t, g_kTxLimit4> g_txBufferB{0};\\nstatic std::array<uint8_t, g_kTxLimit4> g_txBufferC{0};\\nstatic std::array<uint8_t, g_kTxLimit4> g_txBufferD{0};\\nconstexpr int g_kRxLimit1{2000};\\nstatic std::array<uint8_t, g_kRxLimit1> g_rxBuffer{0};\\nconstexpr int g_kRxLimit4{500};\\nstatic std::array<uint8_t, g_kRxLimit4> g_rxBufferA{0};\\nstatic std::array<uint8_t, g_kRxLimit4> g_rxBufferB{0};\\nstatic std::array<uint8_t, g_kRxLimit4> g_rxBufferC{0};\\nstatic std::array<uint8_t, g_kRxLimit4> g_rxBufferD{0};\\n\\n\\n//======================================================================================================================\\n//! @brief C++ entry point. This function executes all other tests / functions. Some individual tests might\\n//! provoke driver to bring device in a state from which it can not resume. From this point on, all the\\n//! tests might fail To solve this device is reset before each test.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//! @param Pointer to the GPIO driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid runTests(IBase_latest* pEthDriver, gpio::IBase_latest* pResetDriver)\\n{\\n // Reset function test:\\n a1TestReset(pEthDriver, pResetDriver);\\n\\n // \\\"macAddress\\\" tests:\\n if(resetTarget(pResetDriver) == false) return;\\n b1TestUnicastAddress(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n b2TestMulticastAddress(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n b3TestBroadcastAddress(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n b4TestNoAddress(pEthDriver);\\n ////if(resetTarget(pResetDriver) == false) return;\\n ////b5TestHardwareAddress(pEthDriver);\\n\\n // Loopback tests:\\n if(resetTarget(pResetDriver) == false) return;\\n c1TestLoopbackLinkStates(pEthDriver);\\n\\n // Transmit & receive tests (blocking):\\n if(resetTarget(pResetDriver) == false) return;\\n d1TestSingleBufferBlockingTxRx(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n d2TestMultiBufferBlockingTxRx(pEthDriver);\\n\\n // Transmit & receive tests (non-blocking):\\n if(resetTarget(pResetDriver) == false) return;\\n e1TestSingleBufferNonblockingTxRxSignals(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n e2TestSingleBufferNonblockingInterruptSignal(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n e3TestSingleBufferNonblockingTxRx(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n e4TestMultiBufferNonblockingTxRx(pEthDriver);\\n\\n // Transmit & receive tests (stress tests):\\n if(resetTarget(pResetDriver) == false) return;\\n f13TestTxBufferFull(pEthDriver);\\n\\n // Transmit & receive tests (corner cases):\\n if(resetTarget(pResetDriver) == false) return;\\n f1TestNonblockingTxFramesTooLarge(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f2TestNonblockingTxOfFramesTooBig(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f3TestBlockingErrorOnBuffDescTooSmall(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f4TestNonblockingErrorOnBuffDescTooSmall(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f5TestNullptrAsBuffDesc(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f6TestBufferDescWithLengthAndWithoutpData(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f7TestMultiBufferDescWithLengthAndWithoutpData(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f8TestBufferDescWithpDataAndWithoutLength(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f9TestMultiBufferDescWithpDataAndWithoutLength(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f10TestMultiBufferDescInCircularFormation(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f11TestCallNonblockingFuncBeforeTxComplete(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n f12TestCallNonblockingFuncBeforeRxComplete(pEthDriver);\\n\\n // Filtering & CRC tests:\\n if(resetTarget(pResetDriver) == false) return;\\n g1TestFiltering(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n g2TestCrcLevel2(pEthDriver);\\n if(resetTarget(pResetDriver) == false) return;\\n g3TestCrcLevel3And4(pEthDriver);\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test transmits a frame over a loopback interface. When frame is received interrupt should be raised\\n//! and is detected using \\\"abiGetInterruptSignal()\\\". At this point target is reset which should disable the\\n//! loopback. We verify this by transmitting another frame & calling \\\"abiGetInterruptSignal()\\\" again. Test\\n//! passes if interrupt is detected for the first sent frame and is not detected for the second sent frame.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//! @param Pointer to the GPIO driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid a1TestReset(IBase_latest* pEthDriver, gpio::IBase_latest* pResetDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: a1TestReset()\\\\r\\\\n\\\"\\n << \\\"INFO: This test transmits a frame over a loopback interface. When\\\\r\\\\n\\\"\\n << \\\" frame is received interrupt should be raised and is detected\\\\r\\\\n\\\"\\n << \\\" using \\\\\\\"abiGetInterruptSignal()\\\\\\\". At this point target is\\\\r\\\\n\\\"\\n << \\\" reset which should disable the loopback. We verify this by\\\\r\\\\n\\\"\\n << \\\" transmitting another frame & calling \\\\\\\"abiGetInterruptSignal()\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" again. Test passes if interrupt is detected for the first sent\\\\r\\\\n\\\"\\n << \\\" frame and is not detected for the second sent frame.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool testIrq1 {true};\\n bool testIrq2 {true};\\n constexpr uint32_t timeout{100};\\n uint16_t pendingFrameNumber{0};\\n ResultCode returnValue {ResultCode::eOk};\\n bool irqFlag{false};\\n Interrupt irqFlagInterrupt{Interrupt::eReceive};\\n\\n // Construct an ethernet frame (broadcast in this case).\\n std::vector<uint8_t> frame{\\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, 0x08,\\n 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x74, 0xda, 0x38, 0xfe,\\n 0x28, 0x65, 0xc0, 0xa8, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,\\n 0xa8, 0x88, 0x01\\n };\\n\\n // Copy frame to g_txBuffer.\\n std::copy(frame.begin(), frame.end(), g_txBuffer.begin());\\n\\n // Create TX buffer descriptor (TX buffer descriptor's size equals frame size).\\n BufferDescriptor txBuffDesc{\\n .pData = g_txBuffer.data(),\\n .length = frame.size()\\n };\\n\\n // Create ethernet configuration and use it to initialize the driver.\\n EthernetConfig ethConfig{\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .loopbackMode = Loopback::eLocal\\n };\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n auto irqBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetInterruptSignal(),\\n [&](euler::driver::ethernet::Interrupt interrupt)\\n {\\n if (Interrupt::eReceive == interrupt)\\n {\\n irqFlagInterrupt = interrupt;\\n irqFlag = true;\\n }\\n }\\n );\\n\\n // Transmit one or more frames with a timeout between them and a visual feedback.\\n auto transmitFramesWithFeedback = [&](const uint32_t timeout, const uint32_t framesCount)\\n {\\n // Send \\\"framesCount\\\" frames.\\n for(uint8_t i = 0; i < framesCount; i ++)\\n {\\n // Timeout prevents \\\"eNotReady\\\" returnValue in next paragraph.\\n threading::Timeout t {std::chrono::milliseconds{timeout}};\\n while(1)\\n {\\n if(t.elapsed())\\n {\\n break;\\n }\\n }\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\";\\n }\\n }\\n };\\n\\n // Check whether \\\"flag\\\" will be successfully set during a timeout and print results.\\n auto checkIrqFlagWithFeedback = [&](const uint32_t timeout, bool& flag, bool& test)\\n {\\n if(flagTimeout(flag, timeout))\\n {\\n if(irqFlagInterrupt == Interrupt::eReceive)\\n {\\n test = true;\\n std::cout\\n << \\\" abiGetInterruptSignal(): interrupt \\\"\\n << convertInterrupt2Str(irqFlagInterrupt) << \\\" detected.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n test = false;\\n std::cout\\n << \\\" abiGetInterruptSignal(): interrupt \\\"\\n << convertInterrupt2Str(irqFlagInterrupt) << \\\" detected.\\\\r\\\\n\\\"\\n ;\\n }\\n }\\n else\\n {\\n test = false;\\n std::cout << \\\" abiGetInterruptSignal(): interrupt not detected.\\\\r\\\\n\\\";\\n }\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pEthDriver->abiOpen(ethConfig);\\n\\n transmitFramesWithFeedback(timeout, 1);\\n checkIrqFlagWithFeedback(timeout, irqFlag, testIrq1);\\n std::cout << \\\" resetTarget() called.\\\\r\\\\n\\\";\\n resetTarget(pResetDriver);\\n transmitFramesWithFeedback(timeout, 1);\\n checkIrqFlagWithFeedback(timeout, irqFlag, testIrq2);\\n\\n pEthDriver->abiClose();\\n\\n if(testIrq1 != testIrq2){\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: RESET was successful (interrupt was cleared).\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: RESET was not successful (interrupt was not cleared).\\\\r\\\\n\\\"\\n ;\\n }\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function sets 3 \\\"unicast\\\" MAC address. It then iterates over the MAC addresses and (a) uses each\\n//! one to initialize KSZ8851SNL driver, (b) read back the set MAC address and (c) verify the MAC address.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid b1TestUnicastAddress(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: b1TestUnicastAddress()\\\\r\\\\n\\\"\\n << \\\"INFO: This test uses \\\\\\\"software\\\\\\\" to set 3 \\\\\\\"unicast\\\\\\\" MAC addresses and\\\\r\\\\n\\\"\\n << \\\" verifies them by reading them and printing them afterwards.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool equal = true;\\n ResultCode returnValue {ResultCode::eOk};\\n std::vector<MacAddress> macAddressVector;\\n MacAddress macAddressOut {};\\n\\n // Put 3 \\\"MacAddress\\\" structures containing \\\"unicast\\\" address into the std::vector.\\n macAddressVector.push_back(\\n MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00}\\n );\\n macAddressVector.push_back(\\n MacAddress{\\n .byte0 = 0xF0,\\n .byte1 = 0x11,\\n .byte2 = 0x22,\\n .byte3 = 0x33,\\n .byte4 = 0x44,\\n .byte5 = 0x00\\n }\\n );\\n macAddressVector.push_back(\\n MacAddress{\\n .byte0 = 0x10,\\n .byte1 = 0x23,\\n .byte2 = 0x45,\\n .byte3 = 0x67,\\n .byte4 = 0x89,\\n .byte5 = 0xAB\\n }\\n );\\n\\n // Iterate over all the elements in the std::vector.\\n for(auto macAddressIn: macAddressVector)\\n {\\n // Prepare the driver configuration\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = macAddressIn\\n };\\n\\n // Initialize the driver with the configuration, read the MAC and close.\\n returnValue = pEthDriver->abiOpen(config);\\n\\n // Check whether driver initialization was successful.\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Driver initialization failed with status \\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC can only be assigned a single \\\\\\\"unicast\\\\\\\" address.\\\\r\\\\n\\\"\\n ;\\n\\n pEthDriver->abiClose();\\n return;\\n }\\n\\n macAddressOut = pEthDriver->abiSpecific()->abiGetMacAddress();\\n pEthDriver->abiClose();\\n\\n printMacAddress(\\\"(software set)\\\", macAddressOut);\\n equal = equal && areMacAddrEqual(\\n macAddressIn,\\n macAddressOut\\n );\\n }\\n\\n if(equal == 1)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: NIC setup succeeded with all tested \\\\\\\"unicast\\\\\\\" MAC addresses.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: NIC setup failed with some tested \\\\\\\"unicast\\\\\\\" MAC addresses.\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC can only be assigned a \\\\\\\"unicast\\\\\\\" address.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function sets a \\\"multicast\\\" MAC address and tries to initialize KSZ8851SNL driver with it\\n//! (initialization should fail).\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid b2TestMulticastAddress(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: b2TestMulticastAddress()\\\\r\\\\n\\\"\\n << \\\"INFO: This test uses \\\\\\\"software\\\\\\\" to set a \\\\\\\"multicast\\\\\\\" MAC address and \\\\r\\\\n\\\"\\n << \\\" verifies that this address fails to initialize the driver.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n // Initialize variables together with a \\\"multicast\\\" MAC address.\\n ResultCode returnValue {ResultCode::eOk};\\n MacAddress macAddressIn {\\n .byte0 = 0x01,\\n .byte1 = 0x00,\\n .byte2 = 0x5e,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x01\\n };\\n\\n // Prepare the driver configuration\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = macAddressIn\\n };\\n\\n // Initialize the driver with the configuration.\\n returnValue = pEthDriver->abiOpen(config);\\n\\n // Check whether driver initialization was successful.\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout\\n << \\\"PASS: Driver initialization failed with \\\\\\\"multicast\\\\\\\" MAC address.\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC can only be assigned a single \\\\\\\"unicast\\\\\\\" address.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\"FAIL: Driver initialization failed.\\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC can only be assigned a single \\\\\\\"unicast\\\\\\\" address.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n // Destroy the driver object.\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function sets a \\\"broadcast\\\" MAC address and tries to initialize KSZ8851SNL driver with it\\n//! (initialization should fail).\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid b3TestBroadcastAddress(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: b3TestBroadcastAddress()\\\\r\\\\n\\\"\\n << \\\"INFO: This test uses \\\\\\\"software\\\\\\\" to set a \\\\\\\"broadcast\\\\\\\" MAC address and\\\\r\\\\n\\\"\\n << \\\" verifies that this address fails to initialize the driver.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n // Initialize variables together with a \\\"broadcast\\\" MAC address.\\n ResultCode returnValue {ResultCode::eOk};\\n MacAddress macAddressIn {\\n .byte0 = 0xff,\\n .byte1 = 0xff,\\n .byte2 = 0xff,\\n .byte3 = 0xff,\\n .byte4 = 0xff,\\n .byte5 = 0xff\\n };\\n\\n // Prepare the driver configuration\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = macAddressIn\\n };\\n\\n // Initialize the driver with the configuration.\\n returnValue = pEthDriver->abiOpen(config);\\n\\n // Check whether driver initialization was successful.\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout\\n << \\\"PASS: Driver initialization failed with \\\\\\\"broadcast\\\\\\\" MAC address.\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC can only be assigned a single \\\\\\\"unicast\\\\\\\" address.\\\\r\\\\n\\\"\\n ;\\n }\\n else if(returnValue == ResultCode::eOk)\\n {\\n std::cout\\n << \\\"FAIL: Driver initialization succeeded while it should have failed.\\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\"FAIL: Driver initialization failed.\\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC can only be assigned a single \\\\\\\"unicast\\\\\\\" address.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n // Destroy the driver object.\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function intentionally forgets to set the \\\"EthernetConfig\\\" member \\\"macAddress\\\" and tries to\\n//! initialize the KSZ8851SNL driver (initialization should fail).\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid b4TestNoAddress(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: b4TestNoAddress()\\\\r\\\\n\\\"\\n << \\\"INFO: This test uses \\\\\\\"software\\\\\\\" to set \\\\\\\"no\\\\\\\" MAC address and verifies\\\\r\\\\n\\\"\\n << \\\" that configuration fails to initialize the driver.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n // Initialize variables.\\n bool equal = false;\\n ResultCode returnValue {ResultCode::eOk};\\n\\n // Prepare the driver configuration\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware\\n // NOTE: .macAddress intentionally not set here.\\n };\\n\\n // Initialize the driver with the configuration.\\n returnValue = pEthDriver->abiOpen(config);\\n\\n // Check whether driver initialization was successful.\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout\\n << \\\"PASS: Driver initialization failed without \\\\\\\"macAddress\\\\\\\" member.\\\\r\\\\n\\\"\\n ;\\n }\\n else if(returnValue == ResultCode::eOk)\\n {\\n std::cout\\n << \\\"FAIL: Driver initialization succeeded while it should have failed.\\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\"FAIL: Driver initialization failed.\\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n\\n // Destroy the driver object.\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function assumes that (a) pin EED_IO is high during reset, (b) external EEPROM is connected to the\\n//! KSZ8851SNL, (c) EEPROM is set to work with 16-bit words, (d) \\\"unicast\\\" MAC address is hardcoded in first\\n//! four 16-bit words of the EEPROM. If all assumptions are correct, KSZ8851SNL should automatically setup\\n//! NIC with the hardcoded \\\"unicast\\\" MAC address after the reset and this function should be able to\\n//! successfully read it. KSZ8851SNL has no hardware mechanism to check whether MAC address was successfully\\n//! latched from EEPROM to the 3 non-volatile (!) registers MARL, MARM and MARH. To find this out function\\n//! A: first sets MAC address 3 registers using software, then B: sets MAC address in 3 registers using\\n//! EEPROM and finally C: compares both read MAC addresses.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid b5TestHardwareAddress(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: b5TestHardwareAddress()\\\\r\\\\n\\\"\\n << \\\"INFO: Test uses \\\\\\\"software\\\\\\\" to set a \\\\\\\"unicast\\\\\\\" MAC address. Then it \\\\r\\\\n\\\"\\n << \\\" tries to set a different \\\\\\\"unicast\\\\\\\" MAC address using \\\\\\\"hardware\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" (EEPROM). If EEPROM is properly configured MAC should change.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n // Initialize variables together with a \\\"unicast\\\" MAC address.\\n ResultCode returnValue {ResultCode::eOk};\\n EthernetConfig config {};\\n MacAddress macAddressOut1 {};\\n MacAddress macAddressOut2 {};\\n MacAddress macAddressIn {\\n .byte0 = 0x20,\\n .byte1 = 0x20,\\n .byte2 = 0x20,\\n .byte3 = 0x20,\\n .byte4 = 0x20,\\n .byte5 = 0x20\\n };\\n\\n // A: Prepare driver configuration where MAC address is set in software.\\n config.macConfigurationMode = MacConfiguration::eSoftware,\\n config.macAddress = macAddressIn;\\n\\n returnValue = pEthDriver->abiOpen(config);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\"FAIL: Driver initialization failed with \\\\\\\"software\\\\\\\" set MAC address.\\\\r\\\\n\\\"\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n\\n pEthDriver->abiClose();\\n return;\\n }\\n\\n macAddressOut1 = pEthDriver->abiSpecific()->abiGetMacAddress();\\n pEthDriver->abiClose();\\n\\n // B: Prepare driver configuration where hardcoded MAC address is read from EEPROM.\\n config.macConfigurationMode = MacConfiguration::eHardware;\\n\\n returnValue = pEthDriver->abiOpen(config);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout << \\\"FAIL: Driver initialization failed with \\\\\\\"hardware\\\\\\\" set MAC address.\\\\r\\\\n\\\";\\n\\n // EED_IO pin's low reset value results in \\\"abiOpen()\\\" returning \\\"ResultCode::eInvalidConfiguration\\\".\\n if(returnValue == ResultCode::eInvalidConfiguration)\\n {\\n std::cout\\n << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\"NOTE: EED_IO pin should be high on reset.\\\\r\\\\n\\\"\\n ;\\n\\n pEthDriver->abiClose();\\n return;\\n }\\n\\n std::cout << \\\"NOTE: abiOpen() returns \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n\\n pEthDriver->abiClose();\\n return;\\n }\\n\\n macAddressOut2 = pEthDriver->abiSpecific()->abiGetMacAddress();\\n pEthDriver->abiClose();\\n\\n // C: Compare the software and hardware set MAC addresses and conclude.\\n printMacAddress(\\\"(software set)\\\", macAddressOut1);\\n printMacAddress(\\\"(hardware set)\\\", macAddressOut2);\\n\\n if(areMacAddrEqual(macAddressOut1, macAddressOut2))\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: MAC addresses set by \\\\\\\"software\\\\\\\" and \\\\\\\"hardware\\\\\\\" are equal.\\\\r\\\\n\\\"\\n << \\\"NOTE: Missing EEPROM results in previous MAC address being assigned.\\\\r\\\\n\\\"\\n << \\\"NOTE: EEPROM MAC address should be in \\\\\\\"unicast\\\\\\\" format.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: MAC addresses set by \\\\\\\"software\\\\\\\" and \\\\\\\"hardware\\\\\\\" differ.\\\\r\\\\n\\\"\\n << \\\"NOTE: NIC setup succeeded with \\\\\\\"hardware\\\\\\\" EEPROM MAC addresses.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function configures driver with three loopback modes (eNone, eRemote, eLocal) and checks \\\"link\\n//! state\\\" (LS) for each mode. In eLocal mode LS should always be up. In eRemote mode LS depends on the\\n//! settings of the device at the other end. In eNone mode LS should be up if (a) cable is connected and\\n//! (b) device at other end is operational. Otherwise LS is down.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid c1TestLoopbackLinkStates(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: c1TestLoopbackLinkStates()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures driver with three loopback modes (eNone,\\\\r\\\\n\\\"\\n << \\\" eRemote, eLocal) and checks \\\\\\\"link state\\\\\\\" (LS) for each mode.\\\\r\\\\n\\\"\\n << \\\" In eLocal mode LS should always be up. In eRemote mode LS\\\\r\\\\n\\\"\\n << \\\" depends on the settings of the device at the other end. In\\\\r\\\\n\\\"\\n << \\\" eNone mode LS should be up if (a) cable is connected and (b)\\\\r\\\\n\\\"\\n << \\\" device at other end is operational. Otherwise LS is down.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n int pass1{};\\n int pass2{};\\n int pass3{};\\n\\n // ------ Lambda function ------------------------------------------------------------------------------------------\\n auto testLinkState = [pEthDriver] (Loopback lMode) -> bool\\n {\\n ResultCode returnValue {ResultCode::eOk};\\n const char* loopbackModeStr = \\\"\\\";\\n LinkState linkState {LinkState::eUp};\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .loopbackMode = lMode\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // \\\"Link state\\\" goes up in \\\"10 Mb/s\\\" ethernet when in some time interval the receiver detects a number of\\n // consecutive \\\"link pulses\\\" send by transmitter. It goes down when no \\\"link pulses\\\" are received in the same\\n // time interval [1, figure 12]. Delay is needed so that hardware has enough time to detect the \\\"link state\\\"\\n // and latch the state to the register bits P1MBSR[2], P1SR[5] [2].\\n // [1] ../../../doc/ksz8851snl/appnotes_01120a.pdf\\n // [2] ../../../doc/ksz8851snl/reference_manual.pdf\\n osDelay(5000);\\n\\n // NOTE: abiReadLinkState() is a nonblocking call.\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReadLinkState(linkState);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n\\n pEthDriver->abiClose();\\n\\n switch(lMode)\\n {\\n case Loopback::eNone:\\n loopbackModeStr = \\\"eNone\\\";\\n break;\\n case Loopback::eLocal:\\n loopbackModeStr = \\\"eLocal\\\";\\n break;\\n case Loopback::eRemote:\\n loopbackModeStr = \\\"eRemote\\\";\\n break;\\n }\\n\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" Mode: \\\" << std::setw(7) << std::setfill(' ') << loopbackModeStr\\n << \\\", abiReadLinkState() call failed with \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" Mode: \\\" << std::setw(7) << std::setfill(' ') << loopbackModeStr\\n << \\\", LS: \\\" << (linkState == LinkState::eUp) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n\\n return linkState == LinkState::eUp;\\n };\\n\\n // ------ Lambda function (end) ------------------------------------------------------------------------------------\\n\\n pass1 = testLinkState(Loopback::eNone);\\n pass2 = testLinkState(Loopback::eLocal);\\n pass3 = testLinkState(Loopback::eRemote);\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << ((pass1 && pass2) == 1\\n ?\\n \\\"PASS: LS as expected in all loopback modes.\\\\r\\\\n\\\"\\n :\\n \\\"FAIL: LS not as expected in one or more loopback modes.\\\\r\\\\n\\\"\\n \\\"NOTE: RJ45 cable should be connected to an operational device.\\\\r\\\\n\\\"\\n );\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test configures KSZ8851SNL with (a) loopback mode \\\"eLocal\\\" whose \\\"link state\\\" is always up and (b)\\n//! no address filtering, which means that no frames are discarded. Then it tries to transmit & receive\\n//! random data using \\\"blocking\\\" functions and a single buffer descriptor (<= 1996 B). Finally, it checks\\n//! whether transmitted & received data match.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid d1TestSingleBufferBlockingTxRx(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: d1TestSingleBufferBlockingTxRx()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures KSZ8851SNL with (a) loopback mode \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" whose \\\\\\\"link state\\\\\\\" is always up and (b) no address filtering,\\\\r\\\\n\\\"\\n << \\\" which means that no frames are discarded. Then it tries to\\\\r\\\\n\\\"\\n << \\\" transmit & receive random data using \\\\\\\"blocking\\\\\\\" functions and\\\\r\\\\n\\\"\\n << \\\" a single buffer descriptor (<= 1996 B). Finally, it checks \\\\r\\\\n\\\"\\n << \\\" whether transmitted & received data match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1{true};\\n bool pass2{true};\\n bool pass3{true};\\n bool pass4{true};\\n bool pass5{true};\\n bool pass6{true};\\n bool pass7{true};\\n bool pass8{true};\\n bool pass9{true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the data that can be received. This will not be\\n // changed.\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // ------ Lambda function ------------------------------------------------------------------------------------------\\n\\n auto testBufDesSize = [&] (int size, int seed) -> bool\\n {\\n int numberOfDiff {};\\n std::uint32_t timeout {1000};\\n ResultCode result {ResultCode::eOk};\\n\\n // Modify the length of the TX buffer descriptor. RX buffer descriptors length will be automatically modified\\n // upon receiving the data.\\n txBuffDesc.length = size;\\n\\n // Populate array at \\\"pData\\\" from \\\"BufferDescriptor\\\" with random values.\\n populateBuffer(txBuffDesc, seed);\\n\\n // Transmit the data.\\n result = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4) << size\\n << \\\" B: abiTransmitBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n waitForAvailableFrames(pEthDriver);\\n\\n // Receive the data.\\n result = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, timeout);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4) << size\\n <<\\\" B: abiReceiveBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == NULL)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4) << size\\n << \\\" B: RX data empty.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n numberOfDiff = compareBufferDescriptors(txBuffDesc, rxBuffDesc);\\n\\n // Check whether transmitted and received data is the same.\\n if(numberOfDiff != 0)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4) << size\\n << \\\" B: TX & RX data do not match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4) << size\\n << \\\" B: TX & RX data match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return true;\\n }\\n\\n };\\n\\n // ------ Lambda function (end) ------------------------------------------------------------------------------------\\n\\n pass1 = testBufDesSize(10, 1);\\n pass2 = testBufDesSize(50, 12);\\n pass3 = testBufDesSize(100, 123);\\n pass4 = testBufDesSize(500, 134);\\n pass5 = testBufDesSize(1000, 155);\\n pass6 = testBufDesSize(1500, 160);\\n pass7 = testBufDesSize(1750, 25);\\n pass8 = testBufDesSize(1996, 25);\\n pass9 = testBufDesSize(1997, 25);\\n\\n if(pass1 && pass2 && pass3 && pass4 && pass5 && pass6 && pass7 && pass8 && !pass9)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: TX & RX data matches in all cases (<= 1996 B).\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: TX & RX data does not match in all cases (<= 1996 B).\\\\r\\\\n\\\"\\n ;\\n\\n }\\n\\n pEthDriver->abiClose();\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test configures KSZ8851SNL with (a) loopback mode \\\"eLocal\\\" whose \\\"link state\\\" is always up and (b)\\n//! no address filtering, which means that no frames are discarded. Then it tries to transmit & receive\\n//! random data using \\\"blocking\\\" functions and multiple (4) buffer descriptors (together <= 1996 B).\\n//! Finally, it checks whether transmitted & received data match.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid d2TestMultiBufferBlockingTxRx(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: d2TestMultiBufferBlockingTxRx()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures KSZ8851SNL with (a) loopback mode \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" whose \\\\\\\"link state\\\\\\\" is always up and (b) no address filtering,\\\\r\\\\n\\\"\\n << \\\" which means that no frames are discarded. Then it tries to\\\\r\\\\n\\\"\\n << \\\" transmit & receive random data using \\\\\\\"blocking\\\\\\\" functions and\\\\r\\\\n\\\"\\n << \\\" multiple (4) buffer descriptors (together <= 1996 B). Finally,\\\\r\\\\n\\\"\\n << \\\" it checks whether transmitted & received data match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1{true};\\n bool pass2{true};\\n bool pass3{true};\\n bool pass4{true};\\n bool pass5{true};\\n bool pass6{true};\\n bool pass7{true};\\n bool pass8{true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // ------ Lambda function ------------------------------------------------------------------------------------------\\n\\n auto testMultBufDesSize = [&] (size_t frameLength, int seed) -> bool\\n {\\n\\n int numberOfDiff {};\\n ResultCode result {ResultCode::eOk};\\n\\n // 4 linked buffer descriptors are set.\\n BufferDescriptor txBuffDescD {\\n .pData = g_txBufferD.data(),\\n .length = frameLength,\\n .pNext = nullptr\\n };\\n BufferDescriptor txBuffDescC{\\n .pData = g_txBufferC.data(),\\n .length = frameLength,\\n .pNext = &txBuffDescD\\n };\\n BufferDescriptor txBuffDescB {\\n .pData = g_txBufferB.data(),\\n .length = frameLength,\\n .pNext = &txBuffDescC\\n };\\n BufferDescriptor txBuffDescA {\\n .pData = g_txBufferA.data(),\\n .length = frameLength,\\n .pNext = &txBuffDescB\\n };\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n result = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDescA, 1000);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ')<< std::setw(4)\\n << frameLength << \\\" B (x4): abiTransmitBlocking() call: \\\"\\n << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n waitForAvailableFrames(pEthDriver);\\n\\n result = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, 1000);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength <<\\\" B (x4): abiReceiveBlocking() call: \\\"\\n << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == NULL)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B (x4): RX data empty.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n numberOfDiff = compareBufferDescriptors(txBuffDescA, rxBuffDesc);\\n\\n // Check whether transmitted and received data is the same.\\n if(numberOfDiff != 0)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B (x4): TX & RX data do not match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B (x4): TX & RX data match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return true;\\n }\\n\\n };\\n\\n // ------ Lambda function (end) ------------------------------------------------------------------------------------\\n\\n pass1 = testMultBufDesSize(10, 23);\\n pass2 = testMultBufDesSize(50, 85);\\n pass3 = testMultBufDesSize(100, 84);\\n pass4 = testMultBufDesSize(200, 223);\\n pass5 = testMultBufDesSize(400, 31);\\n pass6 = testMultBufDesSize(450, 32);\\n pass7 = testMultBufDesSize(499, 33);\\n pass8 = testMultBufDesSize(500, 34);\\n\\n if (pass1 && pass2 && pass3 && pass4 && pass5 && pass6 && pass7 && !pass8)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: TX & RX data pieces (x4) match in all cases (<= 1996 B).\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: TX & RX data pieces (x4) do not match in all cases (<= 1996 B).\\\\r\\\\n\\\"\\n ;\\n\\n }\\n\\n pEthDriver->abiClose();\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief In \\\"eLocal\\\" loopback mode, a single \\\"broadcast\\\" frame is sent using \\\"abiTransmit()\\\". After this call we\\n//! test A: whether driver generates \\\"TX complete\\\" signal. Then B: we wait for indicator that a single frame\\n//! is ready to be read. Finally we C: read the frame using \\\"abiReceive()\\\" and check whether driver\\n//! generated \\\"RX complete\\\" signal.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid e1TestSingleBufferNonblockingTxRxSignals(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: e1TestSingleBufferNonblockingTxRxSignals()\\\\r\\\\n\\\"\\n << \\\"INFO: In \\\\\\\"eLocal\\\\\\\" loopback mode, a single \\\\\\\"broadcast\\\\\\\" frame is\\\\r\\\\n\\\"\\n << \\\" sent using \\\\\\\"abiTransmit()\\\\\\\". After this call we test whether\\\\r\\\\n\\\"\\n << \\\" driver generates \\\\\\\"TX complete\\\\\\\" signal. Then we wait for\\\\r\\\\n\\\"\\n << \\\" indicator that a single frame is ready to be read. Finally we\\\\r\\\\n\\\"\\n << \\\" read the frame using \\\\\\\"abiReceive()\\\\\\\" and check whether driver\\\\r\\\\n\\\"\\n << \\\" generated \\\\\\\"RX complete\\\\\\\" signal.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n constexpr uint32_t timeout{200};\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n bool txCompleteFlag{false};\\n ResultCode txCompleteStatus{ResultCode::eOk};\\n auto transmitCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetTransmitCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n txCompleteFlag = true;\\n txCompleteStatus = returnValue;\\n }\\n );\\n\\n // Call lambda function whenever signal indicating a receive complete is received. This lambda function simply sets\\n // a flag.\\n bool rxCompleteFlag{false};\\n ResultCode rxCompleteStatus{ResultCode::eOk};\\n auto receiveCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetReceiveCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n rxCompleteFlag = true;\\n rxCompleteStatus = returnValue;\\n }\\n );\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n // Construct an ethernet frame (broadcast in this case).\\n std::vector<uint8_t> frame {\\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, 0x08,\\n 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x74, 0xda, 0x38, 0xfe,\\n 0x28, 0x65, 0xc0, 0xa8, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,\\n 0xa8, 0x88, 0x01\\n };\\n\\n // Copy frame from it's first member till it's last member in the TX buffer.\\n std::copy(frame.begin(), frame.end(), g_txBuffer.begin());\\n\\n // Create TX & RX buffer descriptors (TX buffer descriptor's size equals frame size).\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = frame.size()\\n };\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size()\\n };\\n\\n // Create ethernet configuration and use it to initialize the driver.\\n EthernetConfig ethConfig {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .loopbackMode = Loopback::eLocal\\n };\\n pEthDriver->abiOpen(ethConfig);\\n\\n // Prepare for test.\\n bool testTx{true};\\n bool testRx{true};\\n\\n // Transmit frame.\\n ResultCode returnValue {ResultCode::eOk};\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout << \\\" abiTransmit() call failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit() call succeeded.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n // A: Check whether \\\"txCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(txCompleteFlag, timeout))\\n {\\n if(txCompleteStatus == ResultCode::eOk)\\n {\\n testTx = true;\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n testTx = false;\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n }\\n else\\n {\\n testTx = false;\\n std::cout << \\\" \\\\\\\"TX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\";\\n }\\n\\n // B: Wait until \\\"pendingFrameNumber\\\" is updated to the currently avail. RX frames.\\n uint16_t pendingFrameNumber{0};\\n while(\\n pEthDriver->abiSpecific()->abiReadAvailableFrameCount(pendingFrameNumber)\\n == ResultCode::eNotReady\\n );\\n std::cout << \\\" \\\" << pendingFrameNumber << \\\" frame(s) ready to be read.\\\\r\\\\n\\\";\\n\\n // Read frame.\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk){\\n std::cout << \\\" abiReceive() call failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\" abiReceive() call succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // C: Check whether \\\"rxCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(rxCompleteFlag, timeout))\\n {\\n if(rxCompleteStatus == ResultCode::eOk)\\n {\\n testRx = true;\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n testRx = false;\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n }\\n else\\n {\\n testRx = false;\\n std::cout << \\\" \\\\\\\"RX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\";\\n }\\n\\n // Print test returnValues.\\n if(testTx && testRx)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: \\\\\\\"RX complete\\\\\\\" & \\\\\\\"TX complete\\\\\\\" signals are responsive.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: \\\\\\\"RX complete\\\\\\\" & \\\\\\\"TX complete\\\\\\\" signals not responsive.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief Driver is initialized in \\\"eLocal\\\" loopback mode, and \\\"broadcast\\\" frame is created. Test iteratively (a)\\n//! sends frame with \\\"abiTransmit()\\\", (b) checks whether driver generates an interrupt and (c) clear the\\n//! interrupt by calling \\\"abiReadAvailableFrameCount()\\\". 2nd iteration does not clear the interrupt, so in\\n//! 3rd iteration interrupt should not happen.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid e2TestSingleBufferNonblockingInterruptSignal(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: e2TestSingleBufferNonblockingInterruptSignal()\\\\r\\\\n\\\"\\n << \\\"INFO: Driver is initialized in \\\\\\\"eLocal\\\\\\\" loopback mode, and\\\\r\\\\n\\\"\\n << \\\" \\\\\\\"broadcast\\\\\\\" frame is created. Test iteratively (a) sends\\\\r\\\\n\\\"\\n << \\\" frame with \\\\\\\"abiTransmit()\\\\\\\", (b) checks whether driver\\\\r\\\\n\\\"\\n << \\\" generates an interrupt and (c) clear the interrupt by\\\\r\\\\n\\\"\\n << \\\" calling abiReadAvailableFrameCount(). 2nd iteration does\\\\r\\\\n\\\"\\n << \\\" not clear the interrupt, so in 3rd iteration interrupt\\\\r\\\\n\\\"\\n << \\\" should not happen.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool testIrq1 {true};\\n bool testIrq2 {true};\\n bool testIrq3 {true};\\n bool testIrq4 {true};\\n constexpr uint32_t timeout{100};\\n uint16_t pendingFrameNumber{0};\\n ResultCode returnValue {ResultCode::eOk};\\n bool irqFlag{false};\\n Interrupt irqFlagInterrupt{Interrupt::eReceive};\\n\\n // Construct an ethernet frame (broadcast in this case).\\n std::vector<uint8_t> frame{\\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, 0x08,\\n 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x74, 0xda, 0x38, 0xfe,\\n 0x28, 0x65, 0xc0, 0xa8, 0x88, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,\\n 0xa8, 0x88, 0x01\\n };\\n\\n // Copy frame to g_txBuffer.\\n std::copy(frame.begin(), frame.end(), g_txBuffer.begin());\\n\\n // Create TX buffer descriptor (TX buffer descriptor's size equals frame size).\\n BufferDescriptor txBuffDesc{\\n .pData = g_txBuffer.data(),\\n .length = frame.size()\\n };\\n\\n // Create ethernet configuration and use it to initialize the driver.\\n EthernetConfig ethConfig{\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .loopbackMode = Loopback::eLocal\\n };\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n auto irqBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetInterruptSignal(),\\n [&](euler::driver::ethernet::Interrupt interrupt)\\n {\\n if (Interrupt::eReceive == interrupt)\\n {\\n irqFlagInterrupt = interrupt;\\n irqFlag = true;\\n }\\n }\\n );\\n\\n // Transmit one or more frames with a timeout between them and a visual feedback.\\n auto transmitFramesWithFeedback = [&](const uint32_t timeout, const uint32_t framesCount)\\n {\\n // Send \\\"framesCount\\\" frames.\\n for(uint8_t i = 0; i < framesCount; i ++)\\n {\\n // Timeout prevents \\\"eNotReady\\\" returnValue in next paragraph.\\n threading::Timeout t {std::chrono::milliseconds{timeout}};\\n while(1)\\n {\\n if(t.elapsed())\\n {\\n break;\\n }\\n }\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\";\\n }\\n }\\n };\\n\\n // Check whether \\\"flag\\\" will be successfully set during a timeout and print results.\\n auto checkIrqFlagWithFeedback = [&](const uint32_t timeout, bool& flag, bool& test)\\n {\\n if(flagTimeout(flag, timeout))\\n {\\n if(irqFlagInterrupt == Interrupt::eReceive)\\n {\\n test = true;\\n std::cout\\n << \\\" abiGetInterruptSignal(): interrupt \\\"\\n << convertInterrupt2Str(irqFlagInterrupt) << \\\" detected.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n test = false;\\n std::cout\\n << \\\" abiGetInterruptSignal(): interrupt \\\"\\n << convertInterrupt2Str(irqFlagInterrupt) << \\\" detected.\\\\r\\\\n\\\"\\n ;\\n }\\n }\\n else\\n {\\n test = false;\\n std::cout << \\\" abiGetInterruptSignal(): interrupt not detected.\\\\r\\\\n\\\";\\n }\\n };\\n\\n // Clear the interrupt by calling \\\"abiReadAvailableFrameCount()\\\" which also updates the currently available RX\\n // frames, i.e. \\\"pendingFrameNumber\\\".\\n auto clearIrqByReadingFrameCount = [&](uint16_t& pendingFrameNumber){\\n while(\\n pEthDriver->abiSpecific()->abiReadAvailableFrameCount(pendingFrameNumber)\\n == ResultCode::eNotReady\\n );\\n std::cout\\n << \\\" abiReadAvailableFrameCount(): pending frame(s): \\\" << pendingFrameNumber << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pEthDriver->abiOpen(ethConfig);\\n\\n // A: Transmit frame (1).\\n transmitFramesWithFeedback(timeout, 1);\\n checkIrqFlagWithFeedback(timeout, irqFlag, testIrq1);\\n clearIrqByReadingFrameCount(pendingFrameNumber);\\n\\n // B: Send additional frame (1).\\n transmitFramesWithFeedback(timeout, 1);\\n checkIrqFlagWithFeedback(timeout, irqFlag, testIrq2);"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "\\n std::cout\\n << \\\" abiReadAvailableFrameCount(): not called.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n // C: Transmit frame (1).\\n transmitFramesWithFeedback(timeout, 1);\\n checkIrqFlagWithFeedback(timeout, irqFlag, testIrq3);\\n clearIrqByReadingFrameCount(pendingFrameNumber);\\n\\n // D: Transmit additional frame (1).\\n transmitFramesWithFeedback(timeout, 1);\\n checkIrqFlagWithFeedback(timeout, irqFlag, testIrq4);\\n clearIrqByReadingFrameCount(pendingFrameNumber);\\n\\n pEthDriver->abiClose();\\n\\n if(testIrq1 && testIrq2 && !testIrq3 && testIrq4)\\n {\\n std::cout << \\\"PASS: Interrupt signals are responding as expected.\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\"FAIL: Interrupt signals are not responding as expected.\\\\r\\\\n\\\";\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test configures KSZ8851SNL with (a) loopback mode \\\"eLocal\\\" whose \\\"link state\\\" is always up and (b)\\n//! no address filtering, which means that no frames are discarded. Then it tries to transmit & receive\\n//! random data using \\\"nonblocking\\\" functions and a single buffer descriptor (<= 1996 B). Finally, it checks\\n//! whether transmitted & received data match.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid e3TestSingleBufferNonblockingTxRx(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: e3TestSingleBufferNonblockingTxRx()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures KSZ8851SNL with (a) loopback mode \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" whose \\\\\\\"link state\\\\\\\" is always up and (b) no address filtering,\\\\r\\\\n\\\"\\n << \\\" which means that no frames are discarded. Then it tries to\\\\r\\\\n\\\"\\n << \\\" transmit & receive random data using \\\\\\\"nonblocking\\\\\\\" functions\\\\r\\\\n\\\"\\n << \\\" and a single buffer descriptor (<= 1996 B). Finally, it checks \\\\r\\\\n\\\"\\n << \\\" whether transmitted & received data match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {true};\\n bool pass2 {true};\\n bool pass3 {true};\\n bool pass4 {true};\\n bool pass5 {true};\\n bool pass6 {true};\\n bool pass7 {true};\\n bool pass8 {true};\\n bool pass9 {true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Define a receive buffer descriptor - length is the length of the data that can be received. This will not be\\n // changed.\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n bool txCompleteFlag{false};\\n ResultCode txCompleteStatus{ResultCode::eOk};\\n auto transmitCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetTransmitCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n txCompleteFlag = true;\\n txCompleteStatus = returnValue;\\n }\\n );\\n\\n // Call lambda function whenever signal indicating a receive complete is received. This lambda function simply sets\\n // a flag.\\n bool rxCompleteFlag{false};\\n ResultCode rxCompleteStatus{ResultCode::eOk};\\n auto receiveCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetReceiveCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n rxCompleteFlag = true;\\n rxCompleteStatus = returnValue;\\n }\\n );\\n\\n auto fillBufferSendReceiveValidate = [&](int32_t frameLength, int32_t seed) -> bool\\n {\\n int numberOfDiff{0};\\n ResultCode returnValue {ResultCode::eOk};\\n constexpr uint32_t timeout{500};\\n uint16_t pendingFrameNumber{0};\\n\\n // Populate transmit buffer descriptor & adjust it's length.\\n populateBuffer(txBuffDesc, seed);\\n txBuffDesc.length = frameLength;\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // Check whether \\\"txCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(txCompleteFlag, timeout))\\n {\\n if(txCompleteStatus == ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n\\n // Wait until \\\"pendingFrameNumber\\\" is updated to the currently avail. RX frames.\\n while(\\n pEthDriver->abiSpecific()->abiReadAvailableFrameCount(pendingFrameNumber)\\n == ResultCode::eNotReady\\n );\\n std::cout << \\\" \\\" << pendingFrameNumber << \\\" frame(s) ready to be read.\\\\r\\\\n\\\";\\n\\n // Read frame.\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk){\\n std::cout\\n << \\\" abiReceive() call failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive() call succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // Check whether \\\"rxCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(rxCompleteFlag, timeout))\\n {\\n if(rxCompleteStatus == ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == NULL)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B: RX data empty.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n\\n // Check whether transmitted and received data is the same.\\n numberOfDiff = compareBufferDescriptors(txBuffDesc, rxBuffDesc);\\n if(numberOfDiff != 0)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B: TX & RX data do not match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B: TX & RX data match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return true;\\n }\\n\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pass1 = fillBufferSendReceiveValidate(10, 1);\\n pass2 = fillBufferSendReceiveValidate(50, 2);\\n pass3 = fillBufferSendReceiveValidate(100, 3);\\n pass4 = fillBufferSendReceiveValidate(500, 4);\\n pass5 = fillBufferSendReceiveValidate(1000, 5);\\n pass6 = fillBufferSendReceiveValidate(1500, 6);\\n pass7 = fillBufferSendReceiveValidate(1750, 7);\\n pass8 = fillBufferSendReceiveValidate(1996, 8);\\n pass9 = fillBufferSendReceiveValidate(1997, 9);\\n\\n if(pass1 && pass2 && pass3 && pass4 && pass5 && pass6 && pass7 && pass8 && !pass9)\\n {\\n std::cout\\n << \\\"PASS: TX & RX data matches in all cases (<= 1996 B).\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\"FAIL: TX & RX data does not match in all cases (<= 1996 B).\\\\r\\\\n\\\"\\n ;\\n }\\n\\n\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test configures KSZ8851SNL with (a) loopback mode \\\"eLocal\\\" whose \\\"link state\\\" is always up and (b)\\n//! no address filtering, which means that no frames are discarded. Then it tries to transmit & receive\\n//! random data using \\\"nonblocking\\\" functions and multiple (4) buffer descriptors (together <= 1996 B).\\n//! Finally, it checks whether transmitted & received data match.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid e4TestMultiBufferNonblockingTxRx(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: e4TestMultiBufferNonblockingTxRx()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures KSZ8851SNL with (a) loopback mode \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" whose \\\\\\\"link state\\\\\\\" is always up and (b) no address filtering,\\\\r\\\\n\\\"\\n << \\\" which means that no frames are discarded. Then it tries to\\\\r\\\\n\\\"\\n << \\\" transmit & receive random data using \\\\\\\"nonblocking\\\\\\\" functions\\\\r\\\\n\\\"\\n << \\\" and multiple (4) buffer descriptors (together <= 1996 B).\\\\r\\\\n\\\"\\n << \\\" Finally, it checks whether transmitted & received data match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {true};\\n bool pass2 {true};\\n bool pass3 {true};\\n bool pass4 {true};\\n bool pass5 {true};\\n bool pass6 {true};\\n bool pass7 {true};\\n bool pass8 {true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // Define a receive buffer descriptor - length is the length of the data that can be received. This will not be\\n // changed.\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n bool txCompleteFlag{false};\\n ResultCode txCompleteStatus{ResultCode::eOk};\\n auto transmitCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetTransmitCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n txCompleteFlag = true;\\n txCompleteStatus = returnValue;\\n }\\n );\\n\\n // Call lambda function whenever signal indicating a receive complete is received. This lambda function simply sets\\n // a flag.\\n bool rxCompleteFlag{false};\\n ResultCode rxCompleteStatus{ResultCode::eOk};\\n auto receiveCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetReceiveCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n rxCompleteFlag = true;\\n rxCompleteStatus = returnValue;\\n }\\n );\\n\\n auto fillBufferSendReceiveValidate = [&](size_t frameLength, int32_t seed) -> bool\\n {\\n int numberOfDiff{0};\\n ResultCode returnValue {ResultCode::eOk};\\n constexpr uint32_t timeout{500};\\n uint16_t pendingFrameNumber{0};\\n\\n // 4 linked buffer descriptors are set.\\n BufferDescriptor txBuffDescD {\\n .pData = g_txBufferD.data(),\\n .length = frameLength,\\n .pNext = nullptr\\n };\\n BufferDescriptor txBuffDescC{\\n .pData = g_txBufferC.data(),\\n .length = frameLength,\\n .pNext = &txBuffDescD\\n };\\n BufferDescriptor txBuffDescB {\\n .pData = g_txBufferB.data(),\\n .length = frameLength,\\n .pNext = &txBuffDescC\\n };\\n BufferDescriptor txBuffDescA {\\n .pData = g_txBufferA.data(),\\n .length = frameLength,\\n .pNext = &txBuffDescB\\n };\\n\\n // Populate buffers.\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // Check whether \\\"txCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(txCompleteFlag, timeout))\\n {\\n if(txCompleteStatus == ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n\\n // NOTE: abiReadAvailableFrameCount() is a nonblocking call that updates \\\"pendingFrameNumber\\\".\\n while(\\n pEthDriver->abiSpecific()->abiReadAvailableFrameCount(pendingFrameNumber)\\n == ResultCode::eNotReady\\n );\\n std::cout\\n << \\\" \\\" << pendingFrameNumber << \\\" frame(s) ready to be read.\\\\r\\\\n\\\"\\n ;\\n\\n // Read frame.\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk){\\n std::cout\\n << \\\" abiReceive() call failed with: \\\"\\n << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" abiReceive() call succeeded.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n // Check whether \\\"rxCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(rxCompleteFlag, timeout))\\n {\\n if(rxCompleteStatus == ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == NULL)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B: RX data empty.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n\\n // Check whether transmitted and received data is the same.\\n numberOfDiff = compareBufferDescriptors(txBuffDescA, rxBuffDesc);\\n if(numberOfDiff != 0)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B (x4): TX & RX data do not match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B (x4): TX & RX data match.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return true;\\n }\\n\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pass1 = fillBufferSendReceiveValidate(10, 23);\\n pass2 = fillBufferSendReceiveValidate(50, 85);\\n pass3 = fillBufferSendReceiveValidate(100, 84);\\n pass4 = fillBufferSendReceiveValidate(200, 223);\\n pass5 = fillBufferSendReceiveValidate(400, 31);\\n pass6 = fillBufferSendReceiveValidate(450, 32);\\n pass7 = fillBufferSendReceiveValidate(499, 33);\\n pass8 = fillBufferSendReceiveValidate(500, 34);\\n\\n if(pass1 && pass2 && pass3 && pass4 && pass5 && pass6 && pass7 && !pass8)\\n {\\n std::cout << \\\"PASS: TX & RX data pieces (x4) match in all cases (<= 1996 B).\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\"FAIL: TX & RX data pieces (x4) do not match in all cases (<= 1996 B).\\\\r\\\\n\\\";\\n }\\n\\n\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test keeps on sending frames over \\\"eLocal\\\" loopback interface until transmit buffer queue is\\n//! completely full. At this point \\\"eBufferFull\\\" status should be returned when calling \\\"abiTransmit()\\\" or\\n//! \\\"abiTransmitBlocking()\\\". If this is the case, test passes.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f13TestTxBufferFull(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f13TestTxBufferFull()\\\\r\\\\n\\\"\\n << \\\"INFO: This test keeps on sending frames over \\\\\\\"eLocal\\\\\\\" loopback\\\\r\\\\n\\\"\\n << \\\" interface until transmit buffer queue is completely full. At\\\\r\\\\n\\\"\\n << \\\" this point \\\\\\\"eBufferFull\\\\\\\" status should be returned when\\\\r\\\\n\\\"\\n << \\\" calling \\\\\\\"abiTransmit()\\\\\\\" or \\\\\\\"abiTransmitBlocking()\\\\\\\". If this\\\\r\\\\n\\\"\\n << \\\" is the case, test passes.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {true};\\n bool pass2 {true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n bool txCompleteFlag{false};\\n ResultCode txCompleteStatus{ResultCode::eOk};\\n auto transmitCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetTransmitCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n txCompleteFlag = true;\\n txCompleteStatus = returnValue;\\n }\\n );\\n\\n auto txNonblocking = [&](int32_t frameLength, int32_t seed) -> bool\\n {\\n ResultCode returnValue {ResultCode::eOk};\\n constexpr uint32_t timeout{500};\\n\\n // Populate transmit buffer descriptor & adjust it's length.\\n txBuffDesc.length = frameLength;\\n populateBuffer(txBuffDesc, seed);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // Check whether \\\"txCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(txCompleteFlag, timeout))\\n {\\n if(txCompleteStatus == ResultCode::eBufferFull)\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return true;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n };\\n\\n auto txBlocking = [&] (int size, int seed) -> bool\\n {\\n std::uint32_t timeout {1000};\\n ResultCode returnValue {ResultCode::eOk};\\n\\n // Populate transmit buffer descriptor & adjust it's length.\\n txBuffDesc.length = size;\\n populateBuffer(txBuffDesc, seed);\\n\\n returnValue = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n if(returnValue == ResultCode::eBufferFull)\\n {\\n std::cout\\n << \\\" abiTransmitBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return true;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmitBlocking(): succeeded.\\\\r\\\\n\\\";\\n return false;\\n }\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n // Send frame 100 times using nonblocking functions.\\n pEthDriver->abiOpen(config);\\n pass1 = false;\\n for(int32_t i = 0; i < 100; i++)\\n {\\n pass1 = txNonblocking(1996, i);\\n if(pass1 == true)\\n {\\n break;\\n }\\n }\\n pEthDriver->abiClose();\\n\\n osDelay(1000);\\n\\n // Send frame 100 times using blocking functions.\\n pEthDriver->abiOpen(config);\\n pass2 = false;\\n for(int32_t i = 0; i < 100; i++)\\n {\\n pass2 = txBlocking(1996, i);\\n if(pass2 == true)\\n {\\n break;\\n }\\n }\\n pEthDriver->abiClose();\\n\\n // Evaluate the results.\\n if(pass1 == true && pass2 == true)\\n {\\n std::cout << \\\"PASS: TX functions detect a full TX buffer queue.\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\"FAIL: TX functions do not detect a full TX buffer queue.\\\\r\\\\n\\\";\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test tries to transmit ethernet frame which is too large (more than 2000 bytes) in blocking mode.\\n//! Test passes if transmission fails with \\\"eWriteError\\\".\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f1TestNonblockingTxFramesTooLarge(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f1TestNonblockingTxFramesTooLarge()\\\\r\\\\n\\\"\\n << \\\"INFO: This test tries to transmit ethernet frame which is too large\\\\r\\\\n\\\"\\n << \\\" (more than 2000 bytes) in blocking mode. Test passes if\\\\r\\\\n\\\"\\n << \\\" transmission fails with \\\\\\\"eWriteError\\\\\\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n std::array<uint8_t, 2500> txBuffDescOversized;\\n int seed {13};\\n uint32_t timeout {1000};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n BufferDescriptor txBuffDesc {\\n .pData = txBuffDescOversized.data(),\\n .length = txBuffDescOversized.size()\\n };\\n\\n pEthDriver->abiOpen(config);\\n populateBuffer(txBuffDesc, seed);\\n ResultCode ra = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n\\n if (ra == ResultCode::eOk)\\n {\\n std::cout << \\\"FAIL: A frame with size 2500 transmitted successfully when it shouldn't.\\\\r\\\\n\\\";\\n }\\n else if (ra == ResultCode::eWriteError)\\n {\\n std::cout << \\\"PASS: Can't transmit 2500 bytes frame (expected).\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout << \\\"FAIL: Can't transmit for wrong ResultCode (\\\" << static_cast<int>(ra) << \\\").\\\\r\\\\n\\\";\\n }\\n\\n pEthDriver->abiClose();\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test tries to transmit frames which are too big (> 1996 B) over \\\"eLocal\\\" loopback interface in the\\n//! blocking mode. Test passes if all the attempts to transmit frames fail.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f2TestNonblockingTxOfFramesTooBig(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f2TestNonblockingTxOfFramesTooBig()\\\\r\\\\n\\\"\\n << \\\"INFO: This test tries to transmit frames which are too big (> 1996 B)\\\\r\\\\n\\\"\\n << \\\" over \\\\\\\"eLocal\\\\\\\" loopback interface in the blocking mode. Test\\\\r\\\\n\\\"\\n << \\\" passes if all the attempts to transmit frames fail.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {true};\\n bool pass2 {true};\\n bool pass3 {true};\\n bool pass4 {true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n auto fillBufferSendValidate = [&](int32_t frameLength, int32_t seed) -> bool\\n {\\n ResultCode returnValue {ResultCode::eOk};\\n\\n // Populate transmit buffer descriptor & adjust it's length.\\n populateBuffer(txBuffDesc, seed);\\n txBuffDesc.length = frameLength;\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" Sending: \\\" << std::dec << std::setfill(' ') << std::setw(5)\\n << frameLength << \\\" B: abiTransmit(): failed with: \\\"\\n << convertResultCode2Str(returnValue)\\n << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\"\\n ;\\n return true;\\n }\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pass1 = fillBufferSendValidate(1997, 1);\\n pass2 = fillBufferSendValidate(2000, 1);\\n pass3 = fillBufferSendValidate(2500, 1);\\n pass4 = fillBufferSendValidate(5000, 1); // TODO: At 15000, program breaks.\\n\\n pEthDriver->abiClose();\\n\\n if(!pass1 && !pass2 && !pass3 && !pass4)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: Transmission failed for all frames (> 1996 B).\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Transmission did not fail for all frames (> 1996 B).\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test configures KSZ8851SNL with (a) loopback mode \\\"eLocal\\\" whose \\\"link state\\\" is always up and\\n//! (b) no address filtering, which means that no frames are discarded. Test then verifies whether error\\n//! happens when receive \\\"BufferDescriptor\\\" \\\"length\\\" is smaller than the transmit \\\"BufferDescriptor\\\"\\n//! \\\"length\\\" which means that we are sending more data that we can receive. This is tested in \\\"blocking\\\"\\n//! mode while taking into consideration also the possibility of buffer overflow.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f3TestBlockingErrorOnBuffDescTooSmall(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f3TestBlockingErrorOnBuffDescTooSmall()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures KSZ8851SNL with (a) loopback mode \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" whose \\\\\\\"link state\\\\\\\" is always up and (b) no address filtering,\\\\r\\\\n\\\"\\n << \\\" which means that no frames are discarded. Test then verifies\\\\r\\\\n\\\"\\n << \\\" whether error happens when receive \\\\\\\"BufferDescriptor\\\\\\\" \\\\\\\"length\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" is smaller than the transmit \\\\\\\"BufferDescriptor\\\\\\\" \\\\\\\"length\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" meaning we are sending more data that we can receive. This is\\\\r\\\\n\\\"\\n << \\\" tested in blocking mode while taking into consideration also\\\\r\\\\n\\\"\\n << \\\" the possibility of buffer overflow.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n std::array<uint8_t, 1000> txBuff {0};\\n std::array<uint8_t, 1500> rxBuff {0};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0=0x00,\\n .byte1=0xB0,\\n .byte2=0x00,\\n .byte3=0x00,\\n .byte4=0x00,\\n .byte5=0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n BufferDescriptor txBuffDesc {\\n .pData = txBuff.data(),\\n .length = 1000\\n };\\n\\n BufferDescriptor rxBuffDesc {\\n .pData = rxBuff.data(),\\n .length = 500\\n };\\n\\n pEthDriver->abiOpen(config);\\n populateBuffer(txBuffDesc, 13);\\n pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, 1000);\\n\\n int a = waitForAvailableFrames(pEthDriver);\\n if (a <= 0)\\n {\\n std::cout << \\\"FAIL: No available frames to receive.\\\\r\\\\n\\\";\\n return;\\n }\\n\\n ResultCode resCodeRcv = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, 1000);\\n\\n int16_t notEquals = 0;\\n // Check if 1000 bytes after 500 bytes are unchanged (they should be 0).\\n for (uint8_t* p = rxBuff.data() + 500; p < (rxBuff.data() + 1500); p++)\\n {\\n if (*p != 0)\\n {\\n notEquals++;\\n }\\n }\\n\\n if (0 == notEquals)\\n {\\n std::cout\\n << \\\"PASS: No buffer overflow, return code: \\\"\\n << static_cast<int>(resCodeRcv)\\n << \\\" (\\\"\\n << convertResultCode2Str(resCodeRcv)\\n << \\\").\\\\r\\\\n\\\";\\n }\\n else\\n {\\n std::cout\\n << \\\"FAIL: Buffer overflow \\\"\\n << notEquals\\n << \\\" bytes are changed but should remain unchanged.\\\\r\\\\n\\\";\\n }\\n\\n pEthDriver->abiClose();\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test configures KSZ8851SNL with (a) loopback mode \\\"eLocal\\\" whose \\\"link state\\\" is always up and\\n//! (b) no address filtering, which means that no frames are discarded. Test then verifies whether error\\n//! happens when receive \\\"BufferDescriptor\\\" \\\"length\\\" is smaller than the transmit \\\"BufferDescriptor\\\"\\n//! \\\"length\\\" which means that we are sending more data that we can receive. This is tested in non-blocking\\n//! mode.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f4TestNonblockingErrorOnBuffDescTooSmall(IBase_latest* pEthDriver)\\n{\\n\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f4TestNonblockingErrorOnBuffDescTooSmall()\\\\r\\\\n\\\"\\n << \\\"INFO: This test configures KSZ8851SNL with (a) loopback mode \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" whose \\\\\\\"link state\\\\\\\" is always up and (b) no address filtering,\\\\r\\\\n\\\"\\n << \\\" which means that no frames are discarded. Test then verifies\\\\r\\\\n\\\"\\n << \\\" whether error happens when receive \\\\\\\"BufferDescriptor\\\\\\\" \\\\\\\"length\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" is smaller than the transmit \\\\\\\"BufferDescriptor\\\\\\\" \\\\\\\"length\\\\\\\" which\\\\r\\\\n\\\"\\n << \\\" means that we are sending more data that we can receive. This\\\\r\\\\n\\\"\\n << \\\" is tested in non-blocking mode.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n uint8_t status {true};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n bool txCompleteFlag{false};\\n ResultCode txCompleteStatus{};\\n auto transmitCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetTransmitCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n txCompleteFlag = true;\\n txCompleteStatus = returnValue;\\n }\\n );\\n\\n // Call lambda function whenever signal indicating a receive complete is received. This lambda function simply sets\\n // a flag.\\n bool rxCompleteFlag{false};\\n ResultCode rxCompleteStatus{};\\n auto receiveCmpltBindingHandle =\\n euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetReceiveCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n rxCompleteFlag = true;\\n rxCompleteStatus = returnValue;\\n }\\n );\\n\\n auto fillBufferSendReceiveValidate = [&](int32_t frameLength, int32_t seed) -> uint8_t\\n {\\n uint32_t ByteDifference {10};\\n int numberOfDiff{0};\\n ResultCode returnValue {ResultCode::eOk};\\n constexpr uint32_t timeout{500};\\n uint16_t pendingFrameNumber{0};\\n\\n // Populate transmit buffer descriptor & adjust it's length.\\n populateBuffer(txBuffDesc, seed);\\n txBuffDesc.length = frameLength;\\n\\n // NOTE: RX buffer descriptor is intentionally made smaller than TX buffer descriptor.\\n rxBuffDesc.length = frameLength - ByteDifference;\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 1;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // Check whether \\\"txCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(txCompleteFlag, timeout))\\n {\\n if(txCompleteStatus == ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(txCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"TX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 2;\\n }\\n\\n // Wait until \\\"pendingFrameNumber\\\" is updated to the currently avail. RX frames.\\n while(\\n pEthDriver->abiSpecific()->abiReadAvailableFrameCount(pendingFrameNumber)\\n == ResultCode::eNotReady\\n );\\n std::cout << \\\" \\\" << pendingFrameNumber << \\\" frame(s) ready to be read.\\\\r\\\\n\\\";\\n\\n // Read frame.\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue != ResultCode::eOk){\\n std::cout\\n << \\\" abiReceive() call failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 3;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive() call succeeded.\\\\r\\\\n\\\";\\n }\\n\\n // Check whether \\\"rxCompleteFlag\\\" will be successfully set during a timeout.\\n if(flagTimeout(rxCompleteFlag, timeout))\\n {\\n if(rxCompleteStatus == ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal detected. Signal: \\\"\\n << convertResultCode2Str(rxCompleteStatus) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 0;\\n }\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\\\\\"RX complete\\\\\\\" signal was not detected.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 4;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == nullptr)\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B: RX data empty.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 5;\\n }\\n else\\n {\\n std::cout\\n << \\\" Sent: \\\" << std::dec << std::setfill(' ') << std::setw(4)\\n << frameLength << \\\" B: Received data is not empty but it should be.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n return 6;\\n }\\n\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pEthDriver->abiOpen(config);\\n status = fillBufferSendReceiveValidate(1000, 1);\\n pEthDriver->abiClose();\\n\\n if(status == 0)\\n {\\n std::cout\\n << \\\"PASS: Failed to read frame bigger than RX buffer.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\"FAIL: Test did not go as planned.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test checks what happens if \\\"nullptr\\\" is used instead of a \\\"BufferDescriptor\\\" in all transmit &\\n//! receive function calls. Test passes if all function calls return \\\"eInvalidParameter\\\".\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f5TestNullptrAsBuffDesc(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f5TestNullptrAsBuffDesc()\\\\r\\\\n\\\"\\n << \\\"INFO: This test checks what happens if \\\\\\\"nullptr\\\\\\\" is used instead of\\\\r\\\\n\\\"\\n << \\\" a \\\\\\\"BufferDescriptor\\\\\\\" in all transmit & receive function calls.\\\\r\\\\n\\\"\\n << \\\" Test passes if all function calls return \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n uint32_t timeout {1000};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0=0x00,\\n .byte1=0xB0,\\n .byte2=0x00,\\n .byte3=0x00,\\n .byte4=0x00,\\n .byte5=0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n pEthDriver->abiOpen(config);\\n\\n // Testing buffer\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = 200\\n };\\n populateBuffer(txBuffDesc, 28);\\n\\n // abiTransmitBlocking()\\n ResultCode rcTransmitBlocking = pEthDriver->abiSpecific()->abiTransmitBlocking(nullptr, timeout);\\n\\n // abiReceiveBlocking() (first create a message to receive)\\n pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n waitForAvailableFrames(pEthDriver);\\n ResultCode rcReceiveBlocking = pEthDriver->abiSpecific()->abiReceiveBlocking(nullptr, timeout);\\n\\n // abiTransmit()\\n ResultCode rcTransmit = ResultCode::eNotReady;\\n while (rcTransmit == ResultCode::eNotReady)\\n {\\n rcTransmit = pEthDriver->abiSpecific()->abiTransmit(nullptr);\\n }\\n\\n // abiReceive()\\n ResultCode rcTransmitTmp = ResultCode::eNotReady;\\n while (rcTransmitTmp == ResultCode::eNotReady)\\n {\\n rcTransmitTmp = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n\\n waitForAvailableFrames(pEthDriver);\\n\\n ResultCode rcReceive = ResultCode::eNotReady;\\n while (rcReceive == ResultCode::eNotReady)\\n {\\n rcReceive = pEthDriver->abiSpecific()->abiReceive(nullptr);\\n }\\n\\n std::cout\\n << \\\" abiTransmitBlocking() returns: \\\"\\n << static_cast<int>(rcTransmitBlocking) << \\\" (\\\" << convertResultCode2Str(rcTransmitBlocking) << \\\")\\\\r\\\\n\\\"\\n << \\\" abiReceiveBlocking() returns: \\\"\\n << static_cast<int>(rcReceiveBlocking) << \\\" (\\\" << convertResultCode2Str(rcReceiveBlocking) << \\\")\\\\r\\\\n\\\"\\n << \\\" abiTransmit() returns: \\\"\\n << static_cast<int>(rcTransmit) << \\\" (\\\" << convertResultCode2Str(rcTransmit) << \\\")\\\\r\\\\n\\\"\\n << \\\" abiReceive() returns: \\\"\\n << static_cast<int>(rcReceive) << \\\" (\\\" << convertResultCode2Str(rcReceive) << \\\")\\\\r\\\\n\\\"\\n ;\\n\\n if (\\n rcTransmitBlocking == ResultCode::eInvalidParameter ||\\n rcReceiveBlocking == ResultCode::eInvalidParameter ||\\n rcTransmit == ResultCode::eInvalidParameter ||\\n rcReceive == ResultCode::eInvalidParameter\\n )\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: All return values equal \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Not all return values equal \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n\\n pEthDriver->abiClose();\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test passes a \\\"BufferDescriptor\\\" with initialized \\\"length\\\" and uninitialized \\\"pData\\\" members to\\n//! all transmit and receive functions to verify that these function calls fail in a controlled manner.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f6TestBufferDescWithLengthAndWithoutpData(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f6TestBufferDescWithLengthAndWithoutpData()\\\\r\\\\n\\\"\\n << \\\"INFO: This test passes a \\\\\\\"BufferDescriptor\\\\\\\" with initialized \\\\\\\"length\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" and uninitialized \\\\\\\"pData\\\\\\\" members to all transmit and receive\\\\r\\\\n\\\"\\n << \\\" functions to verify that these function calls fail in a\\\\r\\\\n\\\"\\n << \\\" controlled manner.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {false};\\n bool pass2 {false};\\n bool pass3 {false};\\n bool pass4 {false};\\n uint32_t timeout {1000};\\n int32_t seed {1};\\n ResultCode returnValue {ResultCode::eOk};\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"pData\\\" is intentionally not initialized.\\n BufferDescriptor txBuffDesc {\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"pData\\\" is intentionally not initialized.\\n BufferDescriptor rxBuffDesc {\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // A: Testing abiTransmit().\\n pEthDriver->abiOpen(config);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // B: Testing abiTransmitBlocking().\\n pEthDriver->abiOpen(config);\\n\\n returnValue = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmitBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmitBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // C: Testing abiReceive().\\n pEthDriver->abiOpen(config);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceive(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // D: Testing abiReceiveBlocking().\\n pEthDriver->abiOpen(config);\\n\\n returnValue = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceiveBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceiveBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n if(!pass1 && !pass2 && !pass3 && !pass4)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: All function calls failed with \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Some function calls misbehaved.\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test passes a chain of multiple \\\"BufferDescriptor\\\" with initialized \\\"length\\\" and uninitialized\\n//! \\\"pData\\\" members to all transmit and receive functions to verify that these function calls fail in a\\n//! controlled manner.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f7TestMultiBufferDescWithLengthAndWithoutpData(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f7TestMultiBufferDescWithLengthAndWithoutpData()\\\\r\\\\n\\\"\\n << \\\"INFO: This test passes a chain of multiple \\\\\\\"BufferDescriptor\\\\\\\" with\\\\r\\\\n\\\"\\n << \\\" initialized \\\\\\\"length\\\\\\\" and uninitialized \\\\\\\"pData\\\\\\\" members to\\\\r\\\\n\\\"\\n << \\\" all transmit and receive functions to verify that these\\\\r\\\\n\\\"\\n << \\\" function calls fail in a controlled manner.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {false};\\n bool pass2 {false};\\n bool pass3 {false};\\n bool pass4 {false};\\n uint32_t timeout {1000};\\n int32_t seed {1};\\n ResultCode returnValue {ResultCode::eOk};\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"pData\\\" is intentionally not initialized.\\n BufferDescriptor txBuffDescD {\\n .length = g_txBufferD.size(),\\n .pNext = nullptr\\n };\\n BufferDescriptor txBuffDescC{\\n .length = g_txBufferC.size(),\\n .pNext = &txBuffDescD\\n };\\n BufferDescriptor txBuffDescB {\\n .length = g_txBufferB.size(),\\n .pNext = &txBuffDescC\\n };\\n BufferDescriptor txBuffDescA {\\n .length = g_txBufferA.size(),\\n .pNext = &txBuffDescB\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"pData\\\" is intentionally not initialized.\\n BufferDescriptor rxBuffDescD {\\n .length = g_rxBufferD.size(),\\n .pNext = nullptr\\n };\\n BufferDescriptor rxBuffDescC{\\n .length = g_rxBufferC.size(),\\n .pNext = &rxBuffDescD\\n };\\n BufferDescriptor rxBuffDescB {\\n .length = g_rxBufferB.size(),\\n .pNext = &rxBuffDescC\\n };\\n BufferDescriptor rxBuffDescA {\\n .length = g_rxBufferA.size(),\\n .pNext = &rxBuffDescB\\n };\\n\\n // A: Testing abiTransmit().\\n pEthDriver->abiOpen(config);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // B: Testing abiTransmitBlocking().\\n pEthDriver->abiOpen(config);\\n\\n returnValue = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDescA, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmitBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = false;\\n }\\n else\\n {\\n std::cout\\n << \\\" abiTransmitBlocking(): misbehaved with: \\\"\\n << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\"\\n ;\\n pass2 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // C: Testing abiReceive().\\n pEthDriver->abiOpen(config);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceive(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // D: Testing abiReceiveBlocking().\\n pEthDriver->abiOpen(config);\\n\\n returnValue = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDescA, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceiveBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceiveBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n if(!pass1 && !pass2 && !pass3 && !pass4)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: All function calls failed with \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Some function calls misbehaved.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test passes a \\\"BufferDescriptor\\\" with initialized \\\"pData\\\" and uninitialized \\\"length\\\" members to\\n//! all transmit and receive functions to verify that these function calls fail in a controlled manner.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f8TestBufferDescWithpDataAndWithoutLength(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f8TestBufferDescWithpDataAndWithoutLength()\\\\r\\\\n\\\"\\n << \\\"INFO: This test passes a \\\\\\\"BufferDescriptor\\\\\\\" with initialized \\\\\\\"pData\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" and uninitialized \\\\\\\"length\\\\\\\" members to all transmit and receive\\\\r\\\\n\\\"\\n << \\\" functions to verify that these function calls fail in a\\\\r\\\\n\\\"\\n << \\\" controlled manner.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {false};\\n bool pass2 {false};\\n bool pass3 {false};\\n bool pass4 {false};\\n uint32_t timeout {1000};\\n int32_t seed {1};\\n ResultCode returnValue {ResultCode::eOk};\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"length\\\" is intentionally not initialized.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .pNext = nullptr\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"length\\\" is intentionally not initialized.\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuf"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "fer.data(),\\n .pNext = nullptr\\n };\\n\\n // A: Testing abiTransmit().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDesc, seed);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // B: Testing abiTransmitBlocking().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDesc, seed);\\n\\n returnValue = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmitBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmitBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // C: Testing abiReceive().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDesc, seed);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceive(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // D: Testing abiReceiveBlocking().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDesc, seed);\\n\\n returnValue = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceiveBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceiveBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n if(!pass1 && !pass2 && !pass3 && !pass4)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: All function calls failed with \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Some function calls misbehaved.\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test passes a chain of multiple \\\"BufferDescriptor\\\" with initialized \\\"pData\\\" and uninitialized\\n//! \\\"length\\\" members to all transmit and receive functions to verify that these function calls fail in a\\n//! controlled manner.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f9TestMultiBufferDescWithpDataAndWithoutLength(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f9TestMultiBufferDescWithpDataAndWithoutLength()\\\\r\\\\n\\\"\\n << \\\"INFO: This test passes a chain of multiple \\\\\\\"BufferDescriptor\\\\\\\" with\\\\r\\\\n\\\"\\n << \\\" initialized \\\\\\\"pData\\\\\\\" and uninitialized \\\\\\\"length\\\\\\\" members to\\\\r\\\\n\\\"\\n << \\\" all transmit and receive functions to verify that these\\\\r\\\\n\\\"\\n << \\\" function calls fail in a controlled manner.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {false};\\n bool pass2 {false};\\n bool pass3 {false};\\n bool pass4 {false};\\n uint32_t timeout {1000};\\n int32_t seed {1};\\n ResultCode returnValue {ResultCode::eOk};\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"length\\\" is intentionally not initialized.\\n BufferDescriptor txBuffDescD {\\n .pData = g_txBufferD.data(),\\n .pNext = nullptr\\n };\\n BufferDescriptor txBuffDescC{\\n .pData = g_txBufferC.data(),\\n .pNext = &txBuffDescD\\n };\\n BufferDescriptor txBuffDescB {\\n .pData = g_txBufferB.data(),\\n .pNext = &txBuffDescC\\n };\\n BufferDescriptor txBuffDescA {\\n .pData = g_txBufferA.data(),\\n .pNext = &txBuffDescB\\n };\\n\\n // NOTE: Buffer descriptor's member \\\"length\\\" is intentionally not initialized.\\n BufferDescriptor rxBuffDescD {\\n .pData = g_rxBufferD.data(),\\n .pNext = nullptr\\n };\\n BufferDescriptor rxBuffDescC{\\n .pData= g_rxBufferC.data(),\\n .pNext = &rxBuffDescD\\n };\\n BufferDescriptor rxBuffDescB {\\n .pData = g_rxBufferB.data(),\\n .pNext = &rxBuffDescC\\n };\\n BufferDescriptor rxBuffDescA {\\n .pData = g_rxBufferA.data(),\\n .pNext = &rxBuffDescB\\n };\\n\\n // A: Testing abiTransmit().\\n pEthDriver->abiOpen(config);\\n\\n // Populate buffers.\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // B: Testing abiTransmitBlocking().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n returnValue = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDescA, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmitBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmitBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // C: Testing abiReceive().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceive(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // D: Testing abiReceiveBlocking().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n returnValue = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDescA, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceiveBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceiveBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n if(!pass1 && !pass2 && !pass3 && !pass4)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: All function calls failed with \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Some function calls misbehaved.\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test passes a chain of multiple \\\"BufferDescriptor\\\" arranged in a circular formation to all\\n//! transmit and receive functions to verify that these function calls fail in a controlled manner.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f10TestMultiBufferDescInCircularFormation(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f10TestMultiBufferDescInCircularFormation()\\\\r\\\\n\\\"\\n << \\\"INFO: This test passes a chain of multiple \\\\\\\"BufferDescriptor\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" arranged in a circular formation to all transmit and receive\\\\r\\\\n\\\"\\n << \\\" functions to verify that these function calls fail in a\\\\r\\\\n\\\"\\n << \\\" controlled manner.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n bool pass1 {false};\\n bool pass2 {false};\\n bool pass3 {false};\\n bool pass4 {false};\\n uint32_t timeout {1000};\\n int32_t seed {1};\\n ResultCode returnValue {ResultCode::eOk};\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // NOTE: Buffer descriptors need to be declared prior to chaining them together in a circular formation.\\n BufferDescriptor txBuffDescA {};\\n BufferDescriptor txBuffDescB {};\\n BufferDescriptor txBuffDescC {};\\n BufferDescriptor txBuffDescD {};\\n BufferDescriptor rxBuffDescA {};\\n BufferDescriptor rxBuffDescB {};\\n BufferDescriptor rxBuffDescC {};\\n BufferDescriptor rxBuffDescD {};\\n\\n // NOTE: Buffer descriptors are configured in a circular formation.\\n txBuffDescD.length = g_txBufferD.size();\\n txBuffDescD.pData = g_txBufferD.data();\\n txBuffDescD.pNext = &txBuffDescA;\\n\\n txBuffDescC.length = g_txBufferC.size();\\n txBuffDescC.pData = g_txBufferC.data();\\n txBuffDescC.pNext = &txBuffDescD;\\n\\n txBuffDescB.length = g_txBufferB.size();\\n txBuffDescB.pData = g_txBufferB.data();\\n txBuffDescB.pNext = &txBuffDescC;\\n\\n txBuffDescA.length = g_txBufferA.size();\\n txBuffDescA.pData = g_txBufferA.data();\\n txBuffDescA.pNext = &txBuffDescB;\\n\\n // NOTE: Buffer descriptors are configured in a circular formation.\\n rxBuffDescD.length = g_rxBufferD.size();\\n rxBuffDescD.pData = g_rxBufferD.data();\\n rxBuffDescD.pNext = &rxBuffDescA;\\n\\n rxBuffDescC.length = g_rxBufferC.size();\\n rxBuffDescC.pData= g_rxBufferC.data();\\n rxBuffDescC.pNext = &rxBuffDescD;\\n\\n rxBuffDescB.length = g_rxBufferB.size();\\n rxBuffDescB.pData = g_rxBufferB.data();\\n rxBuffDescB.pNext = &rxBuffDescC;\\n\\n rxBuffDescA.length = g_rxBufferA.size();\\n rxBuffDescA.pData = g_rxBufferA.data();\\n rxBuffDescA.pNext = &rxBuffDescB;\\n\\n // A: Testing abiTransmit().\\n pEthDriver->abiOpen(config);\\n\\n // Populate buffers.\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiTransmit(&txBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmit(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmit(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass1 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // B: Testing abiTransmitBlocking().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n returnValue = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDescA, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiTransmitBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiTransmitBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass2 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // C: Testing abiReceive().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n do\\n {\\n returnValue = pEthDriver->abiSpecific()->abiReceive(&rxBuffDescA);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceive(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceive(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass3 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n // D: Testing abiReceiveBlocking().\\n pEthDriver->abiOpen(config);\\n\\n populateBuffer(txBuffDescA, seed + 0);\\n populateBuffer(txBuffDescB, seed + 1);\\n populateBuffer(txBuffDescC, seed + 2);\\n populateBuffer(txBuffDescD, seed + 3);\\n\\n returnValue = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDescA, timeout);\\n if(returnValue == ResultCode::eInvalidParameter)\\n {\\n std::cout << \\\" abiReceiveBlocking(): failed with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = false;\\n }\\n else\\n {\\n std::cout << \\\" abiReceiveBlocking(): misbehaved with: \\\" << convertResultCode2Str(returnValue) << \\\".\\\\r\\\\n\\\";\\n pass4 = true;\\n }\\n\\n pEthDriver->abiClose();\\n\\n if(!pass1 && !pass2 && !pass3 && !pass4)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: All function calls failed with \\\\\\\"eInvalidParameter\\\\\\\".\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Some function calls misbehaved.\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test calls a nonblocking \\\"abiTransmit()\\\" function twice, one after another, so that 1st call has\\n//! not yet finished when 2nd call takes place. Test passes if 2nd call returns \\\"eNotReady\\\".\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f11TestCallNonblockingFuncBeforeTxComplete(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f11TestCallNonblockingFuncBeforeTxComplete()\\\\r\\\\n\\\"\\n << \\\"INFO: This test calls a nonblocking \\\\\\\"abiTransmit()\\\\\\\" function twice,\\\\r\\\\n\\\"\\n << \\\" one after another, so that 1st call has not yet finished when\\\\r\\\\n\\\"\\n << \\\" 2nd call takes place. Test passes if 2nd call returns\\\\r\\\\n\\\"\\n << \\\" \\\\\\\"eNotReady\\\\\\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\";\\n\\n uint16_t availableFrames{0};\\n ResultCode returnValue{ResultCode::eOk};\\n ResultCode returnValue1{ResultCode::eOk};\\n ResultCode returnValue2{ResultCode::eOk};\\n constexpr uint32_t timeout{500};\\n uint16_t pendingFrameNumber{0};\\n int32_t frameLength{1996};\\n int32_t seed{1};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc{\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a transmit complete is received. This lambda function simply sets\\n // a flag.\\n bool txCompleteFlag{false};\\n ResultCode txCompleteStatus{ResultCode::eOk};\\n auto transmitCmpltBindingHandle = euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetTransmitCompleteSignal(),\\n [&](ResultCode returnValue)\\n {\\n txCompleteFlag = true;\\n txCompleteStatus = returnValue;\\n }\\n );\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n populateBuffer(txBuffDesc, seed);\\n txBuffDesc.length = frameLength;\\n\\n pEthDriver->abiOpen(config);\\n\\n // NOTE: These call are intentionally done in a wrong way & immediately one after the other.\\n returnValue1 = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n returnValue2 = pEthDriver->abiSpecific()->abiTransmit(&txBuffDesc);\\n\\n std::cout\\n << \\\" 1st abiTransmit() call results in: \\\" << convertResultCode2Str(returnValue1) << \\\".\\\\r\\\\n\\\"\\n << \\\" 2nd abiTransmit() call results in: \\\" << convertResultCode2Str(returnValue2) << \\\".\\\\r\\\\n\\\"\\n ;\\n\\n // Check available frames\\n pEthDriver->abiSpecific()->abiReadAvailableFrameCount(availableFrames);\\n\\n std::cout << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\";\\n\\n if(returnValue1 == ResultCode::eOk)\\n {\\n if(returnValue2 == ResultCode::eNotReady)\\n {\\n std::cout << \\\"PASS: 2nd \\\\\\\"abiTransmit()\\\\\\\" call results in \\\\\\\"eNotReady\\\\\\\".\\\\r\\\\n\\\";\\n }\\n else if((returnValue2 == ResultCode::eOk) && (availableFrames == 2))\\n {\\n std::cout\\n << \\\"PASS: 1st \\\\\\\"abiTransmit()\\\\\\\" completed before calling 2nd \\\\\\\"abiTransmit()\\\\\\\".\\\\r\\\\n\\\"\\n << \\\"NOTE: This can happen if SPI bandwidth is too low.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout << \\\"FAIL: 2nd \\\\\\\"abiTransmit()\\\\\\\" resulted in \\\" << convertResultCode2Str(returnValue2) << \\\".\\\\r\\\\n\\\";\\n }\\n }\\n else\\n {\\n std::cout << \\\"FAIL: 1st \\\\\\\"abiTransmit()\\\\\\\" call resulted in \\\" << convertResultCode2Str(returnValue1) << \\\".\\\\r\\\\n\\\";\\n }\\n\\n // NOTE: Closing the driver too fast, i.e. before reception is complete brings it in a state \\\"eInvalidState\\\" and\\n // this is why we have to wait for reception to finish before closing the driver.\\n flagTimeout(txCompleteFlag, timeout);\\n pEthDriver->abiClose();\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test first properly sends two frames and then calls a nonblocking \\\"abiReceive()\\\" function twice, one\\n//! after another, so that 1st call has not yet finished when 2nd call takes place. Test passes if 2nd call\\n//! returns \\\"eNotReady\\\".\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid f12TestCallNonblockingFuncBeforeRxComplete(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: f12TestCallNonblockingFuncBeforeRxComplete()\\\\r\\\\n\\\"\\n << \\\"INFO: This test first properly sends two frame and then calls a\\\\r\\\\n\\\"\\n << \\\" nonblocking \\\\\\\"abiReceive()\\\\\\\" function twice, one after another,\\\\r\\\\n\\\"\\n << \\\" so that 1st call has not yet finished when 2nd call takes place\\\\r\\\\n\\\"\\n << \\\" Test passes if 2nd call returns \\\\\\\"eNotReady\\\\\\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\";\\n\\n uint8_t pass{0};\\n uint16_t availableFrames{0};\\n ResultCode returnValue{ResultCode::eOk};\\n ResultCode returnValue1{ResultCode::eOk};\\n ResultCode returnValue2{ResultCode::eOk};\\n constexpr uint32_t timeout{500};\\n uint16_t pendingFrameNumber{0};\\n int32_t frameLength{1996};\\n int32_t seed{1};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .addressFilteringEnabled = false,\\n .loopbackMode = Loopback::eLocal,\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc{\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Define a receive buffer descriptor - length is the length of the data that can be received. This will not be\\n // changed.\\n BufferDescriptor rxBuffDesc1{\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n BufferDescriptor rxBuffDesc2{\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // ------ Lambda functions -----------------------------------------------------------------------------------------\\n\\n // Call lambda function whenever signal indicating a receive complete is received. This lambda function simply sets\\n // a flag.\\n bool rxCompleteFlag{false};\\n ResultCode rxCompleteStatus{ResultCode::eOk};\\n auto receiveCmpltBindingHandle = euler::threading::bindToSignal(\\n pEthDriver->abiSpecific()->abiGetReceiveCompleteSignal(),\\n [&](ResultCode returnValue) {\\n rxCompleteFlag = true;\\n rxCompleteStatus = returnValue;\\n }\\n );\\n\\n auto fillBufferSendReceiveValidate = [&](int32_t frameLength, int32_t seed) -> uint8_t\\n {\\n // Transmit two frames\\n pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, 100);\\n pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, 100);\\n\\n // Read number available frames\\n while(pEthDriver->abiSpecific()->abiReadAvailableFrameCount(availableFrames) == ResultCode::eNotReady)\\n {\\n };\\n\\n std::cout << \\\" \\\" << availableFrames << \\\" frame(s) ready to be read.\\\\r\\\\n\\\";\\n\\n if(availableFrames != 2)\\n {\\n return 5;\\n }\\n\\n // NOTE: These calls are intentionally done in a wrong way & immediately one after the other.\\n returnValue1 = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc1);\\n returnValue2 = pEthDriver->abiSpecific()->abiReceive(&rxBuffDesc2);\\n\\n std::cout\\n << \\\" 1st abiReceive() call results in: \\\" << convertResultCode2Str(returnValue1) << \\\".\\\\r\\\\n\\\"\\n << \\\" 2nd abiReceive() call results in: \\\" << convertResultCode2Str(returnValue2) << \\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n if(returnValue1 != ResultCode::eOk)\\n {\\n return 4;\\n }\\n\\n flagTimeout(rxCompleteFlag, timeout);\\n\\n if(returnValue2 == ResultCode::eNotReady)\\n {\\n return 0;\\n }\\n else if(ResultCode::eOk == returnValue2)\\n {\\n if(((frameLength + 2) == rxBuffDesc1.length) && ((frameLength + 2) == rxBuffDesc2.length))\\n {\\n return 1;\\n }\\n else\\n {\\n return 2;\\n }\\n }\\n else\\n {\\n return 3;\\n }\\n };\\n\\n // ------ Lambda functions (end) -----------------------------------------------------------------------------------\\n\\n pEthDriver->abiOpen(config);\\n populateBuffer(txBuffDesc, seed);\\n txBuffDesc.length = frameLength;\\n pass = fillBufferSendReceiveValidate(frameLength, seed);\\n pEthDriver->abiClose();\\n\\n switch(pass){\\n case 0:\\n std::cout << \\\"PASS: 2nd \\\\\\\"abiReceive()\\\\\\\" call results in \\\\\\\"eNotReady\\\\\\\".\\\\r\\\\n\\\";\\n break;\\n case 1:\\n std::cout\\n << \\\"PASS: 1st \\\\\\\"abiReceive()\\\\\\\" completed before calling 2nd \\\\\\\"abiReceive()\\\\\\\".\\\\r\\\\n\\\"\\n << \\\"NOTE: This can happen if SPI bandwidth is too low.\\\\r\\\\n\\\"\\n ;\\n break;\\n case 2:\\n std::cout << \\\"FAIL: 2st \\\\\\\"abiReceive()\\\\\\\" call resulted in unexpected behaviour.\\\\r\\\\n\\\";\\n break;\\n case 3:\\n std::cout\\n << \\\"FAIL: 2st \\\\\\\"abiReceive()\\\\\\\" call resulted in \\\" << convertResultCode2Str(returnValue2) << \\\".\\\\r\\\\n\\\"\\n ;\\n break;\\n case 4:\\n std::cout\\n << \\\"FAIL: 1st \\\\\\\"abiReceive()\\\\\\\" call resulted in \\\" << convertResultCode2Str(returnValue1) << \\\".\\\\r\\\\n\\\"\\n ;\\n break;\\n case 5:\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Sent 2 frames but \\\" << availableFrames << \\\" frame(s) ready to be read.\\\\r\\\\n\\\"\\n ;\\n break;\\n }\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief Test checks (a) destination MAC filtering (DMF) and (b) frame type reception (FTR). First, it\\n//! configures device in \\\"eLocal\\\" loopback. Then it disables DMF & FTR (all) and sends 4 frames,\\\"\\n//! i.e. 2x unicast frames (1st targeted at our MAC while 2nd is not), 1x broadcast & 1x multicast frame.\\n//! No frames should be received. Next, it keeps DMF disabled while enabling FTR (all). Sending same 4\\n//! frames should result in reception of all frames. Even the unicast frame not targeted at our MAC!\\n//! Finally, test enables DMF and iteratively sends same 4 frames, where in each iteration FTR is different\\n//! combo of \\\"unicastFrameEnabled\\\", \\\"multicastFrameEnabled\\\" and \\\"broadcastFrameEnabled\\\".\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid g1TestFiltering(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: g1TestFiltering()\\\\r\\\\n\\\"\\n << \\\"INFO: Test checks (a) destination MAC filtering (DMF) and (b) frame \\\\r\\\\n\\\"\\n << \\\" type reception (FTR). First, it configures device in \\\\\\\"eLocal\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" loopback. Then it disables DMF & FTR (all) and sends 4 frames,\\\\r\\\\n\\\"\\n << \\\" i.e. 2x unicast (1st targeted at our MAC while 2nd is not), 1x\\\\r\\\\n\\\"\\n << \\\" broadcast & 1x multicast frame. No frames should be received.\\\\r\\\\n\\\"\\n << \\\" Next, it keeps DMF disabled while enabling FTR (all). Sending\\\\r\\\\n\\\"\\n << \\\" same 4 frames should result in reception of all frames. Even\\\\r\\\\n\\\"\\n << \\\" the unicast frame not targeted at our MAC! Finally, test\\\\r\\\\n\\\"\\n << \\\" enables DMF and iteratively sends same 4 frames, where in each\\\\r\\\\n\\\"\\n << \\\" iteration FTR is different combo of \\\\\\\"unicastFrameEnabled\\\\\\\",\\\\r\\\\n\\\"\\n << \\\" \\\\\\\"multicastFrameEnabled\\\\\\\" and \\\\\\\"broadcastFrameEnabled\\\\\\\".\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n std::array<bool, 32> pass{};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xb0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .hardwareCrcOffloadEnabled = true,\\n .transmitCrcOffloadEnabled = true,\\n .receiveCrcOffloadEnabled = true,\\n .loopbackMode = Loopback::eLocal\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the data that can be received. This will not be\\n // changed.\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Ethernet II frame (no CRC).\\n std::vector<uint8_t> frameUnicast{\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, // 06 bytes -- MAC address (unicast destination).\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, // 06 bytes -- MAC address (unicast source).\\n 0x08, 0x00, // 02 bytes -- EtherType (IPv4).\\n 0x45, 0x00, 0x00, 0x30, 0x38, 0x8a, 0x40, 0x00, 0x80, 0x06, // 48 bytes -- Payload\\n 0x30, 0xe3, 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03,\\n 0x04, 0x14, 0x00, 0x50, 0x09, 0x62, 0x09, 0x47, 0x00, 0x00,\\n 0x1c, 0x65, 0x50, 0x18, 0xfe, 0x98, 0xc0, 0x45, 0x00, 0x00,\\n 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x39, 0x36\\n };\\n\\n // Ethernet II frame (no CRC).\\n std::vector<uint8_t> frameUnicastNotForUs{\\n 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, // 06 bytes -- MAC address (unicast destination).\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, // 06 bytes -- MAC address (unicast source).\\n 0x08, 0x00, // 02 bytes -- EtherType (IPv4).\\n 0x45, 0x00, 0x00, 0x30, 0x38, 0x8a, 0x40, 0x00, 0x80, 0x06, // 48 bytes -- Payload\\n 0x30, 0xe3, 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03,\\n 0x04, 0x14, 0x00, 0x50, 0x09, 0x62, 0x09, 0x47, 0x00, 0x00,\\n 0x1c, 0x65, 0x50, 0x18, 0xfe, 0x98, 0xc0, 0x45, 0x00, 0x00,\\n 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20, 0x39, 0x36\\n };\\n\\n // Ethernet II frame (no CRC).\\n std::vector<uint8_t> frameMulticast{\\n 0x01, 0x00, 0x5e, 0x7f, 0xff, 0xfa, // 06 bytes -- MAC address (unicast destination).\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, // 06 bytes -- MAC address (unicast source).\\n 0x08, 0x00, // 02 bytes -- EtherType (IPv4).\\n 0x45, 0x00, 0x00, 0xa5, 0xc5, 0x16, 0x00, 0x00, 0x04, 0x11, // 156 bytes -- Payload\\n 0xb8, 0x88, 0xc0, 0xa8, 0x88, 0x06, 0xef, 0xff, 0xff, 0xfa,\\n 0xc3, 0xde, 0x07, 0x6c, 0x00, 0x91, 0x08, 0xba, 0x4d, 0x2d,\\n 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x20, 0x2a, 0x20, 0x48,\\n 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x48,\\n 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x32, 0x33, 0x39, 0x2e, 0x32,\\n 0x35, 0x35, 0x2e, 0x32, 0x35, 0x35, 0x2e, 0x32, 0x35, 0x30,\\n 0x3a, 0x31, 0x39, 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x54, 0x3a,\\n 0x20, 0x75, 0x72, 0x6e, 0x3a, 0x73, 0x63, 0x68, 0x65, 0x6d,\\n 0x61, 0x73, 0x2d, 0x75, 0x70, 0x6e, 0x70, 0x2d, 0x6f, 0x72,\\n 0x67, 0x3a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x49,\\n 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x47, 0x61, 0x74,\\n 0x65, 0x77, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,\\n 0x3a, 0x31, 0x0d, 0x0a, 0x4d, 0x61, 0x6e, 0x3a, 0x20, 0x22,\\n 0x73, 0x73, 0x64, 0x70, 0x3a, 0x64, 0x69, 0x73, 0x63, 0x6f,\\n 0x76, 0x65, 0x72, 0x22, 0x0d, 0x0a, 0x4d, 0x58, 0x3a, 0x20,\\n 0x33, 0x0d, 0x0a, 0x0d, 0x0a\\n };\\n\\n // Ethernet II frame (no CRC).\\n std::vector<uint8_t> frameBroadcast{\\n 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 06 bytes -- MAC address (multicast destination).\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, // 06 bytes -- MAC address (unicast source).\\n 0x08, 0x00, // 02 bytes -- EtherType (IPv4).\\n 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x74, // 46 bytes -- Payload (smallest possible, random)\\n 0xda, 0x38, 0xfe, 0x28, 0x65, 0xc0, 0xa8, 0x88, 0x06, 0x00,\\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x08, 0x00,\\n 0x06, 0x04, 0x00, 0x01, 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0xc0, 0xa8, 0x88, 0x06, 0x00, 0x00\\n };\\n\\n // ------ Lambda function ------------------------------------------------------------------------------------------\\n\\n auto frameTxRx = [&] (const std::vector<uint8_t>& frame, const char* type) -> bool\\n {\\n int numberOfDiff {};\\n std::uint32_t timeout {300};\\n ResultCode result {ResultCode::eOk};\\n\\n // Modify the length of the TX buffer descriptor. RX buffer descriptor's length will be automatically modified\\n // upon receiving the data.\\n txBuffDesc.length = frame.size();\\n\\n // Copy frame to g_txBuffer.\\n std::copy(frame.begin(), frame.end(), g_txBuffer.begin());\\n\\n // Transmit the data.\\n result = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: abiTransmitBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n waitForAvailableFrames(pEthDriver);\\n\\n rxBuffDesc.pData = g_rxBuffer.data();\\n rxBuffDesc.length = g_rxBuffer.size();\\n rxBuffDesc.pNext = nullptr;\\n\\n // Receive the data.\\n result = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, timeout);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n <<\\\" B: abiReceiveBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == NULL)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: RX data empty.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n\\n numberOfDiff = compareBufferDescriptors(txBuffDesc, rxBuffDesc);\\n\\n // Check whether transmitted and received data is the same.\\n if(numberOfDiff != 0)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: TX & RX data do not match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return false;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: TX & RX data match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return true;\\n }\\n };\\n\\n // ------ Lambda function (end) ------------------------------------------------------------------------------------\\n\\n std::cout\\n << \\\" DMF: false\\\\r\\\\n\\\"\\n << \\\" FTR: none\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = false;\\n config.unicastFrameEnabled = false;\\n config.multicastFrameEnabled = false;\\n config.broadcastFrameEnabled = false;\\n pEthDriver->abiOpen(config);\\n pass.at(0) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(1) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(2) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(3) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: false\\\\r\\\\n\\\"\\n << \\\" FTR: unicast, broadcast, multicast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = false;\\n config.unicastFrameEnabled = true;\\n config.multicastFrameEnabled = true;\\n config.broadcastFrameEnabled = true;\\n pEthDriver->abiOpen(config);\\n pass.at(4) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(5) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(6) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(7) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: true\\\\r\\\\n\\\"\\n << \\\" FTR: unicast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = true;\\n config.unicastFrameEnabled = true;\\n config.multicastFrameEnabled = false;\\n config.broadcastFrameEnabled = false;\\n pEthDriver->abiOpen(config);\\n pass.at(8) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(9) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(10) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(11) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: true\\\\r\\\\n\\\"\\n << \\\" FTR: broadcast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = true;\\n config.unicastFrameEnabled = false;\\n config.multicastFrameEnabled = false;\\n config.broadcastFrameEnabled = true;\\n pEthDriver->abiOpen(config);\\n pass.at(12) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(13) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(14) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(15) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: true\\\\r\\\\n\\\"\\n << \\\" FTR: unicast, broadcast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = true;\\n config.unicastFrameEnabled = true;\\n config.multicastFrameEnabled = false;\\n config.broadcastFrameEnabled = true;\\n pEthDriver->abiOpen(config);\\n pass.at(16) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(17) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(18) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(19) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: true\\\\r\\\\n\\\"\\n << \\\" FTR: multicast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = true;\\n config.unicastFrameEnabled = false;\\n config.multicastFrameEnabled = true;\\n config.broadcastFrameEnabled = false;\\n pEthDriver->abiOpen(config);\\n pass.at(20) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(21) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(22) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(23) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: true\\\\r\\\\n\\\"\\n << \\\" FTR: unicast, multicast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = true;\\n config.unicastFrameEnabled = true;\\n config.multicastFrameEnabled = true;\\n config.broadcastFrameEnabled = false;\\n pEthDriver->abiOpen(config);\\n pass.at(24) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(25) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(26) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(27) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" DMF: true\\\\r\\\\n\\\"\\n << \\\" FTR: unicast, broadcast, multicast\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.addressFilteringEnabled = true;\\n config.unicastFrameEnabled = true;\\n config.multicastFrameEnabled = true;\\n config.broadcastFrameEnabled = true;\\n pEthDriver->abiOpen(config);\\n pass.at(28) = frameTxRx(frameUnicast, \\\"U: \\\");\\n pass.at(29) = frameTxRx(frameUnicastNotForUs, \\\"U(x): \\\");\\n pass.at(30) = frameTxRx(frameBroadcast, \\\"B: \\\");\\n pass.at(31) = frameTxRx(frameMulticast, \\\"M: \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n if(\\n !pass.at(0) && !pass.at(1) && !pass.at(2) && !pass.at(3) &&\\n pass.at(4) && pass.at(5) && pass.at(6) && pass.at(7) &&\\n pass.at(8) && !pass.at(9) && !pass.at(10) && !pass.at(11) &&\\n !pass.at(12) && !pass.at(13) && pass.at(14) && !pass.at(15) &&\\n pass.at(16) && !pass.at(17) && pass.at(18) && !pass.at(19) &&\\n !pass.at(20) && !pass.at(21) && pass.at(22) && pass.at(23) &&\\n pass.at(24) && !pass.at(25) && pass.at(26) && pass.at(27) &&\\n pass.at(28) && !pass.at(29) && pass.at(30) && pass.at(31)\\n )\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: Unicast, Multicast & Broadcast frames filtered as expected.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: Unicast, Multicast & Broadcast frames not filtered as expected.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n std::cout << \\\"NOTE: Broadcast frame is a multicast frame targeted at everybody.\\\\r\\\\n\\\";\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test transmits ethernet frames with invalid and correct predefined CRC (OSI level 2). Then it\\n//! checks if frames are received over \\\"eLocal\\\" loopback. This is done twice. First,\\n//! \\\"hardwareCrcOffloadEnabled\\\" is enabled so that driver automatically overwrites CRC in both frames with\\n//! correct CRC. This is why no frame is discarded upon reception. Then, \\\"hardwareCrcOffloadEnabled\\\" is\\n//! disabled so driver stops overwriting CRC. This is why frames predefined CRC are validated instead,\\n//! leading to the frame with invalid predefined CRC being discarded upon reception.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid g2TestCrcLevel2(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: g2TestCrcLevel2()\\\\r\\\\n\\\"\\n << \\\"INFO: This test transmits ethernet frames with invalid and correct\\\\r\\\\n\\\"\\n << \\\" predefined CRC (OSI level 2). Then it checks if frames are\\\\r\\\\n\\\"\\n << \\\" received over \\\\\\\"eLocal\\\\\\\" loopback. This is done twice. First,\\\\r\\\\n\\\"\\n << \\\" \\\\\\\"hardwareCrcOffloadEnabled\\\\\\\" is enabled so that driver\\\\r\\\\n\\\"\\n << \\\" automatically overwrites CRC in both frames with correct CRC.\\\\r\\\\n\\\"\\n << \\\" This is why no frame is discarded upon reception. Then,\\\\r\\\\n\\\"\\n << \\\" \\\\\\\"hardwareCrcOffloadEnabled\\\\\\\" is disabled so driver stops\\\\r\\\\n\\\"\\n << \\\" overwriting CRC. This is why frames predefined CRC are\\\\r\\\\n\\\"\\n << \\\" validated instead, leading to the frame with invalid predefined\\\\r\\\\n\\\"\\n << \\\" CRC being discarded upon reception.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n std::vector<uint8_t> ethFrameWithCorrectCrc{\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, // 06 bytes -- MAC address (unicast destination).\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, // 06 bytes -- MAC address (unicast source).\\n "
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" " 0x08, 0x00, // 02 bytes -- EtherType (IPv4).\\n 0x45, 0x00, 0x00, 0x3c, 0xbe, 0x76, 0x00, 0x00, 0x80, 0x01, // 60 bytes -- Payload\\n 0xea, 0xef, 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03,\\n 0x08, 0x00, 0x4c, 0xfb, 0x00, 0x01, 0x00, 0x60, 0x61, 0x62,\\n 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,\\n 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,\\n 0x77, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,\\n 0xd1, 0x3a, 0x97, 0xe0 // 4 bytes -- CRC (correct)\\n };\\n\\n std::vector<uint8_t> ethFrameWithInvalidCrc{\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, // 06 bytes -- MAC address (unicast destination).\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65, // 06 bytes -- MAC address (unicast source).\\n 0x08, 0x00, // 02 bytes -- EtherType (IPv4).\\n 0x45, 0x00, 0x00, 0x3c, 0xbe, 0x76, 0x00, 0x00, 0x80, 0x01, // 60 bytes -- Payload\\n 0xea, 0xef, 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03,\\n 0x08, 0x00, 0x4c, 0xfb, 0x00, 0x01, 0x00, 0x60, 0x61, 0x62,\\n 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,\\n 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,\\n 0x77, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,\\n 0xd1, 0x3a, 0x97, 0xe1 // 4 bytes -- CRC (correct)\\n };\\n\\n BufferDescriptor txBuffDesc;\\n\\n // ------ Lambda function ------------------------------------------------------------------------------------------\\n\\n auto frameTxRx = [&] (bool CrcLevel2, std::vector<uint8_t> &frame, bool CrcValid) -> bool\\n {\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xB0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .hardwareCrcOffloadEnabled = CrcLevel2,\\n .loopbackMode = Loopback::eLocal\\n };\\n\\n auto result = pEthDriver->abiOpen(config);\\n\\n // Set transmit frame\\n txBuffDesc.pData = frame.data();\\n txBuffDesc.length = frame.size();\\n\\n // Send frame\\n result = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, 100);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" TX: \\\" << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: abiTransmitBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n return false;\\n }\\n else\\n {\\n // Display frame info\\n std::cout\\n << \\\" TX: Frame (\\\" << std::dec << frame.size()\\n << \\\" B) with \\\" << (CrcValid ? \\\"valid\\\" : \\\"invalid\\\" ) << \\\" CRC sent.\\\\r\\\\n\\\"\\n ;\\n }\\n\\n auto availableFrames = waitForAvailableFrames(pEthDriver);\\n std::cout\\n << \\\" RX: \\\" << ((availableFrames != 0) ? \\\"Frame received\\\" : \\\"Frame not received\\\") << \\\".\\\\r\\\\n\\\"\\n ;\\n\\n pEthDriver->abiClose();\\n\\n return (availableFrames != 0);\\n };\\n\\n // ------ Lambda function (end) ------------------------------------------------------------------------------------\\n\\n auto testResult {true};\\n\\n // Send frames (hardware CRC ON)\\n std::cout\\n << \\\" CRC (level 2) TX generation: enabled.\\\\r\\\\n\\\"\\n << \\\" CRC (level 2) RX validation: enabled.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n testResult = frameTxRx(true, ethFrameWithCorrectCrc, true) && testResult;\\n testResult = frameTxRx(true, ethFrameWithInvalidCrc, false) && testResult;\\n\\n // Send frames (hardware CRC OFF)\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" CRC (level 2) TX generation: disabled.\\\\r\\\\n\\\"\\n << \\\" CRC (level 2) RX validation: enabled.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n testResult = frameTxRx(false, ethFrameWithCorrectCrc, true) && testResult;\\n testResult = !frameTxRx(false, ethFrameWithInvalidCrc, false) && testResult;\\n\\n if(testResult)\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: CRC (level 2) generation & validation works.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: CRC (level 2) generation & validation doesn't work.\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This test tests generation and verification of OSI level 3 CRC (IP) & OSI Level 4 CRC (TCP/UDP/ICMP).\\n//! Test transmits ethernet frames with invalid and correct CRC (OSI level 3, 4). Frames with valid CRC\\n//! (OSI level 3 and 4) are labeled TCP, UDP, ICMP. Frames with invalid CRC (OSI level 3) are labeled as\\n//! TCP(3), UDP(3), ICMP(3) and frames with invalid CRC (OSI level 4) are labeled TCP(4), UDP(4), ICMP(4).\\n//! These frames are transmitted and are then received with all possible combinations of driver\\n//! initialization options \\\"transmitCrcOffloadEnabled\\\" (overwrites frames level 3, 4, CRC with newly\\n//! calculated one) and \\\"receiveCrcOffloadEnabled\\\" (validates level 3, 4 CRC upon arrival and discards\\n//! frames with faulty CRC).\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//======================================================================================================================\\nvoid g3TestCrcLevel3And4(IBase_latest* pEthDriver)\\n{\\n std::cout\\n << \\\"----------------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"TEST: g3TestCrcLevel3And4()\\\\r\\\\n\\\"\\n << \\\"INFO: This test tests generation and verification of OSI level 3 CRC\\\\r\\\\n\\\"\\n << \\\" (IP) & OSI Level 4 CRC (TCP/UDP/ICMP). Test transmits ethernet\\\\r\\\\n\\\"\\n << \\\" frames with invalid and correct CRC (OSI level 3, 4). Frames\\\\r\\\\n\\\"\\n << \\\" with valid CRC (OSI level 3 and 4) are labeled TCP, UDP, ICMP.\\\\r\\\\n\\\"\\n << \\\" Frames with invalid CRC (OSI level 3) are labeled as TCP(3),\\\\r\\\\n\\\"\\n << \\\" UDP(3), ICMP(3) and frames with invalid CRC (OSI level 4) are\\\\r\\\\n\\\"\\n << \\\" labeled TCP(4), UDP(4), ICMP(4). These frames are transmitted\\\\r\\\\n\\\"\\n << \\\" and are then received with all possible combinations of\\\\r\\\\n\\\"\\n << \\\" driver initialization options \\\\\\\"transmitCrcOffloadEnabled\\\\\\\"\\\\r\\\\n\\\"\\n << \\\" (overwrites frames level 3, 4, CRC with newly calculated one)\\\\r\\\\n\\\"\\n << \\\" and \\\\\\\"receiveCrcOffloadEnabled\\\\\\\" (validates level 3, 4 CRC upon\\\\r\\\\n\\\"\\n << \\\" arrival and discards frames with faulty CRC).\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n\\n std::array<uint8_t, 37> pass {};\\n\\n EthernetConfig config = {\\n .macConfigurationMode = MacConfiguration::eSoftware,\\n .macAddress = MacAddress{\\n .byte0 = 0x00,\\n .byte1 = 0xb0,\\n .byte2 = 0x00,\\n .byte3 = 0x00,\\n .byte4 = 0x00,\\n .byte5 = 0x00\\n },\\n .hardwareCrcOffloadEnabled = true,\\n .loopbackMode = Loopback::eLocal\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the frame that will be sent. It will be changed to\\n // test sending and receiving different frame sizes.\\n BufferDescriptor txBuffDesc {\\n .pData = g_txBuffer.data(),\\n .length = g_txBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Define a transmit buffer descriptor - length is the length of the data that can be received. This will not be\\n // changed.\\n BufferDescriptor rxBuffDesc {\\n .pData = g_rxBuffer.data(),\\n .length = g_rxBuffer.size(),\\n .pNext = nullptr\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameIcmp {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x3c, 0xbd, 0xf1, 0x00, 0x00, 0x80, 0x01,\\n 0xeb, 0x74, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0x08, 0x00,\\n 0x4d, 0x4a, // CRC (level 4 - ICMP)\\n 0x00, 0x01, 0x00, 0x11, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,\\n 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,\\n 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61, 0x62, 0x63,\\n 0x64, 0x65,\\n 0x66, 0x67, 0x68, 0x69\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameIcmpCorruptedCrcLevel3 {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x3c, 0xbd, 0xf1, 0x00, 0x00, 0x80, 0x01,\\n 0xeb, 0x75, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0x08, 0x00,\\n 0x4d, 0x4a, // CRC (level 4 - ICMP)\\n 0x00, 0x01, 0x00, 0x11, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,\\n 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,\\n 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61, 0x62, 0x63,\\n 0x64, 0x65,\\n 0x66, 0x67, 0x68, 0x69\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameIcmpCorruptedCrcLevel4 {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x3c, 0xbd, 0xf1, 0x00, 0x00, 0x80, 0x01,\\n 0xeb, 0x74, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0x08, 0x00,\\n 0x4d, 0x4b, // CRC (level 4 - ICMP)\\n 0x00, 0x01, 0x00, 0x11, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,\\n 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,\\n 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61, 0x62, 0x63,\\n 0x64, 0x65,\\n 0x66, 0x67, 0x68, 0x69\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameTcp {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x28, 0xbe, 0x16, 0x40, 0x00, 0x80, 0x06,\\n 0xab, 0x5e, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0x04, 0x6c,\\n 0x00, 0x50, 0x2b, 0xe6, 0x97, 0x29, 0x00, 0x00, 0x19, 0xe5,\\n 0x50, 0x10, 0xfe, 0xfa,\\n 0x3d, 0xce, // CRC (level 4 - TCP)\\n 0x00, 0x00\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameTcpCorruptedCrcLevel3 {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x28, 0xbe, 0x16, 0x40, 0x00, 0x80, 0x06,\\n 0xab, 0x5f, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0x04, 0x6c,\\n 0x00, 0x50, 0x2b, 0xe6, 0x97, 0x29, 0x00, 0x00, 0x19, 0xe5,\\n 0x50, 0x10, 0xfe, 0xfa,\\n 0x3d, 0xce, // CRC (level 4 - TCP)\\n 0x00, 0x00\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameTcpCorruptedCrcLevel4 {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x28, 0xbe, 0x16, 0x40, 0x00, 0x80, 0x06,\\n 0xab, 0x5e, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0x04, 0x6c,\\n 0x00, 0x50, 0x2b, 0xe6, 0x97, 0x29, 0x00, 0x00, 0x19, 0xe5,\\n 0x50, 0x10, 0xfe, 0xfa,\\n 0x3d, 0xcf, // CRC (level 4 - TCP)\\n 0x00, 0x00\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameUdp {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x28, 0xbe, 0x5e, 0x00, 0x00, 0x80, 0x11,\\n 0xeb, 0x0b, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0xe0, 0xbf,\\n 0x11, 0x5c, 0x00, 0x14,\\n 0xc0, 0xa4, // CRC (level 4 - UDP)\\n 0x5b, 0x31, 0x34, 0x5d, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20,\\n 0x39, 0x39\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameUdpCorruptedCrcLevel3 {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x28, 0xbe, 0x5e, 0x00, 0x00, 0x80, 0x11,\\n 0xeb, 0x0c, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0xe0, 0xbf,\\n 0x11, 0x5c, 0x00, 0x14,\\n 0xc0, 0xa4, // CRC (level 4 - UDP)\\n 0x5b, 0x31, 0x34, 0x5d, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20,\\n 0x39, 0x39\\n };\\n\\n // Ethernet II frame:\\n std::vector<uint8_t> frameUdpCorruptedCrcLevel4 {\\n 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,\\n 0x74, 0xda, 0x38, 0xfe, 0x28, 0x65,\\n 0x08, 0x00,\\n 0x45, 0x00, 0x00, 0x28, 0xbe, 0x5e, 0x00, 0x00, 0x80, 0x11,\\n 0xeb, 0x0b, // CRC (level 3 - IP)\\n 0xc0, 0xa8, 0x88, 0x06, 0xc0, 0xa8, 0x88, 0x03, 0xe0, 0xbf,\\n 0x11, 0x5c, 0x00, 0x14,\\n 0xc0, 0xa5, // CRC (level 4 - UDP)\\n 0x5b, 0x31, 0x34, 0x5d, 0x44, 0x61, 0x74, 0x61, 0x3a, 0x20,\\n 0x39, 0x39\\n };\\n\\n // ------ Lambda function ------------------------------------------------------------------------------------------\\n\\n auto frameTxRx = [&] (const std::vector<uint8_t>& frame, const char* type) -> uint8_t\\n {\\n int numberOfDiff {};\\n std::uint32_t timeout {300};\\n ResultCode result {ResultCode::eOk};\\n\\n // Modify the length of the TX buffer descriptor. RX buffer descriptor's length will be automatically modified\\n // upon receiving the data.\\n txBuffDesc.length = frame.size();\\n\\n // Copy frame to g_txBuffer.\\n std::copy(frame.begin(), frame.end(), g_txBuffer.begin());\\n\\n // Transmit the data.\\n result = pEthDriver->abiSpecific()->abiTransmitBlocking(&txBuffDesc, timeout);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: abiTransmitBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return 4;\\n }\\n\\n waitForAvailableFrames(pEthDriver);\\n\\n rxBuffDesc.pData = g_rxBuffer.data();\\n rxBuffDesc.length = g_rxBuffer.size();\\n rxBuffDesc.pNext = nullptr;\\n\\n // Receive the data.\\n result = pEthDriver->abiSpecific()->abiReceiveBlocking(&rxBuffDesc, timeout);\\n if(result != ResultCode::eOk)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n <<\\\" B: abiReceiveBlocking() call: \\\" << convertResultCode2Str(result) << \\\".\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return 3;\\n }\\n\\n // Check what we received.\\n if(rxBuffDesc.length == 0 || rxBuffDesc.pData == NULL)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: RX data empty.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return 2;\\n }\\n\\n numberOfDiff = compareBufferDescriptors(txBuffDesc, rxBuffDesc);\\n\\n // Check whether transmitted and received data is the same.\\n if(numberOfDiff != 0)\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: TX & RX data do not match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return 1;\\n }\\n else\\n {\\n std::cout\\n << \\\" \\\" << type << std::dec << std::setfill(' ') << std::setw(4) << frame.size()\\n << \\\" B: TX & RX data match.\\\\r\\\\n\\\"\\n ;\\n // Restore the original size of the RX buffer.\\n rxBuffDesc.length = g_rxBuffer.size();\\n return 0;\\n }\\n };\\n\\n // ------ Lambda function (end) ------------------------------------------------------------------------------------\\n\\n std::cout\\n << \\\" CRC (level 3, 4) TX generation: disabled.\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) RX validation: disabled.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.transmitCrcOffloadEnabled = false;\\n config.receiveCrcOffloadEnabled = false;\\n pEthDriver->abiOpen(config);\\n pass.at(0) = frameTxRx(frameTcp, \\\"TCP: \\\");\\n pass.at(1) = frameTxRx(frameTcpCorruptedCrcLevel3, \\\"TCP(3): \\\");\\n pass.at(2) = frameTxRx(frameTcpCorruptedCrcLevel4, \\\"TCP(4): \\\");\\n pass.at(3) = frameTxRx(frameUdp, \\\"UDP: \\\");\\n pass.at(4) = frameTxRx(frameUdpCorruptedCrcLevel3, \\\"UDP(3): \\\");\\n pass.at(5) = frameTxRx(frameUdpCorruptedCrcLevel4, \\\"UDP(4): \\\");\\n pass.at(6) = frameTxRx(frameIcmp, \\\"ICMP: \\\");\\n pass.at(7) = frameTxRx(frameIcmpCorruptedCrcLevel3, \\\"ICMP(3): \\\");\\n pass.at(8) = frameTxRx(frameIcmpCorruptedCrcLevel4, \\\"ICMP(4): \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) TX generation: disabled.\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) RX validation: enabled.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.transmitCrcOffloadEnabled = false;\\n config.receiveCrcOffloadEnabled = true;\\n pEthDriver->abiOpen(config);\\n pass.at(9) = frameTxRx(frameTcp, \\\"TCP: \\\");\\n pass.at(10) = frameTxRx(frameTcpCorruptedCrcLevel3, \\\"TCP(3): \\\");\\n pass.at(11) = frameTxRx(frameTcpCorruptedCrcLevel4, \\\"TCP(4): \\\");\\n pass.at(12) = frameTxRx(frameUdp, \\\"UDP: \\\");\\n pass.at(13) = frameTxRx(frameUdpCorruptedCrcLevel3, \\\"UDP(3): \\\");\\n pass.at(14) = frameTxRx(frameUdpCorruptedCrcLevel4, \\\"UDP(4): \\\");\\n pass.at(15) = frameTxRx(frameIcmp, \\\"ICMP: \\\");\\n pass.at(16) = frameTxRx(frameIcmpCorruptedCrcLevel3, \\\"ICMP(3): \\\");\\n pass.at(17) = frameTxRx(frameIcmpCorruptedCrcLevel4, \\\"ICMP(4): \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) TX generation: enabled.\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) RX validation: enabled.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.transmitCrcOffloadEnabled = true;\\n config.receiveCrcOffloadEnabled = true;\\n pEthDriver->abiOpen(config);\\n pass.at(18) = frameTxRx(frameTcp, \\\"TCP: \\\");\\n pass.at(19) = frameTxRx(frameTcpCorruptedCrcLevel3, \\\"TCP(3): \\\");\\n pass.at(20) = frameTxRx(frameTcpCorruptedCrcLevel4, \\\"TCP(4): \\\");\\n pass.at(21) = frameTxRx(frameUdp, \\\"UDP: \\\");\\n pass.at(22) = frameTxRx(frameUdpCorruptedCrcLevel3, \\\"UDP(3): \\\");\\n pass.at(23) = frameTxRx(frameUdpCorruptedCrcLevel4, \\\"UDP(4): \\\");\\n pass.at(24) = frameTxRx(frameIcmp, \\\"ICMP: \\\");\\n pass.at(25) = frameTxRx(frameIcmpCorruptedCrcLevel3, \\\"ICMP(3): \\\");\\n pass.at(26) = frameTxRx(frameIcmpCorruptedCrcLevel4, \\\"ICMP(4): \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) TX generation: enabled.\\\\r\\\\n\\\"\\n << \\\" CRC (level 3, 4) RX validation: disabled.\\\\r\\\\n\\\"\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n ;\\n config.transmitCrcOffloadEnabled = true;\\n config.receiveCrcOffloadEnabled = false;\\n pEthDriver->abiOpen(config);\\n pass.at(27) = frameTxRx(frameTcp, \\\"TCP: \\\");\\n pass.at(28) = frameTxRx(frameTcpCorruptedCrcLevel3, \\\"TCP(3): \\\");\\n pass.at(29) = frameTxRx(frameTcpCorruptedCrcLevel4, \\\"TCP(4): \\\");\\n pass.at(30) = frameTxRx(frameUdp, \\\"UDP: \\\");\\n pass.at(31) = frameTxRx(frameUdpCorruptedCrcLevel3, \\\"UDP(3): \\\");\\n pass.at(32) = frameTxRx(frameUdpCorruptedCrcLevel4, \\\"UDP(4): \\\");\\n pass.at(33) = frameTxRx(frameIcmp, \\\"ICMP: \\\");\\n pass.at(34) = frameTxRx(frameIcmpCorruptedCrcLevel3, \\\"ICMP(3): \\\");\\n pass.at(35) = frameTxRx(frameIcmpCorruptedCrcLevel4, \\\"ICMP(4): \\\");\\n osDelay(100);\\n pEthDriver->abiClose();\\n\\n if(\\n pass.at(0) == 0 && pass.at(1) == 0 && pass.at(2) == 0 &&\\n pass.at(3) == 0 && pass.at(4) == 0 && pass.at(5) == 0 &&\\n pass.at(6) == 0 && pass.at(7) == 0 && pass.at(8) == 0 &&\\n pass.at(9) == 0 && pass.at(10) == 2 && pass.at(11) == 2 &&\\n pass.at(12) == 0 && pass.at(13) == 2 && pass.at(14) == 2 &&\\n pass.at(15) == 0 && pass.at(16) == 2 && pass.at(17) == 2 &&\\n pass.at(18) == 0 && pass.at(19) == 1 && pass.at(20) == 1 &&\\n pass.at(21) == 0 && pass.at(22) == 1 && pass.at(23) == 1 &&\\n pass.at(24) == 0 && pass.at(25) == 1 && pass.at(26) == 1 &&\\n pass.at(27) == 0 && pass.at(28) == 1 && pass.at(29) == 1 &&\\n pass.at(30) == 0 && pass.at(31) == 1 && pass.at(32) == 1 &&\\n pass.at(33) == 0 && pass.at(34) == 1 && pass.at(35) == 1\\n )\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"PASS: CRC (level 3, 4) generation & validation works.\\\\r\\\\n\\\"\\n ;\\n }\\n else\\n {\\n std::cout\\n << \\\" ---------------------------------------------------------------\\\\r\\\\n\\\"\\n << \\\"FAIL: CRC (level 3, 4) generation & validation does not work.\\\\r\\\\n\\\"\\n ;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function prints all six bytes in the \\\"MacAddress\\\" structure in hexadecimal format.\\n//! @param \\\"std::string\\\" used to suffix the MAC address.\\n//! @param \\\"MacAddress\\\" structure from where 6 bytes are printed.\\n//======================================================================================================================\\nvoid printMacAddress(std::string suffix, MacAddress& macAddress)\\n{\\n std::cout << std::hex << std::setfill('0')\\n << \\\" \\\"\\n << std::setw(2) << static_cast<unsigned short>(macAddress.byte0) << \\\":\\\"\\n << std::setw(2) << static_cast<unsigned short>(macAddress.byte1) << \\\":\\\"\\n << std::setw(2) << static_cast<unsigned short>(macAddress.byte2) << \\\":\\\"\\n << std::setw(2) << static_cast<unsigned short>(macAddress.byte3) << \\\":\\\"\\n << std::setw(2) << static_cast<unsigned short>(macAddress.byte4) << \\\":\\\"\\n << std::setw(2) << static_cast<unsigned short>(macAddress.byte5) << \\\" \\\"\\n << suffix\\n << \\\"\\\\r\\\\n\\\"\\n ;\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function compares two MAC addresses byte by byte and checks whether they are the same.\\n//! @param Reference to the MAC address packed in a \\\"MacAddress\\\" structure.\\n//! @param Reference to the MAC address packed in a \\\"MacAddress\\\" structure.\\n//! @return If argument MAC address bytes are all the same, 1 is returned. Otherwise\\n//! 0 is returned.\\n//======================================================================================================================\\nbool areMacAddrEqual(MacAddress& macAddress1, MacAddress& macAddress2)\\n{\\n return(\\n (macAddress1.byte0 == macAddress2.byte0) &&\\n (macAddress1.byte1 == macAddress2.byte1) &&\\n (macAddress1.byte2 == macAddress2.byte2) &&\\n (macAddress1.byte3 == macAddress2.byte3) &&\\n (macAddress1.byte4 == macAddress2.byte4) &&\\n (macAddress1.byte5 == macAddress2.byte5)\\n );\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function takes a \\\"bool\\\" output parameter \\\"signalFlag\\\" which should be set to \\\"false\\\" before calling\\n//! this function. This function sets a \\\"timeout\\\" in which \\\"signalFlag\\\" is continuously checked for a \\\"true\\\"\\n//! value. When (a) \\\"true\\\" value is detected or (b) \\\"timeout\\\" happens, this function returns. In case of (a) it\\n//! returns \\\"true\\\" and resets the signal to \\\"false\\\" but in case (b) it prints and then returns \\\"false\\\".\\n//! @param Bool flag (output parameter) which should be set to \\\"false\\\" before calling this function.\\n//! @return Returns a bool indicating if \\\"signalFlag\\\" was set in a \\\"timeout\\\" or not.\\n//======================================================================================================================\\nbool flagTimeout(bool& signalFlag, const uint32_t timeoutInMs)\\n{\\n threading::Timeout timeout {std::chrono::milliseconds{timeoutInMs}};\\n while(signalFlag != true)\\n {\\n if(timeout.elapsed())\\n {\\n break;\\n }\\n }\\n\\n if(signalFlag == true)\\n {\\n // Reset \\\"signalFlag\\\".\\n signalFlag = false;\\n return true;\\n }\\n else\\n {\\n std::cout << \\\" flagTimeout(): Timeout!\\\\r\\\\n\\\";\\n return false;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function takes an \\\"Interrupt\\\" which is an enum and converts it back to it's string form which is\\n//! then returned.\\n//! @param \\\"Interrupt\\\" enum class.\\n//! @return \\\"std::string\\\" representing a string form for any \\\"Interrupt\\\".\\n//======================================================================================================================\\nstd::string convertInterrupt2Str(Interrupt returnValueInt)\\n{\\n std::string returnValueStr {\\\"\\\"};\\n\\n switch(returnValueInt)\\n {\\n case Interrupt::eReceive:\\n returnValueStr.assign(\\\"eReceive\\\");\\n break;\\n case Interrupt::eLinkChange:\\n returnValueStr.assign(\\\"eLinkChange\\\");\\n break;\\n }\\n\\n return returnValueStr;\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function takes a \\\"ResultCode\\\" which is an enum and converts it back to it's string form which is\\n//! then returned.\\n//! @param \\\"ResultCode\\\" enum class.\\n//! @return \\\"std::string\\\" representing a string form for any \\\"ResultCode\\\".\\n//======================================================================================================================\\nstd::string convertResultCode2Str(ResultCode returnValueInt)\\n{\\n std::string returnValueStr {\\\"\\\"};\\n\\n switch(returnValueInt)\\n {\\n case ResultCode::eOk:\\n returnValueStr.assign(\\\"eOk\\\");\\n break;\\n case ResultCode::eUnknown:\\n returnValueStr.assign(\\\"eUnknown\\\");\\n break;\\n case ResultCode::eNotImplemented:\\n returnValueStr.assign(\\\"eNotImplemented\\\");\\n break;\\n case ResultCode::eInvalidConfiguration:\\n returnValueStr.assign(\\\"eInvalidConfiguration\\\");\\n break;\\n case ResultCode::eInvalidState:\\n returnValueStr.assign(\\\"eInvalidState\\\");\\n break;\\n case ResultCode::eMutexError:\\n returnValueStr.assign(\\\"eMutexError\\\");\\n break;\\n case ResultCode::eBufferFull:\\n returnValueStr.assign(\\\"eBufferFull\\\");\\n break;\\n case ResultCode::eTimeout:\\n returnValueStr.assign(\\\"eTimeout\\\");\\n break;\\n case ResultCode::eAccessDenied:\\n returnValueStr.assign(\\\"eAccessDenied\\\");\\n break;\\n case ResultCode::eNotReady:\\n returnValueStr.assign(\\\"eNotReady\\\");\\n break;\\n case ResultCode::eReadError:\\n returnValueStr.assign(\\\"eReadError\\\");\\n break;\\n case ResultCode::eWriteError:\\n returnValueStr.assign(\\\"eWriteError\\\");\\n break;\\n case ResultCode::eInvalidParameter:\\n returnValueStr.assign(\\\"eInvalidParameter\\\");\\n break;\\n case ResultCode::eContextError:\\n returnValueStr.assign(\\\"eContextError\\\");\\n break;\\n case ResultCode::eCreationFailed:\\n returnValueStr.assign(\\\"eCreationFailed\\\");\\n break;\\n case ResultCode::eAlreadyCreated:\\n returnValueStr.assign(\\\"eAlreadyCreated\\\");\\n break;\\n case ResultCode::eNotFound:\\n returnValueStr.assign(\\\"eNotFound\\\");\\n break;\\n case ResultCode::eNotAvailable:\\n returnValueStr.assign(\\\"eNotAvailable\\\");\\n break;\\n }\\n\\n return returnValueStr;\\n\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function keeps on calling \\\"abiReadAvailableFrameCount()\\\" until (a) it gets a return status\\n//! different than \\\"eNotReady\\\" or \\\"frame_count\\\" different than 0 or (b) a timeout of 1000 ticks. Then\\n//! \\\"frame_count\\\" is returned.\\n//! @param Pointer to the KSZ8851SNL driver object with type IBase_latest.\\n//! @return int representing number of frames ready to be read.:\\n//======================================================================================================================\\nint waitForAvailableFrames(IBase_latest* pEthDriver)\\n{\\n\\n ResultCode r = ResultCode::eNotReady;\\n uint16_t frame_count = 0;\\n uint32_t tick1;\\n uint32_t tick2;\\n\\n tick1 = osKernelGetTickCount();\\n\\n do\\n {\\n r = pEthDriver->abiSpecific()->abiReadAvailableFrameCount(frame_count);\\n\\n // Break the loop after some time if conditions are not met.\\n tick2 = osKernelGetTickCount();\\n if(tick2 - tick1 > 1800)\\n {\\n break;\\n }\\n\\n }\\n while(r == ResultCode::eNotReady || frame_count == 0);\\n\\n return frame_count;\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function takes two BufferDescriptor arguments. It takes into account that multiple BufferDescriptor\\n//! can be connected into a chain using \\\"pNext\\\" ending with a \\\"pNext\\\" pointing to \\\"nullptr\\\". Function enters\\n//! a while loop and iterates over both arguments using pointer arithmetic and comparing them byte by byte.\\n//! On every difference return value \\\"neq\\\" is incremented.\\n//! @param BufferDescriptor type to be compared.\\n//! @param BufferDescriptor type to be compared.\\n//! @return int indicating number of differences between two BufferDescriptor arguments (0 if they are the same).\\n//======================================================================================================================\\nint compareBufferDescriptors(BufferDescriptor a, BufferDescriptor b)\\n{\\n\\n int neq = 0; // \\\"not-equals\\\"\\n BufferDescriptor* ac = &a;\\n BufferDescriptor* bc = &b;\\n int ai = 0;\\n int bi = 0;\\n int i = 0;\\n\\n while (true) {\\n\\n i++;\\n\\n if(ai >= ac->length)\\n {\\n ac = ac->pNext;\\n ai = 0;\\n }\\n\\n if(bi >= bc->length)\\n {\\n bc = bc->pNext;\\n bi = 0;\\n }\\n\\n if(ac == nullptr || bc == nullptr)\\n {\\n break;\\n }\\n\\n neq += ac->pData[ai] != bc->pData[bi];\\n\\n ai++;\\n bi++;\\n }\\n\\n return neq;\\n}\\n\\n\\n//======================================================================================================================\\n//! @brief This function's 1st parameter is a pointer to a \\\"BufferDescriptor\\\" type which in turn has a member\\n//! \\\"pData\\\" pointing to some array. This array's 1st member is first set to be the same as the \\\"seed\\\". Then\\n//! each successive member is set to be it's predecessor's value plus some random operations to produce a\\n//! seemingly random value. [1, p511].\\n//! [1] R. Sedgewick, Algorithms (2nd ed.)\\n//! @param Pointer to some \\\"BufferDescriptor\\\".\\n//! @param Integer that is used as a seed for producing random numbers in the array\\n//! to which first argument's \\\"pData\\\" member points to.\\n//======================================================================================================================\\nvoid populateBuffer(BufferDescriptor& buffDesc, int seed)\\n{\\n buffDesc.pData[0] = seed;\\n for(int member = 1; member < buffDesc.length; member++)\\n {\\n buffDesc.pData[member] = (buffDesc.pData[member - 1] * 7123 + 1) % 256;\\n }\\n}\\n\\n\\n//======================================================================================================================\\n//! @Brief This function configures a GPIO driver passed to it and opens it using. abiOpen(). If the call fails\\n//! function closes the driver with abiClose() and returns 0. In the opposite case it sets GPIO driver to 0,\\n//! waits and sets it to 1 in order to send the RESET signal. Then it closes the driver and returns 1.\\n//! According to the KSZ8851SNL reference manual 10 ms suffices for a device to reset [1, p.77], but we give\\n//! it 500 ms to do it.\\n//! [1] ../../../doc/ksz8851snl/reference_manual.pdf\\n//! @param Pointer to the GPIO driver object with type IBase_latest.\\n//! @return A bool indicating whether sending a RESET signal was successful or not.\\n//======================================================================================================================\\nbool resetTarget(gpio::IBase_latest* pResetDriver)\\n{\\n\\n uint32_t delayInMs {500};\\n ResultCode returnValue {ResultCode::eOk};\\n\\n // Prepare the gpio driver configuration for RESET.\\n gpio::GpioConfig_v4_0 config {\\n .mode = gpio::Mode_v2::eOutput,\\n .slewRate = 50,\\n .outputDriver = gpio::OutputDriver::ePushPull\\n };\\n\\n // Initialize the driver with the configuration, read the MAC and close.\\n returnValue = pResetDriver->abiOpen(config);\\n if(returnValue != ResultCode::eOk)\\n {\\n pResetDriver->abiClose();\\n return false;\\n }\\n\\n // Set reset signal to 0.\\n do\\n {\\n returnValue = pResetDriver->abiSpecific()->abiTransmit(false);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n\\n // Timeout (gives device time to reset).\\n osDelay(delayInMs);\\n\\n // Set reset signal to 1.\\n do\\n {\\n returnValue = pResetDriver->abiSpecific()->abiTransmit(true);\\n }\\n while(returnValue == ResultCode::eNotReady);\\n\\n // Timeout (gives device time to set up).\\n osDelay(delayInMs);\\n\\n pResetDriver->abiClose();\\n return true;\\n\\n}\\n\\n\\n} // namespace ethernet\\n} // namespace driver\\n} // namespace euler\\n\",\"uri\":\"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\",\"version\":0}}}\n\nI[11:23:33.088] <-- textDocument/didOpen\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.149] Loaded compilation database from /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/build/compile_commands.json\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.149] Broadcasting compilation database from /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.150] ASTWorker building file /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp version 0 with command \n[/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/build]\n/home/xenlauz/.conan/data/euler_toolchain_arm_rtos/1.1.0/sick/release/package/cb054d0b3e1ca595dc66bc2339d40f1f8f04ab31/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ --target=arm-none-eabi --driver-mode=g++ -D_GLIBCXX_USE_CXX11_ABI=1 -I/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device -I/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests -I/home/xenlauz/.conan/data -isystem /home/xenlauz/.conan/data/stm32_gpio_driver/2.0.0/sick/release/package/f1a5a252bf81d87e5e40718a78c66061bf769ca9/include -isystem /home/xenlauz/.conan/data/euler_driver_base/2.0.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/driver_interface_commons/1.4.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_abi_definitions/1.11.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_threading/2.1.1/sick/release/package/ce1624222fac38283bb0bc29a01a640d5dbe34db/include -isystem /home/xenlauz/.conan/data/euler_logging_frontend/1.1.0/sick/release/package/6c2567f9cc7e947d303057f842209d3a96a3344e/include -isystem /home/xenlauz/.conan/data/euler_config_headers_at_nucleo_stm32f429/2.1.0/sick/develop/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_nanostreams/1.0.3/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_stl_extension/1.5.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_observer_pattern_interface/1.1.1/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_threading_interface/1.1.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_freertos/1.0.0/sick/release/package/1cfb15f21c2f6b12e02015fa5954230a44e469e3/include -isystem /home/xenlauz/.conan/data/euler_freertos/1.0.0/sick/release/package/1cfb15f21c2f6b12e02015fa5954230a44e469e3/include/CMSIS -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/inc -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/CMSIS/Core/Include -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/CMSIS/Device/ST/STM32F4xx/Include -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/HAL_Driver -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/HAL_Driver/Legacy -isystem /home/xenlauz/.conan/data/gpio_driver_interface/1.2.1/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/stm32_spi_driver/1.1.0/sick/release/package/d4242f0ea4e55ea40d4058924501c4c57e7b84f0/include -isystem /home/xenlauz/.conan/data/spi_driver_interface/1.2.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/ksz8851snl_driver/1.0.0/user/develop/package/e0dc41afe9ab106a3c1847f00fd274c0720452ee/include -isystem /home/xenlauz/.conan/data/ethernet_driver_interface/1.0.0/sick/develop/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -DRAPIDXML_STATIC_POOL_SIZE=2048 -DRAPIDXML_DYNAMIC_POOL_SIZE=256 -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F429xx -DSTM32 -DEULER_THREADING_USE_CMSIS -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -O0 -g3 -gdwarf-4 -g -std=c++14 -o CMakeFiles/microengine_at_stm32f429.elf.dir/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp.obj -c -resource-dir=/home/xenlauz/.local/share/nvim/lsp_servers/clangd/clangd/lib/clang/15.0.6 -- /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.164] Driver produced command: cc1 -cc1 -triple thumbv7em-none-unknown-eabihf -fsyntax-only -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Ksz8851snlDriverTests.cpp -mrelocation-model static -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -fno-verbose-asm -mconstructor-aliases -nostdsysteminc -target-cpu cortex-m4 -target-feature -crc -target-feature -dotprod -target-feature +dsp -target-feature -mve -target-feature -mve.fp -target-feature -ras -target-feature -bf16 -target-feature -sb -target-feature -i8mm -target-feature -lob -target-feature -cdecp0 -target-feature -cdecp1 -target-feature -cdecp2 -target-feature -cdecp3 -target-feature -cdecp4 -target-feature -cdecp5 -target-feature -cdecp6 -target-feature -cdecp7 -target-feature -pacbti -target-feature -hwdiv-arm -target-feature +hwdiv -target-feature -vfp2 -target-feature +vfp2sp -target-feature -vfp3 -target-feature -vfp3d16 -target-feature +vfp3d16sp -target-feature -vfp3sp -target-feature +fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature +vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature -fp64 -target-feature -d32 -target-feature -neon -target-feature -fp16fml -target-feature -crypto -target-feature -sha2 -target-feature -aes -target-feature +strict-align -target-abi aapcs -mfloat-abi hard -Wunaligned-access -fallow-half-arguments-and-returns -mllvm -treat-scalable-fixed-error-as-warning -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/build -resource-dir /home/xenlauz/.local/share/nvim/lsp_servers/clangd/clangd/lib/clang/15.0.6 -isystem /home/xenlauz/.conan/data/stm32_gpio_driver/2.0.0/sick/release/package/f1a5a252bf81d87e5e40718a78c66061bf769ca9/include -isystem /home/xenlauz/.conan/data/euler_driver_base/2.0.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/driver_interface_commons/1.4.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_abi_definitions/1.11.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_threading/2.1.1/sick/release/package/ce1624222fac38283bb0bc29a01a640d5dbe34db/include -isystem /home/xenlauz/.conan/data/euler_logging_frontend/1.1.0/sick/release/package/6c2567f9cc7e947d303057f842209d3a96a3344e/include -isystem /home/xenlauz/.conan/data/euler_config_headers_at_nucleo_stm32f429/2.1.0/sick/develop/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_nanostreams/1.0.3/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_stl_extension/1.5.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_observer_pattern_interface/1.1.1/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_threading_interface/1.1.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/euler_freertos/1.0.0/sick/release/package/1cfb15f21c2f6b12e02015fa5954230a44e469e3/include -isystem /home/xenlauz/.conan/data/euler_freertos/1.0.0/sick/release/package/1cfb15f21c2f6b12e02015fa5954230a44e469e3/include/CMSIS -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/inc -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/CMSIS/Core/Include -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/CMSIS/Device/ST/STM32F4xx/Include -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/HAL_Driver -isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/HAL_Driver/Legacy -isystem /home/xenlauz/.conan/data/gpio_driver_interface/1.2.1/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/stm32_spi_driver/1.1.0/sick/release/package/d4242f0ea4e55ea40d4058924501c4c57e7b84f0/include -isystem /home/xenlauz/.conan/data/spi_driver_interface/1.2.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -isystem /home/xenlauz/.conan/data/ksz8851snl_driver/1.0.0/user/develop/package/e0dc41afe9ab106a3c1847f00fd274c0720452ee/include -isystem /home/xenlauz/.conan/data/ethernet_driver_interface/1.0.0/sick/develop/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include -D _GLIBCXX_USE_CXX11_ABI=1 -I /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device -I /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests -I /home/xenlauz/.conan/data -D RAPIDXML_STATIC_POOL_SIZE=2048 -D RAPIDXML_DYNAMIC_POOL_SIZE=256 -D TRACE -D OS_USE_TRACE_SEMIHOSTING_DEBUG -D STM32F429xx -D STM32 -D EULER_THREADING_USE_CMSIS -internal-isystem /home/xenlauz/.conan/data/euler_toolchain_arm_rtos/1.1.0/sick/release/package/cb054d0b3e1ca595dc66bc2339d40f1f8f04ab31/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/clang-runtimes/arm-none-eabi/include/c++/v1 -internal-isystem /home/xenlauz/.local/share/nvim/lsp_servers/clangd/clangd/lib/clang/15.0.6/include -internal-isystem /home/xenlauz/.conan/data/euler_toolchain_arm_rtos/1.1.0/sick/release/package/cb054d0b3e1ca595dc66bc2339d40f1f8f04ab31/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/clang-runtimes/arm-none-eabi/include -O0 -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/build -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -no-round-trip-args -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -x c++ /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.164] Building first preamble for /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp version 0\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.173] --> window/workDoneProgress/create(0)\nV[11:23:33.173] >>> {"id":0,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"backgroundIndexProgress"}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.173] Enqueueing 5 commands for indexing\nV[11:23:33.174] <<< {"id":0,"jsonrpc":"2.0","result":null}\n\nI[11:23:33.174] <-- reply(0)\nI[11:23:33.174] --> $/progress\nV[11:23:33.174] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"begin","percentage":0,"title":"indexing"}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.174] --> $/progress\nV[11:23:33.174] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"0/1","percentage":0}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.179] Failed to load shard: /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/stm32f4xx_it.c\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.181] Failed to load shard: /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/startup_stm32f429xx.s\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.182] Failed to load shard: /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/main.cpp\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.183] Failed to load shard: /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.185] Failed to load shard: /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/stm32f4xx_hal_timebase_tim.c\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.211] --> $/progress\nV[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"0/6","percentage":0}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.211] --> $/progress\nV[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"0/6","percentage":0}}}\n\nI[11:23:33.211] --> $/progress\nV[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"0/6","percentage":0}}}\n\nI[11:23:33.211] --> $/progress\nV[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"0/6","percentage":0}}}\n\nI[11:23:33.211] --> $/progress\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"1/6","percentage":16}}}\n\nI[11:23:33.211] --> $/progress\nV[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"1/6","percentage":16}}}\n\nI[11:23:33.211] --> $/progress\nV[11:23:33.211] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"1/6","percentage":16}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.220] Indexing /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/stm32f4xx_hal_timebase_tim.c (digest:=C155048C49FBACB4)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.220] Indexing /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/stm32f4xx_it.c (digest:=A2B58BE05B8AA6C2)\nV[11:23:33.220] Indexing /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/main.cpp (digest:=6D5AEC972712EBC8)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.220] Indexing /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/startup_stm32f429xx.s (digest:=657D5D3958FD8C42)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.221] Indexing /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp (digest:=4738A16CFF47A8D2)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.228] Ignored diagnostic. /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/startup_stm32f429xx.s: 'assembler' input unused\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-Xclang -no-round-trip-args'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-D _GLIBCXX_USE_CXX11_ABI=1'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-I /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-I /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-I /home/xenlauz/.conan/data'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/stm32_gpio_driver/2.0.0/sick/release/package/f1a5a252bf81d87e5e40718a78c66061bf769ca9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_driver_base/2.0.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/driver_interface_commons/1.4.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_abi_definitions/1.11.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_threading/2.1.1/sick/release/package/ce1624222fac38283bb0bc29a01a640d5dbe34db/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_logging_frontend/1.1.0/sick/release/package/6c2567f9cc7e947d303057f842209d3a96a3344e/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_config_headers_at_nucleo_stm32f429/2.1.0/sick/develop/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_nanostreams/1.0.3/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_stl_extension/1.5.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_observer_pattern_interface/1.1.1/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_threading_interface/1.1.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_freertos/1.0.0/sick/release/package/1cfb15f21c2f6b12e02015fa5954230a44e469e3/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_freertos/1.0.0/sick/release/package/1cfb15f21c2f6b12e02015fa5954230a44e469e3/include/CMSIS'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/inc'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/CMSIS/Core/Include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/CMSIS/Device/ST/STM32F4xx/Include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/HAL_Driver'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/euler_bsp_stm_nucleo_F429ZI/1.5.0/sick/develop/package/5ff1fd23cb485cb70077eea0381bffb1d0848f30/include/HAL_Driver/Legacy'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/gpio_driver_interface/1.2.1/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/stm32_spi_driver/1.1.0/sick/release/package/d4242f0ea4e55ea40d4058924501c4c57e7b84f0/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/spi_driver_interface/1.2.0/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/ksz8851snl_driver/1.0.0/user/develop/package/e0dc41afe9ab106a3c1847f00fd274c0720452ee/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-isystem /home/xenlauz/.conan/data/ethernet_driver_interface/1.0.0/sick/develop/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-mcpu=cortex-m4'\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-mthumb'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-mfloat-abi=hard'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-mfpu=fpv4-sp-d16'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-specs=nano.specs'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-ffunction-sections'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-g'\nV[11:23:33.228] Ignored diagnostic. argument unused during compilation: '-c'\nV[11:23:33.228] Ignored diagnostic. unable to handle compilation, expected exactly one compiler job in ''\nE[11:23:33.228] Indexing /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/startup_stm32f429xx.s failed: Couldn't build compiler invocation\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.228] --> $/progress\nV[11:23:33.228] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"2/6","percentage":33}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.236] Ignored diagnostic. /home/xenlauz/.conan/data/euler_abi_definitions/1.11.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/euler/abidefs/abi.h:677:12:'cstddef' file not found\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.238] Ignored diagnostic. /home/xenlauz/.conan/data/euler_driver_base/2.0.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/euler/driver/DriverError.h:14:10:'stdexcept' file not found\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.297] indexed preamble AST for /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp version 0:\n symbol slab: 1143 symbols, 363600 bytes\n ref slab: 0 symbols, 0 refs, 128 bytes\n relations slab: 9 relations, 296 bytes\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.305] Build dynamic index for header symbols with estimated memory usage of 1184732 bytes\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.319] Built preamble of size 583732 for file /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp version 0 in 0.15 seconds\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.342] Indexed /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp (964 symbols, 3314 refs, 26 files)\nI[11:23:33.342] Failed to compile /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp, index may be incomplete\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.398] Indexed /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/stm32f4xx_hal_timebase_tim.c (1941 symbols, 25406 refs, 41 files)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.398] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.398] Dex query tree: (LIMIT 10000 (& T=ela T=tes T=ase T=sel T=bas T=lat T=iba T=ate T=est (| S= S=euler:: S=euler::driver:: S=euler::driver::ethernet::) ?=Restricted For Code Completion))\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.399] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.399] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.400] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.400] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.401] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.401] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.402] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.402] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.403] Indexed /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/stm32f4xx_it.c (1978 symbols, 25505 refs, 43 files)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.403] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.403] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.404] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.404] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.405] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.405] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.405] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.405] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.406] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.406] Trying to fix unresolved name "IBase_latest" in scopes: [, euler::, euler::driver::, euler::driver::ethernet::]\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.443] indexed file AST for /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp version 0:\n symbol slab: 56 symbols, 17208 bytes\n ref slab: 125 symbols, 1079 refs, 43367 bytes\n relations slab: 0 relations, 24 bytes\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.443] Build dynamic index for main-file symbols with estimated memory usage of 116287 bytes\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.443] --> textDocument/publishDiagnostics\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.443] >>> {\"jsonrpc\":\"2.0\",\"method\":\"textDocument/publishDiagnostics\",\"params\":{\"diagnostics\":[{\"code\":\"pp_file_not_found\",\"message\":\"In included file: 'cstddef' file not found\",\"range\":{\"end\":{\"character\":10,\"line\":13},\"start\":{\"character\":9,\"line\":13}},\"relatedInformation\":[{\"location\":{\"range\":{\"end\":{\"character\":20,\"line\":676},\"start\":{\"character\":11,\"line\":676}},\"uri\":\"file:///home/xenlauz/.conan/data/euler_abi_definitions/1.11.2/sick/release/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/euler/abidefs/abi.h\"},\"message\":\"Error occurred here\"}],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":26,\"line\":40},\"start\":{\"character\":14,\"line\":40}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":29,\"line\":42},\"start\":{\"character\":17,\"line\":42}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":38,\"line\":43},\"start\":{\"character\":26,\"line\":43}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":40,\"line\":44},\"start\":{\"character\":28,\"line\":44}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":40,\"line\":45},\"start\":{\"character\":28,\"line\":45}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":33,\"line\":46},\"start\":{\"character\":21,\"line\":46}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":39,\"line\":47},\"start\":{\"character\":27,\"line\":47}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":42,\"line\":48},\"start\":{\"character\":30,\"line\":48}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":48,\"line\":49},\"start\":{\"character\":36,\"line\":49}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":47,\"line\":50},\"start\":{\"character\":35,\"line\":50}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":58,\"line\":51},\"start\":{\"character\":46,\"line\":51}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":62,\"line\":52},\"start\":{\"character\":50,\"line\":52}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":51,\"line\":53},\"start\":{\"character\":39,\"line\":53}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":50,\"line\":54},\"start\":{\"character\":38,\"line\":54}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":51,\"line\":55},\"start\":{\"character\":39,\"line\":55}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":51,\"line\":56},\"start\":{\"character\":39,\"line\":56}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":55,\"line\":57},\"start\":{\"character\":43,\"line\":57}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":58,\"line\":58},\"start\":{\"character\":46,\"line\":58}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"unknown_typename\",\"message\":\"Unknown type name 'IBase_latest'\",\"range\":{\"end\":{\"character\":41,\"line\":59},\"start\":{\"character\":29,\"line\":59}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"},{\"code\":\"fatal_too_many_errors\",\"message\":\"Too many errors emitted, stopping now\",\"range\":{\"end\":{\"character\":0,\"line\":0},\"start\":{\"character\":0,\"line\":0}},\"relatedInformation\":[],\"severity\":1,\"source\":\"clang\"}],\"uri\":\"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\",\"version\":0}}\n\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.543] Indexed /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/main.cpp (3279 symbols, 29312 refs, 79 files)\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.543] Failed to compile /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/Device/main.cpp, index may be incomplete\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:33.704] --> $/progress\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.704] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"3/6","percentage":50}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.767] --> $/progress\nV[11:23:33.767] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"4/6","percentage":66}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:33.800] --> $/progress\nV[11:23:33.800] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"report","message":"5/6","percentage":83}}}\n\n'
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:33.886] BackgroundIndex: building version 1 when background indexer is idle\n"
- [ERROR][2023-03-13 11:23:33] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:33.906] BackgroundIndex: serving version 1 (7416366 bytes)\nI[11:23:33.906] --> $/progress\nV[11:23:33.906] >>> {"jsonrpc":"2.0","method":"$/progress","params":{"token":"backgroundIndexProgress","value":{"kind":"end"}}}\n\n'
- [ERROR][2023-03-13 11:23:40] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:40.499] <<< {"id":2,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":20,"line":40},"textDocument":{"uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp"}}}\n\nI[11:23:40.499] <-- textDocument/definition(2)\n'
- [ERROR][2023-03-13 11:23:40] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:40.544] ASTWorker running Definitions on version 0 of /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:40] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:40.546] --> reply:textDocument/definition(2) 47 ms\nV[11:23:40.546] >>> {"id":2,"jsonrpc":"2.0","result":[]}\n\n'
- [ERROR][2023-03-13 11:23:42] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:42.864] <<< {"id":3,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":20,"line":40},"textDocument":{"uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp"}}}\n\nI[11:23:42.864] <-- textDocument/definition(3)\n'
- [ERROR][2023-03-13 11:23:42] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:42.864] ASTWorker running Definitions on version 0 of /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\nI[11:23:42.864] --> reply:textDocument/definition(3) 0 ms\nV[11:23:42.864] >>> {"id":3,"jsonrpc":"2.0","result":[]}\n\n'
- [ERROR][2023-03-13 11:23:47] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:47.677] <<< {"id":4,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":9,"line":40},"textDocument":{"uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp"}}}\n\nI[11:23:47.677] <-- textDocument/definition(4)\n'
- [ERROR][2023-03-13 11:23:47] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:47.699] ASTWorker running Definitions on version 0 of /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:47] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "I[11:23:47.699] --> reply:textDocument/definition(4) 22 ms\n"
- [ERROR][2023-03-13 11:23:47] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:47.700] >>> {"id":4,"jsonrpc":"2.0","result":[{"range":{"end":{"character":13,"line":108},"start":{"character":5,"line":108}},"uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp"}]}\n\n'
- [ERROR][2023-03-13 11:23:52] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:52.808] <<< {"id":5,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":18,"line":40},"textDocument":{"uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp"}}}\n\nI[11:23:52.808] <-- textDocument/definition(5)\n'
- [ERROR][2023-03-13 11:23:52] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:52.844] ASTWorker running Definitions on version 0 of /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:52] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:52.845] --> reply:textDocument/definition(5) 36 ms\nV[11:23:52.845] >>> {"id":5,"jsonrpc":"2.0","result":[]}\n\n'
- [ERROR][2023-03-13 11:23:54] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'V[11:23:54.223] <<< {"id":6,"jsonrpc":"2.0","method":"textDocument/definition","params":{"position":{"character":18,"line":40},"textDocument":{"uri":"file:///mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp"}}}\n\nI[11:23:54.223] <-- textDocument/definition(6)\n'
- [ERROR][2023-03-13 11:23:54] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" "V[11:23:54.223] ASTWorker running Definitions on version 0 of /mnt/c/Users/xenlauz/Documents/002--projects/003--sick--workpackage--microengine/ksz8851-test-at-f429zi/worktrees/develop/src/microengine_at_nucleo_stm32F429/DriverTests/Ksz8851snlDriverTests.cpp\n"
- [ERROR][2023-03-13 11:23:54] .../vim/lsp/rpc.lua:733 "rpc" "clangd" "stderr" 'I[11:23:54.223] --> reply:textDocument/definition(6) 0 ms\nV[11:23:54.223] >>> {"id":6,"jsonrpc":"2.0","result":[]}\n\n'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement