[icmp] do not generate errors in response to errors (#4800)

This commit is contained in:
Jonathan Hui
2020-04-09 09:52:47 -07:00
parent adc62ecfe5
commit fe736641b2
2 changed files with 21 additions and 1 deletions
+12 -1
View File
@@ -98,12 +98,23 @@ otError Icmp::SendError(IcmpHeader::Type aType,
IcmpHeader icmp6Header;
Header ip6Header;
VerifyOrExit(aMessage.GetLength() >= sizeof(ip6Header), error = OT_ERROR_INVALID_ARGS);
aMessage.Read(0, sizeof(ip6Header), &ip6Header);
if (ip6Header.GetNextHeader() == kProtoIcmp6)
{
VerifyOrExit(aMessage.GetLength() >= (sizeof(ip6Header) + sizeof(icmp6Header)));
aMessage.Read(sizeof(ip6Header), sizeof(icmp6Header), &icmp6Header);
VerifyOrExit(!icmp6Header.IsError());
}
messageInfoLocal = aMessageInfo;
VerifyOrExit((message = Get<Ip6>().NewMessage(0)) != NULL, error = OT_ERROR_NO_BUFS);
SuccessOrExit(error = message->SetLength(sizeof(icmp6Header) + sizeof(ip6Header)));
aMessage.Read(0, sizeof(ip6Header), &ip6Header);
message->Write(sizeof(icmp6Header), sizeof(ip6Header), &ip6Header);
icmp6Header.Init();
+9
View File
@@ -101,6 +101,15 @@ public:
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.
*