kopia lustrzana https://github.com/mobilinkd/NucleoTNC
Validate the LICH fragment number and mask the LICH segment bitfield properly. Send -1 for BER while LICH decode is incomplete.
rodzic
6c092b9365
commit
86a9896a8d
|
@ -361,13 +361,24 @@ struct M17FrameDecoder
|
||||||
uint8_t fragment_number = tmp.lich[5]; // Get fragment number.
|
uint8_t fragment_number = tmp.lich[5]; // Get fragment number.
|
||||||
fragment_number = (fragment_number >> 5) & 7;
|
fragment_number = (fragment_number >> 5) & 7;
|
||||||
|
|
||||||
|
if (fragment_number > 5)
|
||||||
|
{
|
||||||
|
INFO("invalid LICH fragment %d", int(fragment_number));
|
||||||
|
ber = -1;
|
||||||
|
return DecodeResult::INCOMPLETE; // More to go...
|
||||||
|
}
|
||||||
|
|
||||||
// Copy decoded LICH to superframe buffer.
|
// Copy decoded LICH to superframe buffer.
|
||||||
std::copy(tmp.lich.begin(), tmp.lich.begin() + 5,
|
std::copy(tmp.lich.begin(), tmp.lich.begin() + 5,
|
||||||
output.lich.begin() + (fragment_number * 5));
|
output.lich.begin() + (fragment_number * 5));
|
||||||
|
|
||||||
lich_segments |= (1 << fragment_number); // Indicate segment received.
|
lich_segments |= (1 << fragment_number); // Indicate segment received.
|
||||||
INFO("got segment %d, have %02x", int(fragment_number), int(lich_segments));
|
INFO("got segment %d, have %02x", int(fragment_number), int(lich_segments));
|
||||||
if (lich_segments != 0x3F) return DecodeResult::INCOMPLETE; // More to go...
|
if ((lich_segments & 0x3F) != 0x3F)
|
||||||
|
{
|
||||||
|
ber = -1;
|
||||||
|
return DecodeResult::INCOMPLETE; // More to go...
|
||||||
|
}
|
||||||
|
|
||||||
crc_.reset();
|
crc_.reset();
|
||||||
for (auto c : output.lich) crc_(c);
|
for (auto c : output.lich) crc_(c);
|
||||||
|
|
Ładowanie…
Reference in New Issue