spinel-cli: Add router timing commands. (#705)

Adds support for routerselectionjitter, routerdowngradethreshold, and masterkey to fixe the slew of ncp-sim failures from recent thread-cert test updates.  Also added missing otInstance parameter to the new APIs..

Added otInstance to new APIs.
This commit is contained in:
Martin Turon
2016-09-27 18:19:47 -07:00
committed by Jonathan Hui
parent 383d0783b2
commit 625e4adde4
10 changed files with 194 additions and 20 deletions
-2
View File
@@ -66,5 +66,3 @@ matrix:
- env: BUILD_TARGET="posix-ncp" VERBOSE=1
compiler: gcc
os: linux
allow_failures:
- env: BUILD_TARGET="posix-ncp" VERBOSE=1
@@ -172,3 +172,14 @@ Default value is `false`.
Allow the HOST to indicate whether or not the router role is enabled.
If current role is a router, setting this property to `false` starts
a re-attach process as an end-device.
### PROP 5384: PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD
* Type: Read-Write
* Packed-Encoding: `C`
### PROP 5385: PROP_THREAD_ROUTER_SELECTION_JITTER
* Type: Read-Write
* Packed-Encoding: `C`
Specifies the self imposed random delay in seconds a REED waits before
registering to become an Active Router.
+4 -4
View File
@@ -1543,7 +1543,7 @@ void otPlatformReset(otInstance *aInstance);
*
* @sa otSetRouterDowngradeThreshold
*/
uint8_t otGetRouterDowngradeThreshold(void);
uint8_t otGetRouterDowngradeThreshold(otInstance *aInstance);
/**
* Set the ROUTER_DOWNGRADE_THRESHOLD parameter used in the Leader role.
@@ -1552,7 +1552,7 @@ uint8_t otGetRouterDowngradeThreshold(void);
*
* @sa otGetRouterDowngradeThreshold
*/
void otSetRouterDowngradeThreshold(uint8_t aThreshold);
void otSetRouterDowngradeThreshold(otInstance *aInstance, uint8_t aThreshold);
/**
* Get the ROUTER_SELECTION_JITTER parameter used in the REED/Router role.
@@ -1561,7 +1561,7 @@ void otSetRouterDowngradeThreshold(uint8_t aThreshold);
*
* @sa otSetRouterSelectionJitter
*/
uint8_t otGetRouterSelectionJitter(void);
uint8_t otGetRouterSelectionJitter(otInstance *aInstance);
/**
* Set the ROUTER_SELECTION_JITTER parameter used in the REED/Router role.
@@ -1570,7 +1570,7 @@ uint8_t otGetRouterSelectionJitter(void);
*
* @sa otGetRouterSelectionJitter
*/
void otSetRouterSelectionJitter(uint8_t aRouterJitter);
void otSetRouterSelectionJitter(otInstance *aInstance, uint8_t aRouterJitter);
/**
* @}
+4 -4
View File
@@ -1743,12 +1743,12 @@ void Interpreter::ProcessRouterDowngradeThreshold(int argc, char *argv[])
if (argc == 0)
{
sServer->OutputFormat("%d\r\n", otGetRouterDowngradeThreshold());
sServer->OutputFormat("%d\r\n", otGetRouterDowngradeThreshold(mInstance));
}
else
{
SuccessOrExit(error = ParseLong(argv[0], value));
otSetRouterDowngradeThreshold(static_cast<uint8_t>(value));
otSetRouterDowngradeThreshold(mInstance, static_cast<uint8_t>(value));
}
exit:
@@ -1794,12 +1794,12 @@ void Interpreter::ProcessRouterSelectionJitter(int argc, char *argv[])
if (argc == 0)
{
sServer->OutputFormat("%d\r\n", otGetRouterSelectionJitter());
sServer->OutputFormat("%d\r\n", otGetRouterSelectionJitter(mInstance));
}
else
{
SuccessOrExit(error = ParseLong(argv[0], value));
otSetRouterSelectionJitter(static_cast<uint8_t>(value));
otSetRouterSelectionJitter(mInstance, static_cast<uint8_t>(value));
}
exit:
+4 -4
View File
@@ -684,22 +684,22 @@ void otPlatformReset(otInstance *aInstance)
otPlatReset(aInstance);
}
uint8_t otGetRouterDowngradeThreshold(void)
uint8_t otGetRouterDowngradeThreshold(otInstance *)
{
return sThreadNetif->GetMle().GetRouterDowngradeThreshold();
}
void otSetRouterDowngradeThreshold(uint8_t aThreshold)
void otSetRouterDowngradeThreshold(otInstance *, uint8_t aThreshold)
{
sThreadNetif->GetMle().SetRouterDowngradeThreshold(aThreshold);
}
uint8_t otGetRouterSelectionJitter(void)
uint8_t otGetRouterSelectionJitter(otInstance *)
{
return sThreadNetif->GetMle().GetRouterSelectionJitter();
}
void otSetRouterSelectionJitter(uint8_t aRouterJitter)
void otSetRouterSelectionJitter(otInstance *, uint8_t aRouterJitter)
{
sThreadNetif->GetMle().SetRouterSelectionJitter(aRouterJitter);
}
+80
View File
@@ -134,10 +134,12 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] =
{ SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::GetPropertyHandler_THREAD_CHILD_TIMEOUT },
{ SPINEL_PROP_THREAD_RLOC16, &NcpBase::GetPropertyHandler_THREAD_RLOC16 },
{ SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD },
{ SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, &NcpBase::GetPropertyHandler_THREAD_ROUTER_DOWNGRADE_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_NET_REQUIRE_JOIN_EXISTING, &NcpBase::GetPropertyHandler_NET_REQUIRE_JOIN_EXISTING },
{ SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER, &NcpBase::GetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER },
{ SPINEL_PROP_IPV6_ML_PREFIX, &NcpBase::GetPropertyHandler_IPV6_ML_PREFIX },
{ SPINEL_PROP_IPV6_ML_ADDR, &NcpBase::GetPropertyHandler_IPV6_ML_ADDR },
@@ -227,8 +229,10 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] =
{ SPINEL_PROP_THREAD_MODE, &NcpBase::SetPropertyHandler_THREAD_MODE },
{ SPINEL_PROP_THREAD_CHILD_TIMEOUT, &NcpBase::SetPropertyHandler_THREAD_CHILD_TIMEOUT },
{ SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD, &NcpBase::SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD },
{ SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD, &NcpBase::SetPropertyHandler_THREAD_ROUTER_DOWNGRADE_THRESHOLD },
{ SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY, &NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY },
{ SPINEL_PROP_NET_REQUIRE_JOIN_EXISTING, &NcpBase::SetPropertyHandler_NET_REQUIRE_JOIN_EXISTING },
{ SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER, &NcpBase::SetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER },
#if OPENTHREAD_ENABLE_DIAG
{ SPINEL_PROP_NEST_STREAM_MFG, &NcpBase::SetPropertyHandler_NEST_STREAM_MFG },
@@ -2560,6 +2564,28 @@ ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t
);
}
ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_DOWNGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key)
{
return SendPropertyUpdate(
header,
SPINEL_CMD_PROP_VALUE_IS,
key,
SPINEL_DATATYPE_UINT8_S,
otGetRouterDowngradeThreshold(mInstance)
);
}
ThreadError NcpBase::GetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER(uint8_t header, spinel_prop_key_t key)
{
return SendPropertyUpdate(
header,
SPINEL_CMD_PROP_VALUE_IS,
key,
SPINEL_DATATYPE_UINT8_S,
otGetRouterSelectionJitter(mInstance)
);
}
ThreadError NcpBase::GetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key)
{
return SendPropertyUpdate(
@@ -3893,6 +3919,60 @@ ThreadError NcpBase::SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t
return errorCode;
}
ThreadError NcpBase::SetPropertyHandler_THREAD_ROUTER_DOWNGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
{
uint8_t i = 0;
spinel_ssize_t parsedLength;
ThreadError errorCode = kThreadError_None;
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
SPINEL_DATATYPE_UINT8_S,
&i
);
if (parsedLength > 0)
{
otSetRouterDowngradeThreshold(mInstance, i);
errorCode = HandleCommandPropertyGet(header, key);
}
else
{
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
}
return errorCode;
}
ThreadError NcpBase::SetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
{
uint8_t i = 0;
spinel_ssize_t parsedLength;
ThreadError errorCode = kThreadError_None;
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
SPINEL_DATATYPE_UINT8_S,
&i
);
if (parsedLength > 0)
{
otSetRouterSelectionJitter(mInstance, i);
errorCode = HandleCommandPropertyGet(header, key);
}
else
{
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
}
return errorCode;
}
ThreadError NcpBase::SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len)
{
uint32_t i = 0;
+4
View File
@@ -334,6 +334,8 @@ private:
ThreadError GetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_RLOC16(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_ROUTER_DOWNGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key);
ThreadError GetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER(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);
@@ -391,6 +393,8 @@ private:
ThreadError SetPropertyHandler_THREAD_MODE(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
ThreadError SetPropertyHandler_THREAD_CHILD_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
ThreadError SetPropertyHandler_THREAD_ROUTER_UPGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
ThreadError SetPropertyHandler_THREAD_ROUTER_DOWNGRADE_THRESHOLD(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
ThreadError SetPropertyHandler_THREAD_ROUTER_SELECTION_JITTER(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
ThreadError SetPropertyHandler_THREAD_CONTEXT_REUSE_DELAY(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
ThreadError SetPropertyHandler_THREAD_NETWORK_ID_TIMEOUT(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len);
+8
View File
@@ -1140,6 +1140,14 @@ spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
ret = "PROP_THREAD_ROUTER_UPGRADE_THRESHOLD";
break;
case SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD:
ret = "PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD";
break;
case SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER:
ret = "PROP_THREAD_ROUTER_SELECTION_JITTER";
break;
case SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY:
ret = "PROP_THREAD_CONTEXT_REUSE_DELAY";
break;
+12
View File
@@ -508,6 +508,18 @@ typedef enum
SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED
= SPINEL_PROP_THREAD_EXT__BEGIN + 7,
/// Thread Router Downgrade Threshold
/** Format: `C`
*/
SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD
= SPINEL_PROP_THREAD_EXT__BEGIN + 8,
/// Thread Router Selection Jitter
/** Format: `C`
*/
SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER
= SPINEL_PROP_THREAD_EXT__BEGIN + 9,
SPINEL_PROP_THREAD_EXT__END = 0x1600,
SPINEL_PROP_IPV6__BEGIN = 0x60,
+67 -6
View File
@@ -88,6 +88,7 @@ import shlex
import base64
import textwrap
import ipaddress
import binascii
import logging
import logging.config
@@ -281,6 +282,9 @@ SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY = SPINEL_PROP_THREAD_EXT__BEGIN + 3 #< [L
SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT = SPINEL_PROP_THREAD_EXT__BEGIN + 4 #< [b]
SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS = SPINEL_PROP_THREAD_EXT__BEGIN + 5 #< [A(b)]
SPINEL_PROP_THREAD_RLOC16_DEBUG_PASSTHRU = SPINEL_PROP_THREAD_EXT__BEGIN + 6 #< [b]
SPINEL_PROP_THREAD_ROUTER_ROLE_ENABLED = SPINEL_PROP_THREAD_EXT__BEGIN + 7 #< [b]
SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD = SPINEL_PROP_THREAD_EXT__BEGIN + 8 #< [C]
SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER = SPINEL_PROP_THREAD_EXT__BEGIN + 9 #< [C]
SPINEL_PROP_THREAD_EXT__END = 0x1600,
@@ -515,6 +519,8 @@ def hexify_bytes(data): return str(map(hexify_chr,data))
def hexify_str(s,delim=':'):
return delim.join(x.encode('hex') for x in s)
def pack_bytes(packet): return pack("%dB" % len(packet), *packet)
def asciify_int(i): return "%c" % (i)
def hex_to_bytes(s):
@@ -932,7 +938,7 @@ class SpinelPropertyHandler(SpinelCodec):
prefixes = []
slaacPrefixSet = set()
while (len(pay) >= 22):
(structlen) = unpack('>H', pay[:2])
(structlen) = unpack('<H', pay[:2])
pay = pay[2:]
prefix = Prefix(*unpack('16sBBBB', pay[:20]))
if (prefix.flags & kThreadPrefixSlaacFlag):
@@ -992,6 +998,12 @@ class SpinelPropertyHandler(SpinelCodec):
def THREAD_ROUTER_UPGRADE_THRESHOLD(self, payload):
return self.parse_C(payload)
def THREAD_ROUTER_DOWNGRADE_THRESHOLD(self, payload):
return self.parse_C(payload)
def THREAD_ROUTER_SELECTION_JITTER(self, payload):
return self.parse_C(payload)
def THREAD_CONTEXT_REUSE_DELAY(self, payload):
return self.parse_L(payload)
@@ -1148,6 +1160,8 @@ SPINEL_PROP_DISPATCH = {
SPINEL_PROP_THREAD_CHILD_TIMEOUT: wpanPropHandler.THREAD_CHILD_TIMEOUT,
SPINEL_PROP_THREAD_RLOC16: wpanPropHandler.THREAD_RLOC16,
SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD: wpanPropHandler.THREAD_ROUTER_UPGRADE_THRESHOLD,
SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD: wpanPropHandler.THREAD_ROUTER_DOWNGRADE_THRESHOLD,
SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER: wpanPropHandler.THREAD_ROUTER_SELECTION_JITTER,
SPINEL_PROP_THREAD_CONTEXT_REUSE_DELAY: wpanPropHandler.THREAD_CONTEXT_REUSE_DELAY,
SPINEL_PROP_THREAD_NETWORK_ID_TIMEOUT: wpanPropHandler.THREAD_NETWORK_ID_TIMEOUT,
SPINEL_PROP_THREAD_ACTIVE_ROUTER_IDS: wpanPropHandler.THREAD_ACTIVE_ROUTER_IDS,
@@ -1599,7 +1613,9 @@ class SpinelCliCmd(Cmd, SpinelCodec):
'rloc16',
'route',
'router',
'routerselectionjitter',
'routerupgradethreshold',
'routerdowngradethreshold',
'scan',
'state',
'thread',
@@ -1669,15 +1685,20 @@ class SpinelCliCmd(Cmd, SpinelCodec):
def prop_get_or_set_value(self, prop_id, line, format='B'):
""" Helper to get or set a property value based on line arguments. """
if line:
value = self.prop_set_value(prop_id, self.prep_line(line), format)
arg = self.prep_line(line, format)
if format=='D': format = str(len(arg))+'s'
value = self.prop_set_value(prop_id, arg, format)
else:
value = self.prop_get_value(prop_id)
return value
def prep_line(self, line):
def prep_line(self, line, format='B'):
""" Convert a line argument to proper type """
if line != None:
line = int(line)
if format == 'D':
line = hex_to_bytes(line)
else:
line = int(line)
return line
def prop_get(self, prop_id, format='B'):
@@ -1697,7 +1718,8 @@ class SpinelCliCmd(Cmd, SpinelCodec):
def prop_set(self, prop_id, line, format='B'):
""" Helper to set a propery and output Done or Error. """
arg = self.prep_line(line)
arg = self.prep_line(line, format)
if format=='D': format = str(len(arg))+'s'
value = self.prop_set_value(prop_id, arg, format)
if (value == None):
@@ -2257,7 +2279,7 @@ class SpinelCliCmd(Cmd, SpinelCodec):
> masterkey 00112233445566778899aabbccddeeff
Done
"""
pass
self.handle_property(line, SPINEL_PROP_NET_MASTER_KEY, 'D')
def do_mode(self, line):
"""
@@ -2639,6 +2661,26 @@ class SpinelCliCmd(Cmd, SpinelCodec):
"""
pass
def do_routerselectionjitter(self, line):
"""
routerselectionjitter
Get the ROUTER_SELECTION_JITTER value.
> routerselectionjitter
120
Done
routerselectionjitter <threshold>
Set the ROUTER_SELECTION_JITTER value.
> routerselectionjitter 120
Done
"""
self.handle_property(line, SPINEL_PROP_THREAD_ROUTER_SELECTION_JITTER)
def do_routerupgradethreshold(self, line):
"""
routerupgradethreshold
@@ -2658,6 +2700,25 @@ class SpinelCliCmd(Cmd, SpinelCodec):
"""
self.handle_property(line, SPINEL_PROP_THREAD_ROUTER_UPGRADE_THRESHOLD)
def do_routerdowngradethreshold(self, line):
"""
routerdowngradethreshold
Get the ROUTER_DOWNGRADE_THRESHOLD value.
> routerdowngradethreshold
16
Done
routerdowngradethreshold <threshold>
Set the ROUTER_DOWNGRADE_THRESHOLD value.
> routerdowngradethreshold 16
Done
"""
self.handle_property(line, SPINEL_PROP_THREAD_ROUTER_DOWNGRADE_THRESHOLD)
def do_scan(self, line):
"""
scan [channel]