From 13a40c8bcf18e54363d5c5ee01881ca0b9376264 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 15 Jun 2018 10:25:36 -0700 Subject: [PATCH] [ncp] adding new spinel property to get EID address cache table (#2788) This commit adds a new spinel property `THREAD_ADDRESS_CACHE_TABLE` to get the Thread EID IPv6 Address cache table. --- doc/spinel-protocol-src/spinel-tech-thread.md | 14 +++++++++++ src/ncp/ncp_base.cpp | 1 + src/ncp/ncp_base.hpp | 1 + src/ncp/ncp_base_ftd.cpp | 25 +++++++++++++++++++ src/ncp/spinel.c | 4 +++ src/ncp/spinel.h | 15 +++++++++++ 6 files changed, 60 insertions(+) diff --git a/doc/spinel-protocol-src/spinel-tech-thread.md b/doc/spinel-protocol-src/spinel-tech-thread.md index 6d7e596fa..ba74d6fb1 100644 --- a/doc/spinel-protocol-src/spinel-tech-thread.md +++ b/doc/spinel-protocol-src/spinel-tech-thread.md @@ -562,3 +562,17 @@ Data per item is: * `S`: Message error rate (0 -> 0%, 0xffff -> 100%) * `c`: Average RSSI (in dBm) * `c`: Last RSSI (in dBm) + + +### PROP 5411: SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE (#prop-thread-address-cache-table) + +* Type: Read-Only +* Packing-Encoding: `A(t(6SC))` + +This property provides Thread EID IPv6 address cache table. + +Data per item is: + +* `6` : Target IPv6 address +* `S` : RLOC16 of target +* `C` : Age (order of use, 0 indicates most recently used entry) diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 4b10adb20..8d76a933d 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -232,6 +232,7 @@ const NcpBase::PropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] = NCP_GET_PROP_HANDLER_ENTRY(THREAD_NETWORK_ID_TIMEOUT), NCP_GET_PROP_HANDLER_ENTRY(THREAD_ROUTER_SELECTION_JITTER), NCP_GET_PROP_HANDLER_ENTRY(THREAD_PREFERRED_ROUTER_ID), + NCP_GET_PROP_HANDLER_ENTRY(THREAD_ADDRESS_CACHE_TABLE), #if OPENTHREAD_ENABLE_COMMISSIONER NCP_GET_PROP_HANDLER_ENTRY(THREAD_COMMISSIONER_ENABLED), #endif diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index a07d0eb13..b38037c18 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -670,6 +670,7 @@ protected: NCP_SET_PROP_HANDLER(THREAD_PENDING_DATASET); NCP_SET_PROP_HANDLER(THREAD_MGMT_ACTIVE_DATASET); NCP_SET_PROP_HANDLER(THREAD_MGMT_PENDING_DATASET); + NCP_GET_PROP_HANDLER(THREAD_ADDRESS_CACHE_TABLE); #if OPENTHREAD_ENABLE_CHANNEL_MANAGER NCP_GET_PROP_HANDLER(CHANNEL_MANAGER_NEW_CHANNEL); NCP_SET_PROP_HANDLER(CHANNEL_MANAGER_NEW_CHANNEL); diff --git a/src/ncp/ncp_base_ftd.cpp b/src/ncp/ncp_base_ftd.cpp index 2de6453ce..1a2ecc246 100644 --- a/src/ncp/ncp_base_ftd.cpp +++ b/src/ncp/ncp_base_ftd.cpp @@ -528,6 +528,31 @@ exit: return error; } +otError NcpBase::GetPropertyHandler_THREAD_ADDRESS_CACHE_TABLE(void) +{ + otError error = OT_ERROR_NONE; + otEidCacheEntry entry; + + for (uint8_t index = 0; ; index++) + { + SuccessOrExit(otThreadGetEidCacheEntry(mInstance, index, &entry)); + + if (!entry.mValid) + { + continue; + } + + SuccessOrExit(error = mEncoder.OpenStruct()); + SuccessOrExit(error = mEncoder.WriteIp6Address(entry.mTarget)); + SuccessOrExit(error = mEncoder.WriteUint16(entry.mRloc16)); + SuccessOrExit(error = mEncoder.WriteUint8(entry.mAge)); + SuccessOrExit(error = mEncoder.CloseStruct()); + } + +exit: + return error; +} + #if OPENTHREAD_ENABLE_TMF_PROXY otError NcpBase::GetPropertyHandler_THREAD_TMF_PROXY_ENABLED(void) { diff --git a/src/ncp/spinel.c b/src/ncp/spinel.c index dedfae07e..43ba7186a 100644 --- a/src/ncp/spinel.c +++ b/src/ncp/spinel.c @@ -1545,6 +1545,10 @@ spinel_prop_key_to_cstr(spinel_prop_key_t prop_key) ret = "PROP_THREAD_NEIGHBOR_TABLE_ERROR_RATES"; break; + case SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE: + ret = "PROP_THREAD_ADDRESS_CACHE_TABLE"; + break; + case SPINEL_PROP_IPV6_LL_ADDR: ret = "PROP_IPV6_LL_ADDR"; break; diff --git a/src/ncp/spinel.h b/src/ncp/spinel.h index 423aa9588..ce6969627 100644 --- a/src/ncp/spinel.h +++ b/src/ncp/spinel.h @@ -1416,6 +1416,21 @@ typedef enum SPINEL_PROP_THREAD_NEIGHBOR_TABLE_ERROR_RATES = SPINEL_PROP_THREAD_EXT__BEGIN + 34, + /// EID (Endpoint Identifier) IPv6 Address Cache Table + /** Format `A(t(6SC))` + * + * This property provides Thread EID address cache table. + * + * Data per item is: + * + * `6` : Target IPv6 address + * `S` : RLOC16 of target + * `C` : Age (order of use, 0 indicates most recently used entry) + * + */ + SPINEL_PROP_THREAD_ADDRESS_CACHE_TABLE + = SPINEL_PROP_THREAD_EXT__BEGIN + 35, + SPINEL_PROP_THREAD_EXT__END = 0x1600, SPINEL_PROP_IPV6__BEGIN = 0x60,