| /* |
| * 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 "RoutingDriverWrapper.h" |
| #include "HeaderInsertion.h" |
| #include "Filtering.h" |
| #include "IPAFilteringTable.h" |
| #include "TestsUtils.h" |
| #include "ExceptionsTestFixture.h" |
| #include "IPv4Packet.h" |
| #include <string.h> |
| |
| #define MAX_SENT_BUFFER_SIZE 1500 |
| #define MAX_RECEIVE_BUFFER_SIZE 1500 |
| #define VALIDATE_WITH_MSG_AND_RETVAL(bRetVal,msg) \ |
| if (false == bRetVal){ \ |
| LOG_MSG_ERROR(msg); \ |
| return false; \ |
| } |
| |
| using namespace IPA; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class ExceptionsTestNonIpPacket: public ExceptionsTestFixture { |
| public: |
| //The packet size to be sent |
| size_t m_nPacketSize; |
| //A buffer to hold the non-IP(V4/V6) packet |
| Byte *m_pSendBuffer; |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| //Set the tests name and description |
| ExceptionsTestNonIpPacket() : |
| m_nPacketSize(0), m_pSendBuffer(NULL) { |
| m_name = "ExceptionsTestNonIpPacket"; |
| m_description = |
| "Create a non-IP packet(version!=4 && version !=6) and \ |
| expect exception from Filter block"; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| virtual bool Run() { |
| bool bRetVal = true; |
| Byte *pReceiveBuffer = new Byte[MAX_RECEIVE_BUFFER_SIZE]; |
| //Send the non-IPV4/IPV6 packet to the IPA |
| LOG_MSG_DEBUG("Send the non-IPV4/IPV6 packet to the IPA"); |
| size_t nBytesSent = m_USB1ToIpaPipe.Send(m_pSendBuffer, m_nPacketSize); |
| if (nBytesSent != m_nPacketSize) { |
| LOG_MSG_ERROR("Not all data was sent into the IPA"); |
| return false; |
| } |
| |
| //Read from the exception pipe(from IPA to A5) - try to read as much as we can |
| size_t nBytesRead = m_IpaToA5ExceptionPipe.Receive(pReceiveBuffer, |
| MAX_RECEIVE_BUFFER_SIZE); |
| if (nBytesRead != nBytesSent) { |
| LOG_MSG_ERROR("Not all data was read:"); |
| print_buff(pReceiveBuffer, nBytesRead); |
| return false; |
| } |
| |
| //check the exception packet against the one that we sent |
| bRetVal = !memcmp(m_pSendBuffer, pReceiveBuffer, nBytesSent); |
| if (false == bRetVal) { |
| LOG_MSG_ERROR("Received packet is not equal, Received:"); |
| print_buff(pReceiveBuffer, nBytesRead); |
| LOG_MSG_ERROR("Received packet is not equal, Sent:"); |
| print_buff(m_pSendBuffer, m_nPacketSize); |
| return false; |
| } |
| return true; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| //build the non-IP packet |
| virtual bool Setup() { |
| bool bRetVal = true; |
| m_pSendBuffer = new Byte[MAX_SENT_BUFFER_SIZE]; |
| //Load some default IPV4 packet and save its size |
| m_nPacketSize = MAX_SENT_BUFFER_SIZE; //This parameter is In/Out |
| bRetVal = LoadDefaultPacket(IPA_IP_v4, m_pSendBuffer, m_nPacketSize); |
| VALIDATE_WITH_MSG_AND_RETVAL(bRetVal, "Load failed"); |
| //Set the version field to non-IPV4/IPV6(version = 5) |
| m_pSendBuffer[0] &= 0x0F; |
| m_pSendBuffer[0] |= 0x50; |
| |
| //initialize Pipes |
| bRetVal = m_USB1ToIpaPipe.Init(); |
| VALIDATE_WITH_MSG_AND_RETVAL(bRetVal, "Pipe Initialization failed"); |
| bRetVal = m_IpaToA5ExceptionPipe.Init(); |
| VALIDATE_WITH_MSG_AND_RETVAL(bRetVal, "Pipe Initialization failed"); |
| return true; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| virtual bool Teardown() { |
| bool bRetVal = true; |
| delete[] m_pSendBuffer; |
| m_USB1ToIpaPipe.Destroy(); |
| m_IpaToA5ExceptionPipe.Destroy(); |
| return bRetVal; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| }; |
| //ExceptionTestNoneIpPacket |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class ExceptionsTestFragmentedException: public ExceptionsTestFixture { |
| public: |
| //The packet size to be sent |
| size_t m_nPacketSize; |
| //A buffer to hold the non-IP(V4/V6) packet |
| Byte *m_pSendBuffer; |
| Byte *m_pReceiveBuffer; |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| //Set the tests name and description |
| ExceptionsTestFragmentedException():m_nPacketSize(0), m_pSendBuffer(NULL), |
| m_pReceiveBuffer(NULL){ |
| m_name = "ExceptionsTestFragmentedException"; |
| m_description = |
| "Send IP packet with MF set, create global Filter rule \ |
| that will hit it as Exception"; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| virtual bool Run() { |
| bool bRetVal = true; |
| //configuring the Filter block to catch the fragmented packet: |
| ConfigureFilterGlobalRuleForMF(); |
| //Send the non-IPV4/IPV6 packet to the IPA |
| LOG_MSG_DEBUG("Send the IP packet with the MF bit set(size = %d)", m_nPacketSize); |
| size_t nBytesSent = m_USB1ToIpaPipe.Send(m_pSendBuffer, m_nPacketSize); |
| if (nBytesSent != m_nPacketSize) { |
| LOG_MSG_ERROR("Not all data was sent into the IPA(only %d)", nBytesSent); |
| return false; |
| } |
| //Read from the exception pipe(from IPA to A5) - try to read as much as we can |
| size_t nBytesRead = m_IpaToA5ExceptionPipe.Receive(m_pReceiveBuffer, |
| MAX_RECEIVE_BUFFER_SIZE); |
| if (nBytesRead != nBytesSent) { |
| LOG_MSG_ERROR("Not all data was read:"); |
| print_buff(m_pReceiveBuffer, nBytesRead); |
| return false; |
| } |
| //check the exception packet against the one that we sent |
| bRetVal = !memcmp(m_pSendBuffer, m_pReceiveBuffer, nBytesSent); |
| if (false == bRetVal) { |
| LOG_MSG_ERROR("Received packet is not equal, Received:"); |
| print_buff(m_pReceiveBuffer, nBytesRead); |
| LOG_MSG_ERROR("Received packet is not equal, Sent:"); |
| print_buff(m_pSendBuffer, m_nPacketSize); |
| return false; |
| } |
| return true; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| //build the non-IP packet |
| virtual bool Setup() { |
| bool bRetVal = true; |
| m_pReceiveBuffer = new Byte[MAX_RECEIVE_BUFFER_SIZE]; |
| m_pSendBuffer = new Byte[MAX_RECEIVE_BUFFER_SIZE]; |
| //Load some default TCP packet |
| TCPPacket tcpPacket; |
| //Set the MF bit |
| tcpPacket.SetMF(true); |
| //copy the packet to the send buffer |
| m_nPacketSize = tcpPacket.GetSize(); |
| tcpPacket.ToNetworkByteStream(m_pSendBuffer); |
| //initialize Pipes |
| bRetVal = m_USB1ToIpaPipe.Init(); |
| VALIDATE_WITH_MSG_AND_RETVAL(bRetVal, "Pipe Initialization failed"); |
| bRetVal = m_IpaToA5ExceptionPipe.Init(); |
| VALIDATE_WITH_MSG_AND_RETVAL(bRetVal, "Pipe Initialization failed"); |
| return true; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| virtual bool Teardown() { |
| bool bRetVal = true; |
| delete[] m_pSendBuffer; |
| m_USB1ToIpaPipe.Destroy(); |
| m_IpaToA5ExceptionPipe.Destroy(); |
| return bRetVal; |
| } |
| |
| |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| void ConfigureFilterGlobalRuleForMF(){ |
| //struct ipa_ioc_add_flt_rule *pRuleTable; |
| //Allocate memory for a table with one rule. |
| |
| //Instruct the Driver to write this table(with its one rule) to the HW |
| |
| //Continue from here - build the rule to catch the fragmented packet |
| } |
| |
| /////////////////////////////////////////////////////////////////////////// |
| |
| |
| }; |
| //ExceptionsTestFragmentedException |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class ExceptionsTestNonTCPUDP: public ExceptionsTestFixture { |
| |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| //Classes instances: |
| static ExceptionsTestNonIpPacket exceptionsTestNonIpPacket; |
| static ExceptionsTestFragmentedException exceptionsTestFragmentedException; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| ////////////// EOF //////// |
| /////////////////////////////////////////////////////////////////////////////// |