blob: dacafde171f74da1a192ec212ac3bad0889a1b89 [file] [log] [blame]
/*
* 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 "test_platform.h"
#if _WIN32
__forceinline int gettimeofday(struct timeval *tv, struct timezone *)
{
DWORD tick = GetTickCount();
tv->tv_sec = (long)(tick / 1000);
tv->tv_usec = (long)(tick * 1000);
return 0;
}
#else
#include <sys/time.h>
#endif
bool g_testPlatAlarmSet = false;
uint32_t g_testPlatAlarmNext = 0;
testPlatAlarmStop g_testPlatAlarmStop = NULL;
testPlatAlarmStartAt g_testPlatAlarmStartAt = NULL;
testPlatAlarmGetNow g_testPlatAlarmGetNow = NULL;
otRadioCaps g_testPlatRadioCaps = OT_RADIO_CAPS_NONE;
testPlatRadioSetPanId g_testPlatRadioSetPanId = NULL;
testPlatRadioSetExtendedAddress g_testPlatRadioSetExtendedAddress = NULL;
testPlatRadioIsEnabled g_testPlatRadioIsEnabled = NULL;
testPlatRadioEnable g_testPlatRadioEnable = NULL;
testPlatRadioDisable g_testPlatRadioDisable = NULL;
testPlatRadioSetShortAddress g_testPlatRadioSetShortAddress = NULL;
testPlatRadioReceive g_testPlatRadioReceive = NULL;
testPlatRadioTransmit g_testPlatRadioTransmit = NULL;
testPlatRadioGetTransmitBuffer g_testPlatRadioGetTransmitBuffer = NULL;
void testPlatResetToDefaults(void)
{
g_testPlatAlarmSet = false;
g_testPlatAlarmNext = 0;
g_testPlatAlarmStop = NULL;
g_testPlatAlarmStartAt = NULL;
g_testPlatAlarmGetNow = NULL;
g_testPlatRadioCaps = OT_RADIO_CAPS_NONE;
g_testPlatRadioSetPanId = NULL;
g_testPlatRadioSetExtendedAddress = NULL;
g_testPlatRadioSetShortAddress = NULL;
g_testPlatRadioIsEnabled = NULL;
g_testPlatRadioEnable = NULL;
g_testPlatRadioDisable = NULL;
g_testPlatRadioReceive = NULL;
g_testPlatRadioTransmit = NULL;
g_testPlatRadioGetTransmitBuffer = NULL;
}
otInstance *testInitInstance(void)
{
otInstance *instance = NULL;
#if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES
size_t instaneBufferLength = 0;
uint8_t *instanceBuffer = NULL;
// Call to query the buffer size
(void)otInstanceInit(NULL, &instaneBufferLength);
// Call to allocate the buffer
instanceBuffer = (uint8_t *)malloc(instaneBufferLength);
VerifyOrQuit(instanceBuffer != NULL, "Failed to allocate otInstance");
memset(instanceBuffer, 0, instaneBufferLength);
// Initialize OpenThread with the buffer
instance = otInstanceInit(instanceBuffer, &instaneBufferLength);
#else
instance = otInstanceInitSingle();
#endif
return instance;
}
void testFreeInstance(otInstance *aInstance)
{
otInstanceFinalize(aInstance);
#if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES
free(aInstance);
#endif
}
bool sDiagMode = false;
extern "C" {
#if OPENTHREAD_ENABLE_MULTIPLE_INSTANCES
void *otPlatCAlloc(size_t aNum, size_t aSize)
{
return calloc(aNum, aSize);
}
void otPlatFree(void *aPtr)
{
free(aPtr);
}
#endif
void otTaskletsSignalPending(otInstance *)
{
}
//
// Alarm
//
void otPlatAlarmStop(otInstance *aInstance)
{
if (g_testPlatAlarmStop)
{
g_testPlatAlarmStop(aInstance);
}
else
{
g_testPlatAlarmSet = false;
}
}
void otPlatAlarmStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
{
if (g_testPlatAlarmStartAt)
{
g_testPlatAlarmStartAt(aInstance, aT0, aDt);
}
else
{
g_testPlatAlarmSet = true;
g_testPlatAlarmNext = aT0 + aDt;
}
}
uint32_t otPlatAlarmGetNow(void)
{
if (g_testPlatAlarmGetNow)
{
return g_testPlatAlarmGetNow();
}
else
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (uint32_t)((tv.tv_sec * 1000) + (tv.tv_usec / 1000) + 123456);
}
}
//
// Radio
//
void otPlatRadioGetIeeeEui64(otInstance *, uint8_t *)
{
}
void otPlatRadioSetPanId(otInstance *aInstance, uint16_t aPanId)
{
if (g_testPlatRadioSetPanId)
{
g_testPlatRadioSetPanId(aInstance, aPanId);
}
}
void otPlatRadioSetExtendedAddress(otInstance *aInstance, uint8_t *aExtAddr)
{
if (g_testPlatRadioSetExtendedAddress)
{
g_testPlatRadioSetExtendedAddress(aInstance, aExtAddr);
}
}
void otPlatRadioSetShortAddress(otInstance *aInstance, uint16_t aShortAddr)
{
if (g_testPlatRadioSetShortAddress)
{
g_testPlatRadioSetShortAddress(aInstance, aShortAddr);
}
}
void otPlatRadioSetPromiscuous(otInstance *, bool)
{
}
bool otPlatRadioIsEnabled(otInstance *aInstance)
{
if (g_testPlatRadioIsEnabled)
{
return g_testPlatRadioIsEnabled(aInstance);
}
else
{
return true;
}
}
otError otPlatRadioEnable(otInstance *aInstance)
{
if (g_testPlatRadioEnable)
{
return g_testPlatRadioEnable(aInstance);
}
else
{
return OT_ERROR_NONE;
}
}
otError otPlatRadioDisable(otInstance *aInstance)
{
if (g_testPlatRadioEnable)
{
return g_testPlatRadioDisable(aInstance);
}
else
{
return OT_ERROR_NONE;
}
}
otError otPlatRadioSleep(otInstance *)
{
return OT_ERROR_NONE;
}
otError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel)
{
if (g_testPlatRadioReceive)
{
return g_testPlatRadioReceive(aInstance, aChannel);
}
else
{
return OT_ERROR_NONE;
}
}
otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aFrame)
{
(void)aFrame;
if (g_testPlatRadioTransmit)
{
return g_testPlatRadioTransmit(aInstance);
}
else
{
return OT_ERROR_NONE;
}
}
otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance)
{
if (g_testPlatRadioGetTransmitBuffer)
{
return g_testPlatRadioGetTransmitBuffer(aInstance);
}
else
{
return (otRadioFrame *)0;
}
}
int8_t otPlatRadioGetRssi(otInstance *)
{
return 0;
}
otRadioCaps otPlatRadioGetCaps(otInstance *)
{
return g_testPlatRadioCaps;
}
bool otPlatRadioGetPromiscuous(otInstance *)
{
return false;
}
void otPlatRadioEnableSrcMatch(otInstance *aInstance, bool aEnable)
{
(void)aInstance;
(void)aEnable;
}
otError otPlatRadioAddSrcMatchShortEntry(otInstance *aInstance, const uint16_t aShortAddress)
{
(void)aInstance;
(void)aShortAddress;
return OT_ERROR_NONE;
}
otError otPlatRadioAddSrcMatchExtEntry(otInstance *aInstance, const uint8_t *aExtAddress)
{
(void)aInstance;
(void)aExtAddress;
return OT_ERROR_NONE;
}
otError otPlatRadioClearSrcMatchShortEntry(otInstance *aInstance, const uint16_t aShortAddress)
{
(void)aInstance;
(void)aShortAddress;
return OT_ERROR_NONE;
}
otError otPlatRadioClearSrcMatchExtEntry(otInstance *aInstance, const uint8_t *aExtAddress)
{
(void)aInstance;
(void)aExtAddress;
return OT_ERROR_NONE;
}
void otPlatRadioClearSrcMatchShortEntries(otInstance *aInstance)
{
(void)aInstance;
}
void otPlatRadioClearSrcMatchExtEntries(otInstance *aInstance)
{
(void)aInstance;
}
otError otPlatRadioEnergyScan(otInstance *, uint8_t, uint16_t)
{
return OT_ERROR_NOT_IMPLEMENTED;
}
void otPlatRadioSetDefaultTxPower(otInstance *aInstance, int8_t aPower)
{
(void)aInstance;
(void)aPower;
}
int8_t otPlatRadioGetReceiveSensitivity(otInstance *aInstance)
{
(void)aInstance;
return 0;
}
//
// Random
//
uint32_t otPlatRandomGet(void)
{
#if _WIN32
return (uint32_t)rand();
#else
return (uint32_t)random();
#endif
}
otError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
otError error = OT_ERROR_NONE;
VerifyOrExit(aOutput, error = OT_ERROR_INVALID_ARGS);
for (uint16_t length = 0; length < aOutputLength; length++)
{
aOutput[length] = (uint8_t)otPlatRandomGet();
}
exit:
return error;
}
//
// Diag
//
void otPlatDiagProcess(int argc, char *argv[], char *aOutput)
{
// no more diagnostics features for Posix platform
sprintf(aOutput, "diag feature '%s' is not supported\r\n", argv[0]);
(void)argc;
}
void otPlatDiagModeSet(bool aMode)
{
sDiagMode = aMode;
}
bool otPlatDiagModeGet()
{
return sDiagMode;
}
void otPlatDiagAlarmFired(otInstance *)
{
}
void otPlatDiagRadioTransmitDone(otInstance *, otRadioFrame *, otError)
{
}
void otPlatDiagRadioReceiveDone(otInstance *, otRadioFrame *, otError)
{
}
//
// Uart
//
void otPlatUartSendDone(void)
{
}
void otPlatUartReceived(const uint8_t *, uint16_t)
{
}
//
// Misc
//
void otPlatReset(otInstance *aInstance)
{
(void)aInstance;
}
otPlatResetReason otPlatGetResetReason(otInstance *aInstance)
{
(void)aInstance;
return OT_PLAT_RESET_REASON_POWER_ON;
}
void otPlatLog(otLogLevel, otLogRegion, const char *, ...)
{
}
//
// Settings
//
void otPlatSettingsInit(otInstance *aInstance)
{
(void)aInstance;
}
otError otPlatSettingsBeginChange(otInstance *aInstance)
{
(void)aInstance;
return OT_ERROR_NONE;
}
otError otPlatSettingsCommitChange(otInstance *aInstance)
{
(void)aInstance;
return OT_ERROR_NONE;
}
otError otPlatSettingsAbandonChange(otInstance *aInstance)
{
(void)aInstance;
return OT_ERROR_NONE;
}
otError otPlatSettingsGet(otInstance *aInstance, uint16_t aKey, int aIndex, uint8_t *aValue,
uint16_t *aValueLength)
{
(void)aInstance;
(void)aKey;
(void)aIndex;
(void)aValue;
(void)aValueLength;
return OT_ERROR_NOT_FOUND;
}
otError otPlatSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
{
(void)aInstance;
(void)aKey;
(void)aValue;
(void)aValueLength;
return OT_ERROR_NONE;
}
otError otPlatSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
{
(void)aInstance;
(void)aKey;
(void)aValue;
(void)aValueLength;
return OT_ERROR_NONE;
}
otError otPlatSettingsDelete(otInstance *aInstance, uint16_t aKey, int aIndex)
{
(void)aInstance;
(void)aKey;
(void)aIndex;
return OT_ERROR_NONE;
}
void otPlatSettingsWipe(otInstance *aInstance)
{
(void)aInstance;
}
} // extern "C"