mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-28 05:23:34 +08:00
TransferListener now can accept rogue transfers
This commit is contained in:
@@ -243,3 +243,38 @@ TEST(TransferListener, MaximumTransferLength)
|
||||
|
||||
ASSERT_TRUE(subscriber.isEmpty());
|
||||
}
|
||||
|
||||
|
||||
TEST(TransferListener, RogueTransfers)
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "A");
|
||||
|
||||
uavcan::PoolManager<1> poolmgr;
|
||||
uavcan::TransferPerfCounter perf;
|
||||
TestListener<0, 0, 0> subscriber(perf, type, poolmgr);
|
||||
|
||||
TransferListenerEmulator emulator(subscriber, type);
|
||||
const Transfer transfers[] =
|
||||
{
|
||||
emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 0, "12345678"), // Invalid - not broadcast
|
||||
emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 0, "12345678"), // Valid
|
||||
emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 0, "123456789"), // Invalid - not SFT
|
||||
emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 0, "") // Valid
|
||||
};
|
||||
|
||||
emulator.send(transfers);
|
||||
|
||||
// Nothing will be received, because rogue transfers are disabled by default
|
||||
ASSERT_TRUE(subscriber.isEmpty());
|
||||
|
||||
subscriber.allowRogueTransfers();
|
||||
|
||||
// Re-send everything again
|
||||
emulator.send(transfers);
|
||||
|
||||
// Now the rogue transfers are enabled
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[1])); // Only SFT broadcast will be accepted
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[3]));
|
||||
|
||||
ASSERT_TRUE(subscriber.isEmpty());
|
||||
}
|
||||
|
||||
@@ -129,6 +129,14 @@ public:
|
||||
const Transfer rx(transfer, Base::getDataTypeDescriptor());
|
||||
transfers_.push(rx);
|
||||
std::cout << "Received transfer: " << rx.toString() << std::endl;
|
||||
|
||||
const bool single_frame = dynamic_cast<uavcan::SingleFrameIncomingTransfer*>(&transfer) != NULL;
|
||||
|
||||
const bool rogue = single_frame &&
|
||||
transfer.getSrcNodeID().isBroadcast() &&
|
||||
(transfer.getTransferType() == uavcan::TransferTypeMessageBroadcast);
|
||||
|
||||
ASSERT_EQ(rogue, transfer.isRogueTransfer());
|
||||
}
|
||||
|
||||
bool matchAndPop(const Transfer& reference)
|
||||
|
||||
Reference in New Issue
Block a user