Message: EthPhyMessage: Add Status

This commit is contained in:
David Rebbe
2026-09-29 15:01:36 -04:00
committed by Kyle Schwarz
parent 0a67c9cf5d
commit 4c0781190e
3 changed files with 14 additions and 1 deletions
+1
View File
@@ -39,6 +39,7 @@ std::shared_ptr<EthPhyMessage> HardwareEthernetPhyRegisterPacket::DecodeToMessag
phyMessage->WriteEnable = (pEntry->WriteEnable != 0u); phyMessage->WriteEnable = (pEntry->WriteEnable != 0u);
phyMessage->Clause45Enable = (pEntry->Clause45Enable != 0u); phyMessage->Clause45Enable = (pEntry->Clause45Enable != 0u);
phyMessage->BusIndex = static_cast<uint8_t>(pEntry->BusIndex); phyMessage->BusIndex = static_cast<uint8_t>(pEntry->BusIndex);
phyMessage->Status = static_cast<uint8_t>(pEntry->status);
phyMessage->Version = static_cast<uint8_t>(pEntry->version); phyMessage->Version = static_cast<uint8_t>(pEntry->version);
if(phyMessage->Clause45Enable) if(phyMessage->Clause45Enable)
phyMessage->Clause45 = pEntry->clause45; phyMessage->Clause45 = pEntry->clause45;
@@ -8,6 +8,7 @@
#include "icsneo/communication/packet.h" #include "icsneo/communication/packet.h"
#include <vector> #include <vector>
#include <memory> #include <memory>
#include <optional>
namespace icsneo { namespace icsneo {
@@ -22,6 +23,9 @@ struct PhyMessage {
bool Clause45Enable = false; bool Clause45Enable = false;
uint8_t BusIndex = 0; uint8_t BusIndex = 0;
uint8_t Version = PhyPacketVersion; 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<uint8_t> Status;
union { union {
Clause22Message Clause22{}; Clause22Message Clause22{};
Clause45Message Clause45; Clause45Message Clause45;
+9 -1
View File
@@ -17,13 +17,21 @@ std::vector<uint8_t> encode(const EthPhyMessage& msg) {
return bytes; return bytes;
} }
} }
TEST(EthPhyRegister, KnownWireBytes) { TEST(EthPhyRegister, KnownWireBytesAndStatus) {
for(bool clause45 : {false, true}) { for(bool clause45 : {false, true}) {
auto msg = request(clause45, true); auto msg = request(clause45, true);
EXPECT_FALSE(msg.messages[0]->Status.has_value());
auto bytes = encode(msg); auto bytes = encode(msg);
EXPECT_EQ(bytes, (std::vector<uint8_t>{1, 0, 1, 8, static_cast<uint8_t>(clause45 ? 7 : 3), 0x1f, EXPECT_EQ(bytes, (std::vector<uint8_t>{1, 0, 1, 8, static_cast<uint8_t>(clause45 ? 7 : 3), 0x1f,
31, static_cast<uint8_t>(clause45 ? 31 : 255), static_cast<uint8_t>(clause45 ? 255 : 31), 31, static_cast<uint8_t>(clause45 ? 31 : 255), static_cast<uint8_t>(clause45 ? 255 : 31),
static_cast<uint8_t>(clause45 ? 255 : 0), 0x34, 0x12})); static_cast<uint8_t>(clause45 ? 255 : 0), 0x34, 0x12}));
for(uint8_t status = 0; status < 8; ++status) {
bytes[4] = static_cast<uint8_t>((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) { TEST(EthPhyRegister, InvalidRequestsLeaveOutputUntouched) {