From 6ccd4ffd78fa565c182427fa2fc8296f963db792 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 16 Aug 2021 09:48:19 -0700 Subject: [PATCH] [mac] tx beacon on the same radio as the request in multi-radio config (#6921) This commit updates `Mac` under `MULTI_RADIO` config to limit the radio links used when sending a MAC Beacon frame (which uses broadcast destination and therefore by default would be sent on all radios) to the same radio links from which the triggering Beacon Request frame(s) were received. This ensures that when a multi-radio node scans another multi-radio node we get one Beacon response on each radio link. --- src/core/mac/mac.cpp | 28 ++++++++++++++++++++-------- src/core/mac/mac.hpp | 1 + 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 5a74c3ad3..1299fd752 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -856,18 +856,26 @@ TxFrame *Mac::PrepareBeaconRequest(void) TxFrame *Mac::PrepareBeacon(void) { - TxFrame & frame = mLinks.GetTxFrames().GetBroadcastTxFrame(); + TxFrame * frame; uint8_t beaconLength; uint16_t fcf; Beacon * beacon = nullptr; BeaconPayload *beaconPayload = nullptr; - fcf = Frame::kFcfFrameBeacon | Frame::kFcfDstAddrNone | Frame::kFcfSrcAddrExt; - frame.InitMacHeader(fcf, Frame::kSecNone); - IgnoreError(frame.SetSrcPanId(mPanId)); - frame.SetSrcAddr(GetExtAddress()); +#if OPENTHREAD_CONFIG_MULTI_RADIO + OT_ASSERT(!mTxBeaconRadioLinks.IsEmpty()); + frame = &mLinks.GetTxFrames().GetTxFrame(mTxBeaconRadioLinks); + mTxBeaconRadioLinks.Clear(); +#else + frame = &mLinks.GetTxFrames().GetBroadcastTxFrame(); +#endif - beacon = reinterpret_cast(frame.GetPayload()); + fcf = Frame::kFcfFrameBeacon | Frame::kFcfDstAddrNone | Frame::kFcfSrcAddrExt; + frame->InitMacHeader(fcf, Frame::kSecNone); + IgnoreError(frame->SetSrcPanId(mPanId)); + frame->SetSrcAddr(GetExtAddress()); + + beacon = reinterpret_cast(frame->GetPayload()); beacon->Init(); beaconLength = sizeof(*beacon); @@ -892,11 +900,11 @@ TxFrame *Mac::PrepareBeacon(void) beaconLength += sizeof(*beaconPayload); } - frame.SetPayloadLength(beaconLength); + frame->SetPayloadLength(beaconLength); LogBeacon("Sending", *beaconPayload); - return &frame; + return frame; } bool Mac::ShouldSendBeacon(void) const @@ -2164,8 +2172,12 @@ bool Mac::HandleMacCommand(RxFrame &aFrame) if (ShouldSendBeacon()) { +#if OPENTHREAD_CONFIG_MULTI_RADIO + mTxBeaconRadioLinks.Add(aFrame.GetRadioType()); +#endif StartOperation(kOperationTransmitBeacon); } + didHandle = true; break; diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index f97222f1c..89a2642a5 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -916,6 +916,7 @@ private: #if OPENTHREAD_CONFIG_MULTI_RADIO RadioTypes mTxPendingRadioLinks; + RadioTypes mTxBeaconRadioLinks; Error mTxError; #endif