Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83f6d02e authored by shihchienc's avatar shihchienc
Browse files

threadhal: handle socket disconnection gracefully

Thread hal exit the process when receiving socket disconnection. This
patch is to change the behavior to handle this connection gracefully.

Bug: 368867685
Test: atest VtsHalThreadNetworkTargetTest
Test: manual
Change-Id: I04a9b00784c4c4beb4dad97d080532a3052be05a
parent 53e667ad
Loading
Loading
Loading
Loading
+39 −18
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@
#include <vector>
#include <vector>


#include "common/code_utils.hpp"
#include "common/code_utils.hpp"
#include "openthread/error.h"
#include "openthread/openthread-system.h"
#include "openthread/openthread-system.h"
#include "platform-posix.h"
#include "platform-posix.h"


@@ -56,14 +57,9 @@ SocketInterface::SocketInterface(const ot::Url::Url& aRadioUrl)


otError SocketInterface::Init(ReceiveFrameCallback aCallback, void* aCallbackContext,
otError SocketInterface::Init(ReceiveFrameCallback aCallback, void* aCallbackContext,
                              RxFrameBuffer& aFrameBuffer) {
                              RxFrameBuffer& aFrameBuffer) {
    otError error = OT_ERROR_NONE;
    otError error = InitSocket();


    VerifyOrExit(mSockFd == -1, error = OT_ERROR_ALREADY);
    VerifyOrExit(error == OT_ERROR_NONE);

    WaitForSocketFileCreated(mRadioUrl.GetPath());

    mSockFd = OpenFile(mRadioUrl);
    VerifyOrExit(mSockFd != -1, error = OT_ERROR_FAILED);


    mReceiveFrameCallback = aCallback;
    mReceiveFrameCallback = aCallback;
    mReceiveFrameContext = aCallbackContext;
    mReceiveFrameContext = aCallbackContext;
@@ -155,9 +151,22 @@ otError SocketInterface::WaitForHardwareResetCompletion(uint32_t aTimeoutMs) {


    VerifyOrExit(!mIsHardwareResetting, error = OT_ERROR_FAILED);
    VerifyOrExit(!mIsHardwareResetting, error = OT_ERROR_FAILED);


exit:
    return error;
}

otError SocketInterface::InitSocket() {
    otError error = OT_ERROR_NONE;
    int retries = 0;

    VerifyOrExit(mSockFd == -1, error = OT_ERROR_ALREADY);

    while (retries++ < kMaxRetriesForSocketInit) {
        WaitForSocketFileCreated(mRadioUrl.GetPath());
        WaitForSocketFileCreated(mRadioUrl.GetPath());
        mSockFd = OpenFile(mRadioUrl);
        mSockFd = OpenFile(mRadioUrl);
    VerifyOrExit(mSockFd != -1, error = OT_ERROR_FAILED);
        VerifyOrExit(mSockFd == -1);
    }
    error = OT_ERROR_FAILED;


exit:
exit:
    return error;
    return error;
@@ -168,11 +177,16 @@ void SocketInterface::UpdateFdSet(void* aMainloopContext) {


    assert(context != nullptr);
    assert(context != nullptr);


    VerifyOrExit(mSockFd != -1);

    FD_SET(mSockFd, &context->mReadFdSet);
    FD_SET(mSockFd, &context->mReadFdSet);


    if (context->mMaxFd < mSockFd) {
    if (context->mMaxFd < mSockFd) {
        context->mMaxFd = mSockFd;
        context->mMaxFd = mSockFd;
    }
    }

exit:
    return;
}
}


void SocketInterface::Process(const void* aMainloopContext) {
void SocketInterface::Process(const void* aMainloopContext) {
@@ -181,9 +195,14 @@ void SocketInterface::Process(const void* aMainloopContext) {


    assert(context != nullptr);
    assert(context != nullptr);


    VerifyOrExit(mSockFd != -1);

    if (FD_ISSET(mSockFd, &context->mReadFdSet)) {
    if (FD_ISSET(mSockFd, &context->mReadFdSet)) {
        Read();
        Read();
    }
    }

exit:
    return;
}
}


otError SocketInterface::HardwareReset(void) {
otError SocketInterface::HardwareReset(void) {
@@ -198,22 +217,24 @@ otError SocketInterface::HardwareReset(void) {


void SocketInterface::Read(void) {
void SocketInterface::Read(void) {
    uint8_t buffer[kMaxFrameSize];
    uint8_t buffer[kMaxFrameSize];
    ssize_t rval;

    VerifyOrExit(mSockFd != -1);


    ssize_t rval = TEMP_FAILURE_RETRY(read(mSockFd, buffer, sizeof(buffer)));
    rval = TEMP_FAILURE_RETRY(read(mSockFd, buffer, sizeof(buffer)));


    if (rval > 0) {
    if (rval > 0) {
        ProcessReceivedData(buffer, static_cast<uint16_t>(rval));
        ProcessReceivedData(buffer, static_cast<uint16_t>(rval));
    } else if (rval < 0) {
    } else if (rval < 0) {
        DieNow(OT_EXIT_ERROR_ERRNO);
        DieNow(OT_EXIT_ERROR_ERRNO);
    } else {
    } else {
        if (mIsHardwareResetting) {
        LogWarn("Socket connection is closed by remote, isHardwareReset: %d", mIsHardwareResetting);
            LogInfo("Socket connection is closed due to hardware reset.");
        ResetStates();
        ResetStates();
        } else {
        InitSocket();
            LogCrit("Socket connection is closed by remote.");
            exit(OT_EXIT_FAILURE);
        }
    }
    }

exit:
    return;
}
}


void SocketInterface::Write(const uint8_t* aFrame, uint16_t aLength) {
void SocketInterface::Write(const uint8_t* aFrame, uint16_t aLength) {
+10 −0
Original line number Original line Diff line number Diff line
@@ -246,6 +246,15 @@ class SocketInterface : public ot::Spinel::SpinelInterface,
     */
     */
    otError WaitForHardwareResetCompletion(uint32_t aTimeoutMs);
    otError WaitForHardwareResetCompletion(uint32_t aTimeoutMs);


    /**
     * Initialize socket
     *
     * @retval TRUE  Socket initialization is successful.
     * @retval FALSE Socket initialization is failed.
     *
     */
    otError InitSocket();

    /**
    /**
     * Reset socket interface to intitial state.
     * Reset socket interface to intitial state.
     *
     *
@@ -257,6 +266,7 @@ class SocketInterface : public ot::Spinel::SpinelInterface,
                                             ///< descriptor to become available.
                                             ///< descriptor to become available.
        kMaxRetriesForSocketCloseCheck = 3,  ///< Maximum retry times for checking
        kMaxRetriesForSocketCloseCheck = 3,  ///< Maximum retry times for checking
                                             ///< if socket is closed.
                                             ///< if socket is closed.
        kMaxRetriesForSocketInit = 3,        ///< Maximum retry times for socket initialization.
    };
    };


    ReceiveFrameCallback mReceiveFrameCallback;
    ReceiveFrameCallback mReceiveFrameCallback;