diff --git a/communication/packet/ethphyregpacket.cpp b/communication/packet/ethphyregpacket.cpp index 7015ab1..4ca7957 100644 --- a/communication/packet/ethphyregpacket.cpp +++ b/communication/packet/ethphyregpacket.cpp @@ -39,6 +39,7 @@ std::shared_ptr HardwareEthernetPhyRegisterPacket::DecodeToMessag phyMessage->WriteEnable = (pEntry->WriteEnable != 0u); phyMessage->Clause45Enable = (pEntry->Clause45Enable != 0u); phyMessage->BusIndex = static_cast(pEntry->BusIndex); + phyMessage->Status = static_cast(pEntry->status); phyMessage->Version = static_cast(pEntry->version); if(phyMessage->Clause45Enable) phyMessage->Clause45 = pEntry->clause45; diff --git a/include/icsneo/communication/message/ethphymessage.h b/include/icsneo/communication/message/ethphymessage.h index 18de5e1..e061e2a 100644 --- a/include/icsneo/communication/message/ethphymessage.h +++ b/include/icsneo/communication/message/ethphymessage.h @@ -8,6 +8,7 @@ #include "icsneo/communication/packet.h" #include #include +#include namespace icsneo { @@ -22,6 +23,9 @@ struct PhyMessage { bool Clause45Enable = false; uint8_t BusIndex = 0; uint8_t Version = PhyPacketVersion; + // Unset on locally constructed messages; every decoded response sets the raw wire status. + // Ignored when sending. A value does not establish firmware error coverage. + std::optional Status; union { Clause22Message Clause22{}; Clause45Message Clause45; diff --git a/test/unit/ethphyregistertest.cpp b/test/unit/ethphyregistertest.cpp index 92b540a..fc9ba11 100644 --- a/test/unit/ethphyregistertest.cpp +++ b/test/unit/ethphyregistertest.cpp @@ -17,13 +17,21 @@ std::vector encode(const EthPhyMessage& msg) { return bytes; } } -TEST(EthPhyRegister, KnownWireBytes) { +TEST(EthPhyRegister, KnownWireBytesAndStatus) { for(bool clause45 : {false, true}) { auto msg = request(clause45, true); + EXPECT_FALSE(msg.messages[0]->Status.has_value()); auto bytes = encode(msg); EXPECT_EQ(bytes, (std::vector{1, 0, 1, 8, static_cast(clause45 ? 7 : 3), 0x1f, 31, static_cast(clause45 ? 31 : 255), static_cast(clause45 ? 255 : 31), static_cast(clause45 ? 255 : 0), 0x34, 0x12})); + for(uint8_t status = 0; status < 8; ++status) { + bytes[4] = static_cast((clause45 ? 7 : 3) | (status << 3)); + auto decoded = HardwareEthernetPhyRegisterPacket::DecodeToMessage(bytes, ignore); + ASSERT_NE(decoded, nullptr); + EXPECT_EQ(decoded->messages[0]->Status, status); + EXPECT_EQ(encode(*decoded)[4], clause45 ? 7 : 3); // never retransmit response status + } } } TEST(EthPhyRegister, InvalidRequestsLeaveOutputUntouched) {