mirror of
https://github.com/espressif/openthread.git
synced 2026-07-30 07:37:46 +00:00
[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:
+1
-1
@@ -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
|
||||
|
||||
@@ -44,6 +44,7 @@ AM_DISTCHECK_CONFIGURE_FLAGS = \
|
||||
--enable-dns-client \
|
||||
--enable-application-coap \
|
||||
--enable-border-router \
|
||||
--enable-mac-filter \
|
||||
$(NULL)
|
||||
|
||||
SUBDIRS = \
|
||||
|
||||
+15
-15
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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[]);
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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_
|
||||
@@ -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_
|
||||
@@ -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
|
||||
@@ -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_
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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_
|
||||
@@ -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_
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
};
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user