eARNETWORK_ERROR ARNETWORK_Receiver_ReturnACK (ARNETWORK_Receiver_t *receiverPtr, int id, uint8_t seq)
{
    /** -- return an acknowledgement -- */
    /** local declarations */
    eARNETWORK_ERROR error = ARNETWORK_OK;
    ARNETWORK_IOBuffer_t* ACKIOBufferPtr = receiverPtr->outputBufferPtrMap[ARNETWORK_Manager_IDOutputToIDAck (receiverPtr->networkALManager, id)];

    if (ACKIOBufferPtr != NULL)
    {
        int isEmpty = ARNETWORK_RingBuffer_IsEmpty(ACKIOBufferPtr->dataDescriptorRBuffer);
        error = ARNETWORK_IOBuffer_AddData (ACKIOBufferPtr, (uint8_t*) &seq, sizeof(seq), NULL, NULL, 1);
        if (error == ARNETWORK_OK && isEmpty > 0)
        {
            ARNETWORK_Sender_SignalNewData (receiverPtr->senderPtr);
        }
    }

    return error;
}
eARNETWORK_ERROR ARNETWORK_Sender_AckReceived (ARNETWORK_Sender_t *senderPtr, int identifier, uint8_t seqNumber)
{
    /** -- Receive an acknowledgment fo a data -- */

    /** local declarations */
    ARNETWORK_IOBuffer_t *inputBufferPtr = NULL;
    eARNETWORK_ERROR error = ARNETWORK_OK;

    inputBufferPtr = senderPtr->inputBufferPtrMap[identifier];

    if (inputBufferPtr != NULL)
    {
        /** lock the IOBuffer */
        error = ARNETWORK_IOBuffer_Lock (inputBufferPtr);

        if (error == ARNETWORK_OK)
        {
            /**
             *  Transmit the acknowledgment to the input buffer.
             *     if the acknowledgment is suiarray the waiting data is popped
             */
            error = ARNETWORK_IOBuffer_AckReceived (inputBufferPtr, seqNumber);

            /** unlock the IOBuffer */
            ARNETWORK_IOBuffer_Unlock (inputBufferPtr);

            /* Wake up the send thread to update the wait time of buffers */
            ARNETWORK_Sender_SignalNewData (senderPtr);
        }
    }
    else
    {
        error = ARNETWORK_ERROR_ID_UNKNOWN;
    }

    return error;
}