[meshcop] process ChannelMaskTlv in message (#3690)

Allows arbitrary number of Channel Mask entries.
This commit is contained in:
Jonathan Hui
2019-03-15 21:46:02 -07:00
committed by GitHub
parent 61e9288805
commit fab45352f5
+32 -4
View File
@@ -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;