mirror of
https://github.com/espressif/openthread.git
synced 2026-09-07 17:50:09 +00:00
[spinel] add support for multiple spinel interfaces (#9360)
This feature allows the RCP to support multiple host stacks on different PANs by making use of the spinel Interface ID. Created unit tests for testing multipan feature with multiple ot-instance support. Based on Si-Labs PR #8914 by @parag-silabs, but a little different approach. Instead of handling everything by a single sub-mac instance, multiple OpenThread instances are created on RCP side that map to different IID. Thanks to this there are separate data kept for each interface. Platform is able to determine interface by ot instance pointer passed as an argument to most of the API functions. Tx/scan queue was removed as it is possible to request transmission in parallel, it is up to the platform to decide if it should fail or queue second tx or it has two radios available. NOTE: Platform needs to provide different otRadioFrame of each instance and the processing needs to take into account the instance being used. Signed-off-by: Marek Porwisz <[email protected]>
This commit is contained in:
@@ -42,6 +42,16 @@
|
||||
#include "openthread-system.h"
|
||||
|
||||
#include "lib/platform/reset_util.h"
|
||||
|
||||
#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE
|
||||
#if OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE == 0
|
||||
#error "Support for multiple OpenThread static instance is disabled."
|
||||
#endif
|
||||
#define ENDPOINT_CT OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM
|
||||
#else
|
||||
#define ENDPOINT_CT 1
|
||||
#endif /* OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE */
|
||||
|
||||
/**
|
||||
* Initializes the NCP app.
|
||||
*
|
||||
@@ -49,6 +59,7 @@
|
||||
*
|
||||
*/
|
||||
extern void otAppNcpInit(otInstance *aInstance);
|
||||
extern void otAppNcpInitMulti(otInstance **aInstances, uint8_t count);
|
||||
|
||||
#if OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
|
||||
OT_TOOL_WEAK void *otPlatCAlloc(size_t aNum, size_t aSize) { return calloc(aNum, aSize); }
|
||||
@@ -70,7 +81,9 @@ int main(int argc, char *argv[])
|
||||
prctl(PR_SET_PDEATHSIG, SIGHUP);
|
||||
#endif
|
||||
|
||||
#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE
|
||||
#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE
|
||||
otInstance *instances[ENDPOINT_CT] = {NULL};
|
||||
#elif OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE
|
||||
size_t otInstanceBufferLength = 0;
|
||||
uint8_t *otInstanceBuffer = NULL;
|
||||
#endif
|
||||
@@ -79,7 +92,16 @@ pseudo_reset:
|
||||
|
||||
otSysInit(argc, argv);
|
||||
|
||||
#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE
|
||||
#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE
|
||||
for (int i = 0; i < ENDPOINT_CT; i++)
|
||||
{
|
||||
instances[i] = otInstanceInitMultiple(i);
|
||||
|
||||
assert(instances[i]);
|
||||
}
|
||||
instance = instances[0];
|
||||
#elif OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE
|
||||
|
||||
// Call to query the buffer size
|
||||
(void)otInstanceInit(NULL, &otInstanceBufferLength);
|
||||
|
||||
@@ -94,7 +116,11 @@ pseudo_reset:
|
||||
#endif
|
||||
assert(instance);
|
||||
|
||||
#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE
|
||||
otAppNcpInitMulti(instances, ENDPOINT_CT);
|
||||
#else
|
||||
otAppNcpInit(instance);
|
||||
#endif
|
||||
|
||||
while (!otSysPseudoResetWasRequested())
|
||||
{
|
||||
@@ -103,7 +129,7 @@ pseudo_reset:
|
||||
}
|
||||
|
||||
otInstanceFinalize(instance);
|
||||
#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE
|
||||
#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && !OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE
|
||||
free(otInstanceBuffer);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -61,4 +61,17 @@ void otAppNcpInit(otInstance *aInstance)
|
||||
otNcpHdlcInit(aInstance, NcpSend);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE
|
||||
void otAppNcpInitMulti(otInstance **aInstances, uint8_t aCount)
|
||||
{
|
||||
#if OPENTHREAD_CONFIG_NCP_SPI_ENABLE
|
||||
#error Multipan support not implemented for SPI
|
||||
#else
|
||||
IgnoreError(otPlatUartEnable());
|
||||
|
||||
otNcpHdlcInitMulti(aInstances, aCount, NcpSend);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif // !OPENTHREAD_ENABLE_NCP_VENDOR_HOOK
|
||||
|
||||
Reference in New Issue
Block a user