[address-resolver] update/add logs in AddressResolver (#2196)

This commit is contained in:
Abtin Keshavarzian
2017-09-19 13:00:50 -07:00
committed by Jonathan Hui
parent 93f4fb3a29
commit 4323b6f221
2 changed files with 99 additions and 18 deletions
+89 -17
View File
@@ -104,7 +104,7 @@ void AddressResolver::Remove(uint8_t routerId)
{ {
if (Mle::Mle::GetRouterId(mCache[i].mRloc16) == routerId) if (Mle::Mle::GetRouterId(mCache[i].mRloc16) == routerId)
{ {
InvalidateCacheEntry(mCache[i]); InvalidateCacheEntry(mCache[i], kReasonRemovingRouterId);
} }
} }
} }
@@ -128,7 +128,7 @@ AddressResolver::Cache *AddressResolver::NewCacheEntry(void)
if (rval != NULL) if (rval != NULL)
{ {
InvalidateCacheEntry(*rval); InvalidateCacheEntry(*rval, kReasonEvictingForNewEntry);
} }
return rval; return rval;
@@ -147,8 +147,32 @@ void AddressResolver::MarkCacheEntryAsUsed(Cache &aEntry)
aEntry.mAge = 0; aEntry.mAge = 0;
} }
void AddressResolver::InvalidateCacheEntry(Cache &aEntry) const char *AddressResolver::ConvertInvalidationReasonToString(InvalidationReason aReason)
{ {
const char *str = "";
switch (aReason)
{
case kReasonRemovingRouterId:
str = "removing router id";
break;
case kReasonReceivedIcmpDstUnreachNoRoute:
str = "received icmp no route";
break;
case kReasonEvictingForNewEntry:
str = "evicting for new entry";
break;
}
return str;
}
void AddressResolver::InvalidateCacheEntry(Cache &aEntry, InvalidationReason aReason)
{
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
for (int i = 0; i < kCacheEntries; i++) for (int i = 0; i < kCacheEntries; i++)
{ {
if (mCache[i].mAge > aEntry.mAge) if (mCache[i].mAge > aEntry.mAge)
@@ -157,9 +181,29 @@ void AddressResolver::InvalidateCacheEntry(Cache &aEntry)
} }
} }
switch (aEntry.mState)
{
case Cache::kStateCached:
otLogInfoArp(GetInstance(), "Cache entry removed: %s, 0x%04x - %s",
aEntry.mTarget.ToString(stringBuffer, sizeof(stringBuffer)), aEntry.mRloc16,
ConvertInvalidationReasonToString(aReason));
break;
case Cache::kStateQuery:
otLogInfoArp(GetInstance(), "Cache entry (query mode) removed: %s, timeout:%d, retry:%d - %s",
aEntry.mTarget.ToString(stringBuffer, sizeof(stringBuffer)), aEntry.mTimeout,
aEntry.mRetryTimeout, ConvertInvalidationReasonToString(aReason));
break;
default:
break;
}
aEntry.mAge = kCacheEntries - 1; aEntry.mAge = kCacheEntries - 1;
aEntry.mState = Cache::kStateInvalid; aEntry.mState = Cache::kStateInvalid;
otLogInfoArp(GetInstance(), "cache entry removed!");
OT_UNUSED_VARIABLE(stringBuffer);
OT_UNUSED_VARIABLE(aReason);
} }
otError AddressResolver::Resolve(const Ip6::Address &aEid, uint16_t &aRloc16) otError AddressResolver::Resolve(const Ip6::Address &aEid, uint16_t &aRloc16)
@@ -235,6 +279,7 @@ otError AddressResolver::SendAddressQuery(const Ip6::Address &aEid)
Coap::Header header; Coap::Header header;
ThreadTargetTlv targetTlv; ThreadTargetTlv targetTlv;
Ip6::MessageInfo messageInfo; Ip6::MessageInfo messageInfo;
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
header.Init(OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_POST); header.Init(OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_POST);
header.AppendUriPathOptions(OT_URI_PATH_ADDRESS_QUERY); header.AppendUriPathOptions(OT_URI_PATH_ADDRESS_QUERY);
@@ -254,7 +299,9 @@ otError AddressResolver::SendAddressQuery(const Ip6::Address &aEid)
SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo)); SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo));
otLogInfoArp(GetInstance(), "Sent address query"); otLogInfoArp(GetInstance(), "Sending address query for %s", aEid.ToString(stringBuffer, sizeof(stringBuffer)));
OT_UNUSED_VARIABLE(stringBuffer);
exit: exit:
@@ -288,13 +335,11 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message &
ThreadRloc16Tlv rloc16Tlv; ThreadRloc16Tlv rloc16Tlv;
ThreadLastTransactionTimeTlv lastTransactionTimeTlv; ThreadLastTransactionTimeTlv lastTransactionTimeTlv;
uint32_t lastTransactionTime; uint32_t lastTransactionTime;
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
VerifyOrExit(aHeader.GetType() == OT_COAP_TYPE_CONFIRMABLE && VerifyOrExit(aHeader.GetType() == OT_COAP_TYPE_CONFIRMABLE &&
aHeader.GetCode() == OT_COAP_CODE_POST); aHeader.GetCode() == OT_COAP_CODE_POST);
otLogInfoArp(GetInstance(), "Received address notification from %04x",
HostSwap16(aMessageInfo.GetPeerAddr().mFields.m16[7]));
SuccessOrExit(ThreadTlv::GetTlv(aMessage, ThreadTlv::kTarget, sizeof(targetTlv), targetTlv)); SuccessOrExit(ThreadTlv::GetTlv(aMessage, ThreadTlv::kTarget, sizeof(targetTlv), targetTlv));
VerifyOrExit(targetTlv.IsValid()); VerifyOrExit(targetTlv.IsValid());
@@ -313,6 +358,10 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message &
lastTransactionTime = lastTransactionTimeTlv.GetTime(); lastTransactionTime = lastTransactionTimeTlv.GetTime();
} }
otLogInfoArp(GetInstance(), "Received address notification from 0x%04x for %s to 0x%04x",
HostSwap16(aMessageInfo.GetPeerAddr().mFields.m16[7]),
targetTlv.GetTarget()->ToString(stringBuffer, sizeof(stringBuffer)), rloc16Tlv.GetRloc16());
for (int i = 0; i < kCacheEntries; i++) for (int i = 0; i < kCacheEntries; i++)
{ {
if (mCache[i].mTarget != *targetTlv.GetTarget()) if (mCache[i].mTarget != *targetTlv.GetTarget())
@@ -349,9 +398,12 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message &
mCache[i].mState = Cache::kStateCached; mCache[i].mState = Cache::kStateCached;
MarkCacheEntryAsUsed(mCache[i]); MarkCacheEntryAsUsed(mCache[i]);
otLogInfoArp(GetInstance(), "Cache entry updated: %s, 0x%04x, lastTrans:%d", stringBuffer,
rloc16Tlv.GetRloc16(), lastTransactionTime);
if (netif.GetCoap().SendEmptyAck(aHeader, aMessageInfo) == OT_ERROR_NONE) if (netif.GetCoap().SendEmptyAck(aHeader, aMessageInfo) == OT_ERROR_NONE)
{ {
otLogInfoArp(GetInstance(), "Sent address notification acknowledgment"); otLogInfoArp(GetInstance(), "Sending address notification acknowledgment");
} }
netif.GetMeshForwarder().HandleResolved(*targetTlv.GetTarget(), OT_ERROR_NONE); netif.GetMeshForwarder().HandleResolved(*targetTlv.GetTarget(), OT_ERROR_NONE);
@@ -359,6 +411,8 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message &
} }
} }
OT_UNUSED_VARIABLE(stringBuffer);
exit: exit:
return; return;
} }
@@ -371,6 +425,7 @@ otError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, const
Message *message; Message *message;
Coap::Header header; Coap::Header header;
Ip6::MessageInfo messageInfo; Ip6::MessageInfo messageInfo;
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
header.Init(aDestination == NULL ? OT_COAP_TYPE_NON_CONFIRMABLE : OT_COAP_TYPE_CONFIRMABLE, header.Init(aDestination == NULL ? OT_COAP_TYPE_NON_CONFIRMABLE : OT_COAP_TYPE_CONFIRMABLE,
OT_COAP_CODE_POST); OT_COAP_CODE_POST);
@@ -398,7 +453,10 @@ otError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, const
SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo)); SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo));
otLogInfoArp(GetInstance(), "Sent address error"); otLogInfoArp(GetInstance(), "Sending address error for target %s",
aTarget.GetTarget()->ToString(stringBuffer, sizeof(stringBuffer)));
OT_UNUSED_VARIABLE(stringBuffer);
exit: exit:
@@ -418,8 +476,7 @@ void AddressResolver::HandleAddressError(void *aContext, otCoapHeader *aHeader,
*static_cast<const Ip6::MessageInfo *>(aMessageInfo)); *static_cast<const Ip6::MessageInfo *>(aMessageInfo));
} }
void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessage, void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
const Ip6::MessageInfo &aMessageInfo)
{ {
ThreadNetif &netif = GetNetif(); ThreadNetif &netif = GetNetif();
otError error = OT_ERROR_NONE; otError error = OT_ERROR_NONE;
@@ -518,12 +575,11 @@ void AddressResolver::HandleAddressQuery(Coap::Header &aHeader, Message &aMessag
ThreadLastTransactionTimeTlv lastTransactionTimeTlv; ThreadLastTransactionTimeTlv lastTransactionTimeTlv;
Child *children; Child *children;
uint8_t numChildren; uint8_t numChildren;
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
VerifyOrExit(aHeader.GetType() == OT_COAP_TYPE_NON_CONFIRMABLE && VerifyOrExit(aHeader.GetType() == OT_COAP_TYPE_NON_CONFIRMABLE &&
aHeader.GetCode() == OT_COAP_CODE_POST); aHeader.GetCode() == OT_COAP_CODE_POST);
otLogInfoArp(GetInstance(), "Received address query from %04x", HostSwap16(aMessageInfo.GetPeerAddr().mFields.m16[7]));
SuccessOrExit(ThreadTlv::GetTlv(aMessage, ThreadTlv::kTarget, sizeof(targetTlv), targetTlv)); SuccessOrExit(ThreadTlv::GetTlv(aMessage, ThreadTlv::kTarget, sizeof(targetTlv), targetTlv));
VerifyOrExit(targetTlv.IsValid()); VerifyOrExit(targetTlv.IsValid());
@@ -531,6 +587,10 @@ void AddressResolver::HandleAddressQuery(Coap::Header &aHeader, Message &aMessag
lastTransactionTimeTlv.Init(); lastTransactionTimeTlv.Init();
otLogInfoArp(GetInstance(), "Received address query from 0x%04x for target %s",
HostSwap16(aMessageInfo.GetPeerAddr().mFields.m16[7]),
targetTlv.GetTarget()->ToString(stringBuffer, sizeof(stringBuffer)));
if (netif.IsUnicastAddress(*targetTlv.GetTarget())) if (netif.IsUnicastAddress(*targetTlv.GetTarget()))
{ {
mlIidTlv.SetIid(netif.GetMle().GetMeshLocal64().GetIid()); mlIidTlv.SetIid(netif.GetMle().GetMeshLocal64().GetIid());
@@ -563,6 +623,8 @@ void AddressResolver::HandleAddressQuery(Coap::Header &aHeader, Message &aMessag
} }
} }
OT_UNUSED_VARIABLE(stringBuffer);
exit: exit:
return; return;
} }
@@ -578,6 +640,7 @@ void AddressResolver::SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv
Coap::Header header; Coap::Header header;
ThreadRloc16Tlv rloc16Tlv; ThreadRloc16Tlv rloc16Tlv;
Ip6::MessageInfo messageInfo; Ip6::MessageInfo messageInfo;
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
header.Init(OT_COAP_TYPE_CONFIRMABLE, OT_COAP_CODE_POST); header.Init(OT_COAP_TYPE_CONFIRMABLE, OT_COAP_CODE_POST);
header.AppendUriPathOptions(OT_URI_PATH_ADDRESS_NOTIFY); header.AppendUriPathOptions(OT_URI_PATH_ADDRESS_NOTIFY);
@@ -603,7 +666,10 @@ void AddressResolver::SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv
SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo)); SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo));
otLogInfoArp(GetInstance(), "Sent address notification"); otLogInfoArp(GetInstance(), "Sending address notification for target %s",
aTargetTlv.GetTarget()->ToString(stringBuffer, sizeof(stringBuffer)));
OT_UNUSED_VARIABLE(stringBuffer);
exit: exit:
@@ -618,9 +684,10 @@ void AddressResolver::HandleTimer(Timer &aTimer)
GetOwner(aTimer).HandleTimer(); GetOwner(aTimer).HandleTimer();
} }
void AddressResolver::HandleTimer() void AddressResolver::HandleTimer(void)
{ {
bool continueTimer = false; bool continueTimer = false;
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
for (int i = 0; i < kCacheEntries; i++) for (int i = 0; i < kCacheEntries; i++)
{ {
@@ -649,6 +716,9 @@ void AddressResolver::HandleTimer()
mCache[i].mRetryTimeout = kAddressQueryMaxRetryDelay; mCache[i].mRetryTimeout = kAddressQueryMaxRetryDelay;
} }
otLogInfoArp(GetInstance(), "Timed out waiting for address notification for %s, retry: %d",
mCache[i].mTarget.ToString(stringBuffer, sizeof(stringBuffer)), mCache[i].mRetryTimeout);
GetNetif().GetMeshForwarder().HandleResolved(mCache[i].mTarget, OT_ERROR_DROP); GetNetif().GetMeshForwarder().HandleResolved(mCache[i].mTarget, OT_ERROR_DROP);
} }
} }
@@ -662,6 +732,8 @@ void AddressResolver::HandleTimer()
{ {
mTimer.Start(kStateUpdatePeriod); mTimer.Start(kStateUpdatePeriod);
} }
OT_UNUSED_VARIABLE(stringBuffer);
} }
void AddressResolver::HandleIcmpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo, void AddressResolver::HandleIcmpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo,
@@ -688,7 +760,7 @@ void AddressResolver::HandleIcmpReceive(Message &aMessage, const Ip6::MessageInf
if (mCache[i].mState != Cache::kStateInvalid && if (mCache[i].mState != Cache::kStateInvalid &&
memcmp(&mCache[i].mTarget, &ip6Header.GetDestination(), sizeof(mCache[i].mTarget)) == 0) memcmp(&mCache[i].mTarget, &ip6Header.GetDestination(), sizeof(mCache[i].mTarget)) == 0)
{ {
InvalidateCacheEntry(mCache[i]); InvalidateCacheEntry(mCache[i], kReasonReceivedIcmpDstUnreachNoRoute);
break; break;
} }
} }
+10 -1
View File
@@ -150,9 +150,18 @@ private:
State mState; State mState;
}; };
enum InvalidationReason
{
kReasonRemovingRouterId,
kReasonReceivedIcmpDstUnreachNoRoute,
kReasonEvictingForNewEntry,
};
static const char *ConvertInvalidationReasonToString(InvalidationReason aReason);
Cache *NewCacheEntry(void); Cache *NewCacheEntry(void);
void MarkCacheEntryAsUsed(Cache &aEntry); void MarkCacheEntryAsUsed(Cache &aEntry);
void InvalidateCacheEntry(Cache &aEntry); void InvalidateCacheEntry(Cache &aEntry, InvalidationReason aReason);
otError SendAddressQuery(const Ip6::Address &aEid); otError SendAddressQuery(const Ip6::Address &aEid);
otError SendAddressError(const ThreadTargetTlv &aTarget, const ThreadMeshLocalEidTlv &aEid, otError SendAddressError(const ThreadTargetTlv &aTarget, const ThreadMeshLocalEidTlv &aEid,