mirror of
https://github.com/espressif/openthread.git
synced 2026-08-30 05:49:54 +00:00
[mac-frame] update GenerateEnhAck() to use InitMacHeader() (#9338)
This commit updates the `GenerateEnhAck()` method to add checks to validate the received frame before preparing the ACK. These checks are added as a safeguard in case the caller (radio platform implementation) does not validate the received frame before calling this method to generate the ACK. Specifically, the checks verify that the received frame is using the 2015 version, has the "Ack Request" flag, has a valid source address (which is used as the destination in the generated ACK), and has a valid destination address that is not broadcast. The checks also verify that if the received frame is secured, it uses security level `kSecurityEncMic32`. The commit also simplifies the code by using `InitMacHeader()` to prepare the header and addresses. Enhanced ACK frames always have a destination address and no source address (to keep the frame shorter). If the received frame has a source PAN ID, it is used in the ACK frame. If it does not, the code checks if the received frame has a destination PAN ID and uses that in the ACK frame.
This commit is contained in:
@@ -747,13 +747,14 @@ void TestMacFrameAckGeneration(void)
|
||||
uint8_t ie_data[6] = {0x04, 0x0d, 0x21, 0x0c, 0x35, 0x0c};
|
||||
Mac::CslIe *csl;
|
||||
|
||||
IgnoreError(ackFrame.GenerateEnhAck(receivedFrame, false, ie_data, sizeof(ie_data)));
|
||||
SuccessOrQuit(ackFrame.GenerateEnhAck(receivedFrame, false, ie_data, sizeof(ie_data)));
|
||||
|
||||
csl = reinterpret_cast<Mac::CslIe *>(ackFrame.GetHeaderIe(Mac::CslIe::kHeaderIeId) + sizeof(Mac::HeaderIe));
|
||||
VerifyOrQuit(ackFrame.mLength == 23);
|
||||
VerifyOrQuit(ackFrame.mLength == 25);
|
||||
VerifyOrQuit(ackFrame.GetType() == Mac::Frame::kTypeAck);
|
||||
VerifyOrQuit(ackFrame.GetSecurityEnabled());
|
||||
VerifyOrQuit(ackFrame.IsIePresent());
|
||||
VerifyOrQuit(!ackFrame.IsDstPanIdPresent());
|
||||
VerifyOrQuit(ackFrame.IsDstPanIdPresent());
|
||||
VerifyOrQuit(ackFrame.IsDstAddrPresent());
|
||||
VerifyOrQuit(!ackFrame.IsSrcAddrPresent());
|
||||
VerifyOrQuit(ackFrame.GetVersion() == Mac::Frame::kVersion2015);
|
||||
|
||||
Reference in New Issue
Block a user