1*cfb92d14SAndroid Build Coastguard Worker /* 2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2016, The OpenThread Authors. 3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved. 4*cfb92d14SAndroid Build Coastguard Worker * 5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the 13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products 14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*cfb92d14SAndroid Build Coastguard Worker * 16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17*cfb92d14SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*cfb92d14SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*cfb92d14SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY 20*cfb92d14SAndroid Build Coastguard Worker * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21*cfb92d14SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22*cfb92d14SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23*cfb92d14SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*cfb92d14SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25*cfb92d14SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*cfb92d14SAndroid Build Coastguard Worker */ 27*cfb92d14SAndroid Build Coastguard Worker 28*cfb92d14SAndroid Build Coastguard Worker /** 29*cfb92d14SAndroid Build Coastguard Worker * @file 30*cfb92d14SAndroid Build Coastguard Worker * This file contains definitions for a HDLC based NCP interface to the OpenThread stack. 31*cfb92d14SAndroid Build Coastguard Worker */ 32*cfb92d14SAndroid Build Coastguard Worker 33*cfb92d14SAndroid Build Coastguard Worker #ifndef NCP_HDLC_HPP_ 34*cfb92d14SAndroid Build Coastguard Worker #define NCP_HDLC_HPP_ 35*cfb92d14SAndroid Build Coastguard Worker 36*cfb92d14SAndroid Build Coastguard Worker #include "openthread-core-config.h" 37*cfb92d14SAndroid Build Coastguard Worker 38*cfb92d14SAndroid Build Coastguard Worker #include "lib/hdlc/hdlc.hpp" 39*cfb92d14SAndroid Build Coastguard Worker #include "lib/spinel/multi_frame_buffer.hpp" 40*cfb92d14SAndroid Build Coastguard Worker #include "ncp/ncp_base.hpp" 41*cfb92d14SAndroid Build Coastguard Worker 42*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_ENABLE_NCP_SPINEL_ENCRYPTER 43*cfb92d14SAndroid Build Coastguard Worker #include "lib/spinel/spinel_encrypter.hpp" 44*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_ENABLE_NCP_SPINEL_ENCRYPTER 45*cfb92d14SAndroid Build Coastguard Worker 46*cfb92d14SAndroid Build Coastguard Worker namespace ot { 47*cfb92d14SAndroid Build Coastguard Worker namespace Ncp { 48*cfb92d14SAndroid Build Coastguard Worker 49*cfb92d14SAndroid Build Coastguard Worker class NcpHdlc : public NcpBase 50*cfb92d14SAndroid Build Coastguard Worker { 51*cfb92d14SAndroid Build Coastguard Worker typedef NcpBase super_t; 52*cfb92d14SAndroid Build Coastguard Worker 53*cfb92d14SAndroid Build Coastguard Worker public: 54*cfb92d14SAndroid Build Coastguard Worker /** 55*cfb92d14SAndroid Build Coastguard Worker * Constructor 56*cfb92d14SAndroid Build Coastguard Worker * 57*cfb92d14SAndroid Build Coastguard Worker * @param[in] aInstance The OpenThread instance structure. 58*cfb92d14SAndroid Build Coastguard Worker * 59*cfb92d14SAndroid Build Coastguard Worker */ 60*cfb92d14SAndroid Build Coastguard Worker explicit NcpHdlc(Instance *aInstance, otNcpHdlcSendCallback aSendCallback); 61*cfb92d14SAndroid Build Coastguard Worker 62*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE && OPENTHREAD_RADIO 63*cfb92d14SAndroid Build Coastguard Worker /** 64*cfb92d14SAndroid Build Coastguard Worker * Constructor 65*cfb92d14SAndroid Build Coastguard Worker * 66*cfb92d14SAndroid Build Coastguard Worker * @param[in] aInstancs The OpenThread instance pointers array. 67*cfb92d14SAndroid Build Coastguard Worker * @param[in] aCount Number of instances in the array. 68*cfb92d14SAndroid Build Coastguard Worker * @param[in] aSendCallback Callback for sending data. 69*cfb92d14SAndroid Build Coastguard Worker * 70*cfb92d14SAndroid Build Coastguard Worker */ 71*cfb92d14SAndroid Build Coastguard Worker explicit NcpHdlc(Instance **aInstances, uint8_t aCount, otNcpHdlcSendCallback aSendCallback); 72*cfb92d14SAndroid Build Coastguard Worker 73*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE && OPENTHREAD_RADIO 74*cfb92d14SAndroid Build Coastguard Worker 75*cfb92d14SAndroid Build Coastguard Worker /** 76*cfb92d14SAndroid Build Coastguard Worker * Is called when uart tx is finished. It prepares and sends the next data chunk (if any) to uart. 77*cfb92d14SAndroid Build Coastguard Worker * 78*cfb92d14SAndroid Build Coastguard Worker */ 79*cfb92d14SAndroid Build Coastguard Worker void HandleHdlcSendDone(void); 80*cfb92d14SAndroid Build Coastguard Worker 81*cfb92d14SAndroid Build Coastguard Worker /** 82*cfb92d14SAndroid Build Coastguard Worker * Is called when uart received a data buffer. 83*cfb92d14SAndroid Build Coastguard Worker * 84*cfb92d14SAndroid Build Coastguard Worker */ 85*cfb92d14SAndroid Build Coastguard Worker void HandleHdlcReceiveDone(const uint8_t *aBuf, uint16_t aBufLength); 86*cfb92d14SAndroid Build Coastguard Worker 87*cfb92d14SAndroid Build Coastguard Worker private: 88*cfb92d14SAndroid Build Coastguard Worker enum 89*cfb92d14SAndroid Build Coastguard Worker { 90*cfb92d14SAndroid Build Coastguard Worker kHdlcTxBufferSize = OPENTHREAD_CONFIG_NCP_HDLC_TX_CHUNK_SIZE, // HDLC tx buffer size. 91*cfb92d14SAndroid Build Coastguard Worker kRxBufferSize = OPENTHREAD_CONFIG_NCP_HDLC_RX_BUFFER_SIZE + // Rx buffer size (should be large enough to fit 92*cfb92d14SAndroid Build Coastguard Worker OPENTHREAD_CONFIG_NCP_SPINEL_ENCRYPTER_EXTRA_DATA_SIZE, // one whole (decoded) received frame). 93*cfb92d14SAndroid Build Coastguard Worker }; 94*cfb92d14SAndroid Build Coastguard Worker 95*cfb92d14SAndroid Build Coastguard Worker enum HdlcTxState 96*cfb92d14SAndroid Build Coastguard Worker { 97*cfb92d14SAndroid Build Coastguard Worker kStartingFrame, // Starting a new frame. 98*cfb92d14SAndroid Build Coastguard Worker kEncodingFrame, // In middle of encoding a frame. 99*cfb92d14SAndroid Build Coastguard Worker kFinalizingFrame, // Finalizing a frame. 100*cfb92d14SAndroid Build Coastguard Worker }; 101*cfb92d14SAndroid Build Coastguard Worker 102*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_ENABLE_NCP_SPINEL_ENCRYPTER 103*cfb92d14SAndroid Build Coastguard Worker /** 104*cfb92d14SAndroid Build Coastguard Worker * Wraps Spinel::Buffer allowing to read data through spinel encrypter. 105*cfb92d14SAndroid Build Coastguard Worker * Creates additional buffers to allow transforming of the whole spinel frames. 106*cfb92d14SAndroid Build Coastguard Worker */ 107*cfb92d14SAndroid Build Coastguard Worker class BufferEncrypterReader 108*cfb92d14SAndroid Build Coastguard Worker { 109*cfb92d14SAndroid Build Coastguard Worker public: 110*cfb92d14SAndroid Build Coastguard Worker /** 111*cfb92d14SAndroid Build Coastguard Worker * C-tor. 112*cfb92d14SAndroid Build Coastguard Worker * Takes a reference to Spinel::Buffer in order to read spinel frames. 113*cfb92d14SAndroid Build Coastguard Worker */ 114*cfb92d14SAndroid Build Coastguard Worker explicit BufferEncrypterReader(Spinel::Buffer &aTxFrameBuffer); 115*cfb92d14SAndroid Build Coastguard Worker bool IsEmpty(void) const; 116*cfb92d14SAndroid Build Coastguard Worker otError OutFrameBegin(void); 117*cfb92d14SAndroid Build Coastguard Worker bool OutFrameHasEnded(void); 118*cfb92d14SAndroid Build Coastguard Worker uint8_t OutFrameReadByte(void); 119*cfb92d14SAndroid Build Coastguard Worker otError OutFrameRemove(void); 120*cfb92d14SAndroid Build Coastguard Worker 121*cfb92d14SAndroid Build Coastguard Worker private: 122*cfb92d14SAndroid Build Coastguard Worker void Reset(void); 123*cfb92d14SAndroid Build Coastguard Worker 124*cfb92d14SAndroid Build Coastguard Worker Spinel::Buffer &mTxFrameBuffer; 125*cfb92d14SAndroid Build Coastguard Worker uint8_t mDataBuffer[kRxBufferSize]; 126*cfb92d14SAndroid Build Coastguard Worker size_t mDataBufferReadIndex; 127*cfb92d14SAndroid Build Coastguard Worker size_t mOutputDataLength; 128*cfb92d14SAndroid Build Coastguard Worker }; 129*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_ENABLE_NCP_SPINEL_ENCRYPTER 130*cfb92d14SAndroid Build Coastguard Worker 131*cfb92d14SAndroid Build Coastguard Worker void EncodeAndSend(void); 132*cfb92d14SAndroid Build Coastguard Worker void HandleFrame(otError aError); 133*cfb92d14SAndroid Build Coastguard Worker void HandleError(otError aError, uint8_t *aBuf, uint16_t aBufLength); 134*cfb92d14SAndroid Build Coastguard Worker void TxFrameBufferHasData(void); 135*cfb92d14SAndroid Build Coastguard Worker void HandleFrameAddedToNcpBuffer(void); 136*cfb92d14SAndroid Build Coastguard Worker 137*cfb92d14SAndroid Build Coastguard Worker static void EncodeAndSend(Tasklet &aTasklet); 138*cfb92d14SAndroid Build Coastguard Worker static void HandleFrame(void *aContext, otError aError); 139*cfb92d14SAndroid Build Coastguard Worker static void HandleFrameAddedToNcpBuffer(void *aContext, 140*cfb92d14SAndroid Build Coastguard Worker Spinel::Buffer::FrameTag aTag, 141*cfb92d14SAndroid Build Coastguard Worker Spinel::Buffer::Priority aPriority, 142*cfb92d14SAndroid Build Coastguard Worker Spinel::Buffer *aBuffer); 143*cfb92d14SAndroid Build Coastguard Worker otNcpHdlcSendCallback mSendCallback; 144*cfb92d14SAndroid Build Coastguard Worker 145*cfb92d14SAndroid Build Coastguard Worker Spinel::FrameBuffer<kHdlcTxBufferSize> mHdlcBuffer; 146*cfb92d14SAndroid Build Coastguard Worker Hdlc::Encoder mFrameEncoder; 147*cfb92d14SAndroid Build Coastguard Worker Hdlc::Decoder mFrameDecoder; 148*cfb92d14SAndroid Build Coastguard Worker HdlcTxState mState; 149*cfb92d14SAndroid Build Coastguard Worker uint8_t mByte; 150*cfb92d14SAndroid Build Coastguard Worker Spinel::FrameBuffer<kRxBufferSize> mRxBuffer; 151*cfb92d14SAndroid Build Coastguard Worker bool mHdlcSendImmediate; 152*cfb92d14SAndroid Build Coastguard Worker Tasklet mHdlcSendTask; 153*cfb92d14SAndroid Build Coastguard Worker 154*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_ENABLE_NCP_SPINEL_ENCRYPTER 155*cfb92d14SAndroid Build Coastguard Worker BufferEncrypterReader mTxFrameBufferEncrypterReader; 156*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_ENABLE_NCP_SPINEL_ENCRYPTER 157*cfb92d14SAndroid Build Coastguard Worker }; 158*cfb92d14SAndroid Build Coastguard Worker 159*cfb92d14SAndroid Build Coastguard Worker } // namespace Ncp 160*cfb92d14SAndroid Build Coastguard Worker } // namespace ot 161*cfb92d14SAndroid Build Coastguard Worker 162*cfb92d14SAndroid Build Coastguard Worker #endif // NCP_HDLC_HPP_ 163