mirror of
https://github.com/espressif/openthread.git
synced 2026-08-17 16:09:51 +00:00
[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:
@@ -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
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user