[udp/tcp/icmp] simplify Header parsing, and declare related types as nested (#5203)

This commit contains two main changes in `Ip6` modules: `Udp`, `Tcp`,
and `Icmp`. First, it simplifies the `Header` types defining constant
`enum` for byte offset of different fields in the header (these
replace the static methods and avoid use of `offsetof` macro). Second
change is it declare related types in each module as nested types of
the the main class (place them under the namespace of the main type).
For example `Icmp::Header`, `Udp::Socket` respectively replace
`IcmpHeader`, `UdpSocket` types.
This commit is contained in:
Abtin Keshavarzian
2020-07-08 10:41:00 -07:00
committed by GitHub
parent abeb02fc52
commit 04b35d0422
26 changed files with 571 additions and 600 deletions
+1 -1
View File
@@ -58,7 +58,7 @@ otError otIcmp6RegisterHandler(otInstance *aInstance, otIcmp6Handler *aHandler)
{
Instance &instance = *static_cast<Instance *>(aInstance);
return instance.Get<Ip6::Icmp>().RegisterHandler(*static_cast<Ip6::IcmpHandler *>(aHandler));
return instance.Get<Ip6::Icmp>().RegisterHandler(*static_cast<Ip6::Icmp::Handler *>(aHandler));
}
otError otIcmp6SendEchoRequest(otInstance * aInstance,
+10 -10
View File
@@ -51,9 +51,9 @@ otMessage *otUdpNewMessage(otInstance *aInstance, const otMessageSettings *aSett
otError otUdpOpen(otInstance *aInstance, otUdpSocket *aSocket, otUdpReceive aCallback, void *aContext)
{
otError error;
Instance & instance = *static_cast<Instance *>(aInstance);
Ip6::UdpSocket &socket = *new (aSocket) Ip6::UdpSocket(instance.Get<Ip6::Udp>());
otError error;
Instance & instance = *static_cast<Instance *>(aInstance);
Ip6::Udp::Socket &socket = *new (aSocket) Ip6::Udp::Socket(instance.Get<Ip6::Udp>());
error = socket.Open(aCallback, aContext);
@@ -62,8 +62,8 @@ otError otUdpOpen(otInstance *aInstance, otUdpSocket *aSocket, otUdpReceive aCal
otError otUdpClose(otUdpSocket *aSocket)
{
otError error = OT_ERROR_INVALID_STATE;
Ip6::UdpSocket &socket = *static_cast<Ip6::UdpSocket *>(aSocket);
otError error = OT_ERROR_INVALID_STATE;
Ip6::Udp::Socket &socket = *static_cast<Ip6::Udp::Socket *>(aSocket);
error = socket.Close();
@@ -72,19 +72,19 @@ otError otUdpClose(otUdpSocket *aSocket)
otError otUdpBind(otUdpSocket *aSocket, otSockAddr *aSockName)
{
Ip6::UdpSocket &socket = *static_cast<Ip6::UdpSocket *>(aSocket);
Ip6::Udp::Socket &socket = *static_cast<Ip6::Udp::Socket *>(aSocket);
return socket.Bind(*static_cast<const Ip6::SockAddr *>(aSockName));
}
otError otUdpConnect(otUdpSocket *aSocket, otSockAddr *aSockName)
{
Ip6::UdpSocket &socket = *static_cast<Ip6::UdpSocket *>(aSocket);
Ip6::Udp::Socket &socket = *static_cast<Ip6::Udp::Socket *>(aSocket);
return socket.Connect(*static_cast<const Ip6::SockAddr *>(aSockName));
}
otError otUdpSend(otUdpSocket *aSocket, otMessage *aMessage, const otMessageInfo *aMessageInfo)
{
Ip6::UdpSocket &socket = *static_cast<Ip6::UdpSocket *>(aSocket);
Ip6::Udp::Socket &socket = *static_cast<Ip6::Udp::Socket *>(aSocket);
return socket.SendTo(*static_cast<Message *>(aMessage), *static_cast<const Ip6::MessageInfo *>(aMessageInfo));
}
@@ -132,14 +132,14 @@ otError otUdpAddReceiver(otInstance *aInstance, otUdpReceiver *aUdpReceiver)
{
Instance &instance = *static_cast<Instance *>(aInstance);
return instance.Get<Ip6::Udp>().AddReceiver(*static_cast<Ip6::UdpReceiver *>(aUdpReceiver));
return instance.Get<Ip6::Udp>().AddReceiver(*static_cast<Ip6::Udp::Receiver *>(aUdpReceiver));
}
otError otUdpRemoveReceiver(otInstance *aInstance, otUdpReceiver *aUdpReceiver)
{
Instance &instance = *static_cast<Instance *>(aInstance);
return instance.Get<Ip6::Udp>().RemoveReceiver(*static_cast<Ip6::UdpReceiver *>(aUdpReceiver));
return instance.Get<Ip6::Udp>().RemoveReceiver(*static_cast<Ip6::Udp::Receiver *>(aUdpReceiver));
}
otError otUdpSendDatagram(otInstance *aInstance, otMessage *aMessage, otMessageInfo *aMessageInfo)
+1 -1
View File
@@ -628,7 +628,7 @@ private:
static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo);
otError Send(ot::Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
Ip6::UdpSocket mSocket;
Ip6::Udp::Socket mSocket;
};
} // namespace Coap
+1 -1
View File
@@ -157,7 +157,7 @@ private:
Coap::Resource mPendingSet;
Coap::Resource mProxyTransmit;
Ip6::UdpReceiver mUdpReceiver; ///< The UDP receiver to receive packets from external commissioner
Ip6::Udp::Receiver mUdpReceiver; ///< The UDP receiver to receive packets from external commissioner
Ip6::NetifUnicastAddress mCommissionerAloc;
TimerMilli mTimer;
+1 -1
View File
@@ -461,7 +461,7 @@ private:
void * mContext;
Ip6::MessageInfo mPeerAddress;
Ip6::UdpSocket mSocket;
Ip6::Udp::Socket mSocket;
TransportCallback mTransportCallback;
void * mTransportContext;
+2 -2
View File
@@ -118,8 +118,8 @@ private:
otError SendJoinerEntrust(const Ip6::MessageInfo &aMessageInfo);
Coap::Message *PrepareJoinerEntrustMessage(void);
Ip6::UdpSocket mSocket;
Coap::Resource mRelayTransmit;
Ip6::Udp::Socket mSocket;
Coap::Resource mRelayTransmit;
TimerMilli mTimer;
MessageQueue mDelayedJoinEnts;
+1 -1
View File
@@ -151,7 +151,7 @@ private:
static bool HandleTrickleTimer(TrickleTimer &aTrickleTimer);
bool HandleTrickleTimer(void);
Ip6::UdpSocket mSocket;
Ip6::Udp::Socket mSocket;
TrickleTimer mTrickleTimer;
+1 -1
View File
@@ -214,7 +214,7 @@ private:
otError SendReply(otIp6Address &aDst, uint8_t *aTransactionId, ClientIdentifier &aClientId, IaNa &aIaNa);
Ip6::UdpSocket mSocket;
Ip6::Udp::Socket mSocket;
PrefixAgent mPrefixAgents[OPENTHREAD_CONFIG_DHCP6_SERVER_NUM_PREFIXES];
uint8_t mPrefixAgentsCount;
+1 -1
View File
@@ -216,7 +216,7 @@ private:
static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo);
void HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
Ip6::UdpSocket mSocket;
Ip6::Udp::Socket mSocket;
uint16_t mMessageId;
MessageQueue mPendingQueries;
+24 -24
View File
@@ -56,10 +56,10 @@ Icmp::Icmp(Instance &aInstance)
Message *Icmp::NewMessage(uint16_t aReserved)
{
return Get<Ip6>().NewMessage(sizeof(IcmpHeader) + aReserved);
return Get<Ip6>().NewMessage(sizeof(Header) + aReserved);
}
otError Icmp::RegisterHandler(IcmpHandler &aHandler)
otError Icmp::RegisterHandler(Handler &aHandler)
{
return mHandlers.Add(aHandler);
}
@@ -68,12 +68,12 @@ otError Icmp::SendEchoRequest(Message &aMessage, const MessageInfo &aMessageInfo
{
otError error = OT_ERROR_NONE;
MessageInfo messageInfoLocal;
IcmpHeader icmpHeader;
Header icmpHeader;
messageInfoLocal = aMessageInfo;
icmpHeader.Init();
icmpHeader.SetType(IcmpHeader::kTypeEchoRequest);
icmpHeader.Clear();
icmpHeader.SetType(Header::kTypeEchoRequest);
icmpHeader.SetId(aIdentifier);
icmpHeader.SetSequence(mEchoSequence++);
@@ -87,16 +87,16 @@ exit:
return error;
}
otError Icmp::SendError(IcmpHeader::Type aType,
IcmpHeader::Code aCode,
otError Icmp::SendError(Header::Type aType,
Header::Code aCode,
const MessageInfo &aMessageInfo,
const Message & aMessage)
{
otError error = OT_ERROR_NONE;
MessageInfo messageInfoLocal;
Message * message = nullptr;
IcmpHeader icmp6Header;
Header ip6Header;
Header icmp6Header;
ot::Ip6::Header ip6Header;
Message::Settings settings(Message::kWithLinkSecurity, Message::kPriorityNet);
VerifyOrExit(aMessage.GetLength() >= sizeof(ip6Header), error = OT_ERROR_INVALID_ARGS);
@@ -118,7 +118,7 @@ otError Icmp::SendError(IcmpHeader::Type aType,
message->Write(sizeof(icmp6Header), sizeof(ip6Header), &ip6Header);
icmp6Header.Init();
icmp6Header.Clear();
icmp6Header.SetType(aType);
icmp6Header.SetCode(aCode);
message->Write(0, sizeof(icmp6Header), &icmp6Header);
@@ -139,10 +139,10 @@ exit:
otError Icmp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo)
{
otError error = OT_ERROR_NONE;
uint16_t payloadLength;
IcmpHeader icmp6Header;
uint16_t checksum;
otError error = OT_ERROR_NONE;
uint16_t payloadLength;
Header icmp6Header;
uint16_t checksum;
VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(icmp6Header), &icmp6Header) == sizeof(icmp6Header),
error = OT_ERROR_PARSE);
@@ -154,14 +154,14 @@ otError Icmp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo)
checksum = aMessage.UpdateChecksum(checksum, aMessage.GetOffset(), payloadLength);
VerifyOrExit(checksum == 0xffff, error = OT_ERROR_PARSE);
if (icmp6Header.GetType() == IcmpHeader::kTypeEchoRequest)
if (icmp6Header.GetType() == Header::kTypeEchoRequest)
{
SuccessOrExit(error = HandleEchoRequest(aMessage, aMessageInfo));
}
aMessage.MoveOffset(sizeof(icmp6Header));
for (IcmpHandler *handler = mHandlers.GetHead(); handler; handler = handler->GetNext())
for (Handler *handler = mHandlers.GetHead(); handler; handler = handler->GetNext())
{
handler->HandleReceiveMessage(aMessage, aMessageInfo, icmp6Header);
}
@@ -196,7 +196,7 @@ bool Icmp::ShouldHandleEchoRequest(const MessageInfo &aMessageInfo)
otError Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMessageInfo)
{
otError error = OT_ERROR_NONE;
IcmpHeader icmp6Header;
Header icmp6Header;
Message * replyMessage = nullptr;
MessageInfo replyMessageInfo;
uint16_t payloadLength;
@@ -206,8 +206,8 @@ otError Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMe
otLogInfoIcmp("Received Echo Request");
icmp6Header.Init();
icmp6Header.SetType(IcmpHeader::kTypeEchoReply);
icmp6Header.Clear();
icmp6Header.SetType(Header::kTypeEchoReply);
if ((replyMessage = Get<Ip6>().NewMessage(0)) == nullptr)
{
@@ -215,11 +215,11 @@ otError Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMe
ExitNow();
}
payloadLength = aRequestMessage.GetLength() - aRequestMessage.GetOffset() - IcmpHeader::GetDataOffset();
SuccessOrExit(error = replyMessage->SetLength(IcmpHeader::GetDataOffset() + payloadLength));
payloadLength = aRequestMessage.GetLength() - aRequestMessage.GetOffset() - Header::kDataFieldOffset;
SuccessOrExit(error = replyMessage->SetLength(Header::kDataFieldOffset + payloadLength));
replyMessage->Write(0, IcmpHeader::GetDataOffset(), &icmp6Header);
aRequestMessage.CopyTo(aRequestMessage.GetOffset() + IcmpHeader::GetDataOffset(), IcmpHeader::GetDataOffset(),
replyMessage->Write(0, Header::kDataFieldOffset, &icmp6Header);
aRequestMessage.CopyTo(aRequestMessage.GetOffset() + Header::kDataFieldOffset, Header::kDataFieldOffset,
payloadLength, *replyMessage);
replyMessageInfo.SetPeerAddr(aMessageInfo.GetPeerAddr());
@@ -254,7 +254,7 @@ void Icmp::UpdateChecksum(Message &aMessage, uint16_t aChecksum)
}
aChecksum = HostSwap16(aChecksum);
aMessage.Write(aMessage.GetOffset() + IcmpHeader::GetChecksumOffset(), sizeof(aChecksum), &aChecksum);
aMessage.Write(aMessage.GetOffset() + Header::kChecksumFieldOffset, sizeof(aChecksum), &aChecksum);
}
} // namespace Ip6
+165 -186
View File
@@ -38,6 +38,7 @@
#include <openthread/icmp6.h>
#include "common/clearable.hpp"
#include "common/encoding.hpp"
#include "common/linked_list.hpp"
#include "common/locator.hpp"
@@ -58,186 +59,6 @@ using ot::Encoding::BigEndian::HostSwap16;
*
*/
/*
* This class implements ICMPv6 header generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class IcmpHeader : public otIcmp6Header
{
public:
/**
* This method initializes the ICMPv6 header to all zeros.
*
*/
void Init(void)
{
mType = 0;
mCode = 0;
mChecksum = 0;
mData.m32[0] = 0;
}
/**
* ICMPv6 Message Types
*
*/
enum Type
{
kTypeDstUnreach = OT_ICMP6_TYPE_DST_UNREACH, ///< Destination Unreachable
kTypePacketToBig = OT_ICMP6_TYPE_PACKET_TO_BIG, ///< Packet To Big
kTypeTimeExceeded = OT_ICMP6_TYPE_TIME_EXCEEDED, ///< Time Exceeded
kTypeParameterProblem = OT_ICMP6_TYPE_PARAMETER_PROBLEM, ///< Parameter Problem
kTypeEchoRequest = OT_ICMP6_TYPE_ECHO_REQUEST, ///< Echo Request
kTypeEchoReply = OT_ICMP6_TYPE_ECHO_REPLY, ///< Echo Reply
};
/**
* ICMPv6 Message Codes
*
*/
enum Code
{
kCodeDstUnreachNoRoute = OT_ICMP6_CODE_DST_UNREACH_NO_ROUTE, ///< Destination Unreachable No Route
kCodeFragmReasTimeEx = OT_ICMP6_CODE_FRAGM_REAS_TIME_EX, ///< Fragment Reassembly Time Exceeded
};
/**
* This method indicates whether the ICMPv6 message is an error message.
*
* @retval TRUE if the ICMPv6 message is an error message.
* @retval FALSE if the ICMPv6 message is an informational message.
*
*/
bool IsError(void) const { return mType < OT_ICMP6_TYPE_ECHO_REQUEST; }
/**
* This method returns the ICMPv6 message type.
*
* @returns The ICMPv6 message type.
*
*/
Type GetType(void) const { return static_cast<Type>(mType); }
/**
* This method sets the ICMPv6 message type.
*
* @param[in] aType The ICMPv6 message type.
*
*/
void SetType(Type aType) { mType = static_cast<uint8_t>(aType); }
/**
* This method returns the ICMPv6 message code.
*
* @returns The ICMPv6 message code.
*
*/
Code GetCode(void) const { return static_cast<Code>(mCode); }
/**
* This method sets the ICMPv6 message code.
*
* @param[in] aCode The ICMPv6 message code.
*/
void SetCode(Code aCode) { mCode = static_cast<uint8_t>(aCode); }
/**
* This method returns the ICMPv6 message checksum.
*
* @returns The ICMPv6 message checksum.
*
*/
uint16_t GetChecksum(void) const { return HostSwap16(mChecksum); }
/**
* This method sets the ICMPv6 message checksum.
*
* @param[in] aChecksum The ICMPv6 message checksum.
*
*/
void SetChecksum(uint16_t aChecksum) { mChecksum = HostSwap16(aChecksum); }
/**
* This method returns the ICMPv6 message ID for Echo Requests and Replies.
*
* @returns The ICMPv6 message ID.
*
*/
uint16_t GetId(void) const { return HostSwap16(mData.m16[0]); }
/**
* This method sets the ICMPv6 message ID for Echo Requests and Replies.
*
* @param[in] aId The ICMPv6 message ID.
*
*/
void SetId(uint16_t aId) { mData.m16[0] = HostSwap16(aId); }
/**
* This method returns the ICMPv6 message sequence for Echo Requests and Replies.
*
* @returns The ICMPv6 message sequence.
*
*/
uint16_t GetSequence(void) const { return HostSwap16(mData.m16[1]); }
/**
* This method sets the ICMPv6 message sequence for Echo Requests and Replies.
*
* @param[in] aSequence The ICMPv6 message sequence.
*
*/
void SetSequence(uint16_t aSequence) { mData.m16[1] = HostSwap16(aSequence); }
/**
* This static method returns the byte offset of the Checksum field in the ICMPv6 header.
*
* @returns The byte offset of the Checksum field.
*
*/
static uint8_t GetChecksumOffset(void) { return offsetof(otIcmp6Header, mChecksum); }
/**
* This static method returns the byte offset of the ICMPv6 payload.
*
* @returns The Byte offset of the ICMPv6 payload.
*
*/
static uint8_t GetDataOffset(void) { return offsetof(otIcmp6Header, mData); }
} OT_TOOL_PACKED_END;
/**
* This class implements ICMPv6 message handlers.
*
*/
class IcmpHandler : public otIcmp6Handler, public LinkedListEntry<IcmpHandler>
{
friend class Icmp;
public:
/**
* This constructor creates an ICMPv6 message handler.
*
* @param[in] aCallback A pointer to the function that is called when receiving an ICMPv6 message.
* @param[in] aContext A pointer to arbitrary context information.
*
*/
IcmpHandler(otIcmp6ReceiveCallback aCallback, void *aContext)
{
mReceiveCallback = aCallback;
mContext = aContext;
mNext = nullptr;
}
private:
void HandleReceiveMessage(Message &aMessage, const MessageInfo &aMessageInfo, const IcmpHeader &aIcmp6Header)
{
mReceiveCallback(mContext, &aMessage, &aMessageInfo, &aIcmp6Header);
}
};
/**
* This class implements ICMPv6.
*
@@ -245,6 +66,167 @@ private:
class Icmp : public InstanceLocator
{
public:
/*
* This class implements ICMPv6 header generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class Header : public otIcmp6Header, public Clearable<Header>
{
public:
/**
* ICMPv6 Message Types
*
*/
enum Type : uint8_t
{
kTypeDstUnreach = OT_ICMP6_TYPE_DST_UNREACH, ///< Destination Unreachable
kTypePacketToBig = OT_ICMP6_TYPE_PACKET_TO_BIG, ///< Packet To Big
kTypeTimeExceeded = OT_ICMP6_TYPE_TIME_EXCEEDED, ///< Time Exceeded
kTypeParameterProblem = OT_ICMP6_TYPE_PARAMETER_PROBLEM, ///< Parameter Problem
kTypeEchoRequest = OT_ICMP6_TYPE_ECHO_REQUEST, ///< Echo Request
kTypeEchoReply = OT_ICMP6_TYPE_ECHO_REPLY, ///< Echo Reply
};
/**
* ICMPv6 Message Codes
*
*/
enum Code : uint8_t
{
kCodeDstUnreachNoRoute = OT_ICMP6_CODE_DST_UNREACH_NO_ROUTE, ///< Destination Unreachable No Route
kCodeFragmReasTimeEx = OT_ICMP6_CODE_FRAGM_REAS_TIME_EX, ///< Fragment Reassembly Time Exceeded
};
enum : uint8_t
{
kTypeFieldOffset = 0, ///< The byte offset of Type field in ICMP6 header.
kCodeFieldOffset = 1, ///< The byte offset of Code field in ICMP6 header.
kChecksumFieldOffset = 2, ///< The byte offset of Checksum field in ICMP6 header.
kDataFieldOffset = 4, ///< The byte offset of Data field in ICMP6 header.
};
/**
* This method indicates whether the ICMPv6 message is an error message.
*
* @retval TRUE if the ICMPv6 message is an error message.
* @retval FALSE if the ICMPv6 message is an informational message.
*
*/
bool IsError(void) const { return mType < OT_ICMP6_TYPE_ECHO_REQUEST; }
/**
* This method returns the ICMPv6 message type.
*
* @returns The ICMPv6 message type.
*
*/
Type GetType(void) const { return static_cast<Type>(mType); }
/**
* This method sets the ICMPv6 message type.
*
* @param[in] aType The ICMPv6 message type.
*
*/
void SetType(Type aType) { mType = static_cast<uint8_t>(aType); }
/**
* This method returns the ICMPv6 message code.
*
* @returns The ICMPv6 message code.
*
*/
Code GetCode(void) const { return static_cast<Code>(mCode); }
/**
* This method sets the ICMPv6 message code.
*
* @param[in] aCode The ICMPv6 message code.
*
*/
void SetCode(Code aCode) { mCode = static_cast<uint8_t>(aCode); }
/**
* This method returns the ICMPv6 message checksum.
*
* @returns The ICMPv6 message checksum.
*
*/
uint16_t GetChecksum(void) const { return HostSwap16(mChecksum); }
/**
* This method sets the ICMPv6 message checksum.
*
* @param[in] aChecksum The ICMPv6 message checksum.
*
*/
void SetChecksum(uint16_t aChecksum) { mChecksum = HostSwap16(aChecksum); }
/**
* This method returns the ICMPv6 message ID for Echo Requests and Replies.
*
* @returns The ICMPv6 message ID.
*
*/
uint16_t GetId(void) const { return HostSwap16(mData.m16[0]); }
/**
* This method sets the ICMPv6 message ID for Echo Requests and Replies.
*
* @param[in] aId The ICMPv6 message ID.
*
*/
void SetId(uint16_t aId) { mData.m16[0] = HostSwap16(aId); }
/**
* This method returns the ICMPv6 message sequence for Echo Requests and Replies.
*
* @returns The ICMPv6 message sequence.
*
*/
uint16_t GetSequence(void) const { return HostSwap16(mData.m16[1]); }
/**
* This method sets the ICMPv6 message sequence for Echo Requests and Replies.
*
* @param[in] aSequence The ICMPv6 message sequence.
*
*/
void SetSequence(uint16_t aSequence) { mData.m16[1] = HostSwap16(aSequence); }
} OT_TOOL_PACKED_END;
/**
* This class implements ICMPv6 message handlers.
*
*/
class Handler : public otIcmp6Handler, public LinkedListEntry<Handler>
{
friend class Icmp;
public:
/**
* This constructor creates an ICMPv6 message handler.
*
* @param[in] aCallback A pointer to the function that is called when receiving an ICMPv6 message.
* @param[in] aContext A pointer to arbitrary context information.
*
*/
Handler(otIcmp6ReceiveCallback aCallback, void *aContext)
{
mReceiveCallback = aCallback;
mContext = aContext;
mNext = nullptr;
}
private:
void HandleReceiveMessage(Message &aMessage, const MessageInfo &aMessageInfo, const Header &aIcmp6Header)
{
mReceiveCallback(mContext, &aMessage, &aMessageInfo, &aIcmp6Header);
}
};
/**
* This constructor initializes the object.
*
@@ -272,7 +254,7 @@ public:
* @retval OT_ERROR_ALREADY The ICMPv6 handler is already registered.
*
*/
otError RegisterHandler(IcmpHandler &aHandler);
otError RegisterHandler(Handler &aHandler);
/**
* This method sends an ICMPv6 Echo Request message.
@@ -300,10 +282,7 @@ public:
* @retval OT_ERROR_NO_BUFS Insufficient buffers available.
*
*/
otError SendError(IcmpHeader::Type aType,
IcmpHeader::Code aCode,
const MessageInfo &aMessageInfo,
const Message & aMessage);
otError SendError(Header::Type aType, Header::Code aCode, const MessageInfo &aMessageInfo, const Message &aMessage);
/**
* This method handles an ICMPv6 message.
@@ -356,7 +335,7 @@ public:
private:
otError HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMessageInfo);
LinkedList<IcmpHandler> mHandlers;
LinkedList<Handler> mHandlers;
uint16_t mEchoSequence;
otIcmp6EchoMode mEchoMode;
+5 -5
View File
@@ -884,7 +884,7 @@ void Ip6::UpdateReassemblyList(void)
else
{
otLogNoteIp6("Reassembly timeout.");
SendIcmpError(*message, IcmpHeader::kTypeTimeExceeded, IcmpHeader::kCodeFragmReasTimeEx);
SendIcmpError(*message, Icmp::Header::kTypeTimeExceeded, Icmp::Header::kCodeFragmReasTimeEx);
mReassemblyList.Dequeue(*message);
message->Free();
@@ -892,7 +892,7 @@ void Ip6::UpdateReassemblyList(void)
}
}
void Ip6::SendIcmpError(Message &aMessage, IcmpHeader::Type aIcmpType, IcmpHeader::Code aIcmpCode)
void Ip6::SendIcmpError(Message &aMessage, Icmp::Header::Type aIcmpType, Icmp::Header::Code aIcmpCode)
{
otError error = OT_ERROR_NONE;
Header header;
@@ -1046,18 +1046,18 @@ otError Ip6::ProcessReceiveCallback(const Message & aMessage,
case kProtoIcmp6:
if (mIcmp.ShouldHandleEchoRequest(aMessageInfo))
{
IcmpHeader icmp;
Icmp::Header icmp;
aMessage.Read(aMessage.GetOffset(), sizeof(icmp), &icmp);
// do not pass ICMP Echo Request messages
VerifyOrExit(icmp.GetType() != IcmpHeader::kTypeEchoRequest, error = OT_ERROR_DROP);
VerifyOrExit(icmp.GetType() != Icmp::Header::kTypeEchoRequest, error = OT_ERROR_DROP);
}
break;
case kProtoUdp:
{
UdpHeader udp;
Udp::Header udp;
aMessage.Read(aMessage.GetOffset(), sizeof(udp), &udp);
switch (udp.GetDestinationPort())
+1 -1
View File
@@ -372,7 +372,7 @@ private:
void CleanupFragmentationBuffer(void);
void HandleUpdateTimer(void);
void UpdateReassemblyList(void);
void SendIcmpError(Message &aMessage, IcmpHeader::Type aIcmpType, IcmpHeader::Code aIcmpCode);
void SendIcmpError(Message &aMessage, Icmp::Header::Type aIcmpType, Icmp::Header::Code aIcmpCode);
static void HandleTimer(Timer &aTimer);
#endif
otError AddMplOption(Message &aMessage, Header &aHeader);
+5 -5
View File
@@ -55,11 +55,11 @@ Filter::Filter(void)
bool Filter::Accept(Message &aMessage) const
{
bool rval = false;
Header ip6;
UdpHeader udp;
TcpHeader tcp;
uint16_t dstport;
bool rval = false;
Header ip6;
Udp::Header udp;
Tcp::Header tcp;
uint16_t dstport;
// Allow all received IPv6 datagrams with link security enabled
if (aMessage.IsLinkSecurityEnabled())
+1 -1
View File
@@ -583,7 +583,7 @@ private:
static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo);
void HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
Ip6::UdpSocket mSocket;
Ip6::Udp::Socket mSocket;
MessageQueue mPendingQueries;
TimerMilli mRetransmissionTimer;
+13 -14
View File
@@ -40,6 +40,7 @@
namespace ot {
namespace Ip6 {
namespace Tcp {
/**
* @addtogroup core-tcp
@@ -51,25 +52,12 @@ namespace Ip6 {
*
*/
OT_TOOL_PACKED_BEGIN
struct TcpHeaderPoD
{
uint16_t mSource;
uint16_t mDestination;
uint32_t mSequenceNumber;
uint32_t mAckNumber;
uint16_t mFlags;
uint16_t mWindow;
uint16_t mChecksum;
uint16_t mUrgentPointer;
} OT_TOOL_PACKED_END;
/**
* This class implements TCP header parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class TcpHeader : private TcpHeaderPoD
class Header
{
public:
/**
@@ -136,6 +124,16 @@ public:
*/
uint16_t GetUrgentPointer(void) const { return HostSwap16(mUrgentPointer); }
private:
uint16_t mSource;
uint16_t mDestination;
uint32_t mSequenceNumber;
uint32_t mAckNumber;
uint16_t mFlags;
uint16_t mWindow;
uint16_t mChecksum;
uint16_t mUrgentPointer;
} OT_TOOL_PACKED_END;
/**
@@ -143,6 +141,7 @@ public:
*
*/
} // namespace Tcp
} // namespace Ip6
} // namespace ot
+23 -23
View File
@@ -60,18 +60,18 @@ static bool IsMle(Instance &aInstance, uint16_t aPort)
}
#endif
UdpSocket::UdpSocket(Udp &aUdp)
Udp::Socket::Socket(Udp &aUdp)
: InstanceLocator(aUdp.GetInstance())
{
mHandle = nullptr;
}
Message *UdpSocket::NewMessage(uint16_t aReserved, const Message::Settings &aSettings)
Message *Udp::Socket::NewMessage(uint16_t aReserved, const Message::Settings &aSettings)
{
return Get<Udp>().NewMessage(aReserved, aSettings);
}
otError UdpSocket::Open(otUdpReceive aHandler, void *aContext)
otError Udp::Socket::Open(otUdpReceive aHandler, void *aContext)
{
otError error = OT_ERROR_NONE;
@@ -92,7 +92,7 @@ exit:
return error;
}
otError UdpSocket::Bind(const SockAddr &aSockAddr)
otError Udp::Socket::Bind(const SockAddr &aSockAddr)
{
otError error = OT_ERROR_NONE;
@@ -118,7 +118,7 @@ otError UdpSocket::Bind(const SockAddr &aSockAddr)
return error;
}
otError UdpSocket::Connect(const SockAddr &aSockAddr)
otError Udp::Socket::Connect(const SockAddr &aSockAddr)
{
otError error = OT_ERROR_NONE;
@@ -133,7 +133,7 @@ otError UdpSocket::Connect(const SockAddr &aSockAddr)
return error;
}
otError UdpSocket::Close(void)
otError Udp::Socket::Close(void)
{
otError error = OT_ERROR_NONE;
@@ -151,7 +151,7 @@ exit:
return error;
}
otError UdpSocket::SendTo(Message &aMessage, const MessageInfo &aMessageInfo)
otError Udp::Socket::SendTo(Message &aMessage, const MessageInfo &aMessageInfo)
{
otError error = OT_ERROR_NONE;
MessageInfo messageInfoLocal;
@@ -202,7 +202,7 @@ exit:
return error;
}
bool UdpSocket::Matches(const MessageInfo &aMessageInfo) const
bool Udp::Socket::Matches(const MessageInfo &aMessageInfo) const
{
bool matches = false;
@@ -240,12 +240,12 @@ Udp::Udp(Instance &aInstance)
{
}
otError Udp::AddReceiver(UdpReceiver &aReceiver)
otError Udp::AddReceiver(Receiver &aReceiver)
{
return mReceivers.Add(aReceiver);
}
otError Udp::RemoveReceiver(UdpReceiver &aReceiver)
otError Udp::RemoveReceiver(Receiver &aReceiver)
{
otError error;
@@ -256,12 +256,12 @@ exit:
return error;
}
void Udp::AddSocket(UdpSocket &aSocket)
void Udp::AddSocket(Socket &aSocket)
{
IgnoreError(mSockets.Add(aSocket));
}
void Udp::RemoveSocket(UdpSocket &aSocket)
void Udp::RemoveSocket(Socket &aSocket)
{
SuccessOrExit(mSockets.Remove(aSocket));
aSocket.SetNext(nullptr);
@@ -288,7 +288,7 @@ uint16_t Udp::GetEphemeralPort(void)
Message *Udp::NewMessage(uint16_t aReserved, const Message::Settings &aSettings)
{
return Get<Ip6>().NewMessage(sizeof(UdpHeader) + aReserved, aSettings);
return Get<Ip6>().NewMessage(sizeof(Header) + aReserved, aSettings);
}
otError Udp::SendDatagram(Message &aMessage, MessageInfo &aMessageInfo, uint8_t aIpProto)
@@ -306,7 +306,7 @@ otError Udp::SendDatagram(Message &aMessage, MessageInfo &aMessageInfo, uint8_t
else
#endif
{
UdpHeader udpHeader;
Header udpHeader;
udpHeader.SetSourcePort(aMessageInfo.mSockPort);
udpHeader.SetDestinationPort(aMessageInfo.mPeerPort);
@@ -325,15 +325,15 @@ exit:
otError Udp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo)
{
otError error = OT_ERROR_NONE;
UdpHeader udpHeader;
uint16_t payloadLength;
uint16_t checksum;
otError error = OT_ERROR_NONE;
Header udpHeader;
uint16_t payloadLength;
uint16_t checksum;
payloadLength = aMessage.GetLength() - aMessage.GetOffset();
// check length
VerifyOrExit(payloadLength >= sizeof(UdpHeader), error = OT_ERROR_PARSE);
VerifyOrExit(payloadLength >= sizeof(Header), error = OT_ERROR_PARSE);
// verify checksum
checksum = Ip6::ComputePseudoheaderChecksum(aMessageInfo.GetPeerAddr(), aMessageInfo.GetSockAddr(), payloadLength,
@@ -354,7 +354,7 @@ otError Udp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo)
VerifyOrExit(IsMle(GetInstance(), aMessageInfo.mSockPort), OT_NOOP);
#endif
for (UdpReceiver *receiver = mReceivers.GetHead(); receiver; receiver = receiver->GetNext())
for (Receiver *receiver = mReceivers.GetHead(); receiver; receiver = receiver->GetNext())
{
VerifyOrExit(!receiver->HandleMessage(aMessage, aMessageInfo), OT_NOOP);
}
@@ -367,8 +367,8 @@ exit:
void Udp::HandlePayload(Message &aMessage, MessageInfo &aMessageInfo)
{
UdpSocket *socket;
UdpSocket *prev;
Socket *socket;
Socket *prev;
socket = mSockets.FindMatching(aMessageInfo, prev);
VerifyOrExit(socket != nullptr, OT_NOOP);
@@ -391,7 +391,7 @@ void Udp::UpdateChecksum(Message &aMessage, uint16_t aChecksum)
}
aChecksum = HostSwap16(aChecksum);
aMessage.Write(aMessage.GetOffset() + UdpHeader::GetChecksumOffset(), sizeof(aChecksum), &aChecksum);
aMessage.Write(aMessage.GetOffset() + Header::kChecksumFieldOffset, sizeof(aChecksum), &aChecksum);
}
} // namespace Ip6
+261 -274
View File
@@ -57,180 +57,266 @@ class Udp;
*
*/
/**
* This class implements a UDP receiver.
*
*/
class UdpReceiver : public otUdpReceiver, public LinkedListEntry<UdpReceiver>
{
friend class Udp;
public:
/**
* This constructor initializes the object.
*
* @param[in] aUdpHandler A pointer to the function to handle UDP message.
* @param[in] aContext A pointer to arbitrary context information.
*
*/
UdpReceiver(otUdpHandler aHandler, void *aContext)
{
mNext = nullptr;
mHandler = aHandler;
mContext = aContext;
}
private:
bool HandleMessage(Message &aMessage, const MessageInfo &aMessageInfo)
{
return mHandler(mContext, &aMessage, &aMessageInfo);
}
};
/**
* This class implements a UDP/IPv6 socket.
*
*/
class UdpSocket : public otUdpSocket, public InstanceLocator, public LinkedListEntry<UdpSocket>
{
friend class Udp;
friend class LinkedList<UdpSocket>;
public:
/**
* This constructor initializes the object.
*
* @param[in] aUdp A reference to the UDP transport object.
*
*/
explicit UdpSocket(Udp &aUdp);
/**
* This method returns a new UDP message with sufficient header space reserved.
*
* @param[in] aReserved The number of header bytes to reserve after the UDP header.
* @param[in] aSettings The message settings (default is used if not provided).
*
* @returns A pointer to the message or nullptr if no buffers are available.
*
*/
Message *NewMessage(uint16_t aReserved, const Message::Settings &aSettings = Message::Settings::GetDefault());
/**
* This method opens the UDP socket.
*
* @param[in] aHandler A pointer to a function that is called when receiving UDP messages.
* @param[in] aContext A pointer to arbitrary context information.
*
* @retval OT_ERROR_NONE Successfully opened the socket.
* @retval OT_ERROR_ALREADY The socket is already open.
*
*/
otError Open(otUdpReceive aHandler, void *aContext);
/**
* This method binds the UDP socket.
*
* @param[in] aSockAddr A reference to the socket address.
*
* @retval OT_ERROR_NONE Successfully bound the socket.
* @retval OT_ERROR_FAILED Failed to bind UDP Socket.
*
*/
otError Bind(const SockAddr &aSockAddr);
/**
* This method indicates whether or not the socket is bound.
*
* @retval TRUE if the socket is bound (i.e. source port is non-zero).
* @retval FALSE if the socket is not bound (source port is zero).
*
*/
bool IsBound(void) const { return mSockName.mPort != 0; }
/**
* This method connects the UDP socket.
*
* @param[in] aSockAddr A reference to the socket address.
*
* @retval OT_ERROR_NONE Successfully connected the socket.
* @retval OT_ERROR_FAILED Failed to connect UDP Socket.
*
*/
otError Connect(const SockAddr &aSockAddr);
/**
* This method closes the UDP socket.
*
* @retval OT_ERROR_NONE Successfully closed the UDP socket.
* @retval OT_ERROR_FAILED Failed to close UDP Socket.
*
*/
otError Close(void);
/**
* This method sends a UDP message.
*
* @param[in] aMessage The message to send.
* @param[in] aMessageInfo The message info associated with @p aMessage.
*
* @retval OT_ERROR_NONE Successfully sent the UDP message.
* @retval OT_ERROR_INVALID_ARGS If no peer is specified in @p aMessageInfo or by connect().
* @retval OT_ERROR_NO_BUFS Insufficient available buffer to add the UDP and IPv6 headers.
*
*/
otError SendTo(Message &aMessage, const MessageInfo &aMessageInfo);
/**
* This method returns the local socket address.
*
* @returns A reference to the local socket address.
*
*/
SockAddr &GetSockName(void) { return *static_cast<SockAddr *>(&mSockName); }
/**
* This method returns the local socket address.
*
* @returns A reference to the local socket address.
*
*/
const SockAddr &GetSockName(void) const { return *static_cast<const SockAddr *>(&mSockName); }
/**
* This method returns the peer's socket address.
*
* @returns A reference to the peer's socket address.
*
*/
SockAddr &GetPeerName(void) { return *static_cast<SockAddr *>(&mPeerName); }
/**
* This method returns the peer's socket address.
*
* @returns A reference to the peer's socket address.
*
*/
const SockAddr &GetPeerName(void) const { return *static_cast<const SockAddr *>(&mPeerName); }
private:
bool Matches(const MessageInfo &aMessageInfo) const;
void HandleUdpReceive(Message &aMessage, const MessageInfo &aMessageInfo)
{
mHandler(mContext, &aMessage, &aMessageInfo);
}
};
/**
* This class implements core UDP message handling.
*
*/
class Udp : public InstanceLocator
{
friend class UdpSocket;
public:
/**
* This class implements a UDP/IPv6 socket.
*
*/
class Socket : public otUdpSocket, public InstanceLocator, public LinkedListEntry<Socket>
{
friend class Udp;
friend class LinkedList<Socket>;
public:
/**
* This constructor initializes the object.
*
* @param[in] aUdp A reference to the UDP transport object.
*
*/
explicit Socket(Udp &aUdp);
/**
* This method returns a new UDP message with sufficient header space reserved.
*
* @param[in] aReserved The number of header bytes to reserve after the UDP header.
* @param[in] aSettings The message settings (default is used if not provided).
*
* @returns A pointer to the message or nullptr if no buffers are available.
*
*/
Message *NewMessage(uint16_t aReserved, const Message::Settings &aSettings = Message::Settings::GetDefault());
/**
* This method opens the UDP socket.
*
* @param[in] aHandler A pointer to a function that is called when receiving UDP messages.
* @param[in] aContext A pointer to arbitrary context information.
*
* @retval OT_ERROR_NONE Successfully opened the socket.
* @retval OT_ERROR_ALREADY The socket is already open.
*
*/
otError Open(otUdpReceive aHandler, void *aContext);
/**
* This method binds the UDP socket.
*
* @param[in] aSockAddr A reference to the socket address.
*
* @retval OT_ERROR_NONE Successfully bound the socket.
* @retval OT_ERROR_FAILED Failed to bind UDP Socket.
*
*/
otError Bind(const SockAddr &aSockAddr);
/**
* This method indicates whether or not the socket is bound.
*
* @retval TRUE if the socket is bound (i.e. source port is non-zero).
* @retval FALSE if the socket is not bound (source port is zero).
*
*/
bool IsBound(void) const { return mSockName.mPort != 0; }
/**
* This method connects the UDP socket.
*
* @param[in] aSockAddr A reference to the socket address.
*
* @retval OT_ERROR_NONE Successfully connected the socket.
* @retval OT_ERROR_FAILED Failed to connect UDP Socket.
*
*/
otError Connect(const SockAddr &aSockAddr);
/**
* This method closes the UDP socket.
*
* @retval OT_ERROR_NONE Successfully closed the UDP socket.
* @retval OT_ERROR_FAILED Failed to close UDP Socket.
*
*/
otError Close(void);
/**
* This method sends a UDP message.
*
* @param[in] aMessage The message to send.
* @param[in] aMessageInfo The message info associated with @p aMessage.
*
* @retval OT_ERROR_NONE Successfully sent the UDP message.
* @retval OT_ERROR_INVALID_ARGS If no peer is specified in @p aMessageInfo or by connect().
* @retval OT_ERROR_NO_BUFS Insufficient available buffer to add the UDP and IPv6 headers.
*
*/
otError SendTo(Message &aMessage, const MessageInfo &aMessageInfo);
/**
* This method returns the local socket address.
*
* @returns A reference to the local socket address.
*
*/
SockAddr &GetSockName(void) { return *static_cast<SockAddr *>(&mSockName); }
/**
* This method returns the local socket address.
*
* @returns A reference to the local socket address.
*
*/
const SockAddr &GetSockName(void) const { return *static_cast<const SockAddr *>(&mSockName); }
/**
* This method returns the peer's socket address.
*
* @returns A reference to the peer's socket address.
*
*/
SockAddr &GetPeerName(void) { return *static_cast<SockAddr *>(&mPeerName); }
/**
* This method returns the peer's socket address.
*
* @returns A reference to the peer's socket address.
*
*/
const SockAddr &GetPeerName(void) const { return *static_cast<const SockAddr *>(&mPeerName); }
private:
bool Matches(const MessageInfo &aMessageInfo) const;
void HandleUdpReceive(Message &aMessage, const MessageInfo &aMessageInfo)
{
mHandler(mContext, &aMessage, &aMessageInfo);
}
};
/**
* This class implements a UDP receiver.
*
*/
class Receiver : public otUdpReceiver, public LinkedListEntry<Receiver>
{
friend class Udp;
public:
/**
* This constructor initializes the UDP receiver.
*
* @param[in] aUdpHandler A pointer to the function to handle UDP message.
* @param[in] aContext A pointer to arbitrary context information.
*
*/
Receiver(otUdpHandler aHandler, void *aContext)
{
mNext = nullptr;
mHandler = aHandler;
mContext = aContext;
}
private:
bool HandleMessage(Message &aMessage, const MessageInfo &aMessageInfo)
{
return mHandler(mContext, &aMessage, &aMessageInfo);
}
};
/**
* This class implements UDP header generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class Header
{
public:
enum : uint8_t
{
kSourcePortFieldOffset = 0, ///< The byte offset of Source Port field in UDP header.
kDestPortFieldOffset = 2, ///< The byte offset of Destination Port field in UDP header.
kLengthFieldOffset = 4, ///< The byte offset of Length field in UDP header.
kChecksumFieldOffset = 6, ///< The byte offset of Checksum field in UDP header.
};
/**
* This method returns the UDP Source Port.
*
* @returns The UDP Source Port.
*
*/
uint16_t GetSourcePort(void) const { return HostSwap16(mSourcePort); }
/**
* This method sets the UDP Source Port.
*
* @param[in] aPort The UDP Source Port.
*
*/
void SetSourcePort(uint16_t aPort) { mSourcePort = HostSwap16(aPort); }
/**
* This method returns the UDP Destination Port.
*
* @returns The UDP Destination Port.
*
*/
uint16_t GetDestinationPort(void) const { return HostSwap16(mDestinationPort); }
/**
* This method sets the UDP Destination Port.
*
* @param[in] aPort The UDP Destination Port.
*
*/
void SetDestinationPort(uint16_t aPort) { mDestinationPort = HostSwap16(aPort); }
/**
* This method returns the UDP Length.
*
* @returns The UDP Length.
*
*/
uint16_t GetLength(void) const { return HostSwap16(mLength); }
/**
* This method sets the UDP Length.
*
* @param[in] aLength The UDP Length.
*
*/
void SetLength(uint16_t aLength) { mLength = HostSwap16(aLength); }
/**
* This method returns the UDP Checksum.
*
* @returns The UDP Checksum.
*
*/
uint16_t GetChecksum(void) const { return HostSwap16(mChecksum); }
/**
* This method sets the UDP Checksum.
*
* @param[in] aChecksum The UDP Checksum.
*
*/
void SetChecksum(uint16_t aChecksum) { mChecksum = HostSwap16(aChecksum); }
private:
uint16_t mSourcePort;
uint16_t mDestinationPort;
uint16_t mLength;
uint16_t mChecksum;
} OT_TOOL_PACKED_END;
/**
* This constructor initializes the object.
*
@@ -248,7 +334,7 @@ public:
* @retval OT_ERROR_ALREADY The UDP receiver was already added.
*
*/
otError AddReceiver(UdpReceiver &aReceiver);
otError AddReceiver(Receiver &aReceiver);
/**
* This method removes a UDP receiver.
@@ -259,7 +345,7 @@ public:
* @retval OT_ERROR_NOT_FOUND The UDP receiver was not added.
*
*/
otError RemoveReceiver(UdpReceiver &aReceiver);
otError RemoveReceiver(Receiver &aReceiver);
/**
* This method adds a UDP socket.
@@ -267,7 +353,7 @@ public:
* @param[in] aSocket A reference to the UDP socket.
*
*/
void AddSocket(UdpSocket &aSocket);
void AddSocket(Socket &aSocket);
/**
* This method removes a UDP socket.
@@ -275,7 +361,7 @@ public:
* @param[in] aSocket A reference to the UDP socket.
*
*/
void RemoveSocket(UdpSocket &aSocket);
void RemoveSocket(Socket &aSocket);
/**
* This method returns a new ephemeral port.
@@ -346,7 +432,7 @@ public:
* @returns A pointer to the head of UDP Socket linked list.
*
*/
UdpSocket *GetUdpSockets(void) { return mSockets.GetHead(); }
Socket *GetUdpSockets(void) { return mSockets.GetHead(); }
#endif
#if OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE
@@ -371,114 +457,15 @@ private:
kDynamicPortMax = 65535, ///< Service Name and Transport Protocol Port Number Registry
};
uint16_t mEphemeralPort;
LinkedList<UdpReceiver> mReceivers;
LinkedList<UdpSocket> mSockets;
uint16_t mEphemeralPort;
LinkedList<Receiver> mReceivers;
LinkedList<Socket> mSockets;
#if OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE
void * mUdpForwarderContext;
otUdpForwarder mUdpForwarder;
#endif
};
OT_TOOL_PACKED_BEGIN
struct UdpHeaderPoD
{
uint16_t mSource;
uint16_t mDestination;
uint16_t mLength;
uint16_t mChecksum;
} OT_TOOL_PACKED_END;
/**
* This class implements UDP header generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class UdpHeader : private UdpHeaderPoD
{
public:
/**
* This method returns the UDP Source Port.
*
* @returns The UDP Source Port.
*
*/
uint16_t GetSourcePort(void) const { return HostSwap16(mSource); }
/**
* This method sets the UDP Source Port.
*
* @param[in] aPort The UDP Source Port.
*
*/
void SetSourcePort(uint16_t aPort) { mSource = HostSwap16(aPort); }
/**
* This method returns the UDP Destination Port.
*
* @returns The UDP Destination Port.
*
*/
uint16_t GetDestinationPort(void) const { return HostSwap16(mDestination); }
/**
* This method sets the UDP Destination Port.
*
* @param[in] aPort The UDP Destination Port.
*
*/
void SetDestinationPort(uint16_t aPort) { mDestination = HostSwap16(aPort); }
/**
* This method returns the UDP Length.
*
* @returns The UDP Length.
*
*/
uint16_t GetLength(void) const { return HostSwap16(mLength); }
/**
* This method sets the UDP Length.
*
* @param[in] aLength The UDP Length.
*
*/
void SetLength(uint16_t aLength) { mLength = HostSwap16(aLength); }
/**
* This method returns the UDP Checksum.
*
* @returns The UDP Checksum.
*
*/
uint16_t GetChecksum(void) const { return HostSwap16(mChecksum); }
/**
* This method sets the UDP Checksum.
*
* @param[in] aChecksum The UDP Checksum.
*
*/
void SetChecksum(uint16_t aChecksum) { mChecksum = HostSwap16(aChecksum); }
/**
* This static method returns the byte offset for the UDP Length.
*
* @returns The byte offset for the UDP Length.
*
*/
static uint8_t GetLengthOffset(void) { return offsetof(UdpHeaderPoD, mLength); }
/**
* This static method returns the byte offset for the UDP Checksum.
*
* @returns The byte offset for the UDP Checksum.
*
*/
static uint8_t GetChecksumOffset(void) { return offsetof(UdpHeaderPoD, mChecksum); }
} OT_TOOL_PACKED_END;
/**
* @}
*
+6 -6
View File
@@ -937,19 +937,19 @@ void AddressResolver::HandleIcmpReceive(void * aContext,
static_cast<AddressResolver *>(aContext)->HandleIcmpReceive(*static_cast<Message *>(aMessage),
*static_cast<const Ip6::MessageInfo *>(aMessageInfo),
*static_cast<const Ip6::IcmpHeader *>(aIcmpHeader));
*static_cast<const Ip6::Icmp::Header *>(aIcmpHeader));
}
void AddressResolver::HandleIcmpReceive(Message & aMessage,
const Ip6::MessageInfo &aMessageInfo,
const Ip6::IcmpHeader & aIcmpHeader)
void AddressResolver::HandleIcmpReceive(Message & aMessage,
const Ip6::MessageInfo & aMessageInfo,
const Ip6::Icmp::Header &aIcmpHeader)
{
OT_UNUSED_VARIABLE(aMessageInfo);
Ip6::Header ip6Header;
VerifyOrExit(aIcmpHeader.GetType() == Ip6::IcmpHeader::kTypeDstUnreach, OT_NOOP);
VerifyOrExit(aIcmpHeader.GetCode() == Ip6::IcmpHeader::kCodeDstUnreachNoRoute, OT_NOOP);
VerifyOrExit(aIcmpHeader.GetType() == Ip6::Icmp::Header::kTypeDstUnreach, OT_NOOP);
VerifyOrExit(aIcmpHeader.GetCode() == Ip6::Icmp::Header::kCodeDstUnreachNoRoute, OT_NOOP);
VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(ip6Header), &ip6Header) == sizeof(ip6Header), OT_NOOP);
Remove(ip6Header.GetDestination(), kReasonReceivedIcmpDstUnreachNoRoute);
+5 -3
View File
@@ -303,7 +303,9 @@ private:
otMessage * aMessage,
const otMessageInfo *aMessageInfo,
const otIcmp6Header *aIcmpHeader);
void HandleIcmpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Ip6::IcmpHeader &aIcmpHeader);
void HandleIcmpReceive(Message & aMessage,
const Ip6::MessageInfo & aMessageInfo,
const Ip6::Icmp::Header &aIcmpHeader);
static void HandleTimer(Timer &aTimer);
void HandleTimer(void);
@@ -327,8 +329,8 @@ private:
CacheEntryList mQueryList;
CacheEntryList mQueryRetryList;
Ip6::IcmpHandler mIcmpHandler;
TimerMilli mTimer;
Ip6::Icmp::Handler mIcmpHandler;
TimerMilli mTimer;
};
/**
+12 -11
View File
@@ -562,12 +562,12 @@ exit:
otError Lowpan::CompressUdp(Message &aMessage, BufferWriter &aBuf)
{
otError error = OT_ERROR_NONE;
BufferWriter buf = aBuf;
uint16_t startOffset = aMessage.GetOffset();
Ip6::UdpHeader udpHeader;
uint16_t source;
uint16_t destination;
otError error = OT_ERROR_NONE;
BufferWriter buf = aBuf;
uint16_t startOffset = aMessage.GetOffset();
Ip6::Udp::Header udpHeader;
uint16_t source;
uint16_t destination;
VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(udpHeader), &udpHeader) == sizeof(udpHeader),
error = OT_ERROR_PARSE);
@@ -597,10 +597,11 @@ otError Lowpan::CompressUdp(Message &aMessage, BufferWriter &aBuf)
else
{
SuccessOrExit(error = buf.Write(kUdpDispatch));
SuccessOrExit(error = buf.Write(&udpHeader, Ip6::UdpHeader::GetLengthOffset()));
SuccessOrExit(error = buf.Write(&udpHeader, Ip6::Udp::Header::kLengthFieldOffset));
}
SuccessOrExit(error = buf.Write(reinterpret_cast<uint8_t *>(&udpHeader) + Ip6::UdpHeader::GetChecksumOffset(), 2));
SuccessOrExit(error =
buf.Write(reinterpret_cast<uint8_t *>(&udpHeader) + Ip6::Udp::Header::kChecksumFieldOffset, 2));
aMessage.MoveOffset(sizeof(udpHeader));
@@ -1010,7 +1011,7 @@ exit:
return (error == OT_ERROR_NONE) ? static_cast<int>(cur - aBuf) : -1;
}
int Lowpan::DecompressUdpHeader(Ip6::UdpHeader &aUdpHeader, const uint8_t *aBuf, uint16_t aBufLength)
int Lowpan::DecompressUdpHeader(Ip6::Udp::Header &aUdpHeader, const uint8_t *aBuf, uint16_t aBufLength)
{
otError error = OT_ERROR_PARSE;
const uint8_t *cur = aBuf;
@@ -1077,8 +1078,8 @@ exit:
int Lowpan::DecompressUdpHeader(Message &aMessage, const uint8_t *aBuf, uint16_t aBufLength, uint16_t aDatagramLength)
{
Ip6::UdpHeader udpHeader;
int headerLen = -1;
Ip6::Udp::Header udpHeader;
int headerLen = -1;
headerLen = DecompressUdpHeader(udpHeader, aBuf, aBufLength);
VerifyOrExit(headerLen >= 0, OT_NOOP);
+1 -1
View File
@@ -309,7 +309,7 @@ public:
* @returns The size of the compressed header in bytes or -1 if decompression fails.
*
*/
int DecompressUdpHeader(Ip6::UdpHeader &aUdpHeader, const uint8_t *aBuf, uint16_t aBufLength);
int DecompressUdpHeader(Ip6::Udp::Header &aUdpHeader, const uint8_t *aBuf, uint16_t aBufLength);
private:
enum
+14 -12
View File
@@ -1242,12 +1242,12 @@ otError MeshForwarder::GetFramePriority(const uint8_t * aFrame,
const Mac::Address &aMacDest,
Message::Priority & aPriority)
{
otError error = OT_ERROR_NONE;
Ip6::Header ip6Header;
Ip6::UdpHeader udpHeader;
Ip6::IcmpHeader icmpHeader;
uint8_t headerLength;
bool nextHeaderCompressed;
otError error = OT_ERROR_NONE;
Ip6::Header ip6Header;
Ip6::Udp::Header udpHeader;
Ip6::Icmp::Header icmpHeader;
uint8_t headerLength;
bool nextHeaderCompressed;
SuccessOrExit(error = DecompressIp6Header(aFrame, aFrameLength, aMacSource, aMacDest, ip6Header, headerLength,
nextHeaderCompressed));
@@ -1278,8 +1278,8 @@ otError MeshForwarder::GetFramePriority(const uint8_t * aFrame,
}
else
{
VerifyOrExit(aFrameLength >= sizeof(Ip6::UdpHeader), error = OT_ERROR_PARSE);
memcpy(&udpHeader, aFrame, sizeof(Ip6::UdpHeader));
VerifyOrExit(aFrameLength >= sizeof(Ip6::Udp::Header), error = OT_ERROR_PARSE);
memcpy(&udpHeader, aFrame, sizeof(Ip6::Udp::Header));
}
if (udpHeader.GetDestinationPort() == Mle::kUdpPort || udpHeader.GetDestinationPort() == kCoapUdpPort)
@@ -1304,8 +1304,8 @@ otError MeshForwarder::ParseIp6UdpTcpHeader(const Message &aMessage,
otError error = OT_ERROR_PARSE;
union
{
Ip6::UdpHeader udp;
Ip6::TcpHeader tcp;
Ip6::Udp::Header udp;
Ip6::Tcp::Header tcp;
} header;
aChecksum = 0;
@@ -1318,7 +1318,8 @@ otError MeshForwarder::ParseIp6UdpTcpHeader(const Message &aMessage,
switch (aIp6Header.GetNextHeader())
{
case Ip6::kProtoUdp:
VerifyOrExit(sizeof(Ip6::UdpHeader) == aMessage.Read(sizeof(Ip6::Header), sizeof(Ip6::UdpHeader), &header.udp),
VerifyOrExit(sizeof(Ip6::Udp::Header) ==
aMessage.Read(sizeof(Ip6::Header), sizeof(Ip6::Udp::Header), &header.udp),
OT_NOOP);
aChecksum = header.udp.GetChecksum();
aSourcePort = header.udp.GetSourcePort();
@@ -1326,7 +1327,8 @@ otError MeshForwarder::ParseIp6UdpTcpHeader(const Message &aMessage,
break;
case Ip6::kProtoTcp:
VerifyOrExit(sizeof(Ip6::TcpHeader) == aMessage.Read(sizeof(Ip6::Header), sizeof(Ip6::TcpHeader), &header.tcp),
VerifyOrExit(sizeof(Ip6::Tcp::Header) ==
aMessage.Read(sizeof(Ip6::Header), sizeof(Ip6::Tcp::Header), &header.tcp),
OT_NOOP);
aChecksum = header.tcp.GetChecksum();
aSourcePort = header.tcp.GetSourcePort();
+8 -7
View File
@@ -602,8 +602,8 @@ void MeshForwarder::SendDestinationUnreachable(uint16_t aMeshSource, const Messa
messageInfo.GetPeerAddr() = Get<Mle::MleRouter>().GetMeshLocal16();
messageInfo.GetPeerAddr().GetIid().SetLocator(aMeshSource);
IgnoreError(Get<Ip6::Icmp>().SendError(Ip6::IcmpHeader::kTypeDstUnreach, Ip6::IcmpHeader::kCodeDstUnreachNoRoute,
messageInfo, aMessage));
IgnoreError(Get<Ip6::Icmp>().SendError(Ip6::Icmp::Header::kTypeDstUnreach,
Ip6::Icmp::Header::kCodeDstUnreachNoRoute, messageInfo, aMessage));
}
void MeshForwarder::HandleMesh(uint8_t * aFrame,
@@ -1051,8 +1051,8 @@ otError MeshForwarder::DecompressIp6UdpTcpHeader(const Message & aMessage,
uint16_t frameLength;
union
{
Ip6::UdpHeader udp;
Ip6::TcpHeader tcp;
Ip6::Udp::Header udp;
Ip6::Tcp::Header tcp;
} header;
aChecksum = 0;
@@ -1076,13 +1076,13 @@ otError MeshForwarder::DecompressIp6UdpTcpHeader(const Message & aMessage,
case Ip6::kProtoUdp:
if (nextHeaderCompressed)
{
frameLength = aMessage.Read(aOffset, sizeof(Ip6::UdpHeader), frameBuffer);
frameLength = aMessage.Read(aOffset, sizeof(Ip6::Udp::Header), frameBuffer);
headerLength = Get<Lowpan::Lowpan>().DecompressUdpHeader(header.udp, frameBuffer, frameLength);
VerifyOrExit(headerLength >= 0, OT_NOOP);
}
else
{
VerifyOrExit(sizeof(Ip6::UdpHeader) == aMessage.Read(aOffset, sizeof(Ip6::UdpHeader), &header.udp),
VerifyOrExit(sizeof(Ip6::Udp::Header) == aMessage.Read(aOffset, sizeof(Ip6::Udp::Header), &header.udp),
OT_NOOP);
}
@@ -1092,7 +1092,8 @@ otError MeshForwarder::DecompressIp6UdpTcpHeader(const Message & aMessage,
break;
case Ip6::kProtoTcp:
VerifyOrExit(sizeof(Ip6::TcpHeader) == aMessage.Read(aOffset, sizeof(Ip6::TcpHeader), &header.tcp), OT_NOOP);
VerifyOrExit(sizeof(Ip6::Tcp::Header) == aMessage.Read(aOffset, sizeof(Ip6::Tcp::Header), &header.tcp),
OT_NOOP);
aChecksum = header.tcp.GetChecksum();
aSourcePort = header.tcp.GetSourcePort();
aDestPort = header.tcp.GetDestinationPort();
+2 -2
View File
@@ -1741,8 +1741,8 @@ private:
Challenge mParentCandidateChallenge;
Ip6::UdpSocket mSocket;
uint32_t mTimeout;
Ip6::Udp::Socket mSocket;
uint32_t mTimeout;
#if OPENTHREAD_CONFIG_MLE_INFORM_PREVIOUS_PARENT_ON_REATTACH
uint16_t mPreviousParentRloc;
+6 -6
View File
@@ -253,12 +253,12 @@ public:
* This fields represent uncompressed IPv6 packet.
*
*/
Mac::Address mMacSource;
Mac::Address mMacDestination;
Ip6::Header mIpHeader;
Payload mExtHeader;
Ip6::Header mIpTunneledHeader;
Ip6::UdpHeader mUdpHeader;
Mac::Address mMacSource;
Mac::Address mMacDestination;
Ip6::Header mIpHeader;
Payload mExtHeader;
Ip6::Header mIpTunneledHeader;
Ip6::Udp::Header mUdpHeader;
/**
* This fields represent compressed IPv6 packet.