[mac filter] add rssfilter support and integrate whitelist/blacklist to AddressFilter (#1967)

* [mac filter] add rssfilter support and integrate whitelist/blacklist
- provide RssIn filter function to fix the received signal strength for test purpose.
- provide Address filter function which integrates whitelist and blacklist, save (~300B) RAM.
- update cli and spinel-cli to reflect new otLinkFilterX() APIs.
- keep whitelist/blacklist spinel properties the same as before while implemented with new otLinkFilterX() APIs.
- THCI: add setOutBoundLinkQuality() API for DEV-1530
- THCI: update Allow/Block relative APIs
- update some test scripts due to new OT_ERROR_ALEADY when adding duplicate address to whitelist

* update for comments

* add MAC_FIXED_RSS spinel property

* rebase and apply new OutboundFrameBegin(aHeader)

* update OpenThread.py
This commit is contained in:
rongli
2017-07-11 22:38:49 -07:00
committed by Jonathan Hui
parent 16d76db592
commit 502c6ca5d6
50 changed files with 2411 additions and 2106 deletions
+1 -1
View File
@@ -61,7 +61,7 @@ set -x
--enable-jam-detection \
--enable-joiner \
--enable-legacy \
--enable-mac-whitelist \
--enable-mac-filter \
--enable-mtd-network-diagnostic \
--enable-raw-link-api \
--enable-tmf-proxy || die
+1
View File
@@ -44,6 +44,7 @@ AM_DISTCHECK_CONFIGURE_FLAGS = \
--enable-dns-client \
--enable-application-coap \
--enable-border-router \
--enable-mac-filter \
$(NULL)
SUBDIRS = \
+15 -15
View File
@@ -742,36 +742,36 @@ AM_CONDITIONAL([OPENTHREAD_ENABLE_JAM_DETECTION], [test "${enable_jam_detection}
AC_DEFINE_UNQUOTED([OPENTHREAD_ENABLE_JAM_DETECTION],[${OPENTHREAD_ENABLE_JAM_DETECTION}],[Define to 1 if you want to use jam detection feature])
#
# MAC Whitelist and Blacklist
# MAC Filter (include AddressFilter and RssInFilter)
#
AC_ARG_ENABLE(mac_whitelist,
[AS_HELP_STRING([--enable-mac-whitelist],[Enable MAC whitelist/blacklist support @<:@default=yes@:>@.])],
AC_ARG_ENABLE(mac_filter,
[AS_HELP_STRING([--enable-mac-filter],[Enable MAC filter support @<:@default=yes@:>@.])],
[
case "${enableval}" in
no|yes)
enable_mac_whitelist=${enableval}
enable_mac_filter=${enableval}
;;
*)
AC_MSG_ERROR([Invalid value ${enable_mac_whitelist} for --enable-mac-whitelist])
AC_MSG_ERROR([Invalid value ${enable_mac_filter} for --enable-mac-filter])
;;
esac
],
[enable_mac_whitelist=yes])
[enable_mac_filter=no])
if test "$enable_mac_whitelist" = "yes"; then
OPENTHREAD_ENABLE_MAC_WHITELIST=1
if test "$enable_mac_filter" = "yes"; then
OPENTHREAD_ENABLE_MAC_FILTER=1
else
OPENTHREAD_ENABLE_MAC_WHITELIST=0
OPENTHREAD_ENABLE_MAC_FILTER=0
fi
AC_MSG_CHECKING([whether to enable mac whitelist])
AC_MSG_RESULT(${enable_mac_whitelist})
AC_SUBST(OPENTHREAD_ENABLE_MAC_WHITELIST)
AM_CONDITIONAL([OPENTHREAD_ENABLE_MAC_WHITELIST], [test "${enable_mac_whitelist}" = "yes"])
AC_DEFINE_UNQUOTED([OPENTHREAD_ENABLE_MAC_WHITELIST],[${OPENTHREAD_ENABLE_MAC_WHITELIST}],[Define to 1 if you want to use MAC whitelist/blacklist feature])
AC_MSG_CHECKING([whether to enable mac filter])
AC_MSG_RESULT(${enable_mac_filter})
AC_SUBST(OPENTHREAD_ENABLE_MAC_FILTER)
AM_CONDITIONAL([OPENTHREAD_ENABLE_MAC_FILTER], [test "${enable_mac_filter}" = "yes"])
AC_DEFINE_UNQUOTED([OPENTHREAD_ENABLE_MAC_FILTER],[${OPENTHREAD_ENABLE_MAC_FILTER}],[Define to 1 if you want to use MAC filter feature])
#
# Diagnostics Library
@@ -1429,7 +1429,7 @@ AC_MSG_NOTICE([
OpenThread Joiner support : ${enable_joiner}
OpenThread DTLS support : ${enable_dtls}
OpenThread Jam Detection support : ${enable_jam_detection}
OpenThread MAC Whitelist support : ${enable_mac_whitelist}
OpenThread MAC Filter support : ${enable_mac_filter}
OpenThread Diagnostics support : ${enable_diag}
OpenThread Child Supervision support : ${enable_child_supervision}
OpenThread Legacy network support : ${enable_legacy}
+2 -8
View File
@@ -90,9 +90,8 @@
<ClCompile Include="..\..\src\core\crypto\pbkdf2_cmac.cpp" />
<ClCompile Include="..\..\src\core\crypto\sha256.cpp" />
<ClCompile Include="..\..\src\core\mac\mac.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_blacklist.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_filter.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_frame.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_whitelist.cpp" />
<ClCompile Include="..\..\src\core\meshcop\announce_begin_client.cpp" />
<ClCompile Include="..\..\src\core\meshcop\commissioner.cpp" />
<ClCompile Include="..\..\src\core\meshcop\dataset.cpp" />
@@ -168,13 +167,8 @@
<ClInclude Include="..\..\src\core\crypto\pbkdf2_cmac.h" />
<ClInclude Include="..\..\src\core\crypto\sha256.hpp" />
<ClInclude Include="..\..\src\core\mac\mac.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_blacklist.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_blacklist_impl.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_blacklist_stub.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_filter.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_frame.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_whitelist.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_whitelist_impl.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_whitelist_stub.hpp" />
<ClInclude Include="..\..\src\core\meshcop\announce_begin_client.hpp" />
<ClInclude Include="..\..\src\core\meshcop\commissioner.hpp" />
<ClInclude Include="..\..\src\core\meshcop\dataset.hpp" />
@@ -153,10 +153,10 @@
<ClCompile Include="..\..\src\core\mac\mac.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\mac\mac_frame.cpp">
<ClCompile Include="..\..\src\core\mac\mac_filter.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\mac\mac_whitelist.cpp">
<ClCompile Include="..\..\src\core\mac\mac_frame.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\net\dhcp6_client.cpp">
@@ -240,9 +240,6 @@
<ClCompile Include="..\..\src\core\net\udp6.cpp">
<Filter>Source Files\net</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\mac\mac_blacklist.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\meshcop\commissioner.cpp">
<Filter>Source Files\meshcop</Filter>
</ClCompile>
@@ -380,18 +377,12 @@
<ClInclude Include="..\..\src\core\mac\mac.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_filter.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_frame.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_whitelist.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_whitelist_impl.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_whitelist_stub.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\net\dhcp6.hpp">
<Filter>Header Files\net</Filter>
</ClInclude>
@@ -494,15 +485,6 @@
<ClInclude Include="..\..\src\core\thread\topology.hpp">
<Filter>Header Files\thread</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_blacklist.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_blacklist_impl.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_blacklist_stub.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\meshcop\announce_begin_client.hpp">
<Filter>Header Files\meshcop</Filter>
</ClInclude>
+2 -8
View File
@@ -98,9 +98,8 @@
<ClCompile Include="..\..\src\core\crypto\pbkdf2_cmac.cpp" />
<ClCompile Include="..\..\src\core\crypto\sha256.cpp" />
<ClCompile Include="..\..\src\core\mac\mac.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_blacklist.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_filter.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_frame.cpp" />
<ClCompile Include="..\..\src\core\mac\mac_whitelist.cpp" />
<ClCompile Include="..\..\src\core\meshcop\commissioner.cpp" />
<ClCompile Include="..\..\src\core\meshcop\dataset.cpp" />
<ClCompile Include="..\..\src\core\meshcop\dataset_local.cpp" />
@@ -200,13 +199,8 @@
<ClInclude Include="..\..\src\core\crypto\pbkdf2_cmac.h" />
<ClInclude Include="..\..\src\core\crypto\sha256.hpp" />
<ClInclude Include="..\..\src\core\mac\mac.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_blacklist.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_blacklist_impl.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_blacklist_stub.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_filter.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_frame.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_whitelist.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_whitelist_impl.hpp" />
<ClInclude Include="..\..\src\core\mac\mac_whitelist_stub.hpp" />
<ClInclude Include="..\..\src\core\meshcop\announce_begin_client.hpp" />
<ClInclude Include="..\..\src\core\meshcop\commissioner.hpp" />
<ClInclude Include="..\..\src\core\meshcop\dataset.hpp" />
@@ -153,10 +153,10 @@
<ClCompile Include="..\..\src\core\mac\mac.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\mac\mac_frame.cpp">
<ClCompile Include="..\..\src\core\mac\mac_filter.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\mac\mac_whitelist.cpp">
<ClCompile Include="..\..\src\core\mac\mac_frame.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\net\dhcp6_client.cpp">
@@ -243,9 +243,6 @@
<ClCompile Include="..\..\src\core\net\udp6.cpp">
<Filter>Source Files\net</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\mac\mac_blacklist.cpp">
<Filter>Source Files\mac</Filter>
</ClCompile>
<ClCompile Include="..\..\src\core\meshcop\commissioner.cpp">
<Filter>Source Files\meshcop</Filter>
</ClCompile>
@@ -380,18 +377,12 @@
<ClInclude Include="..\..\src\core\mac\mac.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_filter.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_frame.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_whitelist.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_whitelist_impl.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_whitelist_stub.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\net\dhcp6.hpp">
<Filter>Header Files\net</Filter>
</ClInclude>
@@ -497,15 +488,6 @@
<ClInclude Include="..\..\src\core\thread\topology.hpp">
<Filter>Header Files\thread</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_blacklist.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_blacklist_impl.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\mac\mac_blacklist_stub.hpp">
<Filter>Header Files\mac</Filter>
</ClInclude>
<ClInclude Include="..\..\src\core\meshcop\commissioner.hpp">
<Filter>Header Files\meshcop</Filter>
</ClInclude>
+1 -1
View File
@@ -107,7 +107,7 @@ configure_OPTIONS = \
--enable-jam-detection \
--enable-joiner \
--enable-legacy \
--enable-mac-whitelist \
--enable-mac-filter \
--enable-mtd-network-diagnostic \
--enable-raw-link-api \
--enable-tmf-proxy \
+2 -2
View File
@@ -82,8 +82,8 @@ ifeq ($(LEGACY),1)
configure_OPTIONS += --enable-legacy
endif
ifeq ($(MAC_WHITELIST),1)
configure_OPTIONS += --enable-mac-whitelist
ifeq ($(MAC_FILTER),1)
configure_OPTIONS += --enable-mac-filter
endif
ifeq ($(MTD_NETDIAG),1)
+31 -13
View File
@@ -350,11 +350,12 @@ typedef enum _OTLWF_NOTIF_TYPE
// GUID - InterfaceGuid
// otExtAddress - aExtAddr
#define IOCTL_OTLWF_OT_MAC_WHITELIST_ENTRY \
#define IOCTL_OTLWF_OT_NEXT_MAC_WHITELIST \
OTLWF_CTL_CODE(137, METHOD_BUFFERED, FILE_READ_DATA)
// GUID - InterfaceGuid
// uint8_t - aIndex (input)
// otMacWhitelistEntry - aEntry (output)
// uint8_t - aIterator (input)
// uint8_t - aNewIterator (output)
// otMacFilterEntry - aEntry (output)
#define IOCTL_OTLWF_OT_CLEAR_MAC_WHITELIST \
OTLWF_CTL_CODE(138, METHOD_BUFFERED, FILE_WRITE_DATA)
@@ -445,11 +446,12 @@ typedef enum _OTLWF_NOTIF_TYPE
// GUID - InterfaceGuid
// otExtAddress - aExtAddr
#define IOCTL_OTLWF_OT_MAC_BLACKLIST_ENTRY \
#define IOCTL_OTLWF_OT_NEXT_MAC_BLACKLIST \
OTLWF_CTL_CODE(155, METHOD_BUFFERED, FILE_READ_DATA)
// GUID - InterfaceGuid
// uint8_t - aIndex (input)
// otMacBlacklistEntry - aEntry (output)
// uint8_t - aIterator (input)
// uint8_t - aNewIterator (output)
// otMacFilterEntry - aEntry (output)
#define IOCTL_OTLWF_OT_CLEAR_MAC_BLACKLIST \
OTLWF_CTL_CODE(156, METHOD_BUFFERED, FILE_WRITE_DATA)
@@ -478,12 +480,6 @@ typedef enum _OTLWF_NOTIF_TYPE
// GUID - InterfaceGuid
// uint32_t - aPartitionId
#define IOCTL_OTLWF_OT_ASSIGN_LINK_QUALITY \
OTLWF_CTL_CODE(161, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
// GUID - InterfaceGuid
// otExtAddress - aExtAddr (input)
// uint8_t - aLinkQuality (input or output)
#define IOCTL_OTLWF_OT_PLATFORM_RESET \
OTLWF_CTL_CODE(162, METHOD_BUFFERED, FILE_WRITE_DATA)
// GUID - InterfaceGuid
@@ -699,8 +695,30 @@ typedef struct otCommissionConfig
// GUID - InterfaceGuid
// int8_t - aParentPriority
#define IOCTL_OTLWF_OT_ADD_MAC_FIXED_RSS \
OTLWF_CTL_CODE(197, METHOD_BUFFERED, FILE_WRITE_DATA)
// GUID - InterfaceGuid
// otExtAddress - aExtAddr (optional)
// int8_t - aRssi
#define IOCTL_OTLWF_OT_REMOVE_MAC_FIXED_RSS \
OTLWF_CTL_CODE(198, METHOD_BUFFERED, FILE_WRITE_DATA)
// GUID - InterfaceGuid
// otExtAddress - aExtAddr (optional)
#define IOCTL_OTLWF_OT_NEXT_MAC_FIXED_RSS \
OTLWF_CTL_CODE(199, METHOD_BUFFERED, FILE_READ_DATA)
// GUID - InterfaceGuid
// uint8_t - aIterator (input)
// uint8_t - aNewIterator (output)
// otMacFilterEntry - aEntry (output)
#define IOCTL_OTLWF_OT_CLEAR_MAC_FIXED_RSS \
OTLWF_CTL_CODE(200, METHOD_BUFFERED, FILE_WRITE_DATA)
// GUID - InterfaceGuid
// OpenThread function IOCTL codes
#define MIN_OTLWF_IOCTL_FUNC_CODE 100
#define MAX_OTLWF_IOCTL_FUNC_CODE 196
#define MAX_OTLWF_IOCTL_FUNC_CODE 200
#endif //__OTLWFIOCTL_H__
+218 -139
View File
@@ -2731,90 +2731,6 @@ otThreadReleaseRouterId(
return DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_RELEASE_ROUTER_ID, aRouterId));
}
OTAPI
otError
OTCALL
otLinkAddWhitelist(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr
)
{
if (aInstance == nullptr) return OT_ERROR_INVALID_ARGS;
return DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_ADD_MAC_WHITELIST, (const otExtAddress*)aExtAddr));
}
OTAPI
otError
OTCALL
otLinkAddWhitelistRssi(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr,
int8_t aRssi
)
{
if (aInstance == nullptr) return OT_ERROR_INVALID_ARGS;
PackedBuffer3<GUID,otExtAddress,int8_t> Buffer(aInstance->InterfaceGuid, *(otExtAddress*)aExtAddr, aRssi);
return DwordToThreadError(SendIOCTL(aInstance->ApiHandle, IOCTL_OTLWF_OT_ADD_MAC_WHITELIST, &Buffer, sizeof(Buffer), nullptr, 0));
}
OTAPI
void
OTCALL
otLinkRemoveWhitelist(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr
)
{
if (aInstance) (void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_REMOVE_MAC_WHITELIST, (const otExtAddress*)aExtAddr);
}
OTAPI
otError
OTCALL
otLinkGetWhitelistEntry(
_In_ otInstance *aInstance,
uint8_t aIndex,
_Out_ otMacWhitelistEntry *aEntry
)
{
if (aInstance == nullptr) return OT_ERROR_INVALID_ARGS;
return DwordToThreadError(QueryIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_WHITELIST_ENTRY, &aIndex, aEntry));
}
OTAPI
void
OTCALL
otLinkClearWhitelist(
_In_ otInstance *aInstance
)
{
if (aInstance) (void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_CLEAR_MAC_WHITELIST);
}
OTAPI
void
OTCALL
otLinkSetWhitelistEnabled(
_In_ otInstance *aInstance,
bool aEnabled
)
{
if (aInstance) (void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_WHITELIST_ENABLED, (BOOLEAN)aEnabled);
}
OTAPI
bool
OTCALL
otLinkIsWhitelistEnabled(
_In_ otInstance *aInstance
)
{
BOOLEAN Result = 0;
if (aInstance) (void)QueryIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_WHITELIST_ENABLED, &Result);
return Result != FALSE;
}
OTAPI
otError
OTCALL
@@ -2860,99 +2776,262 @@ otThreadBecomeLeader(
}
OTAPI
otError
otMacFilterAddressMode
OTCALL
otLinkAddBlacklist(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr
otLinkFilterGetAddressMode(
_In_ otInstance *aInstance
)
{
if (aInstance == nullptr) return OT_ERROR_INVALID_ARGS;
return DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_ADD_MAC_BLACKLIST, (const otExtAddress*)aExtAddr));
}
otMacFilterAddressMode mode = OT_MAC_FILTER_ADDRESS_MODE_DISABLED;
BOOLEAN enabled = 0;
OTAPI
void
OTCALL
otLinkRemoveBlacklist(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr
)
{
if (aInstance) (void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_REMOVE_MAC_BLACKLIST, (const otExtAddress*)aExtAddr);
if (aInstance)
{
(void)QueryIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_WHITELIST_ENABLED, &enabled);
if (enabled)
{
mode = OT_MAC_FILTER_ADDRESS_MODE_WHITELIST;
}
else
{
(void)QueryIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_BLACKLIST_ENABLED, &enabled);
if (enabled)
{
mode = OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST;
}
}
}
return mode;
}
OTAPI
otError
OTCALL
otLinkGetBlacklistEntry(
_In_ otInstance *aInstance,
uint8_t aIndex,
_Out_ otMacBlacklistEntry *aEntry
otLinkFilterSetAddressMode(
_In_ otInstance *aInstance,
otMacFilterAddressMode aMode
)
{
if (aInstance == nullptr) return OT_ERROR_INVALID_ARGS;
return DwordToThreadError(QueryIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_BLACKLIST_ENTRY, &aIndex, aEntry));
otError error = OT_ERROR_NONE;
if (aInstance == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
bool enabled = false;
if (aMode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST)
{
enabled = true;
error = DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_WHITELIST_ENABLED, (BOOLEAN)enabled));
}
else if (aMode == OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST)
{
enabled = true;
error = DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_BLACKLIST_ENABLED, (BOOLEAN)enabled));
}
else
{
error = DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_WHITELIST_ENABLED, (BOOLEAN)enabled));
}
}
return error;
}
OTAPI
void
otError
OTCALL
otLinkClearBlacklist(
otLinkFilterAddAddress(
_In_ otInstance *aInstance,
const otExtAddress *aExtAddr
)
{
otError error = OT_ERROR_NONE;
if (aInstance == nullptr || aExtAddr == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
// same effect to add an address to the address filter with IOCTL_OTLWF_OT_ADD_MAC_WHITELIST or
// IOCTL_OTLWF_OT_ADD_MAC_BLACKLIST.
error = DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_ADD_MAC_WHITELIST, aExtAddr));
}
return error;
}
OTAPI
otError
OTCALL
otLinkFilterRemoveAddress(
_In_ otInstance *aInstance,
const otExtAddress *aExtAddr
)
{
otError error = OT_ERROR_NONE;
if (aInstance == nullptr || aExtAddr == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
// same effect to remove an address from the address filter with IOCTL_OTLWF_OT_REMOVE_MAC_WHITELIST or
// IOCTL_OTLWF_OT_REMOVE_MAC_BLACKLIST.
error = DwordToThreadError(SetIOCTL(aInstance, IOCTL_OTLWF_OT_REMOVE_MAC_WHITELIST, aExtAddr));
}
return error;
}
OTAPI
void
OTCALL
otLinkFilterClearAddresses(
_In_ otInstance *aInstance
)
{
if (aInstance) (void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_CLEAR_MAC_BLACKLIST);
if (aInstance)
{
// same effect to clear the addresses from the address filter with IOCTL_OTLWF_OT_CLEAR_MAC_WHITELIST or
// IOCTL_OTLWF_OT_CLEAR_MAC_BLACKLIST.
(void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_CLEAR_MAC_WHITELIST);
}
}
OTAPI
void
otError
OTCALL
otLinkSetBlacklistEnabled(
otLinkFilterGetNextAddress(
_In_ otInstance *aInstance,
bool aEnabled
_Inout_ otMacFilterIterator *aIterator,
_Out_ otMacFilterEntry *aEntry
)
{
if (aInstance) (void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_BLACKLIST_ENABLED, (BOOLEAN)aEnabled);
otError error = OT_ERROR_NONE;
if (aInstance == nullptr || aIterator == nullptr|| aEntry == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
// same effect to get an in-use address filter entry with IOCTL_OTLWF_OT_NEXT_MAC_WHITELIST or
// IOCTL_OTLWF_OT_NEXT_MAC_BLACKLIST.
return DwordToThreadError(QueryIOCTL(aInstance, IOCTL_OTLWF_OT_NEXT_MAC_WHITELIST, aIterator, aEntry));
}
return OT_ERROR_NOT_FOUND;
}
OTAPI
otError
OTCALL
otLinkFilterAddRssIn(
_In_ otInstance *aInstance,
const otExtAddress *aExtAddr,
int8_t aRss
)
{
otError error = OT_ERROR_NONE;
if (aInstance == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
if (aExtAddr == nullptr)
{
PackedBuffer2<GUID,int8_t> Buffer(aInstance->InterfaceGuid, aRss);
error = DwordToThreadError(SendIOCTL(aInstance->ApiHandle, IOCTL_OTLWF_OT_ADD_MAC_FIXED_RSS,
&Buffer, sizeof(Buffer), nullptr, 0));
}
else
{
PackedBuffer3<GUID,otExtAddress,int8_t> Buffer(aInstance->InterfaceGuid, *aExtAddr, aRss);
error = DwordToThreadError(SendIOCTL(aInstance->ApiHandle, IOCTL_OTLWF_OT_ADD_MAC_FIXED_RSS,
&Buffer, sizeof(Buffer), nullptr, 0));
}
}
return error;
}
OTAPI
bool
otError
OTCALL
otLinkIsBlacklistEnabled(
otLinkFilterRemoveRssIn(
_In_ otInstance *aInstance,
const otExtAddress *aExtAddr
)
{
otError error = OT_ERROR_NONE;
if (aInstance == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
if (aExtAddr == nullptr)
{
error = DwordToThreadError(SendIOCTL(aInstance->ApiHandle, IOCTL_OTLWF_OT_REMOVE_MAC_FIXED_RSS,
nullptr, 0, nullptr, 0));
}
else
{
PackedBuffer2<GUID,otExtAddress> Buffer(aInstance->InterfaceGuid, *aExtAddr);
error = DwordToThreadError(SendIOCTL(aInstance->ApiHandle, IOCTL_OTLWF_OT_REMOVE_MAC_FIXED_RSS,
&Buffer, sizeof(Buffer), nullptr, 0));
}
}
return error;
}
OTAPI
void
OTCALL
otLinkFilterClearRssIn(
_In_ otInstance *aInstance
)
{
BOOLEAN Result = 0;
if (aInstance) (void)QueryIOCTL(aInstance, IOCTL_OTLWF_OT_MAC_BLACKLIST_ENABLED, &Result);
return Result != FALSE;
if (aInstance)
{
(void)SetIOCTL(aInstance, IOCTL_OTLWF_OT_CLEAR_MAC_FIXED_RSS);
}
}
OTAPI
otError
OTAPI
otError
OTCALL
otLinkGetAssignLinkQuality(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr,
_Out_ uint8_t *aLinkQuality
)
{
if (aInstance == nullptr) return OT_ERROR_INVALID_ARGS;
return DwordToThreadError(QueryIOCTL(aInstance, IOCTL_OTLWF_OT_ASSIGN_LINK_QUALITY, (otExtAddress*)aExtAddr, aLinkQuality));
}
OTAPI
void
OTCALL
otLinkSetAssignLinkQuality(
otLinkFilterGetNextRssIn(
_In_ otInstance *aInstance,
const uint8_t *aExtAddr,
uint8_t aLinkQuality
_Inout_ otMacFilterIterator *aIterator,
_Out_ otMacFilterEntry *aEntry
)
{
if (aInstance == nullptr) return;
PackedBuffer3<GUID,otExtAddress,uint8_t> Buffer(aInstance->InterfaceGuid, *(otExtAddress*)aExtAddr, aLinkQuality);
(void)SendIOCTL(aInstance->ApiHandle, IOCTL_OTLWF_OT_ASSIGN_LINK_QUALITY, &Buffer, sizeof(Buffer), nullptr, 0);
otError error = OT_ERROR_NONE;
if (aInstance == nullptr || aIterator == nullptr|| aEntry == nullptr)
{
error = OT_ERROR_INVALID_ARGS;
}
else
{
return DwordToThreadError(QueryIOCTL(aInstance, IOCTL_OTLWF_OT_NEXT_MAC_FIXED_RSS, aIterator, aEntry));
}
return OT_ERROR_NOT_FOUND;
}
OTAPI
+323 -81
View File
@@ -82,7 +82,7 @@ OTLWF_IOCTL_HANDLER IoCtls[] =
{ "IOCTL_OTLWF_OT_MAC_WHITELIST_ENABLED", REF_IOCTL_FUNC_WITH_TUN(otMacWhitelistEnabled) },
{ "IOCTL_OTLWF_OT_ADD_MAC_WHITELIST", REF_IOCTL_FUNC_WITH_TUN(otAddMacWhitelist) },
{ "IOCTL_OTLWF_OT_REMOVE_MAC_WHITELIST", REF_IOCTL_FUNC_WITH_TUN(otRemoveMacWhitelist) },
{ "IOCTL_OTLWF_OT_MAC_WHITELIST_ENTRY", REF_IOCTL_FUNC(otMacWhitelistEntry) },
{ "IOCTL_OTLWF_OT_NEXT_MAC_WHITELIST", REF_IOCTL_FUNC(otNextMacWhitelist) },
{ "IOCTL_OTLWF_OT_CLEAR_MAC_WHITELIST", REF_IOCTL_FUNC_WITH_TUN(otClearMacWhitelist) },
{ "IOCTL_OTLWF_OT_DEVICE_ROLE", REF_IOCTL_FUNC_WITH_TUN(otDeviceRole) },
{ "IOCTL_OTLWF_OT_CHILD_INFO_BY_ID", REF_IOCTL_FUNC(otChildInfoById) },
@@ -100,13 +100,12 @@ OTLWF_IOCTL_HANDLER IoCtls[] =
{ "IOCTL_OTLWF_OT_MAC_BLACKLIST_ENABLED", REF_IOCTL_FUNC(otMacBlacklistEnabled) },
{ "IOCTL_OTLWF_OT_ADD_MAC_BLACKLIST", REF_IOCTL_FUNC(otAddMacBlacklist) },
{ "IOCTL_OTLWF_OT_REMOVE_MAC_BLACKLIST", REF_IOCTL_FUNC(otRemoveMacBlacklist) },
{ "IOCTL_OTLWF_OT_MAC_BLACKLIST_ENTRY", REF_IOCTL_FUNC(otMacBlacklistEntry) },
{ "IOCTL_OTLWF_OT_NEXT_MAC_BLACKLIST", REF_IOCTL_FUNC(otNextMacBlacklist) },
{ "IOCTL_OTLWF_OT_CLEAR_MAC_BLACKLIST", REF_IOCTL_FUNC(otClearMacBlacklist) },
{ "IOCTL_OTLWF_OT_MAX_TRANSMIT_POWER", REF_IOCTL_FUNC(otMaxTransmitPower) },
{ "IOCTL_OTLWF_OT_NEXT_ON_MESH_PREFIX", REF_IOCTL_FUNC(otNextOnMeshPrefix) },
{ "IOCTL_OTLWF_OT_POLL_PERIOD", REF_IOCTL_FUNC(otPollPeriod) },
{ "IOCTL_OTLWF_OT_LOCAL_LEADER_PARTITION_ID", REF_IOCTL_FUNC(otLocalLeaderPartitionId) },
{ "IOCTL_OTLWF_OT_ASSIGN_LINK_QUALITY", REF_IOCTL_FUNC(otAssignLinkQuality) },
{ "IOCTL_OTLWF_OT_PLATFORM_RESET", REF_IOCTL_FUNC_WITH_TUN(otPlatformReset) },
{ "IOCTL_OTLWF_OT_PARENT_INFO", REF_IOCTL_FUNC_WITH_TUN(otParentInfo) },
{ "IOCTL_OTLWF_OT_SINGLETON", REF_IOCTL_FUNC(otSingleton) },
@@ -142,9 +141,14 @@ OTLWF_IOCTL_HANDLER IoCtls[] =
{ "IOCTL_OTLWF_OT_PREFERRED_ROUTER_ID", REF_IOCTL_FUNC(otThreadPreferredRouterId) },
{ "IOCTL_OTLWF_OT_PSKC", REF_IOCTL_FUNC_WITH_TUN(otPSKc) },
{ "IOCTL_OTLWF_OT_PARENT_PRIORITY", REF_IOCTL_FUNC(otParentPriority) },
{ "IOCTL_OTLWF_OT_ADD_MAC_FIXED_RSS", REF_IOCTL_FUNC_WITH_TUN(otAddMacFixedRss) },
{ "IOCTL_OTLWF_OT_REMOVE_MAC_FIXED_RSS", REF_IOCTL_FUNC_WITH_TUN(otRemoveMacFixedRss) },
{ "IOCTL_OTLWF_OT_NEXT_MAC_FIXED_RSS", REF_IOCTL_FUNC(otNextMacFixedRss) },
{ "IOCTL_OTLWF_OT_CLEAR_MAC_FIXED_RSS", REF_IOCTL_FUNC_WITH_TUN(otClearMacFixedRss) },
};
static_assert(ARRAYSIZE(IoCtls) == (MAX_OTLWF_IOCTL_FUNC_CODE - MIN_OTLWF_IOCTL_FUNC_CODE) + 1,
// intentionally -1 in the end due to that IOCTL_OTLWF_OT_ASSIGN_LINK_QUALITY (#161) is removed now.
static_assert(ARRAYSIZE(IoCtls) == (MAX_OTLWF_IOCTL_FUNC_CODE - MIN_OTLWF_IOCTL_FUNC_CODE) + 1 - 1,
"The IoCtl strings should be up to date with the actual IoCtl list.");
const char*
@@ -3440,13 +3444,15 @@ otLwfIoCtl_otMacWhitelistEnabled(
if (InBufferLength >= sizeof(BOOLEAN))
{
BOOLEAN aEnabled = *(BOOLEAN*)InBuffer;
otLinkSetWhitelistEnabled(pFilter->otCtx, aEnabled);
status = STATUS_SUCCESS;
otMacFilterAddressMode mode =
aEnabled ? OT_MAC_FILTER_ADDRESS_MODE_WHITELIST : OT_MAC_FILTER_ADDRESS_MODE_DISABLED;
status = ThreadErrorToNtstatus(otLinkFilterSetAddressMode(pFilter->otCtx, mode));
*OutBufferLength = 0;
}
else if (*OutBufferLength >= sizeof(BOOLEAN))
{
*(BOOLEAN*)OutBuffer = otLinkIsWhitelistEnabled(pFilter->otCtx) ? TRUE : FALSE;
otMacFilterAddressMode mode = otLinkFilterGetAddressMode(pFilter->otCtx);
*(BOOLEAN*)OutBuffer = (mode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST) ? TRUE : FALSE;
status = STATUS_SUCCESS;
*OutBufferLength = sizeof(BOOLEAN);
}
@@ -3536,25 +3542,29 @@ otLwfIoCtl_otAddMacWhitelist(
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
UNREFERENCED_PARAMETER(OutBuffer);
*OutBufferLength = 0;
int8_t aRss = OT_MAC_FILTER_FIXED_RSS_DISABLED;
if (InBufferLength >= sizeof(otExtAddress) + sizeof(int8_t))
{
int8_t aRssi = *(int8_t*)(InBuffer + sizeof(otExtAddress));
status = ThreadErrorToNtstatus(otLinkAddWhitelistRssi(pFilter->otCtx, (uint8_t*)InBuffer, aRssi));
aRss = *(int8_t*)(InBuffer + sizeof(otExtAddress));
}
else if (InBufferLength >= sizeof(otExtAddress))
otError error = otLinkFilterAddAddress(pFilter->otCtx, (otExtAddress *)InBuffer);
if ((error == OT_ERROR_NONE || error == OT_ERROR_ALREADY) &&
(aRss != OT_MAC_FILTER_FIXED_RSS_DISABLED))
{
status = ThreadErrorToNtstatus(otLinkAddWhitelist(pFilter->otCtx, (uint8_t*)InBuffer));
error = otLinkFilterAddRssIn(pFilter->otCtx, (otExtAddress *)InBuffer, aRss);
}
status = ThreadErrorToNtstatus(error);
return status;
}
#define RSSI_OVERRIDE_DISABLED 127 // Used for PROP_MAC_WHITELIST
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfTunIoCtl_otAddMacWhitelist(
@@ -3572,10 +3582,10 @@ otLwfTunIoCtl_otAddMacWhitelist(
if (InBufferLength >= sizeof(otExtAddress))
{
int8_t aRssi = RSSI_OVERRIDE_DISABLED;
int8_t aRss = OT_MAC_FILTER_FIXED_RSS_DISABLED;
if (InBufferLength >= sizeof(otExtAddress) + sizeof(int8_t))
{
aRssi = *(int8_t*)(InBuffer + sizeof(otExtAddress));
aRss = *(int8_t*)(InBuffer + sizeof(otExtAddress));
}
status =
@@ -3588,7 +3598,7 @@ otLwfTunIoCtl_otAddMacWhitelist(
sizeof(otExtAddress) + sizeof(int8_t),
"Ec",
(otExtAddress*)InBuffer,
&aRssi);
&aRss);
}
return status;
@@ -3613,8 +3623,8 @@ otLwfIoCtl_otRemoveMacWhitelist(
if (InBufferLength >= sizeof(otExtAddress))
{
otLinkRemoveWhitelist(pFilter->otCtx, (uint8_t*)InBuffer);
status = STATUS_SUCCESS;
status = ThreadErrorToNtstatus(otLinkFilterRemoveAddress(pFilter->otCtx,
(otExtAddress *)InBuffer));
}
return status;
@@ -3654,7 +3664,7 @@ otLwfTunIoCtl_otRemoveMacWhitelist(
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otMacWhitelistEntry(
otLwfIoCtl_otNextMacWhitelist(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
@@ -3667,15 +3677,25 @@ otLwfIoCtl_otMacWhitelistEntry(
NTSTATUS status = STATUS_INVALID_PARAMETER;
if (InBufferLength >= sizeof(uint8_t) &&
*OutBufferLength >= sizeof(otMacWhitelistEntry))
*OutBufferLength >= sizeof(uint8_t) + sizeof(otMacFilterEntry))
{
uint8_t aIterator = *(uint8_t*)(InBuffer);
otMacFilterEntry *aEntry = (otMacFilterEntry*)((PUCHAR)OutBuffer + sizeof(uint8_t));
status = ThreadErrorToNtstatus(
otLinkGetWhitelistEntry(
otLinkFilterGetNextAddress(
pFilter->otCtx,
*(uint8_t*)InBuffer,
(otMacWhitelistEntry*)OutBuffer)
&aIterator,
aEntry
)
);
*OutBufferLength = sizeof(otMacWhitelistEntry);
*OutBufferLength = sizeof(otMacFilterEntry) + sizeof(uint8_t);
if (status == STATUS_SUCCESS)
{
*(uint8_t*)OutBuffer = aIterator;
}
}
else
{
@@ -3704,7 +3724,7 @@ otLwfIoCtl_otClearMacWhitelist(
UNREFERENCED_PARAMETER(OutBuffer);
*OutBufferLength = 0;
otLinkClearWhitelist(pFilter->otCtx);
otLinkFilterClearAddresses(pFilter->otCtx);
return status;
}
@@ -4625,13 +4645,15 @@ otLwfIoCtl_otMacBlacklistEnabled(
if (InBufferLength >= sizeof(BOOLEAN))
{
BOOLEAN aEnabled = *(BOOLEAN*)InBuffer;
otLinkSetBlacklistEnabled(pFilter->otCtx, aEnabled);
status = STATUS_SUCCESS;
otMacFilterAddressMode mode =
aEnabled ? OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST : OT_MAC_FILTER_ADDRESS_MODE_DISABLED;
status = ThreadErrorToNtstatus(otLinkFilterSetAddressMode(pFilter->otCtx, mode));
*OutBufferLength = 0;
}
else if (*OutBufferLength >= sizeof(BOOLEAN))
{
*(BOOLEAN*)OutBuffer = otLinkIsBlacklistEnabled(pFilter->otCtx) ? TRUE : FALSE;
otMacFilterAddressMode mode = otLinkFilterGetAddressMode(pFilter->otCtx);
*(BOOLEAN*)OutBuffer = mode == (OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST) ? TRUE : FALSE;
status = STATUS_SUCCESS;
*OutBufferLength = sizeof(BOOLEAN);
}
@@ -4662,7 +4684,8 @@ otLwfIoCtl_otAddMacBlacklist(
if (InBufferLength >= sizeof(otExtAddress))
{
status = ThreadErrorToNtstatus(otLinkAddBlacklist(pFilter->otCtx, (uint8_t*)InBuffer));
status = ThreadErrorToNtstatus(otLinkFilterAddAddress(pFilter->otCtx,
(otExtAddress *)InBuffer));
}
return status;
@@ -4687,8 +4710,8 @@ otLwfIoCtl_otRemoveMacBlacklist(
if (InBufferLength >= sizeof(otExtAddress))
{
otLinkRemoveBlacklist(pFilter->otCtx, (uint8_t*)InBuffer);
status = STATUS_SUCCESS;
status = ThreadErrorToNtstatus(otLinkFilterRemoveAddress(pFilter->otCtx,
(otExtAddress *)InBuffer));
}
return status;
@@ -4696,7 +4719,7 @@ otLwfIoCtl_otRemoveMacBlacklist(
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otMacBlacklistEntry(
otLwfIoCtl_otNextMacBlacklist(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
@@ -4709,16 +4732,27 @@ otLwfIoCtl_otMacBlacklistEntry(
NTSTATUS status = STATUS_INVALID_PARAMETER;
if (InBufferLength >= sizeof(uint8_t) &&
*OutBufferLength >= sizeof(otMacBlacklistEntry))
*OutBufferLength >= sizeof(uint8_t) + sizeof(otMacFilterEntry))
{
uint8_t aIterator = *(uint8_t*)(InBuffer);
otMacFilterEntry *aEntry = (otMacFilterEntry*)((PUCHAR)OutBuffer + sizeof(uint8_t));
status = ThreadErrorToNtstatus(
otLinkGetBlacklistEntry(
otLinkFilterGetNextAddress(
pFilter->otCtx,
*(uint8_t*)InBuffer,
(otMacBlacklistEntry*)OutBuffer)
&aIterator,
aEntry
)
);
*OutBufferLength = sizeof(otMacBlacklistEntry);
*OutBufferLength = sizeof(otMacFilterEntry) + sizeof(uint8_t);
if (status == STATUS_SUCCESS)
{
*(uint8_t*)OutBuffer = aIterator;
}
}
else
{
*OutBufferLength = 0;
@@ -4746,7 +4780,7 @@ otLwfIoCtl_otClearMacBlacklist(
UNREFERENCED_PARAMETER(OutBuffer);
*OutBufferLength = 0;
otLinkClearBlacklist(pFilter->otCtx);
otLinkFilterClearAddresses(pFilter->otCtx);
return status;
}
@@ -4905,48 +4939,6 @@ otLwfIoCtl_otLocalLeaderPartitionId(
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otAssignLinkQuality(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_Out_writes_bytes_(*OutBufferLength)
PVOID OutBuffer,
_Inout_ PULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
if (InBufferLength >= sizeof(otExtAddress) + sizeof(uint8_t))
{
otLinkSetAssignLinkQuality(
pFilter->otCtx,
(uint8_t*)InBuffer,
*(uint8_t*)(InBuffer + sizeof(otExtAddress)));
status = STATUS_SUCCESS;
*OutBufferLength = 0;
}
else if (InBufferLength >= sizeof(otExtAddress) &&
*OutBufferLength >= sizeof(uint8_t))
{
status = ThreadErrorToNtstatus(
otLinkGetAssignLinkQuality(
pFilter->otCtx,
(uint8_t*)InBuffer,
(uint8_t*)OutBuffer)
);
*OutBufferLength = sizeof(uint32_t);
}
else
{
*OutBufferLength = 0;
}
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otPlatformReset(
@@ -6261,3 +6253,253 @@ otLwfIoCtl_otParentPriority(
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otAddMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_Out_writes_bytes_(*OutBufferLength)
PVOID OutBuffer,
_Inout_ PULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
UNREFERENCED_PARAMETER(OutBuffer);
*OutBufferLength = 0;
if (InBufferLength >= sizeof(otExtAddress) + sizeof(int8_t))
{
int8_t aRss = *(int8_t*)(InBuffer + sizeof(otExtAddress));
status = ThreadErrorToNtstatus(otLinkFilterAddRssIn(pFilter->otCtx,
(otExtAddress *)InBuffer, aRss));
}
else if (InBufferLength >= sizeof(int8_t))
{
status = ThreadErrorToNtstatus(otLinkFilterAddRssIn(pFilter->otCtx, NULL,
*(int8_t *)InBuffer));
}
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfTunIoCtl_otAddMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_ PIRP pIrp,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_In_ ULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
UNREFERENCED_PARAMETER(OutBufferLength);
if (InBufferLength >= sizeof(otExtAddress) + sizeof(int8_t))
{
int8_t aRss = OT_MAC_FILTER_FIXED_RSS_DISABLED;
aRss = *(int8_t*)(InBuffer + sizeof(otExtAddress));
status =
otLwfTunSendCommandForIrp(
pFilter,
pIrp,
NULL,
SPINEL_CMD_PROP_VALUE_INSERT,
SPINEL_PROP_MAC_FIXED_RSS,
sizeof(otExtAddress) + sizeof(int8_t),
"Ec",
(otExtAddress*)InBuffer,
&aRss);
}
else
{
status =
otLwfTunSendCommandForIrp(
pFilter,
pIrp,
NULL,
SPINEL_CMD_PROP_VALUE_INSERT,
SPINEL_PROP_MAC_FIXED_RSS,
sizeof(int8_t),
"c",
(int8_t*)InBuffer);
}
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otRemoveMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_Out_writes_bytes_(*OutBufferLength)
PVOID OutBuffer,
_Inout_ PULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
UNREFERENCED_PARAMETER(OutBuffer);
*OutBufferLength = 0;
if (InBufferLength >= sizeof(otExtAddress))
{
status = ThreadErrorToNtstatus(otLinkFilterRemoveRssIn(pFilter->otCtx, (otExtAddress *)InBuffer));
}
else
{
status = ThreadErrorToNtstatus(otLinkFilterRemoveRssIn(pFilter->otCtx, NULL));
}
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfTunIoCtl_otRemoveMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_ PIRP pIrp,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_In_ ULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
UNREFERENCED_PARAMETER(OutBufferLength);
if (InBufferLength >= sizeof(otExtAddress))
{
status =
otLwfTunSendCommandForIrp(
pFilter,
pIrp,
NULL,
SPINEL_CMD_PROP_VALUE_REMOVE,
SPINEL_PROP_MAC_FIXED_RSS,
sizeof(otExtAddress),
"E",
(otExtAddress*)InBuffer);
}
else
{
status =
otLwfTunSendCommandForIrp(
pFilter,
pIrp,
NULL,
SPINEL_CMD_PROP_VALUE_REMOVE,
SPINEL_PROP_MAC_FIXED_RSS,
0,
NULL);
}
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otClearMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_Out_writes_bytes_(*OutBufferLength)
PVOID OutBuffer,
_Inout_ PULONG OutBufferLength
)
{
NTSTATUS status = STATUS_SUCCESS;
UNREFERENCED_PARAMETER(InBuffer);
UNREFERENCED_PARAMETER(InBufferLength);
UNREFERENCED_PARAMETER(OutBuffer);
*OutBufferLength = 0;
otLinkFilterClearRssIn(pFilter->otCtx);
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfTunIoCtl_otClearMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_ PIRP pIrp,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_In_ ULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
UNREFERENCED_PARAMETER(InBuffer);
UNREFERENCED_PARAMETER(InBufferLength);
UNREFERENCED_PARAMETER(OutBufferLength);
status =
otLwfTunSendCommandForIrp(
pFilter,
pIrp,
NULL,
SPINEL_CMD_PROP_VALUE_SET,
SPINEL_PROP_MAC_FIXED_RSS,
0,
NULL);
return status;
}
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
otLwfIoCtl_otNextMacFixedRss(
_In_ PMS_FILTER pFilter,
_In_reads_bytes_(InBufferLength)
PUCHAR InBuffer,
_In_ ULONG InBufferLength,
_Out_writes_bytes_(*OutBufferLength)
PVOID OutBuffer,
_Inout_ PULONG OutBufferLength
)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
if (InBufferLength >= sizeof(uint8_t) &&
*OutBufferLength >= sizeof(uint8_t) + sizeof(otMacFilterEntry))
{
uint8_t aIterator = *(uint8_t*)(InBuffer);
otMacFilterEntry *aEntry = (otMacFilterEntry*)((PUCHAR)OutBuffer + sizeof(uint8_t));
status = ThreadErrorToNtstatus(
otLinkFilterGetNextRssIn(
pFilter->otCtx,
&aIterator,
aEntry
)
);
*OutBufferLength = sizeof(otMacFilterEntry) + sizeof(uint8_t);
if (status == STATUS_SUCCESS)
{
*(uint8_t*)OutBuffer = aIterator;
}
}
else
{
*OutBufferLength = 0;
}
return status;
}
+6 -3
View File
@@ -168,7 +168,7 @@ DECL_IOCTL_FUNC_WITH_TUN(otReleaseRouterId);
DECL_IOCTL_FUNC_WITH_TUN2(otMacWhitelistEnabled);
DECL_IOCTL_FUNC_WITH_TUN(otAddMacWhitelist);
DECL_IOCTL_FUNC_WITH_TUN(otRemoveMacWhitelist);
DECL_IOCTL_FUNC(otMacWhitelistEntry);
DECL_IOCTL_FUNC(otNextMacWhitelist);
DECL_IOCTL_FUNC_WITH_TUN(otClearMacWhitelist);
DECL_IOCTL_FUNC_WITH_TUN2(otDeviceRole);
DECL_IOCTL_FUNC(otChildInfoById);
@@ -186,13 +186,12 @@ DECL_IOCTL_FUNC_WITH_TUN2(otStableNetworkDataVersion);
DECL_IOCTL_FUNC(otMacBlacklistEnabled);
DECL_IOCTL_FUNC(otAddMacBlacklist);
DECL_IOCTL_FUNC(otRemoveMacBlacklist);
DECL_IOCTL_FUNC(otMacBlacklistEntry);
DECL_IOCTL_FUNC(otNextMacBlacklist);
DECL_IOCTL_FUNC(otClearMacBlacklist);
DECL_IOCTL_FUNC(otMaxTransmitPower);
DECL_IOCTL_FUNC(otNextOnMeshPrefix);
DECL_IOCTL_FUNC(otPollPeriod);
DECL_IOCTL_FUNC(otLocalLeaderPartitionId);
DECL_IOCTL_FUNC(otAssignLinkQuality);
DECL_IOCTL_FUNC_WITH_TUN(otPlatformReset);
DECL_IOCTL_FUNC_WITH_TUN2(otParentInfo);
DECL_IOCTL_FUNC(otSingleton);
@@ -228,5 +227,9 @@ DECL_IOCTL_FUNC(otThreadAutoStart);
DECL_IOCTL_FUNC(otThreadPreferredRouterId);
DECL_IOCTL_FUNC_WITH_TUN2(otPSKc);
DECL_IOCTL_FUNC(otParentPriority);
DECL_IOCTL_FUNC_WITH_TUN(otAddMacFixedRss);
DECL_IOCTL_FUNC_WITH_TUN(otRemoveMacFixedRss);
DECL_IOCTL_FUNC(otNextMacFixedRss);
DECL_IOCTL_FUNC_WITH_TUN(otClearMacFixedRss);
#endif // _IOCONTROL_H
@@ -1069,7 +1069,7 @@ OTNODEAPI int32_t OTCALL otNodeClearWhitelist(otNode* aNode)
otLogFuncEntryMsg("[%d]", aNode->mId);
printf("%d: whitelist clear\r\n", aNode->mId);
otLinkClearWhitelist(aNode->mInstance);
otLinkFilterClearAddresses(aNode->mInstance);
otLogFuncExit();
return 0;
}
@@ -1079,9 +1079,9 @@ OTNODEAPI int32_t OTCALL otNodeEnableWhitelist(otNode* aNode)
otLogFuncEntryMsg("[%d]", aNode->mId);
printf("%d: whitelist enable\r\n", aNode->mId);
otLinkSetWhitelistEnabled(aNode->mInstance, true);
otError error = otLinkFilterSetAddressMode(aNode->mInstance, OT_MAC_FILTER_ADDRESS_MODE_WHITELIST);
otLogFuncExit();
return 0;
return error;
}
OTNODEAPI int32_t OTCALL otNodeDisableWhitelist(otNode* aNode)
@@ -1089,31 +1089,36 @@ OTNODEAPI int32_t OTCALL otNodeDisableWhitelist(otNode* aNode)
otLogFuncEntryMsg("[%d]", aNode->mId);
printf("%d: whitelist disable\r\n", aNode->mId);
otLinkSetWhitelistEnabled(aNode->mInstance, false);
otError error = otLinkFilterSetAddressMode(aNode->mInstance, OT_MAC_FILTER_ADDRESS_MODE_DISABLED);
otLogFuncExit();
return 0;
return error;
}
OTNODEAPI int32_t OTCALL otNodeAddWhitelist(otNode* aNode, const char *aExtAddr, int8_t aRssi)
OTNODEAPI int32_t OTCALL otNodeAddWhitelist(otNode* aNode,
const char *aExtAddr, int8_t aRssi = OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
otLogFuncEntryMsg("[%d]", aNode->mId);
if (aRssi == 0)
printf("%d: whitelist add %s\r\n", aNode->mId, aExtAddr);
else printf("%d: whitelist add %s %d\r\n", aNode->mId, aExtAddr, aRssi);
otError error = OT_ERROR_NONE;
uint8_t extAddr[8];
if (Hex2Bin(aExtAddr, extAddr, sizeof(extAddr)) != sizeof(extAddr))
otExtAddress extAddress;
if (Hex2Bin(aExtAddr, extAddress.m8, OT_EXT_ADDRESS_SIZE) != OT_EXT_ADDRESS_SIZE)
return OT_ERROR_PARSE;
otError error;
if (aRssi == 0)
printf("%d: whitelist add %s", aNode->mId, aExtAddr);
error = otLinkFilterAddAddress(aNode->mInstance, &extAddress);
if (error == OT_ERROR_NONE || error == OT_ERROR_ALREADY)
{
error = otLinkAddWhitelist(aNode->mInstance, extAddr);
}
else
{
error = otLinkAddWhitelistRssi(aNode->mInstance, extAddr, aRssi);
if (aRssi != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
error = otLinkFilterAddRssIn(aNode->mInstance, &extAddress, aRssi);
printf(" %d", aRssi);
}
}
printf("\r\n");
otLogFuncExit();
return error;
}
@@ -1123,13 +1128,13 @@ OTNODEAPI int32_t OTCALL otNodeRemoveWhitelist(otNode* aNode, const char *aExtAd
otLogFuncEntryMsg("[%d]", aNode->mId);
printf("%d: whitelist remove %s\r\n", aNode->mId, aExtAddr);
uint8_t extAddr[8];
if (Hex2Bin(aExtAddr, extAddr, sizeof(extAddr)) != sizeof(extAddr))
return OT_ERROR_INVALID_ARGS;
otExtAddress extAddress;
if (Hex2Bin(aExtAddr, extAddress.m8, OT_EXT_ADDRESS_SIZE) != OT_EXT_ADDRESS_SIZE)
return OT_ERROR_PARSE;
otLinkRemoveWhitelist(aNode->mInstance, extAddr);
otError error = otLinkFilterRemoveAddress(aNode->mInstance, &extAddress);
otLogFuncExit();
return 0;
return error;
}
OTNODEAPI uint16_t OTCALL otNodeGetAddr16(otNode* aNode)
@@ -55,6 +55,7 @@ using namespace std;
#include <openthread/thread_ftd.h>
#include <openthread/commissioner.h>
#include <openthread/joiner.h>
#include <openthread/link.h>
#include <openthread/platform/logging-windows.h>
#include <otNode.h>
+1 -1
View File
@@ -64,7 +64,7 @@
#define OPENTHREAD_ENABLE_DHCP6_SERVER 1
/* Define to 1 to enable MAC whitelist/blacklist feature. */
#define OPENTHREAD_ENABLE_MAC_WHITELIST 1
#define OPENTHREAD_ENABLE_MAC_FILTER 1
/* Define to 1 to enable TMF proxy feature. */
#define OPENTHREAD_ENABLE_TMF_PROXY 0
+219 -190
View File
@@ -306,226 +306,255 @@ OTAPI void OTCALL otLinkSetPollPeriod(otInstance *aInstance, uint32_t aPollPerio
OTAPI otShortAddress OTCALL otLinkGetShortAddress(otInstance *aInstance);
/**
* Add an IEEE 802.15.4 Extended Address to the MAC whitelist.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
*
* @retval OT_ERROR_NONE Successfully added to the MAC whitelist.
* @retval OT_ERROR_NO_BUFS No buffers available for a new MAC whitelist entry.
*
* @sa otLinkAddWhitelistRssi
* @sa otLinkRemoveWhitelist
* @sa otLinkClearWhitelist
* @sa otLinkGetWhitelistEntry
* @sa otLinkSetWhitelistEnabled
*/
OTAPI otError OTCALL otLinkAddWhitelist(otInstance *aInstance, const uint8_t *aExtAddr);
/**
* Add an IEEE 802.15.4 Extended Address to the MAC whitelist and fix the RSSI value.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
* @param[in] aRssi The RSSI in dBm to use when receiving messages from aExtAddr.
*
* @retval OT_ERROR_NONE Successfully added to the MAC whitelist.
* @retval OT_ERROR_NO_BUFS No buffers available for a new MAC whitelist entry.
*
* @sa otLinkAddWhitelistRssi
* @sa otLinkRemoveWhitelist
* @sa otLinkClearWhitelist
* @sa otLinkGetWhitelistEntry
* @sa otLinkIsWhitelistEnabled
* @sa otLinkSetWhitelistEnabled
*/
OTAPI otError OTCALL otLinkAddWhitelistRssi(otInstance *aInstance, const uint8_t *aExtAddr, int8_t aRssi);
/**
* Remove an IEEE 802.15.4 Extended Address from the MAC whitelist.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
*
* @sa otLinkAddWhitelist
* @sa otLinkAddWhitelistRssi
* @sa otLinkClearWhitelist
* @sa otLinkGetWhitelistEntry
* @sa otLinkIsWhitelistEnabled
* @sa otLinkSetWhitelistEnabled
*/
OTAPI void OTCALL otLinkRemoveWhitelist(otInstance *aInstance, const uint8_t *aExtAddr);
/**
* This function gets a MAC whitelist entry.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aIndex An index into the MAC whitelist table.
* @param[out] aEntry A pointer to where the information is placed.
*
* @retval OT_ERROR_NONE Successfully retrieved the MAC whitelist entry.
* @retval OT_ERROR_INVALID_ARGS @p aIndex is out of bounds or @p aEntry is NULL.
*
*/
OTAPI otError OTCALL otLinkGetWhitelistEntry(otInstance *aInstance, uint8_t aIndex, otMacWhitelistEntry *aEntry);
/**
* Remove all entries from the MAC whitelist.
*
* @param[in] aInstance A pointer to an OpenThread instance.
*
* @sa otLinkAddWhitelist
* @sa otLinkAddWhitelistRssi
* @sa otLinkRemoveWhitelist
* @sa otLinkGetWhitelistEntry
* @sa otLinkIsWhitelistEnabled
* @sa otLinkSetWhitelistEnabled
*/
OTAPI void OTCALL otLinkClearWhitelist(otInstance *aInstance);
/**
* Enable MAC whitelist filtering.
* This function gets the address mode of MAC filter.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aEnabled TRUE to enable the whitelist, FALSE otherwise.
*
* @sa otLinkAddWhitelist
* @sa otLinkAddWhitelistRssi
* @sa otLinkRemoveWhitelist
* @sa otLinkClearWhitelist
* @sa otLinkGetWhitelistEntry
* @sa otLinkIsWhitelistEnabled
*/
OTAPI void OTCALL otLinkSetWhitelistEnabled(otInstance *aInstance, bool aEnabled);
/**
* This function indicates whether or not the MAC whitelist is enabled.
* @returns the address mode.
*
* @param[in] aInstance A pointer to an OpenThread instance.
*
* @returns TRUE if the MAC whitelist is enabled, FALSE otherwise.
*
* @sa otLinkAddWhitelist
* @sa otLinkAddWhitelistRssi
* @sa otLinkRemoveWhitelist
* @sa otLinkClearWhitelist
* @sa otLinkGetWhitelistEntry
* @sa otLinkSetWhitelistEnabled
*/
OTAPI bool OTCALL otLinkIsWhitelistEnabled(otInstance *aInstance);
/**
* Add an IEEE 802.15.4 Extended Address to the MAC blacklist.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
*
* @retval OT_ERROR_NONE Successfully added to the MAC blacklist.
* @retval OT_ERROR_NO_BUFS No buffers available for a new MAC blacklist entry.
*
* @sa otLinkRemoveBlacklist
* @sa otLinkClearBlacklist
* @sa otLinkGetBlacklistEntry
* @sa otLinkIsBlacklistEnabled
* @sa otLinkSetBlacklistEnabled
*/
OTAPI otError OTCALL otLinkAddBlacklist(otInstance *aInstance, const uint8_t *aExtAddr);
/**
* Remove an IEEE 802.15.4 Extended Address from the MAC blacklist.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
*
* @sa otLinkAddBlacklist
* @sa otLinkClearBlacklist
* @sa otLinkGetBlacklistEntry
* @sa otLinkIsBlacklistEnabled
* @sa otLinkSetBlacklistEnabled
*/
OTAPI void OTCALL otLinkRemoveBlacklist(otInstance *aInstance, const uint8_t *aExtAddr);
/**
* This function gets a MAC Blacklist entry.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aIndex An index into the MAC Blacklist table.
* @param[out] aEntry A pointer to where the information is placed.
*
* @retval OT_ERROR_NONE Successfully retrieved the MAC Blacklist entry.
* @retval OT_ERROR_INVALID_ARGS @p aIndex is out of bounds or @p aEntry is NULL.
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI otError OTCALL otLinkGetBlacklistEntry(otInstance *aInstance, uint8_t aIndex, otMacBlacklistEntry *aEntry);
OTAPI otMacFilterAddressMode OTCALL otLinkFilterGetAddressMode(otInstance *aInstance);
/**
* Remove all entries from the MAC Blacklist.
*
* @param[in] aInstance A pointer to an OpenThread instance.
*
* @sa otLinkAddBlacklist
* @sa otLinkRemoveBlacklist
* @sa otLinkGetBlacklistEntry
* @sa otLinkIsBlacklistEnabled
* @sa otLinkSetBlacklistEnabled
*/
OTAPI void OTCALL otLinkClearBlacklist(otInstance *aInstance);
/**
* Enable MAC Blacklist filtering.
* This function sets the address mode of MAC filter.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aEnabled TRUE to enable the blacklist, FALSE otherwise.
* @param[in] aMode The address mode to set.
*
* @retval OT_ERROR_NONE Successfully set the address mode.
* @retval OT_ERROR_INVALID_ARGS @p aMode is not valid.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
* @sa otLinkAddBlacklist
* @sa otLinkRemoveBlacklist
* @sa otLinkClearBlacklist
* @sa otLinkGetBlacklistEntry
* @sa otLinkIsBlacklistEnabled
*/
OTAPI void OTCALL otLinkSetBlacklistEnabled(otInstance *aInstance, bool aEnabled);
OTAPI otError OTCALL otLinkFilterSetAddressMode(otInstance *aInstance, otMacFilterAddressMode aMode);
/**
* This function indicates whether or not the MAC Blacklist is enabled.
* This method adds an Extended Address to MAC filter.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddress A reference to the Extended Address.
*
* @retval OT_ERROR_NONE Successfully added @p aExtAddress to MAC filter.
* @retval OT_ERROR_ALREADY If @p aExtAddress was already in MAC filter.
* @retval OT_ERROR_INVALID_ARGS If @p aExtAddress is NULL.
* @retval OT_ERROR_NO_BUFS No available entry exists.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI otError OTCALL otLinkFilterAddAddress(otInstance *aInstance, const otExtAddress *aExtAddress);
/**
* This method removes an Extended Address from MAC filter.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddress A reference to the Extended Address.
*
* @retval OT_ERROR_NONE Successfully removed @p aExtAddress from MAC filter.
* @retval OT_ERROR_INVALID_ARGS If @p aExtAddress is NULL.
* @retval OT_ERROR_NOT_FOUND @p aExtAddress is not in MAC filter.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI otError OTCALL otLinkFilterRemoveAddress(otInstance *aInstance, const otExtAddress *aExtAddress);
/**
* This method clears all the Extended Addresses from MAC filter.
*
* @param[in] aInstance A pointer to an OpenThread instance.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI void OTCALL otLinkFilterClearAddresses(otInstance *aInstance);
/**
* This method gets an in-use address filter entry.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[inout] aIterator A pointer to the MAC filter iterator context. To get the first in-use address filter entry,
* it should be set to OT_MAC_FILTER_ITERATOR_INIT.
* @param[out] aEntry A pointer to where the information is placed.
*
* @retval OT_ERROR_NONE Successfully retrieved an in-use address filter entry.
* @retval OT_ERROR_INVALID_ARGS If @p aIterator or @p aEntry is NULL.
* @retval OT_ERROR_NOT_FOUND No subsequent entry exists.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI otError OTCALL otLinkFilterGetNextAddress(otInstance *aInstance,
otMacFilterIterator *aIterator, otMacFilterEntry *aEntry);
/**
* This method sets the received signal strength (in dBm) for the messages from the Extended Address.
* The default received signal strength for all received messages would be set if no Extended Address is specified.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddress A pointer to the IEEE 802.15.4 Extended Address, or NULL to set the default received signal
* strength.
* @param[in] aRss The received signal strength (in dBm) to set.
*
* @retval OT_ERROR_NONE Successfully set @p aRss for @p aExtAddress or set the default @p aRss for all
* received messages if @p aExtAddress is NULL.
* @retval OT_ERROR_NO_BUFS No available entry exists.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI otError OTCALL otLinkFilterAddRssIn(otInstance *aInstance, const otExtAddress *aExtAddress, int8_t aRss);
/**
* This method removes the received signal strength setting for the received messages from the Extended Address or
* removes the default received signal strength setting if no Extended Address is specified.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddress A pointer to the IEEE 802.15.4 Extended Address, or NULL to reset the default received
* signal strength.
*
* @retval OT_ERROR_NONE Successfully removed received signal strength setting for @p aExtAddress or
* removed the default received signal strength setting if @p aExtAddress is NULL.
* @retval OT_ERROR_NOT_FOUND @p aExtAddress is not in MAC filter if it is not NULL.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterClearRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI otError OTCALL otLinkFilterRemoveRssIn(otInstance *aInstance, const otExtAddress *aExtAddress);
/**
* This method clears all the received signal strength settings.
*
* @param[in] aInstance A pointer to an OpenThread instance.
*
* @returns TRUE if the MAC Blacklist is enabled, FALSE otherwise.
*
* @sa otLinkAddBlacklist
* @sa otLinkRemoveBlacklist
* @sa otLinkClearBlacklist
* @sa otLinkGetBlacklistEntry
* @sa otLinkSetBlacklistEnabled
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterGetNextRssIn
*
*/
OTAPI bool OTCALL otLinkIsBlacklistEnabled(otInstance *aInstance);
OTAPI void OTCALL otLinkFilterClearRssIn(otInstance *aInstance);
/**
* Get the assigned link quality which is on the link to a given extended address.
* This method gets an in-use RssIn filter entry.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
* @param[in] aLinkQuality A pointer to the assigned link quality.
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[inout] aIterator A reference to the MAC filter iterator context. To get the first in-use RssIn Filter entry,
* it should be set to OT_MAC_FILTER_ITERATOR_INIT.
* @param[out] aEntry A reference to where the information is placed. The last entry would have the extended
* address as all 0xff to indicate the default received signal strength if it was set.
*
* @retval OT_ERROR_NONE Successfully retrieved the link quality to aLinkQuality.
* @retval OT_ERROR_INVALID_STATE No attached child matches with a given extended address.
* @retval OT_ERROR_NONE Successfully retrieved an in-use RssIn Filter entry.
* @retval OT_ERROR_INVALID_ARGS If @p aIterator or @p aEntry is NULL.
* @retval OT_ERROR_NOT_FOUND No subsequent entry exists.
*
* @sa otLinkFilterGetAddressMode
* @sa otLinkFilterSetAddressMode
* @sa otLinkFilterAddAddress
* @sa otLinkFilterRemoveAddress
* @sa otLinkFilterClearAddresses
* @sa otLinkFilterGetNextAddress
* @sa otLinkFilterAddRssIn
* @sa otLinkFilterRemoveRssIn
* @sa otLinkFilterClearRssIn
*
* @sa otLinkSetAssignLinkQuality
*/
OTAPI otError OTCALL otLinkGetAssignLinkQuality(otInstance *aInstance, const uint8_t *aExtAddr,
uint8_t *aLinkQuality);
OTAPI otError OTCALL otLinkFilterGetNextRssIn(otInstance *aInstance,
otMacFilterIterator *aIterator, otMacFilterEntry *aEntry);
/**
* Set the link quality which is on the link to a given extended address.
* This method converts received signal strength to link quality.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aExtAddr A pointer to the IEEE 802.15.4 Extended Address.
* @param[in] aLinkQuality The link quality to be set on the link.
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aRss The received signal strength value to be converted.
*
* @return Link quality value mapping to @p aRss.
*
* @sa otLinkGetAssignLinkQuality
*/
OTAPI void OTCALL otLinkSetAssignLinkQuality(otInstance *aInstance, const uint8_t *aExtAddr, uint8_t aLinkQuality);
uint8_t otLinkConvertRssToLinkQuality(otInstance *aInstance, int8_t aRss);
/**
* This method converts link quality to typical received signal strength.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aLinkQuality LinkQuality value, should be in range [0,3].
*
* @return Typical platform received signal strength mapping to @p aLinkQuality.
*
*/
int8_t otLinkConvertLinkQualityToRss(otInstance *aInstance, uint8_t aLinkQuality);
/**
* Get the MAC layer counters.
+21 -13
View File
@@ -765,26 +765,34 @@ typedef enum otRoutePreference
} otRoutePreference;
/**
* This structure represents a whitelist entry.
*
* Used to indicate no fixed received signal strength was set
*/
typedef struct otMacWhitelistEntry
{
otExtAddress mExtAddress; ///< IEEE 802.15.4 Extended Address
int8_t mRssi; ///< RSSI value
bool mValid : 1; ///< Indicates whether or not the whitelist entry is valid
bool mFixedRssi : 1; ///< Indicates whether or not the RSSI value is fixed.
} otMacWhitelistEntry;
#define OT_MAC_FILTER_FIXED_RSS_DISABLED 127
#define OT_MAC_FILTER_ITERATOR_INIT 0 ///< Initializer for otMacFilterIterator.
typedef uint8_t otMacFilterIterator; ///< Used to iterate through mac filter entries.
/**
* This structure represents a blacklist entry.
* Defines address mode of the mac filter.
*/
typedef enum otMacFilterAddressMode
{
OT_MAC_FILTER_ADDRESS_MODE_DISABLED, ///< Address filter is disabled.
OT_MAC_FILTER_ADDRESS_MODE_WHITELIST, ///< Whitelist address filter mode is enabled.
OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST, ///< Blacklist address filter mode is enabled.
} otMacFilterAddressMode;
/**
* This structure represents a Mac Filter entry.
*
*/
typedef struct otMacBlacklistEntry
typedef struct otMacFilterEntry
{
otExtAddress mExtAddress; ///< IEEE 802.15.4 Extended Address
bool mValid; ///< Indicates whether or not the blacklist entry is valid
} otMacBlacklistEntry;
int8_t mRssIn; ///< Received signal strength
bool mFiltered; ///< Indicates whether or not this entry is filtered.
} otMacFilterEntry;
/**
* Represents a Thread device role.
+120 -81
View File
@@ -8,7 +8,6 @@ OpenThread test scripts use the CLI to execute test cases.
## OpenThread Command List
* [autostart](#autostart)
* [blacklist](#blacklist)
* [bufferinfo](#bufferinfo)
* [channel](#channel)
* [child](#child-list)
@@ -38,6 +37,7 @@ OpenThread test scripts use the CLI to execute test cases.
* [leaderpartitionid](#leaderpartitionid)
* [leaderweight](#leaderweight)
* [linkquality](#linkquality-extaddr)
* [macfilter](#macfilter)
* [masterkey](#masterkey)
* [mode](#mode)
* [netdataregister](#netdataregister)
@@ -66,7 +66,6 @@ OpenThread test scripts use the CLI to execute test cases.
* [thread](#thread-start)
* [txpowermax](#txpowermax)
* [version](#version)
* [whitelist](#whitelist)
* [diag](#diag)
## OpenThread Command Details
@@ -99,63 +98,6 @@ false
Done
```
### blacklist
List the blacklist entries.
```bash
> blacklist
Enabled
166e0a0000000002
166e0a0000000003
Done
```
### blacklist add \<extaddr\>
Add an IEEE 802.15.4 Extended Address to the blacklist.
```bash
> blacklist add 166e0a0000000002
Done
```
### blacklist clear
Clear all entries from the blacklist.
```bash
> blacklist clear
Done
```
### blacklist disable
Disable MAC blacklist filtering.
```bash
> blacklist disable
Done
```
### blacklist enable
Enable MAC blacklist filtering.
```bash
> blacklist enable
Done
```
### blacklist remove \<extaddr\>
Remove an IEEE 802.15.4 Extended Address from the blacklist.
```bash
> blacklist remove 166e0a0000000002
Done
```
### bufferinfo
Show the current message buffer information.
@@ -1630,61 +1572,158 @@ OPENTHREAD/gf4f2f04; Jul 1 2016 17:00:09
Done
```
### whitelist
### macfilter
List the whitelist entries.
List the macfilter status, including address and received signal strength filter settings.
```bash
> whitelist
Enabled
e2b3540590b0fd87
d38d7f875888fccb
c467a90a2060fa0e
> macfilter
Address Mode: Whitelist
0f6127e33af6b403 : rss -95 (lqi 1)
0f6127e33af6b402
RssIn List:
0f6127e33af6b403 : rss -95 (lqi 1)
Default rss : -50 (lqi 3)
Done
```
### whitelist add \<extaddr\>
### macfilter addr
Add an IEEE 802.15.4 Extended Address to the whitelist.
List the address filter status.
```bash
> whitelist add dead00beef00cafe
> macfilter addr
Whitelist
0f6127e33af6b403 : rss -95 (lqi 1)
0f6127e33af6b402
Done
```
### whitelist clear
### macfilter addr disable
Clear all entries from the whitelist.
Disable address filter mode.
```bash
> whitelist clear
> macfilter addr disable
Done
```
### whitelist disable
### macfilter addr whitelist
Disable MAC whitelist filtering.
Enable whitelist address filter mode.
```bash
> whitelist disable
> macfilter addr whitelist
Done
```
### whitelist enable
### macfilter addr blacklist
Enable MAC whitelist filtering.
Enable blacklist address filter mode.
```bash
> whitelist enable
> macfilter addr blacklist
Done
```
### whitelist remove \<extaddr\>
### macfilter addr add \<extaddr\> \[rss\]
Remove an IEEE 802.15.4 Extended Address from the whitelist.
Add an IEEE 802.15.4 Extended Address to the address filter, and fixed the received singal strength for
the messages from the address if rss is specified.
```bash
> whitelist remove dead00beef00cafe
> macfilter addr add 0f6127e33af6b403 -95
Done
```
```bash
> macfilter addr add 0f6127e33af6b402
Done
```
### macfilter addr remove \<extaddr\>
Remove the IEEE802.15.4 Extended Address from the address filter.
```bash
> macfilter addr remove 0f6127e33af6b402
Done
```
### macfilter addr clear
Clear all the IEEE802.15.4 Extended Addresses from the address filter.
```bash
> macfilter addr clear
Done
```
### macfilter rss
List the rss filter status
```bash
> macfilter rss
0f6127e33af6b403 : rss -95 (lqi 1)
Default rss: -50 (lqi 3)
Done
```
### macfilter rss add \<extaddr\> \<rss\>
Set the received signal strength for the messages from the IEEE802.15.4 Extended Address.
If extaddr is \*, default received signal strength for all received messages would be set.
```bash
> macfilter rss add * -50
Done
```
```bash
> macfilter rss add 0f6127e33af6b404 -85
Done
```
### macfilter rss add-lqi \<extaddr\> \<lqi\>
Set the received link quality for the messages from the IEEE802.15.4 Extended Address. Valid lqi range [0,3]
If extaddr is \*, default received link quality for all received messages would be set.
Equivalent with 'filter rss add' with similar usage
```bash
> macfilter rss add-lqi * 3
Done
```
```bash
> macfilter rss add 0f6127e33af6b404 2
Done
```
### macfilter rss remove \<extaddr\>
Removes the received signal strength or received link quality setting on the Extended Address.
If extaddr is \*, default received signal strength or link quality for all received messages would be unset.
```bash
> macfilter rss remove *
Done
```
```bash
> macfilter rss remove 0f6127e33af6b404
Done
```
### macfilter rss clear
Clear all the the received signal strength or received link quality settings.
```bash
> macfilter rss clear
Done
```
+295 -140
View File
@@ -47,6 +47,7 @@
#include <openthread/commissioner.h>
#include <openthread/icmp6.h>
#include <openthread/joiner.h>
#include <openthread/link.h>
#if OPENTHREAD_FTD
#include <openthread/dataset_ftd.h>
@@ -89,7 +90,6 @@ const struct Command Interpreter::sCommands[] =
{
{ "help", &Interpreter::ProcessHelp },
{ "autostart", &Interpreter::ProcessAutoStart },
{ "blacklist", &Interpreter::ProcessBlacklist },
{ "bufferinfo", &Interpreter::ProcessBufferInfo },
{ "channel", &Interpreter::ProcessChannel },
#if OPENTHREAD_FTD
@@ -150,7 +150,9 @@ const struct Command Interpreter::sCommands[] =
{ "leaderpartitionid", &Interpreter::ProcessLeaderPartitionId },
{ "leaderweight", &Interpreter::ProcessLeaderWeight },
#endif
{ "linkquality", &Interpreter::ProcessLinkQuality },
#if OPENTHREAD_ENABLE_MAC_FILTER
{ "macfilter", &Interpreter::ProcessMacFilter },
#endif
{ "masterkey", &Interpreter::ProcessMasterKey },
{ "mode", &Interpreter::ProcessMode },
#if OPENTHREAD_ENABLE_BORDER_ROUTER
@@ -200,7 +202,6 @@ const struct Command Interpreter::sCommands[] =
{ "thread", &Interpreter::ProcessThread },
{ "txpowermax", &Interpreter::ProcessTxPowerMax },
{ "version", &Interpreter::ProcessVersion },
{ "whitelist", &Interpreter::ProcessWhitelist },
};
#ifdef OTDLL
@@ -401,72 +402,6 @@ void Interpreter::ProcessAutoStart(int argc, char *argv[])
AppendResult(error);
}
void Interpreter::ProcessBlacklist(int argc, char *argv[])
{
otError error = OT_ERROR_NONE;
otMacBlacklistEntry entry;
int argcur = 0;
uint8_t extAddr[8];
if (argcur >= argc)
{
if (otLinkIsBlacklistEnabled(mInstance))
{
mServer->OutputFormat("Enabled\r\n");
}
else
{
mServer->OutputFormat("Disabled\r\n");
}
for (uint8_t i = 0; ; i++)
{
if (otLinkGetBlacklistEntry(mInstance, i, &entry) != OT_ERROR_NONE)
{
break;
}
if (entry.mValid == false)
{
continue;
}
OutputBytes(entry.mExtAddress.m8, OT_EXT_ADDRESS_SIZE);
mServer->OutputFormat("\r\n");
}
}
else if (strcmp(argv[argcur], "add") == 0)
{
VerifyOrExit(++argcur < argc, error = OT_ERROR_PARSE);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), error = OT_ERROR_PARSE);
otLinkAddBlacklist(mInstance, extAddr);
VerifyOrExit(otLinkAddBlacklist(mInstance, extAddr) == OT_ERROR_NONE, error = OT_ERROR_PARSE);
}
else if (strcmp(argv[argcur], "clear") == 0)
{
otLinkClearBlacklist(mInstance);
}
else if (strcmp(argv[argcur], "disable") == 0)
{
otLinkSetBlacklistEnabled(mInstance, false);
}
else if (strcmp(argv[argcur], "enable") == 0)
{
otLinkSetBlacklistEnabled(mInstance, true);
}
else if (strcmp(argv[argcur], "remove") == 0)
{
VerifyOrExit(++argcur < argc, error = OT_ERROR_PARSE);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), error = OT_ERROR_PARSE);
otLinkRemoveBlacklist(mInstance, extAddr);
}
exit:
AppendResult(error);
}
void Interpreter::ProcessBufferInfo(int argc, char *argv[])
{
otBufferInfo bufferInfo;
@@ -1309,32 +1244,6 @@ exit:
}
#endif // OPENTHREAD_FTD
void Interpreter::ProcessLinkQuality(int argc, char *argv[])
{
otError error = OT_ERROR_NONE;
uint8_t extAddress[8];
uint8_t linkQuality;
long value;
VerifyOrExit(argc > 0, error = OT_ERROR_INVALID_ARGS);
VerifyOrExit(Hex2Bin(argv[0], extAddress, OT_EXT_ADDRESS_SIZE) >= 0, error = OT_ERROR_PARSE);
if (argc == 1)
{
VerifyOrExit(otLinkGetAssignLinkQuality(mInstance, extAddress, &linkQuality) == OT_ERROR_NONE,
error = OT_ERROR_INVALID_ARGS);
mServer->OutputFormat("%d\r\n", linkQuality);
}
else
{
SuccessOrExit(error = ParseLong(argv[1], value));
otLinkSetAssignLinkQuality(mInstance, extAddress, static_cast<uint8_t>(value));
}
exit:
AppendResult(error);
}
#if OPENTHREAD_FTD
void Interpreter::ProcessPSKc(int argc, char *argv[])
{
@@ -2932,86 +2841,332 @@ exit:
}
#endif
void Interpreter::ProcessWhitelist(int argc, char *argv[])
#if OPENTHREAD_ENABLE_MAC_FILTER
void Interpreter::ProcessMacFilter(int argc, char *argv[])
{
otError error = OT_ERROR_NONE;
otMacWhitelistEntry entry;
int argcur = 0;
uint8_t extAddr[8];
int8_t rssi;
if (argcur >= argc)
if (argc == 0)
{
if (otLinkIsWhitelistEnabled(mInstance))
PrintMacFilter();
}
else
{
if (strcmp(argv[0], "addr") == 0)
{
mServer->OutputFormat("Enabled\r\n");
error = ProcessMacFilterAddress(argc - 1, argv + 1);
}
#ifndef OTDLL
else if (strcmp(argv[0], "rss") == 0)
{
error = ProcessMacFilterRss(argc - 1, argv + 1);
}
#endif
else
{
mServer->OutputFormat("Disabled\r\n");
error = OT_ERROR_INVALID_ARGS;
}
}
if (error != OT_ERROR_NONE)
{
otThreadErrorToString(error);
}
AppendResult(error);
}
void Interpreter::PrintMacFilter(void)
{
otMacFilterEntry entry;
otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
otMacFilterAddressMode mode = otLinkFilterGetAddressMode(mInstance);
if (mode == OT_MAC_FILTER_ADDRESS_MODE_DISABLED)
{
mServer->OutputFormat("Address Mode: Disabled\r\n");
}
else if (mode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST)
{
mServer->OutputFormat("Address Mode: Whitelist\r\n");
}
else if (mode == OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST)
{
mServer->OutputFormat("Address Mode: Blacklist\r\n");
}
while (otLinkFilterGetNextAddress(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
OutputBytes(entry.mExtAddress.m8, OT_EXT_ADDRESS_SIZE);
if (entry.mRssIn != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
#ifndef OTDLL
mServer->OutputFormat(" : rss %d (lqi %d)", entry.mRssIn,
otLinkConvertRssToLinkQuality(mInstance, entry.mRssIn));
#else
mServer->OutputFormat(" : rss %d", entry.mRssIn);
#endif // OTDLL
}
for (uint8_t i = 0; ; i++)
mServer->OutputFormat("\r\n");
}
#ifndef OTDLL
iterator = OT_MAC_FILTER_ITERATOR_INIT;
mServer->OutputFormat("RssIn List:\r\n");
while (otLinkFilterGetNextRssIn(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
uint8_t i = 0;
for (; i < OT_EXT_ADDRESS_SIZE; i++)
{
if (otLinkGetWhitelistEntry(mInstance, i, &entry) != OT_ERROR_NONE)
if (entry.mExtAddress.m8[i] != 0xff)
{
break;
}
}
if (entry.mValid == false)
{
continue;
}
if (i == OT_EXT_ADDRESS_SIZE)
{
mServer->OutputFormat("Default rss : %d (lqi %d)\r\n",
entry.mRssIn, otLinkConvertRssToLinkQuality(mInstance, entry.mRssIn));
}
else
{
OutputBytes(entry.mExtAddress.m8, OT_EXT_ADDRESS_SIZE);
mServer->OutputFormat(" : rss %d (lqi %d)\r\n",
entry.mRssIn, otLinkConvertRssToLinkQuality(mInstance, entry.mRssIn));
}
}
#endif // OTDLL
}
otError Interpreter::ProcessMacFilterAddress(int argc, char *argv[])
{
otError error = OT_ERROR_NONE;
otExtAddress extAddr;
otMacFilterEntry entry;
otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
otMacFilterAddressMode mode = otLinkFilterGetAddressMode(mInstance);
long value;
if (argc == 0)
{
if (mode == OT_MAC_FILTER_ADDRESS_MODE_DISABLED)
{
mServer->OutputFormat("Disabled\r\n");
}
else if (mode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST)
{
mServer->OutputFormat("Whitelist\r\n");
}
else if (mode == OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST)
{
mServer->OutputFormat("Blacklist\r\n");
}
while (otLinkFilterGetNextAddress(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
OutputBytes(entry.mExtAddress.m8, OT_EXT_ADDRESS_SIZE);
if (entry.mFixedRssi)
if (entry.mRssIn != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
mServer->OutputFormat(" %d", entry.mRssi);
#ifndef OTDLL
mServer->OutputFormat(" : rss %d (lqi %d)", entry.mRssIn,
otLinkConvertRssToLinkQuality(mInstance, entry.mRssIn));
#else
mServer->OutputFormat(" : rss %d", entry.mRssIn);
#endif // OTDLL
}
mServer->OutputFormat("\r\n");
}
}
else if (strcmp(argv[argcur], "add") == 0)
else
{
VerifyOrExit(++argcur < argc, error = OT_ERROR_PARSE);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), error = OT_ERROR_PARSE);
if (++argcur < argc)
if (strcmp(argv[0], "disable") == 0)
{
rssi = static_cast<int8_t>(strtol(argv[argcur], NULL, 0));
VerifyOrExit(otLinkAddWhitelistRssi(mInstance, extAddr, rssi) == OT_ERROR_NONE, error = OT_ERROR_PARSE);
VerifyOrExit(argc == 1, error = OT_ERROR_INVALID_ARGS);
SuccessOrExit(error = otLinkFilterSetAddressMode(mInstance, OT_MAC_FILTER_ADDRESS_MODE_DISABLED));
}
else if (strcmp(argv[0], "whitelist") == 0)
{
VerifyOrExit(argc == 1, error = OT_ERROR_INVALID_ARGS);
SuccessOrExit(error = otLinkFilterSetAddressMode(mInstance, OT_MAC_FILTER_ADDRESS_MODE_WHITELIST));
}
else if (strcmp(argv[0], "blacklist") == 0)
{
VerifyOrExit(argc == 1, error = OT_ERROR_INVALID_ARGS);
SuccessOrExit(error = otLinkFilterSetAddressMode(mInstance, OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST));
}
else if (strcmp(argv[0], "add") == 0)
{
VerifyOrExit(argc >= 2, error = OT_ERROR_INVALID_ARGS);
VerifyOrExit(Hex2Bin(argv[1], extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE,
error = OT_ERROR_PARSE);
error = otLinkFilterAddAddress(mInstance, &extAddr);
VerifyOrExit(error == OT_ERROR_NONE || error == OT_ERROR_ALREADY);
if (argc > 2)
{
int8_t rss = 0;
VerifyOrExit(argc == 3, error = OT_ERROR_INVALID_ARGS);
SuccessOrExit(error = ParseLong(argv[2], value));
rss = static_cast<int8_t>(value);
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, &extAddr, rss));
}
}
else if (strcmp(argv[0], "remove") == 0)
{
VerifyOrExit(argc == 2, error = OT_ERROR_INVALID_ARGS);
VerifyOrExit(Hex2Bin(argv[1], extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE,
error = OT_ERROR_PARSE);
SuccessOrExit(error = otLinkFilterRemoveAddress(mInstance, &extAddr));
}
else if (strcmp(argv[0], "clear") == 0)
{
VerifyOrExit(argc == 1, error = OT_ERROR_INVALID_ARGS);
otLinkFilterClearAddresses(mInstance);
}
else
{
otLinkAddWhitelist(mInstance, extAddr);
VerifyOrExit(otLinkAddWhitelist(mInstance, extAddr) == OT_ERROR_NONE, error = OT_ERROR_PARSE);
error = OT_ERROR_INVALID_ARGS;
}
}
else if (strcmp(argv[argcur], "clear") == 0)
{
otLinkClearWhitelist(mInstance);
}
else if (strcmp(argv[argcur], "disable") == 0)
{
otLinkSetWhitelistEnabled(mInstance, false);
}
else if (strcmp(argv[argcur], "enable") == 0)
{
otLinkSetWhitelistEnabled(mInstance, true);
}
else if (strcmp(argv[argcur], "remove") == 0)
{
VerifyOrExit(++argcur < argc, error = OT_ERROR_PARSE);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), error = OT_ERROR_PARSE);
otLinkRemoveWhitelist(mInstance, extAddr);
}
exit:
AppendResult(error);
return error;
}
#ifndef OTDLL
otError Interpreter::ProcessMacFilterRss(int argc, char *argv[])
{
otError error = OT_ERROR_NONE;
otMacFilterEntry entry;
otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
otExtAddress extAddr;
long value;
int8_t rss;
if (argc == 0)
{
while (otLinkFilterGetNextRssIn(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
uint8_t i = 0;
for (; i < OT_EXT_ADDRESS_SIZE; i++)
{
if (entry.mExtAddress.m8[i] != 0xff)
{
break;
}
}
if (i == OT_EXT_ADDRESS_SIZE)
{
mServer->OutputFormat("Default rss: %d (lqi %d)\r\n",
entry.mRssIn, otLinkConvertRssToLinkQuality(mInstance, entry.mRssIn));
}
else
{
OutputBytes(entry.mExtAddress.m8, OT_EXT_ADDRESS_SIZE);
mServer->OutputFormat(" : rss %d (lqi %d)\r\n",
entry.mRssIn, otLinkConvertRssToLinkQuality(mInstance, entry.mRssIn));
}
}
}
else
{
if (strcmp(argv[0], "add-lqi") == 0)
{
uint8_t linkquality = 0;
VerifyOrExit(argc == 3, error = OT_ERROR_INVALID_ARGS);
SuccessOrExit(error = ParseLong(argv[2], value));
linkquality = static_cast<uint8_t>(value);
VerifyOrExit(linkquality <= 3, error = OT_ERROR_PARSE);
rss = otLinkConvertLinkQualityToRss(mInstance, linkquality);
if (strcmp(argv[1], "*") == 0)
{
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, NULL, rss));
}
else
{
VerifyOrExit(Hex2Bin(argv[1], extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE,
error = OT_ERROR_PARSE);
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, &extAddr, rss));
}
}
else if (strcmp(argv[0], "add") == 0)
{
VerifyOrExit(argc == 3, error = OT_ERROR_INVALID_ARGS);
SuccessOrExit(error = ParseLong(argv[2], value));
rss = static_cast<int8_t>(value);
if (strcmp(argv[1], "*") == 0)
{
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, NULL, rss));
}
else
{
VerifyOrExit(Hex2Bin(argv[1], extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE,
error = OT_ERROR_PARSE);
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, &extAddr, rss));
}
}
else if (strcmp(argv[0], "remove") == 0)
{
VerifyOrExit(argc == 2, error = OT_ERROR_INVALID_ARGS);
if (strcmp(argv[1], "*") == 0)
{
SuccessOrExit(error = otLinkFilterRemoveRssIn(mInstance, NULL));
}
else
{
VerifyOrExit(Hex2Bin(argv[1], extAddr.m8, OT_EXT_ADDRESS_SIZE) == OT_EXT_ADDRESS_SIZE,
error = OT_ERROR_PARSE);
SuccessOrExit(error = otLinkFilterRemoveRssIn(mInstance, &extAddr));
}
}
else if (strcmp(argv[0], "clear") == 0)
{
otLinkFilterClearRssIn(mInstance);
}
else
{
error = OT_ERROR_INVALID_ARGS;
}
}
exit:
return error;
}
#endif // OTDLL
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#if OPENTHREAD_ENABLE_DIAG
void Interpreter::ProcessDiag(int argc, char *argv[])
{
+8 -2
View File
@@ -162,7 +162,6 @@ private:
void ProcessHelp(int argc, char *argv[]);
void ProcessAutoStart(int argc, char *argv[]);
void ProcessBufferInfo(int argc, char *argv[]);
void ProcessBlacklist(int argc, char *argv[]);
void ProcessChannel(int argc, char *argv[]);
#if OPENTHREAD_FTD
void ProcessChild(int argc, char *argv[]);
@@ -274,7 +273,14 @@ private:
void ProcessThread(int argc, char *argv[]);
void ProcessTxPowerMax(int argc, char *argv[]);
void ProcessVersion(int argc, char *argv[]);
void ProcessWhitelist(int argc, char *argv[]);
#if OPENTHREAD_ENABLE_MAC_FILTER
void ProcessMacFilter(int argc, char *argv[]);
void PrintMacFilter(void);
otError ProcessMacFilterAddress(int argc, char *argv[]);
#ifndef OTDLL
otError ProcessMacFilterRss(int argc, char *argv[]);
#endif // OTDLL
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#ifdef OTDLL
void ProcessInstanceList(int argc, char *argv[]);
+2 -8
View File
@@ -133,9 +133,8 @@ SOURCES_COMMON = \
crypto/pbkdf2_cmac.cpp \
crypto/sha256.cpp \
mac/mac.cpp \
mac/mac_blacklist.cpp \
mac/mac_filter.cpp \
mac/mac_frame.cpp \
mac/mac_whitelist.cpp \
meshcop/announce_begin_client.cpp \
meshcop/commissioner.cpp \
meshcop/dataset.cpp \
@@ -229,13 +228,8 @@ HEADERS_COMMON = \
crypto/pbkdf2_cmac.h \
crypto/sha256.hpp \
mac/mac.hpp \
mac/mac_blacklist.hpp \
mac/mac_blacklist_impl.hpp \
mac/mac_blacklist_stub.hpp \
mac/mac_filter.hpp \
mac/mac_frame.hpp \
mac/mac_whitelist.hpp \
mac/mac_whitelist_impl.hpp \
mac/mac_whitelist_stub.hpp \
meshcop/announce_begin_client.hpp \
meshcop/commissioner.hpp \
meshcop/dataset.hpp \
+53 -75
View File
@@ -144,125 +144,101 @@ otShortAddress otLinkGetShortAddress(otInstance *aInstance)
return aInstance->mThreadNetif.GetMac().GetShortAddress();
}
otError otLinkAddWhitelist(otInstance *aInstance, const uint8_t *aExtAddr)
#if OPENTHREAD_ENABLE_MAC_FILTER
otMacFilterAddressMode otLinkFilterGetAddressMode(otInstance *aInstance)
{
otError error = OT_ERROR_NONE;
if (aInstance->mThreadNetif.GetMac().GetWhitelist().Add(*reinterpret_cast<const Mac::ExtAddress *>(aExtAddr)) == NULL)
{
error = OT_ERROR_NO_BUFS;
}
return error;
return aInstance->mThreadNetif.GetMac().GetFilter().GetAddressMode();
}
otError otLinkAddWhitelistRssi(otInstance *aInstance, const uint8_t *aExtAddr, int8_t aRssi)
otError otLinkFilterSetAddressMode(otInstance *aInstance, otMacFilterAddressMode aMode)
{
return aInstance->mThreadNetif.GetMac().GetFilter().SetAddressMode(aMode);
}
otError otLinkFilterAddAddress(otInstance *aInstance, const otExtAddress *aExtAddress)
{
otError error = OT_ERROR_NONE;
otMacWhitelistEntry *entry;
entry = aInstance->mThreadNetif.GetMac().GetWhitelist().Add(*reinterpret_cast<const Mac::ExtAddress *>(aExtAddr));
VerifyOrExit(entry != NULL, error = OT_ERROR_NO_BUFS);
aInstance->mThreadNetif.GetMac().GetWhitelist().SetFixedRssi(*entry, aRssi);
VerifyOrExit(aExtAddress != NULL, error = OT_ERROR_INVALID_ARGS);
error = aInstance->mThreadNetif.GetMac().GetFilter().AddAddress(*static_cast<const Mac::ExtAddress *>(aExtAddress));
exit:
return error;
}
void otLinkRemoveWhitelist(otInstance *aInstance, const uint8_t *aExtAddr)
{
aInstance->mThreadNetif.GetMac().GetWhitelist().Remove(*reinterpret_cast<const Mac::ExtAddress *>(aExtAddr));
}
void otLinkClearWhitelist(otInstance *aInstance)
{
aInstance->mThreadNetif.GetMac().GetWhitelist().Clear();
}
otError otLinkGetWhitelistEntry(otInstance *aInstance, uint8_t aIndex, otMacWhitelistEntry *aEntry)
otError otLinkFilterRemoveAddress(otInstance *aInstance, const otExtAddress *aExtAddress)
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aEntry != NULL, error = OT_ERROR_INVALID_ARGS);
error = aInstance->mThreadNetif.GetMac().GetWhitelist().GetEntry(aIndex, *aEntry);
VerifyOrExit(aExtAddress != NULL, error = OT_ERROR_INVALID_ARGS);
error = aInstance->mThreadNetif.GetMac().GetFilter().RemoveAddress(
*static_cast<const Mac::ExtAddress *>(aExtAddress));
exit:
return error;
}
void otLinkSetWhitelistEnabled(otInstance *aInstance, bool aEnabled)
void otLinkFilterClearAddresses(otInstance *aInstance)
{
aInstance->mThreadNetif.GetMac().GetWhitelist().SetEnabled(aEnabled);
return aInstance->mThreadNetif.GetMac().GetFilter().ClearAddresses();
}
bool otLinkIsWhitelistEnabled(otInstance *aInstance)
otError otLinkFilterGetNextAddress(otInstance *aInstance, otMacFilterIterator *aIterator, otMacFilterEntry *aEntry)
{
return aInstance->mThreadNetif.GetMac().GetWhitelist().IsEnabled();
}
otError otLinkAddBlacklist(otInstance *aInstance, const uint8_t *aExtAddr)
{
otError error = OT_ERROR_NONE;
if (aInstance->mThreadNetif.GetMac().GetBlacklist().Add(*reinterpret_cast<const Mac::ExtAddress *>(aExtAddr)) == NULL)
{
error = OT_ERROR_NO_BUFS;
}
VerifyOrExit(aIterator != NULL && aEntry != NULL, error = OT_ERROR_INVALID_ARGS);
return error;
}
void otLinkRemoveBlacklist(otInstance *aInstance, const uint8_t *aExtAddr)
{
aInstance->mThreadNetif.GetMac().GetBlacklist().Remove(*reinterpret_cast<const Mac::ExtAddress *>(aExtAddr));
}
void otLinkClearBlacklist(otInstance *aInstance)
{
aInstance->mThreadNetif.GetMac().GetBlacklist().Clear();
}
otError otLinkGetBlacklistEntry(otInstance *aInstance, uint8_t aIndex, otMacBlacklistEntry *aEntry)
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aEntry != NULL, error = OT_ERROR_INVALID_ARGS);
error = aInstance->mThreadNetif.GetMac().GetBlacklist().GetEntry(aIndex, *aEntry);
error = aInstance->mThreadNetif.GetMac().GetFilter().GetNextAddress(*aIterator, *aEntry);
exit:
return error;
}
void otLinkSetBlacklistEnabled(otInstance *aInstance, bool aEnabled)
otError otLinkFilterAddRssIn(otInstance *aInstance, const otExtAddress *aExtAddress, int8_t aRss)
{
aInstance->mThreadNetif.GetMac().GetBlacklist().SetEnabled(aEnabled);
return aInstance->mThreadNetif.GetMac().GetFilter().AddRssIn(
static_cast<const Mac::ExtAddress *>(aExtAddress), aRss);
}
bool otLinkIsBlacklistEnabled(otInstance *aInstance)
otError otLinkFilterRemoveRssIn(otInstance *aInstance, const otExtAddress *aExtAddress)
{
return aInstance->mThreadNetif.GetMac().GetBlacklist().IsEnabled();
return aInstance->mThreadNetif.GetMac().GetFilter().RemoveRssIn(static_cast<const Mac::ExtAddress *>(aExtAddress));
}
otError otLinkGetAssignLinkQuality(otInstance *aInstance, const uint8_t *aExtAddr, uint8_t *aLinkQuality)
void otLinkFilterClearRssIn(otInstance *aInstance)
{
Mac::ExtAddress extAddress;
memset(&extAddress, 0, sizeof(extAddress));
memcpy(extAddress.m8, aExtAddr, OT_EXT_ADDRESS_SIZE);
return aInstance->mThreadNetif.GetMle().GetAssignLinkQuality(extAddress, *aLinkQuality);
aInstance->mThreadNetif.GetMac().GetFilter().ClearRssIn();
}
void otLinkSetAssignLinkQuality(otInstance *aInstance, const uint8_t *aExtAddr, uint8_t aLinkQuality)
otError otLinkFilterGetNextRssIn(otInstance *aInstance, otMacFilterIterator *aIterator, otMacFilterEntry *aEntry)
{
Mac::ExtAddress extAddress;
otError error = OT_ERROR_NONE;
memset(&extAddress, 0, sizeof(extAddress));
memcpy(extAddress.m8, aExtAddr, OT_EXT_ADDRESS_SIZE);
VerifyOrExit(aIterator != NULL && aEntry != NULL, error = OT_ERROR_INVALID_ARGS);
aInstance->mThreadNetif.GetMle().SetAssignLinkQuality(extAddress, aLinkQuality);
error = aInstance->mThreadNetif.GetMac().GetFilter().GetNextRssIn(*aIterator, *aEntry);
exit:
return error;
}
uint8_t otLinkConvertRssToLinkQuality(otInstance *aInstance, int8_t aRss)
{
return LinkQualityInfo::ConvertRssToLinkQuality(aInstance->mThreadNetif.GetMac().GetNoiseFloor(), aRss);
}
int8_t otLinkConvertLinkQualityToRss(otInstance *aInstance, uint8_t aLinkQuality)
{
return LinkQualityInfo::ConvertLinkQualityToRss(aInstance->mThreadNetif.GetMac().GetNoiseFloor(), aLinkQuality);
}
#endif // OPENTHREAD_ENABLE_MAC_FILTER
void otLinkSetPcapCallback(otInstance *aInstance, otLinkPcapCallback aPcapCallback, void *aCallbackContext)
{
aInstance->mThreadNetif.GetMac().SetPcapCallback(aPcapCallback, aCallbackContext);
@@ -296,7 +272,8 @@ otError otLinkActiveScan(otInstance *aInstance, uint32_t aScanChannels, uint16_t
{
aInstance->mActiveScanCallback = aCallback;
aInstance->mActiveScanCallbackContext = aCallbackContext;
return aInstance->mThreadNetif.GetMac().ActiveScan(aScanChannels, aScanDuration, &HandleActiveScanResult, aInstance);
return aInstance->mThreadNetif.GetMac().ActiveScan(aScanChannels, aScanDuration,
&HandleActiveScanResult, aInstance);
}
bool otLinkIsActiveScanInProgress(otInstance *aInstance)
@@ -322,7 +299,8 @@ otError otLinkEnergyScan(otInstance *aInstance, uint32_t aScanChannels, uint16_t
{
aInstance->mEnergyScanCallback = aCallback;
aInstance->mEnergyScanCallbackContext = aCallbackContext;
return aInstance->mThreadNetif.GetMac().EnergyScan(aScanChannels, aScanDuration, &HandleEnergyScanResult, aInstance);
return aInstance->mThreadNetif.GetMac().EnergyScan(aScanChannels, aScanDuration,
&HandleEnergyScanResult, aInstance);
}
void HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult)
+26 -14
View File
@@ -136,8 +136,9 @@ Mac::Mac(ThreadNetif &aThreadNetif):
mEnergyScanSampleRssiTask(aThreadNetif.GetIp6().mTaskletScheduler, &Mac::HandleEnergyScanSampleRssi, this),
mPcapCallback(NULL),
mPcapCallbackContext(NULL),
mWhitelist(),
mBlacklist(),
#if OPENTHREAD_ENABLE_MAC_FILTER
mFilter(),
#endif // OPENTHREAD_ENABLE_MAC_FILTER
mTxFrame(static_cast<Frame *>(otPlatRadioGetTransmitBuffer(aThreadNetif.GetInstance()))),
mKeyIdMode2FrameCounter(0),
#if OPENTHREAD_CONFIG_STAY_AWAKE_BETWEEN_FRAGMENTS
@@ -1468,12 +1469,13 @@ void Mac::ReceiveDoneTask(Frame *aFrame, otError aError)
Address dstaddr;
PanId panid;
Neighbor *neighbor;
otMacWhitelistEntry *whitelistEntry;
int8_t rssi;
bool receive = false;
uint8_t commandId;
bool scheduleNextTrasmission = false;
otError error = aError;
#if OPENTHREAD_ENABLE_MAC_FILTER
int8_t rssi = OT_MAC_FILTER_FIXED_RSS_DISABLED;
#endif // OPENTHREAD_ENABLE_MAC_FILTER
mCounters.mRxTotal++;
@@ -1525,22 +1527,22 @@ void Mac::ReceiveDoneTask(Frame *aFrame, otError aError)
ExitNow(error = OT_ERROR_INVALID_SOURCE_ADDRESS);
}
// Source Whitelist Processing
if (srcaddr.mLength != 0 && mWhitelist.IsEnabled())
{
VerifyOrExit((whitelistEntry = mWhitelist.Find(srcaddr.mExtAddress)) != NULL, error = OT_ERROR_WHITELIST_FILTERED);
#if OPENTHREAD_ENABLE_MAC_FILTER
if (mWhitelist.GetFixedRssi(*whitelistEntry, rssi) == OT_ERROR_NONE)
// Source filter Processing.
if (srcaddr.mLength != 0)
{
// check if filtered out by whitelist or blacklist.
SuccessOrExit(error = mFilter.Apply(srcaddr.mExtAddress, rssi));
// override with the rssi in setting
if (rssi != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
aFrame->mPower = rssi;
}
}
// Source Blacklist Processing
if (srcaddr.mLength != 0 && mBlacklist.IsEnabled())
{
VerifyOrExit((mBlacklist.Find(srcaddr.mExtAddress)) == NULL, error = OT_ERROR_BLACKLIST_FILTERED);
}
#endif // OPENTHREAD_ENABLE_MAC_FILTER
// Destination Address Filtering
aFrame->GetDstAddr(dstaddr);
@@ -1582,6 +1584,16 @@ void Mac::ReceiveDoneTask(Frame *aFrame, otError aError)
if (neighbor != NULL)
{
#if OPENTHREAD_ENABLE_MAC_FILTER
// make assigned rssi to take effect quickly
if (rssi != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
neighbor->GetLinkInfo().Clear();
}
#endif // OPENTHREAD_ENABLE_MAC_FILTER
neighbor->GetLinkInfo().AddRss(GetNoiseFloor(), aFrame->mPower);
if (aFrame->GetSecurityEnabled() == true)
+9 -15
View File
@@ -41,9 +41,8 @@
#include "common/locator.hpp"
#include "common/tasklet.hpp"
#include "common/timer.hpp"
#include "mac/mac_blacklist.hpp"
#include "mac/mac_frame.hpp"
#include "mac/mac_whitelist.hpp"
#include "mac/mac_filter.hpp"
#include "thread/key_manager.hpp"
#include "thread/network_diagnostic_tlvs.hpp"
#include "thread/topology.hpp"
@@ -482,21 +481,15 @@ public:
*/
otError SetExtendedPanId(const uint8_t *aExtPanId);
#if OPENTHREAD_ENABLE_MAC_FILTER
/**
* This method returns the MAC whitelist filter.
* This method returns the MAC filter.
*
* @returns A reference to the MAC whitelist filter.
* @returns A reference to the MAC filter.
*
*/
Whitelist &GetWhitelist(void) { return mWhitelist; }
/**
* This method returns the MAC blacklist filter.
*
* @returns A reference to the MAC blacklist filter.
*
*/
Blacklist &GetBlacklist(void) { return mBlacklist; }
Filter &GetFilter(void) { return mFilter; }
#endif // OPENTHREAD_ENABLE_MAC_FILTER
/**
* This method is called to handle receive events.
@@ -744,8 +737,9 @@ private:
otLinkPcapCallback mPcapCallback;
void *mPcapCallbackContext;
Whitelist mWhitelist;
Blacklist mBlacklist;
#if OPENTHREAD_ENABLE_MAC_FILTER
Filter mFilter;
#endif // OPENTHREAD_ENABLE_MAC_FILTER
Frame *mTxFrame;
-135
View File
@@ -1,135 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file implements blacklist IEEE 802.15.4 frame filtering based on MAC address.
*/
#include <openthread/config.h>
#include "mac_blacklist.hpp"
#include "utils/wrap_string.h"
#include "common/code_utils.hpp"
#if OPENTHREAD_ENABLE_MAC_WHITELIST
namespace ot {
namespace Mac {
Blacklist::Blacklist(void)
{
mEnabled = false;
for (int i = 0; i < kMaxEntries; i++)
{
mBlacklist[i].mValid = false;
}
}
otError Blacklist::GetEntry(uint8_t aIndex, Entry &aEntry) const
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aIndex < kMaxEntries, error = OT_ERROR_INVALID_ARGS);
memcpy(&aEntry.mExtAddress, &mBlacklist[aIndex].mExtAddress, sizeof(aEntry.mExtAddress));
aEntry.mValid = mBlacklist[aIndex].mValid;
exit:
return error;
}
Blacklist::Entry *Blacklist::Add(const ExtAddress &address)
{
Entry *rval;
VerifyOrExit((rval = Find(address)) == NULL);
for (int i = 0; i < kMaxEntries; i++)
{
if (mBlacklist[i].mValid)
{
continue;
}
memcpy(&mBlacklist[i].mExtAddress, &address, sizeof(mBlacklist[i].mExtAddress));
mBlacklist[i].mValid = true;
ExitNow(rval = &mBlacklist[i]);
}
exit:
return rval;
}
void Blacklist::Clear(void)
{
for (int i = 0; i < kMaxEntries; i++)
{
mBlacklist[i].mValid = false;
}
}
void Blacklist::Remove(const ExtAddress &address)
{
Entry *entry;
VerifyOrExit((entry = Find(address)) != NULL);
memset(entry, 0, sizeof(*entry));
exit:
return;
}
Blacklist::Entry *Blacklist::Find(const ExtAddress &address)
{
Entry *rval = NULL;
for (int i = 0; i < kMaxEntries; i++)
{
if (!mBlacklist[i].mValid)
{
continue;
}
if (memcmp(&mBlacklist[i].mExtAddress, &address, sizeof(mBlacklist[i].mExtAddress)) == 0)
{
ExitNow(rval = &mBlacklist[i]);
}
}
exit:
return rval;
}
} // namespace Mac
} // namespace ot
#endif // OPENTHREAD_ENABLE_MAC_WHITELIST
-35
View File
@@ -1,35 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <openthread/config.h>
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#include "mac_blacklist_impl.hpp"
#else
#include "mac_blacklist_stub.hpp"
#endif
-158
View File
@@ -1,158 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for IEEE 802.15.4 frame filtering based on MAC address.
*/
#ifndef MAC_BLACKLIST_HPP_
#define MAC_BLACKLIST_HPP_
#include "utils/wrap_stdint.h"
#include <openthread/types.h>
#include "mac/mac_frame.hpp"
namespace ot {
namespace Mac {
/**
* @addtogroup core-mac
*
* @{
*
*/
/**
* This class implements blacklist filtering on IEEE 802.15.4 frames.
*
*/
class Blacklist
{
public:
typedef otMacBlacklistEntry Entry;
enum
{
kMaxEntries = OPENTHREAD_CONFIG_MAC_BLACKLIST_SIZE,
};
/**
* This constructor initializes the blacklist filter.
*
*/
Blacklist(void);
/**
* This method indicates whether or not the blacklist filter is enabled.
*
* @retval TRUE If the blacklist filter is enabled.
* @retval FALSE If the blacklist filter is disabled.
*
*/
bool IsEnabled(void) const { return mEnabled; }
/**
* This method enables the blacklist filter.
*
* @param[in] aEnabled TRUE to enable the blacklist filter, FALSE otherwise.
*
*/
void SetEnabled(bool aEnabled) { mEnabled = aEnabled; }
/**
* This method returns the maximum number of blacklist entries.
*
* @returns The maximum number of blacklist entries.
*
*/
int GetMaxEntries(void) const { return kMaxEntries; }
/**
* This method gets a blacklist entry.
*
* @param[in] aIndex An index into the MAC blacklist table.
* @param[out] aEntry A reference to where the information is placed.
*
* @retval OT_ERROR_NONE Successfully retrieved the MAC blacklist entry.
* @retval OT_ERROR_INVALID_ARGS @p aIndex is out of bounds or @p aEntry is NULL.
*
*/
otError GetEntry(uint8_t aIndex, Entry &aEntry) const;
/**
* This method adds an Extended Address to the blacklist filter.
*
* @param[in] aAddress A reference to the Extended Address.
*
* @returns A pointer to the blacklist entry or NULL if there are no available entries.
*
*/
Entry *Add(const ExtAddress &aAddress);
/**
* This method removes an Extended Address to the blacklist filter.
*
* @param[in] aAddress A reference to the Extended Address.
*
*/
void Remove(const ExtAddress &aAddress);
/**
* This method removes all entries from the blacklist filter.
*
*/
void Clear(void);
/**
* This method finds a blacklist entry.
*
* @param[in] aAddress A reference to the Extended Address.
*
* @returns A pointer to the blacklist entry or NULL if the entry could not be found.
*
*/
Entry *Find(const ExtAddress &aAddress);
private:
Entry mBlacklist[kMaxEntries];
bool mEnabled;
};
/**
* @}
*
*/
} // namespace Mac
} // namespace ot
#endif // MAC_BLACKLIST_HPP_
-73
View File
@@ -1,73 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for IEEE 802.15.4 frame filtering based on MAC address.
*/
#ifndef MAC_BLACKLIST_HPP_
#define MAC_BLACKLIST_HPP_
#include "utils/wrap_stdint.h"
#include <openthread/types.h>
#include "mac/mac_frame.hpp"
namespace ot {
namespace Mac {
class Blacklist
{
public:
typedef otMacBlacklistEntry Entry;
Blacklist(void) { }
bool IsEnabled(void) const { return false; }
void SetEnabled(bool) { }
int GetMaxEntries(void) const { return 0; }
otError GetEntry(uint8_t, Entry &) const { return OT_ERROR_NOT_IMPLEMENTED; }
Entry *Add(const ExtAddress &) { return NULL; }
void Remove(const ExtAddress &) { }
void Clear(void) { }
Entry *Find(const ExtAddress &) { return NULL; }
};
} // namespace Mac
} // namespace ot
#endif // MAC_BLACKLIST_HPP_
+291
View File
@@ -0,0 +1,291 @@
/*
* Copyright (c) 2017, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file implements Filter IEEE 802.15.4 frame filtering based on MAC address.
*/
#include <openthread/config.h>
#include "mac_filter.hpp"
#include "openthread/types.h"
#include "utils/wrap_string.h"
#include "common/code_utils.hpp"
#if OPENTHREAD_ENABLE_MAC_FILTER
namespace ot {
namespace Mac {
Filter::Filter(void) :
mAddressMode(OT_MAC_FILTER_ADDRESS_MODE_DISABLED),
mRssIn(OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
for (int i = 0; i < GetMaxEntries(); i++)
{
memset(&mEntries[i], 0, sizeof(Entry));
mEntries[i].mFiltered = false;
mEntries[i].mRssIn = OT_MAC_FILTER_FIXED_RSS_DISABLED;
}
}
Filter::Entry *Filter::FindEntry(const ExtAddress &aExtAddress)
{
Entry *entry = NULL;
for (uint8_t i = 0; i < GetMaxEntries(); i++)
{
if ((mEntries[i].mFiltered || mEntries[i].mRssIn != OT_MAC_FILTER_FIXED_RSS_DISABLED) &&
memcmp(&aExtAddress, &mEntries[i].mExtAddress, OT_EXT_ADDRESS_SIZE) == 0)
{
ExitNow(entry = &mEntries[i]);
}
}
exit:
return entry;
}
Filter::Entry *Filter::FindAvailEntry(void)
{
Entry *entry = NULL;
for (uint8_t i = 0; i < GetMaxEntries(); i++)
{
if (!mEntries[i].mFiltered && mEntries[i].mRssIn == OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
ExitNow(entry = &mEntries[i]);
}
}
exit:
return entry;
}
otError Filter::SetAddressMode(otMacFilterAddressMode aMode)
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aMode == OT_MAC_FILTER_ADDRESS_MODE_DISABLED ||
aMode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST ||
aMode == OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST,
error = OT_ERROR_INVALID_ARGS);
mAddressMode = aMode;
exit:
return error;
}
otError Filter::AddAddress(const ExtAddress &aExtAddress)
{
otError error = OT_ERROR_NONE;
Entry *entry = FindEntry(aExtAddress);
if (entry == NULL)
{
VerifyOrExit((entry = FindAvailEntry()) != NULL, error = OT_ERROR_NO_BUFS);
memcpy(&entry->mExtAddress, &aExtAddress, OT_EXT_ADDRESS_SIZE);
}
if (entry->mFiltered)
{
ExitNow(error = OT_ERROR_ALREADY);
}
entry->mFiltered = true;
exit:
return error;
}
otError Filter::RemoveAddress(const ExtAddress &aExtAddress)
{
otError error = OT_ERROR_NONE;
Entry *entry = FindEntry(aExtAddress);
if (entry == NULL || !entry->mFiltered)
{
ExitNow(error = OT_ERROR_NOT_FOUND);
}
entry->mFiltered = false;
exit:
return error;
}
void Filter::ClearAddresses(void)
{
for (uint8_t i = 0; i < GetMaxEntries(); i++)
{
mEntries[i].mFiltered = false;
}
}
otError Filter::GetNextAddress(otMacFilterIterator &aIterator, Entry &aEntry)
{
otError error = OT_ERROR_NOT_FOUND;
uint8_t i = *reinterpret_cast<uint8_t *>(&aIterator);
for (; i < GetMaxEntries(); i++)
{
if (mEntries[i].mFiltered)
{
aEntry = mEntries[i];
aIterator = *reinterpret_cast<otMacFilterIterator *>(&(++i));
ExitNow(error = OT_ERROR_NONE);
}
}
exit:
return error;
}
otError Filter::AddRssIn(const ExtAddress *aExtAddress, int8_t aRss)
{
otError error = OT_ERROR_NONE;
// set the default RssIn for all received messages.
if (aExtAddress == NULL)
{
mRssIn = aRss;
ExitNow();
}
else
{
Entry *entry = FindEntry(*aExtAddress);
if (entry == NULL)
{
VerifyOrExit((entry = FindAvailEntry()) != NULL, error = OT_ERROR_NO_BUFS);
memcpy(&entry->mExtAddress, aExtAddress, OT_EXT_ADDRESS_SIZE);
}
entry->mRssIn = aRss;
}
exit:
return error;
}
otError Filter::RemoveRssIn(const ExtAddress *aExtAddress)
{
otError error = OT_ERROR_NONE;
if (aExtAddress == NULL)
{
mRssIn = OT_MAC_FILTER_FIXED_RSS_DISABLED;
}
else
{
Entry *entry = FindEntry(*aExtAddress);
VerifyOrExit(entry != NULL, error = OT_ERROR_NOT_FOUND);
entry->mRssIn = OT_MAC_FILTER_FIXED_RSS_DISABLED;
}
exit:
return error;
}
void Filter::ClearRssIn(void)
{
mRssIn = OT_MAC_FILTER_FIXED_RSS_DISABLED;
for (uint8_t i = 0; i < GetMaxEntries(); i++)
{
mEntries[i].mRssIn = OT_MAC_FILTER_FIXED_RSS_DISABLED;
}
}
otError Filter::GetNextRssIn(otMacFilterIterator &aIterator, Entry &aEntry)
{
otError error = OT_ERROR_NOT_FOUND;
uint8_t i = *reinterpret_cast<uint8_t *>(&aIterator);
for (; i < GetMaxEntries(); i++)
{
if (mEntries[i].mRssIn != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
aEntry = mEntries[i];
aIterator = *reinterpret_cast<otMacFilterIterator *>(&(++i));
ExitNow(error = OT_ERROR_NONE);
}
}
// return default rssin setting if no more rssin filter entry.
if (i == GetMaxEntries() && mRssIn != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
memset(&aEntry.mExtAddress, 0xff, OT_EXT_ADDRESS_SIZE);
aEntry.mRssIn = mRssIn;
aIterator = *reinterpret_cast<otMacFilterIterator *>(&(++i));
ExitNow(error = OT_ERROR_NONE);
}
exit:
return error;
}
otError Filter::Apply(const ExtAddress &aExtAddress, int8_t &aRss)
{
otError error = OT_ERROR_NONE;
otMacFilterEntry *entry = FindEntry(aExtAddress);
// assign the default RssIn setting for all receiving messages first.
aRss = mRssIn;
// check AddressFilter.
if (mAddressMode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST)
{
VerifyOrExit(entry != NULL && entry->mFiltered, error = OT_ERROR_WHITELIST_FILTERED);
}
else if (mAddressMode == OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST)
{
VerifyOrExit(entry == NULL || !entry->mFiltered, error = OT_ERROR_BLACKLIST_FILTERED);
}
// not override the default RssIn setting if no specific RssIn on the Extended Address.
if (entry != NULL && entry->mRssIn != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
aRss = entry->mRssIn;
}
exit:
return error;
}
} // namespace Mac
} // namespace ot
#endif // OPENTHREAD_ENABLE_MAC_FILTER
+225
View File
@@ -0,0 +1,225 @@
/*
* Copyright (c) 2017, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for IEEE 802.15.4 frame filtering based on MAC address.
*/
#ifndef MAC_FILTER_HPP_
#define MAC_FILTER_HPP_
#include "utils/wrap_stdint.h"
#include <openthread/types.h>
#include "mac/mac_frame.hpp"
#if OPENTHREAD_ENABLE_MAC_FILTER
namespace ot {
namespace Mac {
/**
* @addtogroup core-mac
*
* @{
*
*/
/**
* This class implements Mac Filter on IEEE 802.15.4 frames.
*
*/
class Filter
{
public:
typedef otMacFilterEntry Entry;
enum
{
kMaxEntries = OPENTHREAD_CONFIG_MAC_FILTER_SIZE,
};
/**
* This constructor initializes the filter.
*
*/
Filter(void);
/**
* This method returns the maximum number of filter entries.
*
* @returns The maximum number of filter entries.
*
*/
uint8_t GetMaxEntries(void) const { return kMaxEntries; }
/**
* This function gets the address mode of the filter.
*
* @returns the address mode.
*
*/
otMacFilterAddressMode GetAddressMode(void) const { return mAddressMode; }
/**
* This function sets the address mode of the filter.
*
* @param[in] aMode The address mode to set.
*
* @retval OT_ERROR_NONE Successfully set the AddressFilter mode.
* @retval OT_ERROR_INVALID_ARGS @p aMode is not valid address mode.
*
*/
otError SetAddressMode(otMacFilterAddressMode aMode);
/**
* This method adds an Extended Address to filter.
*
* @param[in] aExtAddress A reference to the Extended Address.
*
* @retval OT_ERROR_NONE Successfully added @p aExtAddress to the filter.
* @retval OT_ERROR_ALREADY If @p aExtAddress was already in the Filter.
* @retval OT_ERROR_NO_BUFS No available entry exists.
*
*/
otError AddAddress(const ExtAddress &aExtAddress);
/**
* This method removes an Extended Address from the filter.
*
* @param[in] aExtAddress A reference to the Extended Address.
*
* @retval OT_ERROR_NONE Successfully removed @p aExtAddress from the filter.
* @retval OT_ERROR_NOT_FOUND @p aExtAddress is not in the filter.
*
*/
otError RemoveAddress(const ExtAddress &aExtAddress);
/**
* This method clears all Extended Addresses from the filter.
*
*/
void ClearAddresses(void);
/**
* This method gets an in-use address filter entry.
*
* @param[inout] aIterator A reference to the MAC filter iterator context. To get the first in-use address filter
* entry, it should be set to OT_MAC_FILTER_ITERATOR_INIT.
* @param[out] aEntry A reference to where the information is placed.
*
* @retval OT_ERROR_NONE Successfully retrieved an in-use address filter entry.
* @retval OT_ERROR_NOT_FOUND No subsequent entry exists.
*
*/
otError GetNextAddress(otMacFilterIterator &aIterator, Entry &aEntry);
/**
* This method sets the received signal strength for the messsages from the Extended Address.
* The default received signal strength for all received messages would be set if no Extended Address is specified.
*
* @param[in] aExtAddress A pointer to the Extended Address, or NULL to set the default received signal strength.
* @param[in] aRss The received signal strength to set.
*
* @retval OT_ERROR_NONE Successfully set @p aRss for @p aExtAddress, or
* set the default @p aRss for all received messages if @p aExtAddress is NULL.
* @retval OT_ERROR_NO_BUFS No available entry exists.
*
*/
otError AddRssIn(const ExtAddress *aExtAddress, int8_t aRss);
/**
* This method removes the received signal strength setting for the received messages from the Extended Address,
* or removes the default received signal strength setting if no Extended Address is specified.
*
* @param[in] aExtAddress A pointer to the Extended Address.
*
* @retval OT_ERROR_NONE Successfully removed the received signal strength setting for the received
* messages from @p aExtAddress or removed the default received signal strength
* setting if @p aExtAddress is NULL.
* @retval OT_ERROR_NOT_FOUND @p aExtAddress is not in the RssIn filter if it is not NULL.
*
*/
otError RemoveRssIn(const ExtAddress *aExtAddress);
/**
* This method clears all the received signal strength settings.
*
*/
void ClearRssIn(void);
/**
* This method gets an in-use RssIn filter entry.
*
* @param[inout] aIterator A reference to the MAC filter iterator context. To get the first in-use RssIn
* filter entry, it should be set to OT_MAC_FILTER_ITERATOR_INIT.
* @param[out] aEntry A reference to where the information is placed. The last entry would have the
* Extended Address as all 0xff to indicate the default received signal strength
* if it was set.
*
* @retval OT_ERROR_NONE Successfully retrieved the in-use RssIn filter entry.
* @retval OT_ERROR_NOT_FOUND No subsequent entry exists.
*
*/
otError GetNextRssIn(otMacFilterIterator &aIterator, Entry &aEntry);
/**
* This method applies the filter rules on the Extended Address.
*
* @param[in] aExtAddress A reference to the Extended Address.
* @param[out] aRss A reference to where the received signal strength to be placed.
*
* @retval OT_ERROR_NONE Successfully applied the filter rules on @p aExtAddress.
* @retval OT_ERROR_WHITELIST_FILTERED Whitelist is enabled and @p aExtAddress is not in the whitelist
* @retval OT_ERROR_BLACKLIST_FILTERED Blacklist is enabled and @p aExtAddress is in the blacklist
*
*/
otError Apply(const ExtAddress &aExtAddress, int8_t &aRss);
private:
Entry *FindAvailEntry(void);
Entry *FindEntry(const ExtAddress &aExtAddress);
Entry mEntries[kMaxEntries];
otMacFilterAddressMode mAddressMode;
int8_t mRssIn;
};
/**
* @}
*
*/
} // namespace Mac
} // namespace ot
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#endif // MAC_FILTER_HPP_
-160
View File
@@ -1,160 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file implements whitelist IEEE 802.15.4 frame filtering based on MAC address.
*/
#include <openthread/config.h>
#include "mac_whitelist.hpp"
#include "utils/wrap_string.h"
#include "common/code_utils.hpp"
#if OPENTHREAD_ENABLE_MAC_WHITELIST
namespace ot {
namespace Mac {
Whitelist::Whitelist(void)
{
mEnabled = false;
for (int i = 0; i < kMaxEntries; i++)
{
mWhitelist[i].mValid = false;
}
}
otError Whitelist::GetEntry(uint8_t aIndex, Entry &aEntry) const
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aIndex < kMaxEntries, error = OT_ERROR_INVALID_ARGS);
memcpy(&aEntry.mExtAddress, &mWhitelist[aIndex].mExtAddress, sizeof(aEntry.mExtAddress));
aEntry.mRssi = mWhitelist[aIndex].mRssi;
aEntry.mValid = mWhitelist[aIndex].mValid;
aEntry.mFixedRssi = mWhitelist[aIndex].mFixedRssi;
exit:
return error;
}
Whitelist::Entry *Whitelist::Add(const ExtAddress &address)
{
Entry *rval;
VerifyOrExit((rval = Find(address)) == NULL);
for (int i = 0; i < kMaxEntries; i++)
{
if (mWhitelist[i].mValid)
{
continue;
}
memcpy(&mWhitelist[i].mExtAddress, &address, sizeof(mWhitelist[i].mExtAddress));
mWhitelist[i].mValid = true;
mWhitelist[i].mFixedRssi = false;
ExitNow(rval = &mWhitelist[i]);
}
exit:
return rval;
}
void Whitelist::Clear(void)
{
for (int i = 0; i < kMaxEntries; i++)
{
mWhitelist[i].mValid = false;
}
}
void Whitelist::Remove(const ExtAddress &address)
{
Entry *entry;
VerifyOrExit((entry = Find(address)) != NULL);
memset(entry, 0, sizeof(*entry));
exit:
return;
}
Whitelist::Entry *Whitelist::Find(const ExtAddress &address)
{
Entry *rval = NULL;
for (int i = 0; i < kMaxEntries; i++)
{
if (!mWhitelist[i].mValid)
{
continue;
}
if (memcmp(&mWhitelist[i].mExtAddress, &address, sizeof(mWhitelist[i].mExtAddress)) == 0)
{
ExitNow(rval = &mWhitelist[i]);
}
}
exit:
return rval;
}
void Whitelist::ClearFixedRssi(Entry &aEntry)
{
aEntry.mFixedRssi = false;
}
otError Whitelist::GetFixedRssi(Entry &aEntry, int8_t &rssi) const
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aEntry.mValid && aEntry.mFixedRssi, error = OT_ERROR_INVALID_ARGS);
rssi = aEntry.mRssi;
exit:
return error;
}
void Whitelist::SetFixedRssi(Entry &aEntry, int8_t aRssi)
{
aEntry.mFixedRssi = true;
aEntry.mRssi = aRssi;
}
} // namespace Mac
} // namespace ot
#endif // OPENTHREAD_ENABLE_MAC_WHITELIST
-35
View File
@@ -1,35 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <openthread/config.h>
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#include "mac_whitelist_impl.hpp"
#else
#include "mac_whitelist_stub.hpp"
#endif
-187
View File
@@ -1,187 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for IEEE 802.15.4 frame filtering based on MAC address.
*/
#ifndef MAC_WHITELIST_HPP_
#define MAC_WHITELIST_HPP_
#include "utils/wrap_stdint.h"
#include <openthread/types.h>
#include "mac/mac_frame.hpp"
namespace ot {
namespace Mac {
/**
* @addtogroup core-mac
*
* @{
*
*/
/**
* This class implements whitelist filtering on IEEE 802.15.4 frames.
*
*/
class Whitelist
{
public:
typedef otMacWhitelistEntry Entry;
enum
{
kMaxEntries = OPENTHREAD_CONFIG_MAC_WHITELIST_SIZE,
};
/**
* This constructor initializes the whitelist filter.
*
*/
Whitelist(void);
/**
* This method indicates whether or not the whitelist filter is enabled.
*
* @retval TRUE If the whitelist filter is enabled.
* @retval FALSE If the whitelist filter is disabled.
*
*/
bool IsEnabled(void) const { return mEnabled; }
/**
* This method enables the whitelist filter.
*
* @param[in] aEnabled TRUE to enable the whitelist filter, FALSE otherwise.
*
*/
void SetEnabled(bool aEnabled) { mEnabled = aEnabled; }
/**
* This method returns the maximum number of whitelist entries.
*
* @returns The maximum number of whitelist entries.
*
*/
int GetMaxEntries(void) const { return kMaxEntries; }
/**
* This method gets a whitelist entry.
*
* @param[in] aIndex An index into the MAC whitelist table.
* @param[out] aEntry A reference to where the information is placed.
*
* @retval OT_ERROR_NONE Successfully retrieved the MAC whitelist entry.
* @retval OT_ERROR_INVALID_ARGS @p aIndex is out of bounds or @p aEntry is NULL.
*
*/
otError GetEntry(uint8_t aIndex, Entry &aEntry) const;
/**
* This method adds an Extended Address to the whitelist filter.
*
* @param[in] aAddress A reference to the Extended Address.
*
* @returns A pointer to the whitelist entry or NULL if there are no available entries.
*
*/
Entry *Add(const ExtAddress &aAddress);
/**
* This method removes an Extended Address to the whitelist filter.
*
* @param[in] aAddress A reference to the Extended Address.
*
*/
void Remove(const ExtAddress &aAddress);
/**
* This method removes all entries from the whitelist filter.
*
*/
void Clear(void);
/**
* This method finds a whitelist entry.
*
* @param[in] aAddress A reference to the Extended Address.
*
* @returns A pointer to the whitelist entry or NULL if the entry could not be found.
*
*/
Entry *Find(const ExtAddress &aAddress);
/**
* This method clears the fixed RSSI value and uses the measured value provided by the radio instead.
*
* @param[in] aEntry A reference to the whitelist entry.
*
*/
void ClearFixedRssi(Entry &aEntry);
/**
* This method indicates whether or not the fixed RSSI is set.
*
* @param[in] aEntry A reference to the whitelist entry.
* @param[out] aRssi A reference to the RSSI variable.
*
* @retval OT_ERROR_NONE A fixed RSSI is set and written to @p aRssi.
* @retval OT_ERROR_INVALID_ARGS A fixed RSSI was not set.
*
*/
otError GetFixedRssi(Entry &aEntry, int8_t &aRssi) const;
/**
* This method sets a fixed RSSI value for all received messages matching @p aEntry.
*
* @param[in] aEntry A reference to the whitelist entry.
* @param[in] aRssi An RSSI value in dBm.
*
*/
void SetFixedRssi(Entry &aEntry, int8_t aRssi);
private:
Entry mWhitelist[kMaxEntries];
bool mEnabled;
};
/**
* @}
*
*/
} // namespace Mac
} // namespace ot
#endif // MAC_WHITELIST_HPP_
-79
View File
@@ -1,79 +0,0 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for IEEE 802.15.4 frame filtering based on MAC address.
*/
#ifndef MAC_WHITELIST_HPP_
#define MAC_WHITELIST_HPP_
#include "utils/wrap_stdint.h"
#include <openthread/types.h>
#include "mac/mac_frame.hpp"
namespace ot {
namespace Mac {
class Whitelist
{
public:
typedef otMacWhitelistEntry Entry;
Whitelist(void) { }
bool IsEnabled(void) const { return false; }
void SetEnabled(bool) { }
int GetMaxEntries(void) const { return 0; }
otError GetEntry(uint8_t, Entry &) const { return OT_ERROR_NOT_IMPLEMENTED; }
Entry *Add(const ExtAddress &) { return NULL; }
void Remove(const ExtAddress &) { }
void Clear(void) { }
Entry *Find(const ExtAddress &) { return NULL; }
void ClearFixedRssi(Entry &) { }
otError GetFixedRssi(Entry &, int8_t &) const { return OT_ERROR_NOT_IMPLEMENTED; }
void SetFixedRssi(Entry &, int8_t) { }
};
} // namespace Mac
} // namespace ot
#endif // MAC_WHITELIST_HPP_
+5 -15
View File
@@ -402,24 +402,14 @@
#endif // OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT
/**
* @def OPENTHREAD_CONFIG_MAC_BLACKLIST_SIZE
* @def OPENTHREAD_CONFIG_MAC_FILTER_SIZE
*
* The number if MAC blacklist entries.
* The number of MAC Filter entries.
*
*/
#ifndef OPENTHREAD_CONFIG_MAC_BLACKLIST_SIZE
#define OPENTHREAD_CONFIG_MAC_BLACKLIST_SIZE 32
#endif // OPENTHREAD_CONFIG_MAC_BLACKLIST_SIZE
/**
* @def OPENTHREAD_CONFIG_MAC_WHITELIST_SIZE
*
* The number if MAC whitelist entries.
*
*/
#ifndef OPENTHREAD_CONFIG_MAC_WHITELIST_SIZE
#define OPENTHREAD_CONFIG_MAC_WHITELIST_SIZE 32
#endif // OPENTHREAD_CONFIG_MAC_WHITELIST_SIZE
#ifndef OPENTHREAD_CONFIG_MAC_FILTER_SIZE
#define OPENTHREAD_CONFIG_MAC_FILTER_SIZE 32
#endif // OPENTHREAD_CONFIG_MAC_FILTER_SIZE
/**
* @def OPENTHREAD_CONFIG_STORE_FRAME_COUNTER_AHEAD
+26
View File
@@ -199,6 +199,32 @@ uint8_t LinkQualityInfo::ConvertRssToLinkQuality(int8_t aNoiseFloor, int8_t aRss
return ConvertLinkMarginToLinkQuality(ConvertRssToLinkMargin(aNoiseFloor, aRss));
}
int8_t LinkQualityInfo::ConvertLinkQualityToRss(int8_t aNoiseFloor, uint8_t aLinkQuality)
{
uint8_t linkmargin = 0;
switch (aLinkQuality)
{
case 3:
linkmargin = kLinkQuality3LinkMargin;
break;
case 2:
linkmargin = kLinkQuality2LinkMargin;
break;
case 1:
linkmargin = kLinkQuality1LinkMargin;
break;
default:
linkmargin = kLinkQuality0LinkMargin;
break;
}
return linkmargin + aNoiseFloor;
}
uint8_t LinkQualityInfo::CalculateLinkQuality(uint8_t aLinkMargin, uint8_t aLastLinkQuality)
{
uint8_t threshold1, threshold2, threshold3;
+20
View File
@@ -160,6 +160,7 @@ private:
*/
class LinkQualityInfo
{
public:
enum
{
@@ -284,6 +285,18 @@ public:
*/
static uint8_t ConvertRssToLinkQuality(int8_t aNoiseFloor, int8_t aRss);
/**
* This method converts a link quality value to a typical received signal strength value .
* @note only for test
*
* @param[in] aNoiseFloor The noise floor value (in dBm).
* @param[in] aLinkQuality The link quality value in [0, 3].
*
* @returns The typical platform rssi.
*
*/
static int8_t ConvertLinkQualityToRss(int8_t aNoiseFloor, uint8_t aLinkQuality);
private:
enum
{
@@ -294,6 +307,13 @@ private:
kThreshold1 = 2, // Link margin threshold for quality 1 link.
kHysteresisThreshold = 2, // Link margin hysteresis threshold.
// constants for test:
kLinkQuality3LinkMargin = 50, ///< link margin for Link Quality 3 (21 - 255)
kLinkQuality2LinkMargin = 15, ///< link margin for Link Quality 3 (21 - 255)
kLinkQuality1LinkMargin = 5, ///< link margin for Link Quality 3 (21 - 255)
kLinkQuality0LinkMargin = 0, ///< link margin for Link Quality 3 (21 - 255)
kNoLinkQuality = 0xff, // Used to indicate that there is no previous/last link quality.
};
-48
View File
@@ -66,9 +66,6 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
mRetrieveNewNetworkData(false),
mRole(OT_DEVICE_ROLE_DISABLED),
mDeviceMode(ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeSecureDataRequest),
isAssignLinkQuality(false),
mAssignLinkQuality(0),
mAssignLinkMargin(0),
mParentRequestState(kParentIdle),
mReattachState(kReattachStop),
mParentRequestTimer(aThreadNetif.GetIp6(), &Mle::HandleParentRequestTimer, this),
@@ -170,8 +167,6 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
mNetifCallback.Set(&Mle::HandleNetifStateChanged, this);
aThreadNetif.RegisterCallback(mNetifCallback);
memset(&mAddr64, 0, sizeof(mAddr64));
}
otError Mle::Enable(void)
@@ -888,49 +883,6 @@ exit:
return error;
}
otError Mle::GetAssignLinkQuality(const Mac::ExtAddress aMacAddr, uint8_t &aLinkQuality)
{
otError error;
VerifyOrExit((memcmp(aMacAddr.m8, mAddr64.m8, OT_EXT_ADDRESS_SIZE)) == 0, error = OT_ERROR_INVALID_ARGS);
aLinkQuality = mAssignLinkQuality;
return OT_ERROR_NONE;
exit:
return error;
}
void Mle::SetAssignLinkQuality(const Mac::ExtAddress aMacAddr, uint8_t aLinkQuality)
{
isAssignLinkQuality = true;
mAddr64 = aMacAddr;
mAssignLinkQuality = aLinkQuality;
switch (aLinkQuality)
{
case 3:
mAssignLinkMargin = kMinAssignedLinkMargin3;
break;
case 2:
mAssignLinkMargin = kMinAssignedLinkMargin2;
break;
case 1:
mAssignLinkMargin = kMinAssignedLinkMargin1;
break;
case 0:
mAssignLinkMargin = kMinAssignedLinkMargin0;
default:
break;
}
}
void Mle::GenerateNonce(const Mac::ExtAddress &aMacAddr, uint32_t aFrameCounter, uint8_t aSecurityLevel,
uint8_t *aNonce)
{
-26
View File
@@ -822,27 +822,6 @@ public:
*/
otError GetLeaderData(otLeaderData &aLeaderData);
/**
* This method returns the link quality on the link to a given extended address.
*
* @param[in] aMacAddr The IEEE 802.15.4 Extended Mac Address.
* @param[in] aLinkQuality A reference to the assigned link quality.
*
* @retval OT_ERROR_NONE Successfully retrieve the link quality to aLinkQuality.
* @retval OT_ERROR_INVALID_ARGS No match found with a given extended address.
*
*/
otError GetAssignLinkQuality(const Mac::ExtAddress aMacAddr, uint8_t &aLinkQuality);
/**
* This method sets the link quality on the link to a given extended address.
*
* @param[in] aMacAddr The IEEE 802.15.4 Extended Mac Address.
* @param[in] aLinkQaulity The link quality to be set on the link.
*
*/
void SetAssignLinkQuality(const Mac::ExtAddress aMacAddr, uint8_t aLinkQuality);
/**
* This method returns the Child ID portion of an RLOC16.
*
@@ -1317,11 +1296,6 @@ protected:
Router mParent; ///< Parent information.
uint8_t mDeviceMode; ///< Device mode setting.
bool isAssignLinkQuality; ///< Indicating an assigned link quality is used on the link
uint8_t mAssignLinkQuality; ///< The assigned link quality value
uint8_t mAssignLinkMargin; ///< The maximum link margin corresponding to mAssignLinkQuality
Mac::ExtAddress mAddr64; ///< A given IEEE 802.15.4 Extended Address
/**
* States when searching for a parent.
*
-9
View File
@@ -125,15 +125,6 @@ enum
kLinkQuality0LinkCost = 16, ///< Link Cost for Link Quality 0
};
// add for certification testing
enum
{
kMinAssignedLinkMargin3 = 0x15, ///< minimal link margin for Link Quality 3 (21 - 255)
kMinAssignedLinkMargin2 = 0x0b, ///< minimal link margin for Link Quality 2 (11 - 20)
kMinAssignedLinkMargin1 = 0x03, ///< minimal link margin for Link Quality 1 (3 - 9)
kMinAssignedLinkMargin0 = 0x00, ///< minimal link margin for Link Quality 0 (0 - 2)
};
/**
* Multicast Forwarding Constants
*
+3 -35
View File
@@ -784,13 +784,6 @@ otError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neighbor
// always append a link margin, regardless of whether or not it was requested
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(GetNetif().GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
// add for certification testing
if (isAssignLinkQuality && aNeighbor != NULL &&
(memcmp(&aNeighbor->GetExtAddress(), mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0))
{
linkMargin = mAssignLinkMargin;
}
SuccessOrExit(error = AppendLinkMargin(*message, linkMargin));
if (aNeighbor != NULL && IsActiveRouter(aNeighbor->GetRloc16()))
@@ -1130,12 +1123,6 @@ uint8_t MleRouter::GetLinkCost(uint8_t aRouterId)
rval = router->GetLinkQualityOut();
}
// add for certification testing
if (isAssignLinkQuality && (memcmp(&router->GetExtAddress(), mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0))
{
rval = mAssignLinkQuality;
}
rval = LinkQualityToCost(rval);
exit:
@@ -1924,18 +1911,8 @@ otError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &challen
aChild->GenerateChallenge();
SuccessOrExit(error = AppendChallenge(*message, aChild->GetChallenge(), aChild->GetChallengeSize()));
if (isAssignLinkQuality &&
(memcmp(mAddr64.m8, &aChild->GetExtAddress(), OT_EXT_ADDRESS_SIZE) == 0))
{
// use assigned one to ensure the link quality
SuccessOrExit(error = AppendLinkMargin(*message, mAssignLinkMargin));
}
else
{
error = AppendLinkMargin(*message, aChild->GetLinkInfo().GetLinkMargin(GetNetif().GetMac().GetNoiseFloor()));
SuccessOrExit(error);
}
error = AppendLinkMargin(*message, aChild->GetLinkInfo().GetLinkMargin(GetNetif().GetMac().GetNoiseFloor()));
SuccessOrExit(error);
SuccessOrExit(error = AppendConnectivity(*message));
SuccessOrExit(error = AppendVersion(*message));
@@ -4459,16 +4436,7 @@ void MleRouter::FillRouteTlv(RouteTlv &tlv)
tlv.SetRouteCost(routeCount, cost);
tlv.SetLinkQualityOut(routeCount, mRouters[i].GetLinkQualityOut());
if (isAssignLinkQuality &&
(memcmp(&mRouters[i].GetExtAddress(), mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0))
{
tlv.SetLinkQualityIn(routeCount, mAssignLinkQuality);
}
else
{
tlv.SetLinkQualityIn(routeCount, mRouters[i].GetLinkInfo().GetLinkQuality());
}
tlv.SetLinkQualityIn(routeCount, mRouters[i].GetLinkInfo().GetLinkQuality());
}
routeCount++;
+295 -100
View File
@@ -79,8 +79,6 @@ namespace ot {
#define NCP_CHANGED_THREAD_ON_MESH_NETS (1U << 30)
#define NCP_CHANGED_THREAD_OFF_MESH_ROUTES (1U << 29)
#define RSSI_OVERRIDE_DISABLED 127 // Used for PROP_MAC_WHITELIST
#define IGNORE_RETURN_VALUE(s) do { if (s){} } while (0)
// ----------------------------------------------------------------------------
@@ -168,11 +166,12 @@ const NcpBase::GetPropertyHandlerEntry NcpBase::mGetPropertyHandlerTable[] =
#if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
NCP_GET_PROP_HANDLER_ENTRY(THREAD_COMMISSIONER_ENABLED),
#endif
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_GET_PROP_HANDLER_ENTRY(MAC_WHITELIST),
NCP_GET_PROP_HANDLER_ENTRY(MAC_WHITELIST_ENABLED),
NCP_GET_PROP_HANDLER_ENTRY(MAC_BLACKLIST),
NCP_GET_PROP_HANDLER_ENTRY(MAC_BLACKLIST_ENABLED),
NCP_GET_PROP_HANDLER_ENTRY(MAC_FIXED_RSS),
#endif
NCP_GET_PROP_HANDLER_ENTRY(THREAD_MODE),
NCP_GET_PROP_HANDLER_ENTRY(THREAD_CHILD_TIMEOUT),
@@ -304,11 +303,12 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] =
NCP_SET_PROP_HANDLER_ENTRY(IPV6_ML_PREFIX),
NCP_SET_PROP_HANDLER_ENTRY(IPV6_ICMP_PING_OFFLOAD),
NCP_SET_PROP_HANDLER_ENTRY(THREAD_RLOC16_DEBUG_PASSTHRU),
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_SET_PROP_HANDLER_ENTRY(MAC_WHITELIST),
NCP_SET_PROP_HANDLER_ENTRY(MAC_WHITELIST_ENABLED),
NCP_SET_PROP_HANDLER_ENTRY(MAC_BLACKLIST),
NCP_SET_PROP_HANDLER_ENTRY(MAC_BLACKLIST_ENABLED),
NCP_SET_PROP_HANDLER_ENTRY(MAC_FIXED_RSS),
#endif
#if OPENTHREAD_ENABLE_RAW_LINK_API
NCP_SET_PROP_HANDLER_ENTRY(MAC_SRC_MATCH_ENABLED),
@@ -380,9 +380,10 @@ const NcpBase::InsertPropertyHandlerEntry NcpBase::mInsertPropertyHandlerTable[]
#if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
NCP_INSERT_PROP_HANDLER_ENTRY(THREAD_JOINERS),
#endif
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_INSERT_PROP_HANDLER_ENTRY(MAC_WHITELIST),
NCP_INSERT_PROP_HANDLER_ENTRY(MAC_BLACKLIST),
NCP_INSERT_PROP_HANDLER_ENTRY(MAC_FIXED_RSS),
#endif
};
@@ -400,9 +401,10 @@ const NcpBase::RemovePropertyHandlerEntry NcpBase::mRemovePropertyHandlerTable[]
NCP_REMOVE_PROP_HANDLER_ENTRY(THREAD_ON_MESH_NETS),
#endif
NCP_REMOVE_PROP_HANDLER_ENTRY(THREAD_ASSISTING_PORTS),
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_REMOVE_PROP_HANDLER_ENTRY(MAC_WHITELIST),
NCP_REMOVE_PROP_HANDLER_ENTRY(MAC_BLACKLIST),
NCP_REMOVE_PROP_HANDLER_ENTRY(MAC_FIXED_RSS),
#endif
#if OPENTHREAD_FTD
NCP_REMOVE_PROP_HANDLER_ENTRY(THREAD_ACTIVE_ROUTER_IDS),
@@ -2225,7 +2227,7 @@ otError NcpBase::GetPropertyHandler_CAPS(uint8_t aHeader, spinel_prop_key_t aKey
SuccessOrExit(error = OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_NET_THREAD_1_0));
SuccessOrExit(error = OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_COUNTERS));
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
SuccessOrExit(error = OutboundFrameFeedPacked(SPINEL_DATATYPE_UINT_PACKED_S, SPINEL_CAP_MAC_WHITELIST));
#endif
@@ -3966,11 +3968,12 @@ otError NcpBase::GetPropertyHandler_DEBUG_NCP_LOG_LEVEL(uint8_t aHeader, spinel_
);
}
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
otError NcpBase::GetPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_key_t aKey)
{
otMacWhitelistEntry entry;
otMacFilterEntry entry;
otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
otError error = OT_ERROR_NONE;
mDisableStreamWrite = true;
@@ -3984,32 +3987,17 @@ otError NcpBase::GetPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_k
aKey
));
for (uint8_t i = 0; (i != 255) && (error == OT_ERROR_NONE); i++)
while (otLinkFilterGetNextAddress(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
error = otLinkGetWhitelistEntry(mInstance, i, &entry);
if (error != OT_ERROR_NONE)
{
break;
}
if (entry.mValid)
{
if (!entry.mFixedRssi)
{
entry.mRssi = RSSI_OVERRIDE_DISABLED;
}
SuccessOrExit(
SuccessOrExit(
error = OutboundFrameFeedPacked(
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S // Extended address
SPINEL_DATATYPE_INT8_S // Rssi
),
entry.mExtAddress.m8,
entry.mRssi
));
}
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S // Extended address
SPINEL_DATATYPE_INT8_S // Rss
),
entry.mExtAddress.m8,
entry.mRssIn
));
}
SuccessOrExit(error = OutboundFrameSend());
@@ -4021,18 +4009,22 @@ exit:
otError NcpBase::GetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t aHeader, spinel_prop_key_t aKey)
{
otMacFilterAddressMode mode = otLinkFilterGetAddressMode(mInstance);
bool isEnabled = (mode == OT_MAC_FILTER_ADDRESS_MODE_WHITELIST) ? true : false;
return SendPropertyUpdate(
aHeader,
SPINEL_CMD_PROP_VALUE_IS,
aKey,
SPINEL_DATATYPE_BOOL_S,
otLinkIsWhitelistEnabled(mInstance)
isEnabled
);
}
otError NcpBase::GetPropertyHandler_MAC_BLACKLIST(uint8_t aHeader, spinel_prop_key_t aKey)
{
otMacBlacklistEntry entry;
otMacFilterEntry entry;
otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
otError error = OT_ERROR_NONE;
mDisableStreamWrite = true;
@@ -4046,25 +4038,15 @@ otError NcpBase::GetPropertyHandler_MAC_BLACKLIST(uint8_t aHeader, spinel_prop_k
aKey
));
for (uint8_t i = 0; (i != 255) && (error == OT_ERROR_NONE); i++)
while (otLinkFilterGetNextAddress(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
error = otLinkGetBlacklistEntry(mInstance, i, &entry);
if (error != OT_ERROR_NONE)
{
break;
}
if (entry.mValid)
{
SuccessOrExit(
SuccessOrExit(
error = OutboundFrameFeedPacked(
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S // Extended address
),
entry.mExtAddress.m8
));
}
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S // Extended address
),
entry.mExtAddress.m8
));
}
SuccessOrExit(error = OutboundFrameSend());
@@ -4076,17 +4058,56 @@ exit:
otError NcpBase::GetPropertyHandler_MAC_BLACKLIST_ENABLED(uint8_t aHeader, spinel_prop_key_t aKey)
{
otMacFilterAddressMode mode = otLinkFilterGetAddressMode(mInstance);
bool isEnabled = (mode == OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST) ? true : false;
return SendPropertyUpdate(
aHeader,
SPINEL_CMD_PROP_VALUE_IS,
aKey,
SPINEL_DATATYPE_BOOL_S,
otLinkIsBlacklistEnabled(mInstance)
isEnabled
);
}
otError NcpBase::GetPropertyHandler_MAC_FIXED_RSS(uint8_t aHeader, spinel_prop_key_t aKey)
{
otMacFilterEntry entry;
otMacFilterIterator iterator = OT_MAC_FILTER_ITERATOR_INIT;
otError error = OT_ERROR_NONE;
#endif // OPENTHREAD_ENABLE_MAC_WHITELIST
mDisableStreamWrite = true;
SuccessOrExit(error = OutboundFrameBegin(aHeader));
SuccessOrExit(
error = OutboundFrameFeedPacked(
SPINEL_DATATYPE_COMMAND_PROP_S,
aHeader,
SPINEL_CMD_PROP_VALUE_IS,
aKey
));
while (otLinkFilterGetNextRssIn(mInstance, &iterator, &entry) == OT_ERROR_NONE)
{
SuccessOrExit(
error = OutboundFrameFeedPacked(
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S // Extended address
SPINEL_DATATYPE_INT8_S // Rss
),
entry.mExtAddress.m8,
entry.mRssIn
));
}
SuccessOrExit(error = OutboundFrameSend());
exit:
mDisableStreamWrite = false;
return error;
}
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#if OPENTHREAD_FTD
otError NcpBase::GetPropertyHandler_NET_PSKC(uint8_t aHeader, spinel_prop_key_t aKey)
@@ -5700,7 +5721,7 @@ exit:
#endif // OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
otError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_key_t aKey, const uint8_t *aValuePtr,
uint16_t aValueLen)
@@ -5709,13 +5730,13 @@ otError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_k
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
// First, clear the whitelist.
otLinkClearWhitelist(mInstance);
// First, clear the address filter entries.
otLinkFilterClearAddresses(mInstance);
while (aValueLen > 0)
{
otExtAddress *extAddress = NULL;
int8_t rssi = RSSI_OVERRIDE_DISABLED;
int8_t rss;
parsedLength = spinel_datatype_unpack(
aValuePtr,
@@ -5725,12 +5746,12 @@ otError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_k
SPINEL_DATATYPE_INT8_S
),
&extAddress,
&rssi
&rss
);
if (parsedLength <= 0)
{
rssi = RSSI_OVERRIDE_DISABLED;
rss = OT_MAC_FILTER_FIXED_RSS_DISABLED;
parsedLength = spinel_datatype_unpack(
aValuePtr,
aValueLen,
@@ -5743,13 +5764,13 @@ otError NcpBase::SetPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_k
VerifyOrExit(parsedLength > 0, error = OT_ERROR_PARSE);
if (rssi == RSSI_OVERRIDE_DISABLED)
error = otLinkFilterAddAddress(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE || error == OT_ERROR_ALREADY);
if (rss != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
SuccessOrExit(error = otLinkAddWhitelist(mInstance, extAddress->m8));
}
else
{
SuccessOrExit(error = otLinkAddWhitelistRssi(mInstance, extAddress->m8, rssi));
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, extAddress, rss));
}
aValuePtr += parsedLength;
@@ -5761,7 +5782,7 @@ exit:
// the state of the whitelist---so we need to report
// those incomplete changes via an asynchronous
// change event.
reportAsync = (error != OT_ERROR_NONE);
reportAsync = (error != OT_ERROR_NONE && error != OT_ERROR_ALREADY);
error = SendSetPropertyResponse(aHeader, aKey, error);
@@ -5779,6 +5800,7 @@ otError NcpBase::SetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t aHeader, spine
bool enabled;
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
otMacFilterAddressMode mode = OT_MAC_FILTER_ADDRESS_MODE_DISABLED;
parsedLength = spinel_datatype_unpack(
aValuePtr,
@@ -5789,7 +5811,12 @@ otError NcpBase::SetPropertyHandler_MAC_WHITELIST_ENABLED(uint8_t aHeader, spine
VerifyOrExit(parsedLength > 0, error = OT_ERROR_PARSE);
otLinkSetWhitelistEnabled(mInstance, enabled);
if (enabled)
{
mode = OT_MAC_FILTER_ADDRESS_MODE_WHITELIST;
}
error = otLinkFilterSetAddressMode(mInstance, mode);
exit:
return SendSetPropertyResponse(aHeader, aKey, error);
@@ -5802,12 +5829,12 @@ otError NcpBase::SetPropertyHandler_MAC_BLACKLIST(uint8_t aHeader, spinel_prop_k
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
// First, clear the blacklist.
otLinkClearBlacklist(mInstance);
// First, clear the address filter entries.
otLinkFilterClearAddresses(mInstance);
while (aValueLen > 0)
{
otExtAddress *ext_addr = NULL;
otExtAddress *extAddress = NULL;
parsedLength = spinel_datatype_unpack(
aValuePtr,
@@ -5815,12 +5842,14 @@ otError NcpBase::SetPropertyHandler_MAC_BLACKLIST(uint8_t aHeader, spinel_prop_k
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S
),
&ext_addr
&extAddress
);
VerifyOrExit(parsedLength > 0, error = OT_ERROR_PARSE);
SuccessOrExit(error = otLinkAddBlacklist(mInstance, ext_addr->m8));
error = otLinkFilterRemoveAddress(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE || error == OT_ERROR_ALREADY);
aValuePtr += parsedLength;
aValueLen -= parsedLength;
@@ -5831,7 +5860,7 @@ exit:
// the state of the blacklist---so we need to report
// those incomplete changes via an asynchronous
// change event.
reportAsync = (error != OT_ERROR_NONE);
reportAsync = (error != OT_ERROR_NONE && error != OT_ERROR_ALREADY);
error = SendSetPropertyResponse(aHeader, aKey, error);
@@ -5849,6 +5878,7 @@ otError NcpBase::SetPropertyHandler_MAC_BLACKLIST_ENABLED(uint8_t aHeader, spine
bool enabled;
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
otMacFilterAddressMode mode = OT_MAC_FILTER_ADDRESS_MODE_DISABLED;
parsedLength = spinel_datatype_unpack(
aValuePtr,
@@ -5859,13 +5889,82 @@ otError NcpBase::SetPropertyHandler_MAC_BLACKLIST_ENABLED(uint8_t aHeader, spine
VerifyOrExit(parsedLength > 0, error = OT_ERROR_PARSE);
otLinkSetBlacklistEnabled(mInstance, enabled);
if (enabled)
{
mode = OT_MAC_FILTER_ADDRESS_MODE_BLACKLIST;
}
error = otLinkFilterSetAddressMode(mInstance, mode);
exit:
return SendSetPropertyResponse(aHeader, aKey, error);
}
#endif // OPENTHREAD_ENABLE_MAC_WHITELIST
otError NcpBase::SetPropertyHandler_MAC_FIXED_RSS(uint8_t aHeader, spinel_prop_key_t aKey, const uint8_t *aValuePtr,
uint16_t aValueLen)
{
bool reportAsync;
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
// First, clear the address filter entries.
otLinkFilterClearRssIn(mInstance);
while (aValueLen > 0)
{
otExtAddress *extAddress;
int8_t rss;
parsedLength = spinel_datatype_unpack(
aValuePtr,
aValueLen,
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_EUI64_S
SPINEL_DATATYPE_INT8_S
),
&extAddress,
&rss
);
if (parsedLength < 0)
{
extAddress = NULL;
parsedLength = spinel_datatype_unpack(
aValuePtr,
aValueLen,
SPINEL_DATATYPE_STRUCT_S(
SPINEL_DATATYPE_INT8_S
),
&rss
);
}
VerifyOrExit(parsedLength > 0, error = OT_ERROR_PARSE);
SuccessOrExit(error = otLinkFilterAddRssIn(mInstance, extAddress, rss));
aValuePtr += parsedLength;
aValueLen -= parsedLength;
}
exit:
// If we had an error, we may have actually changed
// the state of the RssIn filter---so we need to report
// those incomplete changes via an asynchronous
// change event.
reportAsync = (error != OT_ERROR_NONE);
error = SendSetPropertyResponse(aHeader, aKey, error);
if (reportAsync)
{
HandleCommandPropertyGet(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, aKey);
}
return error;
}
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#if OPENTHREAD_ENABLE_RAW_LINK_API
@@ -6569,8 +6668,7 @@ otError NcpBase::InsertPropertyHandler_MAC_SRC_MATCH_SHORT_ADDRESSES(uint8_t aHe
error = otLinkRawSrcMatchAddShortEntry(mInstance, short_address);
VerifyOrExit(error == OT_ERROR_NONE,
spinelError = ThreadErrorToSpinelStatus(error));
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
@@ -6609,8 +6707,7 @@ otError NcpBase::InsertPropertyHandler_MAC_SRC_MATCH_EXTENDED_ADDRESSES(uint8_t
error = otLinkRawSrcMatchAddExtEntry(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE,
spinelError = ThreadErrorToSpinelStatus(error));
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
@@ -6668,8 +6765,7 @@ otError NcpBase::InsertPropertyHandler_IPV6_ADDRESS_TABLE(uint8_t aHeader, spine
error = otIp6AddUnicastAddress(mInstance, &netifAddr);
VerifyOrExit(error == OT_ERROR_NONE,
spinelError = ThreadErrorToSpinelStatus(error));
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
@@ -6852,7 +6948,7 @@ exit:
return error;
}
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
otError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_key_t aKey,
const uint8_t *aValuePtr, uint16_t aValueLen)
@@ -6861,7 +6957,7 @@ otError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_pro
otError error = OT_ERROR_NONE;
spinel_status_t spinelError = SPINEL_STATUS_OK;
otExtAddress *extAddress = NULL;
int8_t rssi = RSSI_OVERRIDE_DISABLED;
int8_t rss = OT_MAC_FILTER_FIXED_RSS_DISABLED;
if (aValueLen > static_cast<spinel_ssize_t>(sizeof(otExtAddress)))
{
@@ -6870,7 +6966,7 @@ otError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_pro
aValueLen,
SPINEL_DATATYPE_EUI64_S SPINEL_DATATYPE_INT8_S,
&extAddress,
&rssi
&rss
);
}
else
@@ -6885,16 +6981,15 @@ otError NcpBase::InsertPropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_pro
VerifyOrExit(parsedLength > 0, spinelError = SPINEL_STATUS_PARSE_ERROR);
if (rssi == RSSI_OVERRIDE_DISABLED)
{
error = otLinkAddWhitelist(mInstance, extAddress->m8);
}
else
{
error = otLinkAddWhitelistRssi(mInstance, extAddress->m8, rssi);
}
error = otLinkFilterAddAddress(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
VerifyOrExit(error == OT_ERROR_NONE || error == OT_ERROR_ALREADY, spinelError = ThreadErrorToSpinelStatus(error));
if (rss != OT_MAC_FILTER_FIXED_RSS_DISABLED)
{
error = otLinkFilterAddRssIn(mInstance, extAddress, rss);
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
}
error = SendPropertyUpdate(
aHeader,
@@ -6931,7 +7026,61 @@ otError NcpBase::InsertPropertyHandler_MAC_BLACKLIST(uint8_t aHeader, spinel_pro
VerifyOrExit(parsedLength > 0, spinelError = SPINEL_STATUS_PARSE_ERROR);
error = otLinkAddBlacklist(mInstance, extAddress->m8);
error = otLinkFilterAddAddress(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE || error == OT_ERROR_ALREADY, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
SPINEL_CMD_PROP_VALUE_INSERTED,
aKey,
aValuePtr,
aValueLen
);
exit:
if (spinelError != SPINEL_STATUS_OK)
{
error = SendLastStatus(aHeader, spinelError);
}
return error;
}
otError NcpBase::InsertPropertyHandler_MAC_FIXED_RSS(uint8_t aHeader, spinel_prop_key_t aKey,
const uint8_t *aValuePtr, uint16_t aValueLen)
{
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
spinel_status_t spinelError = SPINEL_STATUS_OK;
otExtAddress *extAddress = NULL;
int8_t rss = OT_MAC_FILTER_FIXED_RSS_DISABLED;
if (aValueLen > sizeof(int8_t))
{
parsedLength = spinel_datatype_unpack(
aValuePtr,
aValueLen,
SPINEL_DATATYPE_EUI64_S SPINEL_DATATYPE_INT8_S,
&extAddress,
&rss
);
}
else
{
parsedLength = spinel_datatype_unpack(
aValuePtr,
aValueLen,
SPINEL_DATATYPE_INT8_S,
&rss
);
}
VerifyOrExit(parsedLength > 0, spinelError = SPINEL_STATUS_PARSE_ERROR);
error = otLinkFilterAddRssIn(mInstance, extAddress, rss);
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
@@ -6952,7 +7101,7 @@ exit:
return error;
}
#endif // OPENTHREAD_ENABLE_MAC_WHITELIST
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
otError NcpBase::InsertPropertyHandler_THREAD_JOINERS(uint8_t aHeader, spinel_prop_key_t aKey,
@@ -7318,7 +7467,7 @@ exit:
}
#endif // OPENTHREAD_FTD
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
otError NcpBase::RemovePropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_prop_key_t aKey,
const uint8_t *aValuePtr, uint16_t aValueLen)
@@ -7337,7 +7486,9 @@ otError NcpBase::RemovePropertyHandler_MAC_WHITELIST(uint8_t aHeader, spinel_pro
VerifyOrExit(parsedLength > 0, spinelError = SPINEL_STATUS_PARSE_ERROR);
otLinkRemoveWhitelist(mInstance, extAddress->m8);
error = otLinkFilterRemoveAddress(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
@@ -7374,7 +7525,9 @@ otError NcpBase::RemovePropertyHandler_MAC_BLACKLIST(uint8_t aHeader, spinel_pro
VerifyOrExit(parsedLength > 0, spinelError = SPINEL_STATUS_PARSE_ERROR);
otLinkRemoveBlacklist(mInstance, extAddress->m8);
error = otLinkFilterRemoveAddress(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
@@ -7394,7 +7547,49 @@ exit:
return error;
}
#endif // OPENTHREAD_ENABLE_MAC_WHITELIST
otError NcpBase::RemovePropertyHandler_MAC_FIXED_RSS(uint8_t aHeader, spinel_prop_key_t aKey,
const uint8_t *aValuePtr, uint16_t aValueLen)
{
spinel_ssize_t parsedLength;
otError error = OT_ERROR_NONE;
spinel_status_t spinelError = SPINEL_STATUS_OK;
otExtAddress *extAddress = NULL;
if (aValueLen > 0)
{
parsedLength = spinel_datatype_unpack(
aValuePtr,
aValueLen,
SPINEL_DATATYPE_EUI64_S,
&extAddress
);
VerifyOrExit(parsedLength > 0, spinelError = SPINEL_STATUS_PARSE_ERROR);
}
error = otLinkFilterRemoveRssIn(mInstance, extAddress);
VerifyOrExit(error == OT_ERROR_NONE, spinelError = ThreadErrorToSpinelStatus(error));
error = SendPropertyUpdate(
aHeader,
SPINEL_CMD_PROP_VALUE_REMOVED,
aKey,
aValuePtr,
aValueLen
);
exit:
if (spinelError != SPINEL_STATUS_OK)
{
error = SendLastStatus(aHeader, spinelError);
}
return error;
}
#endif // OPENTHREAD_ENABLE_MAC_FILTER
#if OPENTHREAD_ENABLE_LEGACY
+8 -4
View File
@@ -400,11 +400,12 @@ private:
NCP_GET_PROP_HANDLER(NCP_CNTR);
NCP_GET_PROP_HANDLER(IP_CNTR);
NCP_GET_PROP_HANDLER(MSG_BUFFER_COUNTERS);
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_GET_PROP_HANDLER(MAC_WHITELIST);
NCP_GET_PROP_HANDLER(MAC_WHITELIST_ENABLED);
NCP_GET_PROP_HANDLER(MAC_BLACKLIST);
NCP_GET_PROP_HANDLER(MAC_BLACKLIST_ENABLED);
NCP_GET_PROP_HANDLER(MAC_FIXED_RSS);
#endif
NCP_GET_PROP_HANDLER(THREAD_MODE);
NCP_GET_PROP_HANDLER(THREAD_CHILD_TIMEOUT);
@@ -479,11 +480,12 @@ private:
#endif
NCP_SET_PROP_HANDLER(MAC_PROMISCUOUS_MODE);
NCP_SET_PROP_HANDLER(MAC_SCAN_PERIOD);
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_SET_PROP_HANDLER(MAC_WHITELIST);
NCP_SET_PROP_HANDLER(MAC_WHITELIST_ENABLED);
NCP_SET_PROP_HANDLER(MAC_BLACKLIST);
NCP_SET_PROP_HANDLER(MAC_BLACKLIST_ENABLED);
NCP_SET_PROP_HANDLER(MAC_FIXED_RSS);
#endif
#if OPENTHREAD_ENABLE_RAW_LINK_API
NCP_SET_PROP_HANDLER(MAC_SRC_MATCH_ENABLED);
@@ -546,9 +548,10 @@ private:
NCP_INSERT_PROP_HANDLER(THREAD_ON_MESH_NETS);
#endif
NCP_INSERT_PROP_HANDLER(THREAD_ASSISTING_PORTS);
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_INSERT_PROP_HANDLER(MAC_WHITELIST);
NCP_INSERT_PROP_HANDLER(MAC_BLACKLIST);
NCP_INSERT_PROP_HANDLER(MAC_FIXED_RSS);
#endif
#if OPENTHREAD_ENABLE_COMMISSIONER
NCP_INSERT_PROP_HANDLER(THREAD_JOINERS);
@@ -566,9 +569,10 @@ private:
NCP_REMOVE_PROP_HANDLER(THREAD_ON_MESH_NETS);
#endif
NCP_REMOVE_PROP_HANDLER(THREAD_ASSISTING_PORTS);
#if OPENTHREAD_ENABLE_MAC_WHITELIST
#if OPENTHREAD_ENABLE_MAC_FILTER
NCP_REMOVE_PROP_HANDLER(MAC_WHITELIST);
NCP_REMOVE_PROP_HANDLER(MAC_BLACKLIST);
NCP_REMOVE_PROP_HANDLER(MAC_FIXED_RSS);
#endif
#if OPENTHREAD_FTD
NCP_REMOVE_PROP_HANDLER(THREAD_ACTIVE_ROUTER_IDS);
+4
View File
@@ -1104,6 +1104,10 @@ spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
ret = "PROP_MAC_BLACKLIST_ENABLED";
break;
case SPINEL_PROP_MAC_FIXED_RSS:
ret = "PROP_MAC_FIXED_RSS";
break;
case SPINEL_PROP_NET_SAVED:
ret = "PROP_NET_SAVED";
break;
+11
View File
@@ -702,6 +702,17 @@ typedef enum
/** Format: `b`
*/
SPINEL_PROP_MAC_BLACKLIST_ENABLED = SPINEL_PROP_MAC_EXT__BEGIN + 7,
/// MAC Received Signal Strength Filter
/** Format: `A(t(Ec))`
*
* Structure Parameters:
*
* * `E`: Optional EUI64 address of node. Set default RSS if not included.
* * `c`: Fixed RSS. OT_MAC_FILTER_FIXED_RSS_OVERRIDE_DISABLED(127) means not set.
*/
SPINEL_PROP_MAC_FIXED_RSS = SPINEL_PROP_MAC_EXT__BEGIN + 8,
SPINEL_PROP_MAC_EXT__END = 0x1400,
SPINEL_PROP_NET__BEGIN = 0x40,
@@ -45,7 +45,6 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER].get_addr64())
self.nodes[LEADER].enable_whitelist()
for i in range(2,17):
@@ -78,7 +78,6 @@ class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
time.sleep(5)
self.nodes[LEADER].add_whitelist(self.nodes[ED].get_addr64())
self.nodes[ED].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
+11 -5
View File
@@ -150,26 +150,31 @@ class otCli:
self.pexpect.expect('Done')
def clear_whitelist(self):
self.send_command('whitelist clear')
cmd = 'macfilter addr clear'
self.send_command(cmd)
self.pexpect.expect('Done')
def enable_whitelist(self):
self.send_command('whitelist enable')
cmd = 'macfilter addr whitelist'
self.send_command(cmd)
self.pexpect.expect('Done')
def disable_whitelist(self):
self.send_command('whitelist disable')
cmd = 'macfilter addr disable'
self.send_command(cmd)
self.pexpect.expect('Done')
def add_whitelist(self, addr, rssi=None):
cmd = 'whitelist add ' + addr
cmd = 'macfilter addr add ' + addr
if rssi != None:
cmd += ' ' + str(rssi)
self.send_command(cmd)
self.pexpect.expect('Done')
def remove_whitelist(self, addr):
cmd = 'whitelist remove ' + addr
cmd = 'macfilter addr remove ' + addr
self.send_command(cmd)
self.pexpect.expect('Done')
@@ -186,6 +191,7 @@ class otCli:
i = self.pexpect.expect('([0-9a-fA-F]{16})')
if i == 0:
addr64 = self.pexpect.match.groups()[0].decode("utf-8")
self.pexpect.expect('Done')
return addr64
+117 -121
View File
@@ -355,73 +355,21 @@ class OpenThread(IThci):
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("setRouterSelectionJitter() Error: " + str(e))
def __enableWhiteList(self):
"""enable white list filter
def __setAddressfilterMode(self, mode):
"""set address filter mode
Returns:
True: successful to enable white list filter
False: fail to enable white list filter
True: successful to set address filter mode.
False: fail to set address filter mode.
"""
print 'call enableWhiteList'
print 'call setAddressFilterMode() ' + mode
try:
if self.__sendCommand('whitelist enable')[0] == 'Done':
self.isWhiteListEnabled = True
cmd = 'macfilter addr ' + mode
if self.__sendCommand(cmd)[0] == 'Done':
return True
else:
return False
return False
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("enableWhiteList() Error: " + str(e))
def __enableBlackList(self):
"""enable black list filter
Returns:
True: successful to enable black list filter
False: fail to enable black list filter
"""
print 'call enableBlackList'
try:
if self.__sendCommand('blacklist enable')[0] == 'Done':
self.isBlackListEnabled = True
return True
else:
return False
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("enableBlackList() Error: " + str(e))
def __disableWhiteList(self):
"""disable white list filter
Returns:
True: successful to disable white list filter
False: fail to disable white list filter
"""
print 'call disableWhiteList'
try:
if self.__sendCommand('whitelist disable')[0] == 'Done':
self.isWhiteListEnabled = False
return True
else:
return False
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("disableWhiteList() Error: " + str(e))
def __disableBlackList(self):
"""disable black list filter
Returns:
True: successful to disable black list filter
False: fail to disable black list filter
"""
print 'call disableBlackList'
try:
if self.__sendCommand('blacklist disable')[0] == 'Done':
self.isBlackListEnabled = False
return True
else:
return False
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("disableBlackList() Error: " + str(e))
ModuleHelper.WriteIntoDebugLogger("__setAddressFilterMode() Error: " + str(e))
def __startOpenThread(self):
"""start OpenThread stack
@@ -438,17 +386,16 @@ class OpenThread(IThci):
else:
self.hasActiveDatasetToCommit = False
# restore whitelist if rejoin after reset
if self.isPowerDown and self.isWhiteListEnabled:
self.__enableWhiteList()
for addr in self._whiteList:
self.addAllowMAC(addr)
# restore blacklist if rejoin after reset
if self.isPowerDown and self.isBlackListEnabled:
self.__enableBlackList()
for addr in self._blackList:
self.addBlockedMAC(addr)
# restore whitelist/blacklist address filter mode if rejoin after reset
if self.isPowerDown:
if self._addressfilterMode == 'whitelist':
if self.__setAddressfilterMode('whitelist'):
for addr in self._addressfilterSet:
self.addAllowMAC(addr)
elif self._addressfilterMode == 'blacklist':
if self.__setAddressfilterMode('blacklist'):
for addr in self._addressfilterSet:
self.addBlockedMAC(addr)
if self.__sendCommand('ifconfig up')[0] == 'Done':
self.__setRouterSelectionJitter(1)
@@ -882,14 +829,14 @@ class OpenThread(IThci):
return self.networkKey
def addBlockedMAC(self, xEUI):
"""add a given extended address to the black list entry
"""add a given extended address to the blacklist entry
Args:
xEUI: extended address in hex format
Returns:
True: successful to add a given extended address to the black list entry
False: fail to add a given extended address to the black list entry
True: successful to add a given extended address to the blacklist entry
False: fail to add a given extended address to the blacklist entry
"""
print '%s call addBlockedMAC' % self.port
print xEUI
@@ -904,25 +851,32 @@ class OpenThread(IThci):
print 'block device itself'
return True
if not self.isBlackListEnabled:
self.__enableBlackList()
if self._addressfilterMode != 'blacklist':
if self.__setAddressfilterMode('blacklist'):
self._addressfilterMode = 'blacklist'
cmd = 'blacklist add %s' % macAddr
cmd = 'macfilter addr add %s' % macAddr
print cmd
self._blackList.add(macAddr)
return self.__sendCommand(cmd)[0] == 'Done'
ret = self.__sendCommand(cmd)[0] == 'Done'
self._addressfilterSet.add(macAddr)
print 'current blacklist entries:'
for addr in self._addressfilterSet:
print addr
return ret
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("addBlockedMAC() Error: " + str(e))
def addAllowMAC(self, xEUI):
"""add a given extended address to the white list entry
"""add a given extended address to the whitelist addressfilter
Args:
xEUI: a given extended address in hex format
Returns:
True: successful to add a given extended address to the white list entry
False: fail to add a given extended address to the white list entry
True: successful to add a given extended address to the whitelist entry
False: fail to add a given extended address to the whitelist entry
"""
print '%s call addAllowMAC' % self.port
print xEUI
@@ -932,54 +886,75 @@ class OpenThread(IThci):
macAddr = self.__convertLongToString(xEUI)
try:
if not self.isWhiteListEnabled:
self.__enableWhiteList()
if self._addressfilterMode != 'whitelist':
if self.__setAddressfilterMode('whitelist'):
self._addressfilterMode = 'whitelist'
cmd = 'whitelist add %s' % macAddr
cmd = 'macfilter addr add %s' % macAddr
print cmd
self._whiteList.add(macAddr)
return self.__sendCommand(cmd)[0] == 'Done'
ret = self.__sendCommand(cmd)[0] == 'Done'
self._addressfilterSet.add(macAddr)
print 'current whitelist entries:'
for addr in self._addressfilterSet:
print addr
return ret
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("addAllowMAC() Error: " + str(e))
def clearBlockList(self):
"""clear all entries in black list table
"""clear all entries in blacklist table
Returns:
True: successful to clear the black list
False: fail to clear the black list
True: successful to clear the blacklist
False: fail to clear the blacklist
"""
print '%s call clearBlockList' % self.port
# remove all entries in black list
# remove all entries in blacklist
try:
if self.__sendCommand('blacklist clear')[0] == 'Done':
self.__disableBlackList()
self._blackList.clear()
return True
else:
return False
print 'clearing blacklist entries:'
for addr in self._addressfilterSet:
print addr
# disable blacklist
if self.__setAddressfilterMode('disable'):
self._addressfilterMode = 'disable'
# clear ops
cmd = 'macfilter addr clear'
if self.__sendCommand(cmd)[0] == 'Done':
self._addressfilterSet.clear()
return True
return False
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("clearBlockList() Error: " + str(e))
def clearAllowList(self):
"""clear all entries in white list table
"""clear all entries in whitelist table
Returns:
True: successful to clear the white list
False: fail to clear the white list
True: successful to clear the whitelist
False: fail to clear the whitelist
"""
print '%s call clearAllowList' % self.port
# remove all entries in white list as well as in black list
# remove all entries in whitelist
try:
if self.__sendCommand('whitelist clear')[0] == 'Done':
self.__disableWhiteList()
self._whiteList.clear()
self.clearBlockList()
return True
else:
return False
print 'clearing whitelist entries:'
for addr in self._addressfilterSet:
print addr
# disable whitelist
if self.__setAddressfilterMode('disable'):
self._addressfilterMode = 'disable'
# clear ops
cmd = 'macfilter addr clear'
if self.__sendCommand(cmd)[0] == 'Done':
self._addressfilterSet.clear()
return True
return False
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("clearAllowList() Error: " + str(e))
@@ -1273,10 +1248,8 @@ class OpenThread(IThci):
self.joinCommissionedStatus = self.joinStatus['notstart']
self.networkDataRequirement = '' # indicate Thread device requests full or stable network data
self.isPowerDown = False # indicate if Thread device experiences a power down event
self.isWhiteListEnabled = False # indicate if Thread device enables white list filter
self.isBlackListEnabled = False # indicate if Thread device enables black list filter
self._whiteList = set() # cache whitelist devices when white list filter is enabled
self._blackList = set() # cache blacklist devices when black list filter is enabled
self._addressfilterMode = 'disable' # indicate AddressFilter mode ['disable', 'whitelist', 'blacklist']
self._addressfilterSet = set() # cache filter entries
self.isActiveCommissioner = False # indicate if Thread device is an active commissioner
self._lines = None # buffered lines read from device
@@ -1326,11 +1299,11 @@ class OpenThread(IThci):
ModuleHelper.WriteIntoDebugLogger("setPollingRate() Error: " + str(e))
def setLinkQuality(self, EUIadr, LinkQuality):
"""set custom link quality on a link to Thread device with a given extended address
"""set custom LinkQualityIn for all receiving messages from the specified EUIadr
Args:
EUIadr: a given extended address
LinkQuality: a given custom link quality for child devices
LinkQuality: a given custom link quality
link quality/link margin mapping table
3: 21 - 255 (dB)
2: 11 - 20 (dB)
@@ -1338,8 +1311,8 @@ class OpenThread(IThci):
0: 0 - 2 (dB)
Returns:
True: successful to set the link quality on a link to a Thread device
False: fail to set the link quality on a link to a Thread device
True: successful to set the link quality
False: fail to set the link quality
"""
print '%s call setLinkQuality' % self.port
print EUIadr
@@ -1352,18 +1325,41 @@ class OpenThread(IThci):
address64 = ''
if '0x' in euiStr:
address64 = euiStr.lstrip('0x')
# prepend 0 at the beginning
if len(address64) < 16:
address64 = address64.zfill(16)
print address64
address64 = address64.zfill(16)
print address64
cmd = 'linkquality %s %s' % (address64, str(LinkQuality))
cmd = 'macfilter rss add-lqi %s %s' % (address64, str(LinkQuality))
print cmd
return self.__sendCommand(cmd)[0] == 'Done'
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("setLinkQuality() Error: " + str(e))
def setOutBoundLinkQuality(self, LinkQuality):
"""set custom LinkQualityIn for all receiving messages from the any address
Args:
LinkQuality: a given custom link quality
link quality/link margin mapping table
3: 21 - 255 (dB)
2: 11 - 20 (dB)
1: 3 - 9 (dB)
0: 0 - 2 (dB)
Returns:
True: successful to set the link quality
False: fail to set the link quality
"""
print '%s call setOutBoundLinkQuality' % self.port
print LinkQuality
try:
cmd = 'macfilter rss add-lqi * %s' % str(LinkQuality)
print cmd
return self.__sendCommand(cmd)[0] == 'Done'
except Exception, e:
ModuleHelper.WriteIntoDebugLogger("setOutBoundLinkQuality() Error: " + str(e))
def removeRouterPrefix(self, prefixEntry):
"""remove the configured prefix on a border router