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);
}
if (errorCode == kThreadError_NoBufs)
if (errorCode == kThreadError_NoBufs)
{
// If we cannot send a response due to buffer space not being
// 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;
}
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());
@@ -2941,41 +2949,41 @@ ThreadError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_pro
&& (value_len > 0)
)
{
otExtAddress ext_addr;
otExtAddress *ext_addr = NULL;
int8_t rssi = RSSI_OVERRIDE_DISABLED;
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"T(E).",
&ext_addr
"T(Ec).",
&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)
{
errorCode = kThreadError_Parse;
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)
{
errorCode = otAddMacWhitelist(ext_addr.m8);
errorCode = otAddMacWhitelist(ext_addr->m8);
}
else
{
errorCode = otAddMacWhitelistRssi(ext_addr.m8, rssi);
errorCode = otAddMacWhitelistRssi(ext_addr->m8, rssi);
}
value_ptr += parsedLength;
@@ -3424,37 +3432,39 @@ ThreadError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t header, spinel_
{
ThreadError errorCode = kThreadError_None;
spinel_ssize_t parsedLength;
otExtAddress ext_addr;
otExtAddress *ext_addr = NULL;
int8_t rssi = RSSI_OVERRIDE_DISABLED;
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"E",
&ext_addr
);
// Check for an RSSI
if (parsedLength > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
if (value_len > static_cast<spinel_ssize_t>(sizeof(ext_addr)))
{
spinel_datatype_unpack(
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"Ec",
NULL,
&ext_addr,
&rssi
);
}
else
{
parsedLength = spinel_datatype_unpack(
value_ptr,
value_len,
"E",
&ext_addr
);
}
if (parsedLength > 0)
{
if (rssi == RSSI_OVERRIDE_DISABLED)
{
errorCode = otAddMacWhitelist(ext_addr.m8);
errorCode = otAddMacWhitelist(ext_addr->m8);
}
else
{
errorCode = otAddMacWhitelistRssi(ext_addr.m8, rssi);
errorCode = otAddMacWhitelistRssi(ext_addr->m8, rssi);
}
if (errorCode == kThreadError_None)
+1 -1
View File
@@ -323,7 +323,7 @@ typedef enum
* Structure Parameters:
*
* * `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,