/*
 *    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.
 */

/**
 * @file
 *   This file implements an HDLC-lite encoder and decoder.
 */

#include <openthread/config.h>

#include "hdlc.hpp"

#include <stdlib.h>

#include "common/code_utils.hpp"

#if OPENTHREAD_ENABLE_NCP_UART

namespace ot {
namespace Hdlc {

/**
 * This method updates an FCS.
 *
 * @param[in]  aFcs   The FCS to update.
 * @param[in]  aByte  The input byte value.
 *
 * @returns The updated FCS.
 *
 */
static uint16_t UpdateFcs(uint16_t aFcs, uint8_t aByte);

enum
{
    kFlagXOn        = 0x11,
    kFlagXOff       = 0x13,
    kFlagSequence   = 0x7e,  ///< HDLC Flag value
    kEscapeSequence = 0x7d,  ///< HDLC Escape value
    kFlagSpecial    = 0xf8,
};

/**
 * FCS lookup table
 *
 */
enum
{
    kInitFcs = 0xffff,  ///< Initial FCS value.
    kGoodFcs = 0xf0b8,  ///< Good FCS value.
};

uint16_t UpdateFcs(uint16_t aFcs, uint8_t aByte)
{
    static const uint16_t sFcsTable[256] =
    {
        0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
        0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
        0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
        0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
        0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
        0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
        0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
        0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
        0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
        0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
        0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
        0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
        0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
        0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
        0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
        0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
        0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
        0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
        0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
        0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
        0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
        0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
        0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
        0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
        0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
        0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
        0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
        0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
        0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
        0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
        0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
        0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
    };
    return (aFcs >> 8) ^ sFcsTable[(aFcs ^ aByte) & 0xff];
}

bool HdlcByteNeedsEscape(uint8_t aByte)
{
    switch (aByte)
    {
    case kFlagXOn:
    case kFlagXOff:
    case kEscapeSequence:
    case kFlagSequence:
    case kFlagSpecial:
        return true;

    default:
        return false;
    }
}

Encoder::BufferWriteIterator::BufferWriteIterator(void)
{
    mWritePointer = NULL;
    mRemainingLength = 0;
}

otError Encoder::BufferWriteIterator::WriteByte(uint8_t aByte)
{
    otError error = OT_ERROR_NONE;

    VerifyOrExit(mRemainingLength > 0, error = OT_ERROR_NO_BUFS);

    *mWritePointer++ = aByte;
    mRemainingLength--;

exit:
    return error;
}

bool Encoder::BufferWriteIterator::CanWrite(uint16_t aWriteLength) const
{
    return (mRemainingLength >= aWriteLength);
}

Encoder::Encoder(void):
    mFcs(0)
{
}

otError Encoder::Init(BufferWriteIterator &aIterator)
{
    mFcs = kInitFcs;

    return aIterator.WriteByte(kFlagSequence);
}

otError Encoder::Encode(uint8_t aInByte, BufferWriteIterator &aIterator)
{
    otError error = OT_ERROR_NONE;

    if (HdlcByteNeedsEscape(aInByte))
    {
        VerifyOrExit(aIterator.CanWrite(2) , error = OT_ERROR_NO_BUFS);

        aIterator.WriteByte(kEscapeSequence);
        aIterator.WriteByte(aInByte ^ 0x20);
    }
    else
    {
        SuccessOrExit(error = aIterator.WriteByte(aInByte));
    }

    mFcs = UpdateFcs(mFcs, aInByte);

exit:
    return error;
}

otError Encoder::Encode(const uint8_t *aInBuf, uint16_t aInLength, BufferWriteIterator &aIterator)
{
    otError error = OT_ERROR_NONE;
    BufferWriteIterator oldIterator(aIterator);
    uint16_t oldFcs = mFcs;

    for (int i = 0; i < aInLength; i++)
    {
        SuccessOrExit(error = Encode(aInBuf[i], aIterator));
    }

exit:

    if (error != OT_ERROR_NONE)
    {
        aIterator = oldIterator;
        mFcs = oldFcs;
    }

    return error;
}

otError Encoder::Finalize(BufferWriteIterator &aIterator)
{
    otError error = OT_ERROR_NONE;
    BufferWriteIterator oldIterator(aIterator);
    uint16_t oldFcs = mFcs;
    uint16_t fcs = mFcs;

    fcs ^= 0xffff;

    SuccessOrExit(error = Encode(fcs & 0xff, aIterator));
    SuccessOrExit(error = Encode(fcs >> 8, aIterator));

    SuccessOrExit(error = aIterator.WriteByte(kFlagSequence));

exit:

    if (error != OT_ERROR_NONE)
    {
        aIterator = oldIterator;
        mFcs = oldFcs;
    }

    return error;
}

Decoder::Decoder(uint8_t *aOutBuf, uint16_t aOutLength, FrameHandler aFrameHandler, ErrorHandler aErrorHandler,
                 void *aContext):
    mState(kStateNoSync),
    mFrameHandler(aFrameHandler),
    mErrorHandler(aErrorHandler),
    mContext(aContext),
    mOutBuf(aOutBuf),
    mOutOffset(0),
    mOutLength(aOutLength),
    mFcs(0)
{
}

void Decoder::Decode(const uint8_t *aInBuf, uint16_t aInLength)
{
    uint8_t byte;

    for (int i = 0; i < aInLength; i++)
    {
        byte = aInBuf[i];

        switch (mState)
        {
        case kStateNoSync:
            if (byte == kFlagSequence)
            {
                mState = kStateSync;
                mOutOffset = 0;
                mFcs = kInitFcs;
            }

            break;

        case kStateSync:
            switch (byte)
            {
            case kEscapeSequence:
                mState = kStateEscaped;
                break;

            case kFlagSequence:

                // We ignore frames which are smaller
                // than the size of the CRC check.
                if (mOutOffset > sizeof(uint16_t))
                {
                    if (mFcs == kGoodFcs)
                    {
                        mFrameHandler(mContext, mOutBuf, mOutOffset - sizeof(uint16_t));
                    }
                    else if (mErrorHandler != NULL)
                    {
                        mErrorHandler(mContext, OT_ERROR_PARSE, mOutBuf, mOutOffset);
                    }
                }

                mOutOffset = 0;
                mFcs = kInitFcs;

                break;

            default:
                if (mOutOffset < mOutLength)
                {
                    mFcs = UpdateFcs(mFcs, byte);
                    mOutBuf[mOutOffset++] = byte;
                }
                else
                {
                    if (mErrorHandler != NULL)
                    {
                        mErrorHandler(mContext, OT_ERROR_NO_BUFS, mOutBuf, mOutOffset);
                    }

                    mState = kStateNoSync;
                }

                break;
            }

            break;

        case kStateEscaped:
            if (mOutOffset < mOutLength)
            {
                byte ^= 0x20;
                mFcs = UpdateFcs(mFcs, byte);
                mOutBuf[mOutOffset++] = byte;
                mState = kStateSync;
            }
            else
            {
                if (mErrorHandler != NULL)
                {
                    mErrorHandler(mContext, OT_ERROR_NO_BUFS, mOutBuf, mOutOffset);
                }

                mState = kStateNoSync;
            }


            break;
        }
    }
}

}  // namespace Hdlc
}  // namespace ot

#endif // OPENTHREAD_ENABLE_NCP_UART
