mirror of
https://github.com/espressif/openthread.git
synced 2026-10-01 13:27:42 +00:00
[ncp] update pass through filter rules (#2036)
This commit is contained in:
+29
-9
@@ -572,11 +572,9 @@ otError Ip6::ProcessReceiveCallback(const Message &aMessage, const MessageInfo &
|
|||||||
|
|
||||||
if (mIsReceiveIp6FilterEnabled)
|
if (mIsReceiveIp6FilterEnabled)
|
||||||
{
|
{
|
||||||
// do not pass messages sent to/from an RLOC
|
// do not pass messages sent to an RLOC/ALOC
|
||||||
VerifyOrExit(!aMessageInfo.GetSockAddr().IsRoutingLocator() &&
|
VerifyOrExit(!aMessageInfo.GetSockAddr().IsRoutingLocator() &&
|
||||||
!aMessageInfo.GetPeerAddr().IsRoutingLocator() &&
|
!aMessageInfo.GetSockAddr().IsAnycastRoutingLocator(),
|
||||||
!aMessageInfo.GetSockAddr().IsAnycastRoutingLocator() &&
|
|
||||||
!aMessageInfo.GetPeerAddr().IsAnycastRoutingLocator(),
|
|
||||||
error = OT_ERROR_NO_ROUTE);
|
error = OT_ERROR_NO_ROUTE);
|
||||||
|
|
||||||
switch (aIpProto)
|
switch (aIpProto)
|
||||||
@@ -594,17 +592,39 @@ otError Ip6::ProcessReceiveCallback(const Message &aMessage, const MessageInfo &
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case kProtoUdp:
|
case kProtoUdp:
|
||||||
if (aMessageInfo.GetSockAddr().IsLinkLocal() ||
|
{
|
||||||
aMessageInfo.GetSockAddr().IsLinkLocalMulticast())
|
UdpHeader udp;
|
||||||
|
aMessage.Read(aMessage.GetOffset(), sizeof(udp), &udp);
|
||||||
|
|
||||||
|
switch (udp.GetDestinationPort())
|
||||||
{
|
{
|
||||||
UdpHeader udp;
|
case Mle::kUdpPort:
|
||||||
aMessage.Read(aMessage.GetOffset(), sizeof(udp), &udp);
|
|
||||||
|
|
||||||
// do not pass MLE messages
|
// do not pass MLE messages
|
||||||
VerifyOrExit(udp.GetDestinationPort() != Mle::kUdpPort, error = OT_ERROR_NO_ROUTE);
|
if (aMessageInfo.GetSockAddr().IsLinkLocal() ||
|
||||||
|
aMessageInfo.GetSockAddr().IsLinkLocalMulticast())
|
||||||
|
{
|
||||||
|
ExitNow(error = OT_ERROR_NO_ROUTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCoapUdpPort:
|
||||||
|
|
||||||
|
// do not pass TMF messages
|
||||||
|
if (GetInstance().mThreadNetif.IsTmfMessage(aMessageInfo))
|
||||||
|
{
|
||||||
|
ExitNow(error = OT_ERROR_NO_ROUTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -182,21 +182,27 @@ exit:
|
|||||||
|
|
||||||
otError ThreadNetif::TmfFilter(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, void *aContext)
|
otError ThreadNetif::TmfFilter(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, void *aContext)
|
||||||
{
|
{
|
||||||
otError error = OT_ERROR_NONE;
|
OT_UNUSED_VARIABLE(aMessage);
|
||||||
|
|
||||||
|
return static_cast<ThreadNetif *>(aContext)->IsTmfMessage(aMessageInfo) ? OT_ERROR_NONE : OT_ERROR_NOT_TMF;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ThreadNetif::IsTmfMessage(const Ip6::MessageInfo &aMessageInfo)
|
||||||
|
{
|
||||||
|
bool rval = true;
|
||||||
|
|
||||||
// A TMF message must comply with following rules:
|
// A TMF message must comply with following rules:
|
||||||
// 1. The destination is a Mesh Local Address or a Link-Local Multicast Address or a Realm-Local Multicast Address,
|
// 1. The destination is a Mesh Local Address or a Link-Local Multicast Address or a Realm-Local Multicast Address,
|
||||||
// and the source is a Mesh Local Address.
|
// and the source is a Mesh Local Address.
|
||||||
// 2. Both the destination and the source are Link-Local Addresses.
|
// 2. Both the destination and the source are Link-Local Addresses.
|
||||||
VerifyOrExit(((static_cast<ThreadNetif *>(aContext)->mMleRouter.IsMeshLocalAddress(aMessageInfo.GetSockAddr()) ||
|
VerifyOrExit(((mMleRouter.IsMeshLocalAddress(aMessageInfo.GetSockAddr()) ||
|
||||||
aMessageInfo.GetSockAddr().IsLinkLocalMulticast() ||
|
aMessageInfo.GetSockAddr().IsLinkLocalMulticast() ||
|
||||||
aMessageInfo.GetSockAddr().IsRealmLocalMulticast()) &&
|
aMessageInfo.GetSockAddr().IsRealmLocalMulticast()) &&
|
||||||
static_cast<ThreadNetif *>(aContext)->mMleRouter.IsMeshLocalAddress(aMessageInfo.GetPeerAddr())) ||
|
mMleRouter.IsMeshLocalAddress(aMessageInfo.GetPeerAddr())) ||
|
||||||
(aMessageInfo.GetSockAddr().IsLinkLocal() && aMessageInfo.GetPeerAddr().IsLinkLocal()),
|
(aMessageInfo.GetSockAddr().IsLinkLocal() && aMessageInfo.GetPeerAddr().IsLinkLocal()),
|
||||||
error = OT_ERROR_NOT_TMF);
|
rval = false);
|
||||||
exit:
|
exit:
|
||||||
OT_UNUSED_VARIABLE(aMessage);
|
return rval;
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ot
|
} // namespace ot
|
||||||
|
|||||||
@@ -412,6 +412,15 @@ public:
|
|||||||
*/
|
*/
|
||||||
PanIdQueryServer &GetPanIdQueryServer(void) { return mPanIdQuery; }
|
PanIdQueryServer &GetPanIdQueryServer(void) { return mPanIdQuery; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns whether Thread Management Framework Addressing Rules are met.
|
||||||
|
*
|
||||||
|
* @retval TRUE if Thread Management Framework Addressing Rules are met.
|
||||||
|
* @retval FALSE if Thread Management Framework Addressing Rules are not met.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool IsTmfMessage(const Ip6::MessageInfo &aMessageInfo);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static otError TmfFilter(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, void *aContext);
|
static otError TmfFilter(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, void *aContext);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user