ncp: Add the ability to get PROP_THREAD_ON_MESH_NETS (#491)

This property will also be updated dynamically.
This commit is contained in:
Robert Quattlebaum
2016-08-30 11:52:43 -07:00
committed by Jonathan Hui
parent f4ea00c5f3
commit 0066be4c18
3 changed files with 127 additions and 5 deletions
+116 -1
View File
@@ -132,6 +132,7 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] =
{ SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD },
{ SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY },
{ SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT, &NcpBase::GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT },
{ SPINEL_PROP_THREAD_ON_MESH_NETS, &NcpBase::NcpBase::GetPropertyHandler_THREAD_ON_MESH_NETS },
{ SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::GetPropertyHandler_IPV6_ML_PREFIX },
{ SPINEL_PROP_IPV6_ML_ADDR, &NcpBase::GetPropertyHandler_IPV6_ML_ADDR },
@@ -354,6 +355,45 @@ static spinel_status_t ResetReasonToSpinelStatus(otPlatResetReason reason)
return ret;
}
static uint8_t BorderRouterConfigToFlagByte(const otBorderRouterConfig &config)
{
uint8_t flags(0);
if (config.mPreferred)
{
flags |= SPINEL_NET_FLAG_PREFERRED;
}
if (config.mSlaac)
{
flags |= SPINEL_NET_FLAG_SLAAC;
}
if (config.mDhcp)
{
flags |= SPINEL_NET_FLAG_DHCP;
}
if (config.mDefaultRoute)
{
flags |= SPINEL_NET_FLAG_DEFAULT_ROUTE;
}
if (config.mConfigure)
{
flags |= SPINEL_NET_FLAG_CONFIGURE;
}
if (config.mOnMesh)
{
flags |= SPINEL_NET_FLAG_ON_MESH;
}
flags |= (config.mPreference << SPINEL_NET_FLAG_PREFERENCE_OFFSET);
return flags;
}
// ----------------------------------------------------------------------------
// MARK: Class Boilerplate
// ----------------------------------------------------------------------------
@@ -614,7 +654,10 @@ void NcpBase::UpdateChangedProps(void)
}
else if ((mChangedFlags & OT_THREAD_NETDATA_UPDATED) != 0)
{
// TODO: Handle the netdata changed event.
SuccessOrExit(HandleCommandPropertyGet(
SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0,
SPINEL_PROP_THREAD_ON_MESH_NETS
));
mChangedFlags &= ~static_cast<uint32_t>(OT_THREAD_NETDATA_UPDATED);
}
@@ -1715,6 +1758,78 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_ALLOW_LOCAL_NET_DATA_CHANGE(uint8
);
}
ThreadError NcpBase::GetPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_prop_key_t key)
{
ThreadError errorCode = kThreadError_None;
otBorderRouterConfig border_router_config;
uint8_t flags;
SuccessOrExit(errorCode = OutboundFrameBegin());
SuccessOrExit(errorCode = OutboundFrameFeedPacked("Cii", header, SPINEL_CMD_PROP_VALUE_IS, key));
// Fill from non-local network data first
for (otNetworkDataIterator iter = OT_NETWORK_DATA_ITERATOR_INIT ;;)
{
errorCode = otGetNextOnMeshPrefix(false, &iter, &border_router_config);
if (errorCode != kThreadError_None)
{
break;
}
flags = BorderRouterConfigToFlagByte(border_router_config);
SuccessOrExit(errorCode = OutboundFrameFeedPacked(
"T("
SPINEL_DATATYPE_IPv6ADDR_S // IPv6 Prefix
SPINEL_DATATYPE_UINT8_S // Prefix Length (in bits)
SPINEL_DATATYPE_BOOL_S // isStable
SPINEL_DATATYPE_UINT8_S // Flags
SPINEL_DATATYPE_BOOL_S // isLocal
").",
&border_router_config.mPrefix,
64,
border_router_config.mStable,
flags,
true
));
}
// Fill from local network data last
for (otNetworkDataIterator iter = OT_NETWORK_DATA_ITERATOR_INIT ;;)
{
errorCode = otGetNextOnMeshPrefix(true, &iter, &border_router_config);
if (errorCode != kThreadError_None)
{
break;
}
flags = BorderRouterConfigToFlagByte(border_router_config);
SuccessOrExit(errorCode = OutboundFrameFeedPacked(
"T("
SPINEL_DATATYPE_IPv6ADDR_S // IPv6 Prefix
SPINEL_DATATYPE_UINT8_S // Prefix Length (in bits)
SPINEL_DATATYPE_BOOL_S // isStable
SPINEL_DATATYPE_UINT8_S // Flags
SPINEL_DATATYPE_BOOL_S // isLocal
").",
&border_router_config.mPrefix,
64,
border_router_config.mStable,
flags,
false
));
}
SuccessOrExit(errorCode = OutboundFrameSend());
exit:
return errorCode;
}
ThreadError NcpBase::GetPropertyHandler_IPV6_ML_PREFIX(uint8_t header, spinel_prop_key_t key)
{
+2
View File
@@ -305,6 +305,8 @@ private:
ThreadError GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_prop_key_t key);
ThreadError SetPropertyHandler_POWER_STATE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,
uint16_t value_len);
+9 -4
View File
@@ -149,10 +149,15 @@ typedef enum
} spinel_power_state_t;
enum {
SPINEL_NET_FLAG_CONFIGURE = 0x04,
SPINEL_NET_FLAG_DHCP = 0x08,
SPINEL_NET_FLAG_SLAAC_VALID = 0x10,
SPINEL_NET_FLAG_SLAAC_PREFERRED = 0x20,
SPINEL_NET_FLAG_ON_MESH = (1 << 0),
SPINEL_NET_FLAG_DEFAULT_ROUTE = (1 << 1),
SPINEL_NET_FLAG_CONFIGURE = (1 << 2),
SPINEL_NET_FLAG_DHCP = (1 << 3),
SPINEL_NET_FLAG_SLAAC = (1 << 4),
SPINEL_NET_FLAG_PREFERRED = (1 << 5),
SPINEL_NET_FLAG_PREFERENCE_OFFSET = 6,
SPINEL_NET_FLAG_PREFERENCE_MASK = (3 << SPINEL_NET_FLAG_PREFERENCE_OFFSET),
};
enum