loconet: improved message validation
Dieser Commit ist enthalten in:
Ursprung
b62127e196
Commit
2e84170dc7
@ -186,7 +186,7 @@ void LocoNetSerial::read()
|
||||
const Protocol::LocoNet::Message* message = reinterpret_cast<const Protocol::LocoNet::Message*>(pos);
|
||||
|
||||
size_t drop = 0;
|
||||
while((message->size() == 0 || (message->size() <= bytesTransferred && !Protocol::LocoNet::isChecksumValid(*message))) && drop < bytesTransferred)
|
||||
while((message->size() == 0 || (message->size() <= bytesTransferred && !Protocol::LocoNet::isValid(*message))) && drop < bytesTransferred)
|
||||
{
|
||||
drop++;
|
||||
pos++;
|
||||
|
||||
@ -78,7 +78,7 @@ bool LocoNet::send(const Message& message)
|
||||
{
|
||||
if(m_debugLog)
|
||||
logDebug("tx: " + to_string(message));
|
||||
assert(isChecksumValid(message));
|
||||
assert(isValid(message));
|
||||
return m_send(message);
|
||||
}
|
||||
|
||||
@ -108,7 +108,7 @@ void LocoNet::receive(const Message& message)
|
||||
{
|
||||
// NOTE: this function is called async!
|
||||
|
||||
assert(isChecksumValid(message));
|
||||
assert(isValid(message));
|
||||
|
||||
if(m_debugLog)
|
||||
EventLoop::call([this, log="rx: " + to_string(message)](){ logDebug(log); });
|
||||
|
||||
@ -45,6 +45,17 @@ bool isChecksumValid(const Message& message)
|
||||
return calcChecksum(message) == reinterpret_cast<const uint8_t*>(&message)[message.size() - 1];
|
||||
}
|
||||
|
||||
bool isValid(const Message& message)
|
||||
{
|
||||
const uint8_t size = message.size();
|
||||
if(size == 0 || !isChecksumValid(message))
|
||||
return false;
|
||||
for(uint8_t i = 1; i < size; i++) // bit 7 must be unset (except opcode)
|
||||
if(reinterpret_cast<const uint8_t*>(&message)[i] & 0x80)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string to_string(const Message& message, bool raw)
|
||||
{
|
||||
std::string s;
|
||||
|
||||
@ -40,6 +40,7 @@ struct Message;
|
||||
uint8_t calcChecksum(const Message& msmessageg);
|
||||
void updateChecksum(Message& message);
|
||||
bool isChecksumValid(const Message& message);
|
||||
bool isValid(const Message& message);
|
||||
std::string to_string(const Message& message, bool raw = false);
|
||||
|
||||
constexpr uint8_t SLOT_LOCO_MIN = 1;
|
||||
|
||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren