blob: 92cd285eb417e018af7b565326032256a042228a [file]
/*
* Copyright (c) 2025, 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/platform/trel.h>
#include "nexus_core.hpp"
#include "nexus_node.hpp"
#if OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE
namespace ot {
namespace Nexus {
//---------------------------------------------------------------------------------------------------------------------
// otPlatTrel APIs
extern "C" {
void otPlatTrelEnable(otInstance *aInstance, uint16_t *aUdpPort) { AsNode(aInstance).mTrel.Enable(*aUdpPort); }
void otPlatTrelDisable(otInstance *aInstance) { AsNode(aInstance).mTrel.Disable(); }
void otPlatTrelSend(otInstance *aInstance,
const uint8_t *aUdpPayload,
uint16_t aUdpPayloadLen,
const otSockAddr *aDestSockAddr)
{
AsNode(aInstance).mTrel.Send(aUdpPayload, aUdpPayloadLen, AsCoreType(aDestSockAddr));
}
void otPlatTrelNotifyPeerSocketAddressDifference(otInstance *aInstance,
const otSockAddr *aPeerSockAddr,
const otSockAddr *aRxSockAddr)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aPeerSockAddr);
OT_UNUSED_VARIABLE(aRxSockAddr);
}
const otPlatTrelCounters *otPlatTrelGetCounters(otInstance *aInstance) { return &AsNode(aInstance).mTrel.mCounters; }
void otPlatTrelResetCounters(otInstance *aInstance) { AsNode(aInstance).mTrel.ResetCounters(); }
} // extern "C"
//---------------------------------------------------------------------------------------------------------------------
// Trel
uint16_t Trel::sLastUsedUdpPort = kUdpPortStart;
Trel::Trel(void)
: mEnabled(false)
, mUdpPort(sLastUsedUdpPort++)
{
ClearAllBytes(mCounters);
}
void Trel::Reset(void)
{
mEnabled = false;
ClearAllBytes(mCounters);
mPendingTxList.Free();
}
void Trel::Enable(uint16_t &aUdpPort)
{
mEnabled = true;
aUdpPort = mUdpPort;
}
void Trel::Disable(void)
{
mEnabled = false;
mPendingTxList.Free();
}
void Trel::Send(const uint8_t *aUdpPayload, uint16_t aUdpPayloadLen, const Ip6::SockAddr &aDestSockAddr)
{
PendingTx *pendingTx = PendingTx::Allocate();
VerifyOrQuit(pendingTx != nullptr);
SuccessOrQuit(pendingTx->mPayloadData.SetFrom(aUdpPayload, aUdpPayloadLen));
pendingTx->mDestSockAddr = aDestSockAddr;
mPendingTxList.PushAfterTail(*pendingTx);
mCounters.mTxPackets++;
mCounters.mTxBytes += aUdpPayloadLen;
}
void Trel::Receive(Instance &aInstance, Heap::Data &aPayloadData, const Ip6::SockAddr &aSenderAddr)
{
mCounters.mRxPackets++;
mCounters.mRxBytes += aPayloadData.GetLength();
otPlatTrelHandleReceived(&aInstance, AsNonConst(aPayloadData.GetBytes()), aPayloadData.GetLength(), &aSenderAddr);
}
} // namespace Nexus
} // namespace ot
#endif // OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE