[ip6] simplify and update NewMessageFromData() (#9037)

This commit simplifies and updates the `NewMessageFromData()` method
to always determine the priority from the IPv6 header, even if a
`Message::Settings` is provided. This change aligns the behavior of
`NewMessageFromData()` with the documented and intended behavior of
`otIp6NewMessageFromBuffer()`.
This commit is contained in:
Abtin Keshavarzian
2023-05-10 17:59:32 -07:00
committed by GitHub
parent 161a4407e2
commit 4cba902db1
3 changed files with 21 additions and 51 deletions
+2 -3
View File
@@ -146,9 +146,8 @@ otMessage *otIp6NewMessageFromBuffer(otInstance *aInstance,
uint16_t aDataLength,
const otMessageSettings *aSettings)
{
return (aSettings != nullptr)
? AsCoreType(aInstance).Get<Ip6::Ip6>().NewMessage(aData, aDataLength, AsCoreType(aSettings))
: AsCoreType(aInstance).Get<Ip6::Ip6>().NewMessage(aData, aDataLength);
return AsCoreType(aInstance).Get<Ip6::Ip6>().NewMessageFromData(aData, aDataLength,
Message::Settings::From(aSettings));
}
otError otIp6AddUnsecurePort(otInstance *aInstance, uint16_t aPort)
+14 -31
View File
@@ -87,9 +87,21 @@ Message *Ip6::NewMessage(uint16_t aReserved, const Message::Settings &aSettings)
Message::kTypeIp6, sizeof(Header) + sizeof(HopByHopHeader) + sizeof(MplOption) + aReserved, aSettings);
}
Message *Ip6::NewMessage(const uint8_t *aData, uint16_t aDataLength, const Message::Settings &aSettings)
Message *Ip6::NewMessageFromData(const uint8_t *aData, uint16_t aDataLength, const Message::Settings &aSettings)
{
Message *message = Get<MessagePool>().Allocate(Message::kTypeIp6, /* aReserveHeader */ 0, aSettings);
Message *message = nullptr;
Message::Settings settings = aSettings;
const Header *header;
VerifyOrExit((aData != nullptr) && (aDataLength >= sizeof(Header)));
// Determine priority from IPv6 header
header = reinterpret_cast<const Header *>(aData);
VerifyOrExit(header->IsValid());
VerifyOrExit(sizeof(Header) + header->GetPayloadLength() == aDataLength);
settings.mPriority = DscpToPriority(header->GetDscp());
message = Get<MessagePool>().Allocate(Message::kTypeIp6, /* aReserveHeader */ 0, settings);
VerifyOrExit(message != nullptr);
@@ -103,18 +115,6 @@ exit:
return message;
}
Message *Ip6::NewMessage(const uint8_t *aData, uint16_t aDataLength)
{
Message *message = nullptr;
Message::Priority priority;
SuccessOrExit(GetDatagramPriority(aData, aDataLength, priority));
message = NewMessage(aData, aDataLength, Message::Settings(Message::kWithLinkSecurity, priority));
exit:
return message;
}
Message::Priority Ip6::DscpToPriority(uint8_t aDscp)
{
Message::Priority priority;
@@ -170,23 +170,6 @@ uint8_t Ip6::PriorityToDscp(Message::Priority aPriority)
return dscp;
}
Error Ip6::GetDatagramPriority(const uint8_t *aData, uint16_t aDataLen, Message::Priority &aPriority)
{
Error error = kErrorNone;
const Header *header;
VerifyOrExit((aData != nullptr) && (aDataLen >= sizeof(Header)), error = kErrorInvalidArgs);
header = reinterpret_cast<const Header *>(aData);
VerifyOrExit(header->IsValid(), error = kErrorParse);
VerifyOrExit(sizeof(Header) + header->GetPayloadLength() == aDataLen, error = kErrorParse);
aPriority = DscpToPriority(header->GetDscp());
exit:
return error;
}
Error Ip6::AddMplOption(Message &aMessage, Header &aHeader)
{
Error error = kErrorNone;
+5 -17
View File
@@ -149,29 +149,18 @@ public:
/**
* This method allocates a new message buffer from the buffer pool and writes the IPv6 datagram to the message.
*
* The message priority is always determined from IPv6 message itself (@p aData) and the priority included in
* @p aSetting is ignored.
*
* @param[in] aData A pointer to the IPv6 datagram buffer.
* @param[in] aDataLength The size of the IPV6 datagram buffer pointed by @p aData.
* @param[in] aSettings The message settings.
*
* @returns A pointer to the message or `nullptr` if malformed IPv6 header or insufficient message buffers are
* available.
* available.
*
*/
Message *NewMessage(const uint8_t *aData, uint16_t aDataLength, const Message::Settings &aSettings);
/**
* This method allocates a new message buffer from the buffer pool and writes the IPv6 datagram to the message.
*
* @note The link layer security is enabled and the message priority is obtained from IPv6 message itself.
*
* @param[in] aData A pointer to the IPv6 datagram buffer.
* @param[in] aDataLength The size of the IPV6 datagram buffer pointed by @p aData.
*
* @returns A pointer to the message or `nullptr` if malformed IPv6 header or insufficient message buffers are
* available.
*
*/
Message *NewMessage(const uint8_t *aData, uint16_t aDataLength);
Message *NewMessageFromData(const uint8_t *aData, uint16_t aDataLength, const Message::Settings &aSettings);
/**
* This method converts the IPv6 DSCP value to message priority level.
@@ -375,7 +364,6 @@ private:
void HandleSendQueue(void);
static uint8_t PriorityToDscp(Message::Priority aPriority);
static Error GetDatagramPriority(const uint8_t *aData, uint16_t aDataLen, Message::Priority &aPriority);
void EnqueueDatagram(Message &aMessage);
Error PassToHost(Message &aMessage,