diff --git a/src/core/meshcop/meshcop_tlvs.cpp b/src/core/meshcop/meshcop_tlvs.cpp index c319ab641..f407dc24a 100644 --- a/src/core/meshcop/meshcop_tlvs.cpp +++ b/src/core/meshcop/meshcop_tlvs.cpp @@ -236,11 +236,39 @@ exit: uint32_t ChannelMaskTlv::GetChannelMask(const Message &aMessage) { - uint32_t mask = 0; - ChannelMaskTlv channelMaskTlv; + uint32_t mask = 0; + uint16_t offset; + uint16_t end; - SuccessOrExit(GetTlv(aMessage, kChannelMask, sizeof(channelMaskTlv), channelMaskTlv)); - mask = channelMaskTlv.GetChannelMask(); + SuccessOrExit(GetValueOffset(aMessage, kChannelMask, offset, end)); + end += offset; + + while (offset + sizeof(ChannelMaskEntryBase) <= end) + { + ChannelMaskEntry entry; + + aMessage.Read(offset, sizeof(ChannelMaskEntryBase), &entry); + VerifyOrExit(offset + entry.GetEntrySize() <= end); + + switch (entry.GetChannelPage()) + { +#if OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT + case OT_RADIO_CHANNEL_PAGE_0: + aMessage.Read(offset, sizeof(entry), &entry); + mask |= entry.GetMask() & OT_RADIO_2P4GHZ_OQPSK_CHANNEL_MASK; + break; +#endif + +#if OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT + case OT_RADIO_CHANNEL_PAGE_2: + aMessage.Read(offset, sizeof(entry), &entry); + mask |= entry.GetMask() & OT_RADIO_915MHZ_OQPSK_CHANNEL_MASK; + break; +#endif + } + + offset += entry.GetEntrySize(); + } exit: return mask;