/* * Copyright (c) 2017 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. */ #include "HeaderRemovalTests.h" #include "TestsUtils.h" #include ///////////////////////////////////////////////////////////////////////////////// static const unsigned int HEADER_REMOVAL_TEST_MAX_PACKET_BYTE_SIZE = 1024; ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// HeaderRemovalTOSCheck::HeaderRemovalTOSCheck() { m_name = "HeaderRemovalTOSCheck"; m_description = "HeaderRemovalTOSCheck: Remove the header from the A2NDUN pipe and check the TOS field of the IP packet"; } ///////////////////////////////////////////////////////////////////////////////// bool HeaderRemovalTOSCheck::Run() { bool bTestResult = true; Byte pPacketReceiveBuffer[HEADER_REMOVAL_TEST_MAX_PACKET_BYTE_SIZE] = {0};//This buffer will be used in order to store the received packet. unsigned int nMagicNumber = 0x12345678; //arbitrary number unsigned int nChannelID = 0xABCD;//arbitrary number unsigned int nA2NDUNPacketByteSize = 0; unsigned int nBytesSent = 0; int nBytesReceived = 0; Byte *pA2NDUNPacket = CreateA2NDUNPacket(nMagicNumber, nChannelID, IPV4_FILE_PATH, &nA2NDUNPacketByteSize); if(0 == pA2NDUNPacket) { LOG_MSG_ERROR("Cannot load file to memory, exiting"); return false; } LOG_MSG_INFO("A2 Packet was successfully created (%d bytes)", nA2NDUNPacketByteSize); if ( false == SetIPATablesToPassAllToSpecificClient(IPA_CLIENT_TEST2_PROD, IPA_CLIENT_TEST_CONS)) { LOG_MSG_ERROR("SetIPATablesToPassAllToSpecificClient failed, exiting test case"); bTestResult = false; goto bail; } LOG_MSG_INFO("All tables were configured in order to output the packet to the correct pipe"); LOG_MSG_INFO("Sending packet into the A2NDUN pipe(%d bytes) and the Pipe will add an header", nA2NDUNPacketByteSize); nBytesSent = m_A2NDUNToIpaPipe.Send(pA2NDUNPacket, nA2NDUNPacketByteSize); if (nA2NDUNPacketByteSize != nBytesSent) { bTestResult = false; goto bail; } //Receive the raw IP packet(which is a 4 arbitrary bytes) without header removal by the Pipe LOG_MSG_INFO("Reading packet from the USB pipe"); nBytesReceived = m_IpaToUsbPipe.Receive(pPacketReceiveBuffer, HEADER_REMOVAL_TEST_MAX_PACKET_BYTE_SIZE); //TODO Header Removal: at this point the success scenario is that data came to the correct pipe - change this to //packet memory compare after header insertion is enabled. if (0 == nBytesReceived) { bTestResult = false; goto bail; } LOG_MSG_INFO("Read buffer : "); //Print the output for (int i = 0 ; i < nBytesReceived ; i++) { printf("0x%02x", pPacketReceiveBuffer[i]); } LOG_MSG_INFO("End of Read buffer."); if(0 != memcmp((const void *)pPacketReceiveBuffer, (const void *)(pA2NDUNPacket + (nBytesSent - nBytesReceived)), nBytesReceived)) { LOG_MSG_ERROR("Memory contains don't match"); bTestResult = false; goto bail; } /* fall through */ bail: delete pA2NDUNPacket; return bTestResult; } HeaderRemovalMetaDataFiltering::HeaderRemovalMetaDataFiltering() { m_name = "HeaderRemovalMetaDataFiltering"; m_description = "HeaderRemovalMetaDataFiltering: check meta data based filtering"; } ///////////////////////////////////////////////////////////////////////////////// bool HeaderRemovalMetaDataFiltering::Run() { bool bTestResult = true; Byte pPacketReceiveBuffer[HEADER_REMOVAL_TEST_MAX_PACKET_BYTE_SIZE] = {0};//This buffer will be used in order to store the received packet. unsigned int nMagicNumber = 0x12345678; //arbitrary number unsigned int nChannelID = 0xABCD;//arbitrary number unsigned int nA2NDUNPacketByteSize = 0; unsigned int nMetaData = 0; unsigned int nMetaDataMask = 0xFFFF; unsigned int nBytesSent = 0; int nBytesReceived = 0; Byte *pA2NDUNPacket = CreateA2NDUNPacket(nMagicNumber, nChannelID, IPV4_FILE_PATH, &nA2NDUNPacketByteSize); if(0 == pA2NDUNPacket) { LOG_MSG_ERROR("Cannot load file to memory, exiting"); return false; } nMetaData = (nChannelID << 16) | (0xFFFF & nA2NDUNPacketByteSize); LOG_MSG_INFO("*************nMetaData == (0x%x)", nMetaData); LOG_MSG_INFO("A2 Packet was successfully created (%d bytes)", nA2NDUNPacketByteSize); SetRoutingTableToPassAllToSpecificClient(IPA_CLIENT_TEST_CONS); SetHeaderInsertionTableAddEmptyHeaderForTheClient(IPA_CLIENT_TEST_CONS); LOG_MSG_INFO("Configuring Filtering module..."); if (false == ConfigureFilteringBlockWithMetaDataEq( IPA_CLIENT_TEST_CONS, nMetaData, nMetaDataMask)) { bTestResult = false; goto bail; } LOG_MSG_INFO("Sending packet into the A2NDUN pipe(%d bytes) and the Pipe will add an header", nA2NDUNPacketByteSize); nBytesSent = m_A2NDUNToIpaPipe.Send(pA2NDUNPacket, nA2NDUNPacketByteSize); if (nA2NDUNPacketByteSize != nBytesSent) { bTestResult = false; goto bail; } //Receive the raw IP packet(which is a 4 arbitrary bytes) without header removal by the Pipe LOG_MSG_INFO("Reading packet from the USB pipe"); nBytesReceived = m_IpaToUsbPipe.Receive(pPacketReceiveBuffer, HEADER_REMOVAL_TEST_MAX_PACKET_BYTE_SIZE); //TODO Header Removal: at this point the success scenario is that data came to the correct pipe - change this to //packet memory compare after header insertion is enabled. if (0 == nBytesReceived) { bTestResult = false; goto bail; } LOG_MSG_INFO("Read buffer : "); //Print the output for (int i = 0 ; i < nBytesReceived ; i++) { printf("0x%02x", pPacketReceiveBuffer[i]); } LOG_MSG_INFO("End of Read buffer."); if(0 != memcmp((const void *)pPacketReceiveBuffer, (const void *)(pA2NDUNPacket + (nBytesSent - nBytesReceived)), nBytesReceived)) { LOG_MSG_ERROR("Memory contains don't match"); bTestResult = false; goto bail; } /* fall through */ bail: delete pA2NDUNPacket; return bTestResult; } static HeaderRemovalTOSCheck headerRemovalTOSCheck; static HeaderRemovalMetaDataFiltering headerRemovalMetaDataFiltering; ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////