/* * Copyright (c) 2021 The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of The Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. */ #ifndef ULSOTESTFIXTURE_H_ #define ULSOTESTFIXTURE_H_ #include #include #include #include #include #include #include "Constants.h" #include "Logger.h" #include "linux/msm_ipa.h" #include "TestsUtils.h" #include "TestBase.h" #include "network_traffic/UlsoPacket.h" using std::cout; using std::endl; using std::string; class UlsoTestFixture: public TestBase { public: UlsoTestFixture(){ m_testSuiteName.push_back("ULSO"); memset(m_sendBuf, 0, sizeof(m_sendBuf)); memset(m_receiveBuf, 0, sizeof(m_receiveBuf)); memset(m_segmentBuf, 0, sizeof(m_segmentBuf)); } virtual bool Setup() { if(!setupKernelModule()){ return false; } m_producer.Open(INTERFACE0_TO_IPA_DATA_PATH, INTERFACE0_FROM_IPA_DATA_PATH); m_consumer.Open(INTERFACE1_TO_IPA_DATA_PATH, INTERFACE1_FROM_IPA_DATA_PATH); return true; } virtual bool Teardown(){ m_producer.Close(); m_consumer.Close(); return true; } virtual bool Run() = 0; protected: virtual void configFromEp(struct test_ipa_ep_cfg *ep_cfg){ return; } size_t clearPipe(){ cout << "In clearPipe" << endl; if(m_consumer.setReadNoBlock() == -1){ cout << "Error: setReadNoBlock returned -1" << endl; return 0; } size_t recievedBytes = m_consumer.ReceiveSingleDataChunk(m_receiveBuf, UlsoPacket<>::maxSize); size_t totalReceivedBytes = recievedBytes; if(recievedBytes > 0){ unsigned count = 1; while(recievedBytes){ cout << "Receive #" << count << endl; printBuf(m_receiveBuf, recievedBytes, string("Rceived ") + std::to_string(recievedBytes) + string(" Bytes:")); recievedBytes = m_consumer.ReceiveSingleDataChunk(m_receiveBuf, UlsoPacket<>::maxSize); totalReceivedBytes += recievedBytes; count ++; } } else { cout << "There were no bytes left in the pipe" << endl; } m_consumer.clearReadNoBlock(); return totalReceivedBytes; } bool fail(size_t sendSize=0, size_t totalSegmentsSize=0, size_t recievedBytes=0){ printBuf(m_sendBuf, sendSize, "Sent:"); printBuf(m_receiveBuf, recievedBytes, string("Rceived ") + std::to_string(recievedBytes) + string(" Bytes:")); printBuf(m_segmentBuf, totalSegmentsSize, string("Expected to receive ") + std::to_string(totalSegmentsSize) + string(" Bytes:")); clearPipe(); return false; } virtual int setupKernelModule(bool en_status = 0){ struct ipa_channel_config from_ipa_channels[1]; struct test_ipa_ep_cfg from_ipa_cfg[1]; struct ipa_channel_config to_ipa_channels[1]; struct test_ipa_ep_cfg to_ipa_cfg[1]; struct ipa_test_config_header header = {0}; struct ipa_channel_config *to_ipa_array[1]; struct ipa_channel_config *from_ipa_array[1]; /* From ipa configurations - 1 pipe */ memset(&from_ipa_cfg[0], 0, sizeof(from_ipa_cfg[0])); from_ipa_cfg[0].ulso.is_ulso_pipe = true; configFromEp(&from_ipa_cfg[0]); prepare_channel_struct(&from_ipa_channels[0], header.from_ipa_channels_num++, IPA_CLIENT_TEST_CONS, (void *)&from_ipa_cfg[0], sizeof(from_ipa_cfg[0]), en_status); from_ipa_array[0] = &from_ipa_channels[0]; /* To ipa configurations - 1 pipe */ memset(&to_ipa_cfg[0], 0, sizeof(to_ipa_cfg[0])); to_ipa_cfg[0].ulso.ipid_min_max_idx = 0; to_ipa_cfg[0].ulso.is_ulso_pipe = true; prepare_channel_struct(&to_ipa_channels[0], header.to_ipa_channels_num++, IPA_CLIENT_TEST_PROD, (void *)&to_ipa_cfg[0], sizeof(to_ipa_cfg[0])); to_ipa_array[0] = &to_ipa_channels[0]; prepare_header_struct(&header, from_ipa_array, to_ipa_array); return GenericConfigureScenario(&header, true); } protected: static void printBuf(uint8_t* buf, size_t bufSize, string title=""){ if(bufSize == 0){ return; } cout << title << endl << std::hex; for (size_t i = 0; i < bufSize-1; i++) cout << std::setfill('0') << std::setw(2) << static_cast(buf[i]) << " "; cout << std::setfill('0') << std::setw(2) << static_cast(buf[bufSize-1]) << std::dec << endl; } public: InterfaceAbstraction m_producer; InterfaceAbstraction m_consumer; uint8_t m_sendBuf[UlsoPacket<>::maxSize]; uint8_t m_receiveBuf[UlsoPacket<>::maxSize]; uint8_t m_segmentBuf[UlsoPacket<>::maxSize]; }; #endif /* ULSOTESTFIXTURE_H_ */