1ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard/* 29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2011-2015, Intel Corporation 3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved. 4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification, 6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met: 7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this 9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer. 10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice, 12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or 13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution. 14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors 16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without 17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission. 18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */ 3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#pragma once 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 329368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "NonCopyable.hpp" 339368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <vector> 3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <string> 359368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <cstdint> 3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 379368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <remote_processor_export.h> 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 399368eea42a1afb01dd44110582f997115b50e742François Gaffieclass Socket; 409368eea42a1afb01dd44110582f997115b50e742François Gaffie 419368eea42a1afb01dd44110582f997115b50e742François Gaffieclass REMOTE_PROCESSOR_EXPORT CMessage : private utility::NonCopyable 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4368a912857707864bbaaff9808717813105072a6ePatrick Benavolipublic: 449368eea42a1afb01dd44110582f997115b50e742François Gaffie enum class MsgType : std::uint8_t 459368eea42a1afb01dd44110582f997115b50e742François Gaffie { 469368eea42a1afb01dd44110582f997115b50e742François Gaffie ECommandRequest, 479368eea42a1afb01dd44110582f997115b50e742François Gaffie ESuccessAnswer, 489368eea42a1afb01dd44110582f997115b50e742François Gaffie EFailureAnswer, 499368eea42a1afb01dd44110582f997115b50e742François Gaffie EInvalid = static_cast<uint8_t>(-1), 509368eea42a1afb01dd44110582f997115b50e742François Gaffie }; 519368eea42a1afb01dd44110582f997115b50e742François Gaffie CMessage(MsgType ucMsgId); 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CMessage(); 539368eea42a1afb01dd44110582f997115b50e742François Gaffie virtual ~CMessage() = default; 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 559368eea42a1afb01dd44110582f997115b50e742François Gaffie enum Result 569368eea42a1afb01dd44110582f997115b50e742François Gaffie { 57e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard success, 58e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard peerDisconnected, 59e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard error 60e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard }; 61e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard 62ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard /** Write or read the message on pSocket. 63ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard * 649368eea42a1afb01dd44110582f997115b50e742François Gaffie * @param[in,out] socket is the socket on wich IO operation will be made. 65ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard * @param[in] bOut if true message should be read, 66ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard * if false it should be written. 67ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard * @param[out] strError on failure, a string explaining the error, 68ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard * on success, undefined. 69ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard * 70e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard * @return success if a correct message could be recv/send 71e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard * peerDisconnected if the peer disconnected before the first socket access. 72e874c2575c1203648e71426cd34f747cbd34b2b4Kevin Rocard * error if the message could not be read/write for any other reason 73ef8d727ca0eb346af951d15d84ba6f2b9564adf5Kevin Rocard */ 749368eea42a1afb01dd44110582f997115b50e742François Gaffie Result serialize(Socket &&socket, bool bOut, std::string &strError); 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoliprotected: 7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Msg Id 789368eea42a1afb01dd44110582f997115b50e742François Gaffie MsgType getMsgId() const; 79911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 80911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** Write raw data to the message 81911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * 82911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[in] pvData pointer to the data array 83911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[in] uiSize array size in bytes 84911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 859368eea42a1afb01dd44110582f997115b50e742François Gaffie void writeData(const void *pvData, size_t uiSize); 86911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 87911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** Read raw data from the message 88911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * 89911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[out] pvData pointer to the data array 90911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[in] uiSize array size in bytes 91911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 929368eea42a1afb01dd44110582f997115b50e742François Gaffie void readData(void *pvData, size_t uiSize); 93911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 94911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** Write string to the message 95911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * 96911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[in] strData the string to write 97911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 989368eea42a1afb01dd44110582f997115b50e742François Gaffie void writeString(const std::string &strData); 99911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 100911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** Write string to the message 101911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * 102911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[out] strData the string to read to 103911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 1049368eea42a1afb01dd44110582f997115b50e742François Gaffie void readString(std::string &strData); 105911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 106911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** @return string length plus room to store its length 107911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * 108911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[in] strData the string to get the size from 109911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 1109368eea42a1afb01dd44110582f997115b50e742François Gaffie size_t getStringSize(const std::string &strData) const; 111911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 112911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** @return remaining data size to read or to write depending on the context 113911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * (request: write, answer: read) 114911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 115911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t getRemainingDataSize() const; 1169368eea42a1afb01dd44110582f997115b50e742François Gaffie 11768a912857707864bbaaff9808717813105072a6ePatrick Benavoliprivate: 1189368eea42a1afb01dd44110582f997115b50e742François Gaffie bool isValidAccess(size_t offset, size_t size) const; 119911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 120911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** Allocate room to store the message 121911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * 122911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli * @param[int] uiDataSize the szie to allocate in bytes 123911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 124911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli void allocateData(size_t uiDataSize); 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Fill data to send 12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void fillDataToSend() = 0; 12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Collect received data 12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli virtual void collectReceivedData() = 0; 129911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 130911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** @return size of the transaction data in bytes 131911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli */ 132911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli virtual size_t getDataSize() const = 0; 133911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli 13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Checksum 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint8_t computeChecksum() const; 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // MsgId 1389368eea42a1afb01dd44110582f997115b50e742François Gaffie MsgType _ucMsgId; 1399368eea42a1afb01dd44110582f997115b50e742François Gaffie 1409368eea42a1afb01dd44110582f997115b50e742François Gaffie size_t getMessageDataSize() const { return mData.size(); } 1419368eea42a1afb01dd44110582f997115b50e742François Gaffie 1429368eea42a1afb01dd44110582f997115b50e742François Gaffie using Data = std::vector<uint8_t>; 1439368eea42a1afb01dd44110582f997115b50e742François Gaffie Data mData; 144911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli /** Read/Write Index used to iterate across the message data */ 145911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavoli size_t _uiIndex; 1469368eea42a1afb01dd44110582f997115b50e742François Gaffie 1479368eea42a1afb01dd44110582f997115b50e742François Gaffie static const uint16_t SYNC_WORD = 0xBABE; 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}; 149