[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:
Marek Porwisz
2023-11-28 16:16:37 -08:00
committed by GitHub
parent f859987ce6
commit 834c8cbc8e
40 changed files with 2324 additions and 171 deletions
+29 -3
View File
@@ -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
+13
View File
@@ -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