ncp: Fix for fetching whitelist. (#382)

Fetching the whitelist previously returned unused whitelist slots
instead of omitting them. It also makes sure that we return
an RSSI value of `0x7F` (127) when the fixed-RSSI feature is
not being used.
This commit is contained in:
Robert Quattlebaum
2016-08-15 17:15:15 -07:00
committed by Jonathan Hui
parent 5a70ddac77
commit 743ce89aed
2 changed files with 43 additions and 33 deletions
+42 -32
View File
@@ -596,7 +596,7 @@ void NcpBase::HandleReceive(const uint8_t *buf, uint16_t bufLength)
errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR); errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR);
} }
if (errorCode == kThreadError_NoBufs) if (errorCode == kThreadError_NoBufs)
{ {
// If we cannot send a response due to buffer space not being // If we cannot send a response due to buffer space not being
// available, we remember the TID of command so to send an // available, we remember the TID of command so to send an
@@ -1898,7 +1898,15 @@ ThreadError NcpBase::GetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_pro
break; break;
} }
SuccessOrExit(errorCode = OutboundFrameFeedPacked("T(Ecb).", &entry.mExtAddress, entry.mRssi, entry.mValid)); if (entry.mValid)
{
if (!entry.mFixedRssi)
{
entry.mRssi = RSSI_OVERRIDE_DISABLED;
}
SuccessOrExit(errorCode = OutboundFrameFeedPacked("T(Ec).", entry.mExtAddress.m8, entry.mRssi));
}
} }
SuccessOrExit(errorCode = OutboundFrameSend()); SuccessOrExit(errorCode = OutboundFrameSend());
@@ -2941,41 +2949,41 @@ ThreadError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_pro
&& (value_len > 0) && (value_len > 0)
) )
{ {
otExtAddress ext_addr; otExtAddress *ext_addr = NULL;
int8_t rssi = RSSI_OVERRIDE_DISABLED; int8_t rssi = RSSI_OVERRIDE_DISABLED;
parsedLength = spinel_datatype_unpack( parsedLength = spinel_datatype_unpack(
value_ptr, value_ptr,
value_len, value_len,
"T(E).", "T(Ec).",
&ext_addr &ext_addr,
&rssi
); );
if (parsedLength <= 0)
{
rssi = RSSI_OVERRIDE_DISABLED;
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"T(E).",
&ext_addr
);
}
if (parsedLength <= 0) if (parsedLength <= 0)
{ {
errorCode = kThreadError_Parse; errorCode = kThreadError_Parse;
break; break;
} }
// Check for an RSSI
if (parsedLength > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
{
spinel_datatype_unpack(
value_ptr,
value_len,
"T(Ec).",
NULL,
&rssi
);
}
if (rssi == RSSI_OVERRIDE_DISABLED) if (rssi == RSSI_OVERRIDE_DISABLED)
{ {
errorCode = otAddMacWhitelist(ext_addr.m8); errorCode = otAddMacWhitelist(ext_addr->m8);
} }
else else
{ {
errorCode = otAddMacWhitelistRssi(ext_addr.m8, rssi); errorCode = otAddMacWhitelistRssi(ext_addr->m8, rssi);
} }
value_ptr += parsedLength; value_ptr += parsedLength;
@@ -3424,37 +3432,39 @@ ThreadError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_
{ {
ThreadError errorCode = kThreadError_None; ThreadError errorCode = kThreadError_None;
spinel_ssize_t parsedLength; spinel_ssize_t parsedLength;
otExtAddress ext_addr; otExtAddress *ext_addr = NULL;
int8_t rssi = RSSI_OVERRIDE_DISABLED; int8_t rssi = RSSI_OVERRIDE_DISABLED;
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"E",
&ext_addr
);
// Check for an RSSI if (value_len > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
if (parsedLength > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
{ {
spinel_datatype_unpack( parsedLength = spinel_datatype_unpack(
value_ptr, value_ptr,
value_len, value_len,
"Ec", "Ec",
NULL, &ext_addr,
&rssi &rssi
); );
} }
else
{
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"E",
&ext_addr
);
}
if (parsedLength > 0) if (parsedLength > 0)
{ {
if (rssi == RSSI_OVERRIDE_DISABLED) if (rssi == RSSI_OVERRIDE_DISABLED)
{ {
errorCode = otAddMacWhitelist(ext_addr.m8); errorCode = otAddMacWhitelist(ext_addr->m8);
} }
else else
{ {
errorCode = otAddMacWhitelistRssi(ext_addr.m8, rssi); errorCode = otAddMacWhitelistRssi(ext_addr->m8, rssi);
} }
if (errorCode == kThreadError_None) if (errorCode == kThreadError_None)
+1 -1
View File
@@ -323,7 +323,7 @@ typedef enum
* Structure Parameters: * Structure Parameters:
* *
* * `E`: EUI64 address of node * * `E`: EUI64 address of node
* * `c`: Optional fixed RSSI. -127 means not set. * * `c`: Optional fixed RSSI. 127 means not set.
*/ */
SPINEL_PROP_MAC_WHITELIST = SPINEL_PROP_MAC_EXT__BEGIN + 0, SPINEL_PROP_MAC_WHITELIST = SPINEL_PROP_MAC_EXT__BEGIN + 0,