/* * Copyright (c) 2017-2019 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 #include #include #include #include #include // for memcpy #include "hton.h" // for htonl #include "InterfaceAbstraction.h" #include "Constants.h" #include "Logger.h" #include "TestsUtils.h" #include "Filtering.h" #include "HeaderInsertion.h" #include "RoutingDriverWrapper.h" #include "IPAFilteringTable.h" /* Processing context test design: 1. 1 Producer with RNDIS de-aggregation and ETH2 header removal. 2. 1 Producer with WLAN and ETH2 header removal. 3. 1 default consumer. 4. 1 RNDIS aggregation consumer. 5. 1 FLT rule – accept all - points to 1 RT rule. 6. 1 RT rule – accept all - points to specific test relevant proc_ctx. 7. All tests add all proc_ctx (for all tests). 8. Proc_ctx to be added: 1 for each test – 3 altogether. Proc_ctx of test 01 and 03 are the same. 9. Each test will send 1 packet and check that the packet is good except test 03. 10. Test 03 the same as Test 01 but will send multiple packets and expect 1 (RNDIS aggregation test). List of tests: 00. Header insertion scenario of [RNDIS][ETH_II][IP] -> [WLAN][ETH_II][IP] 01. Header insertion scenario of [WLAN][ETH_II][IP] -> [RNDIS][ETH_II][IP] 02. Header insertion scenario of [WLAN][ETH_II][IP] -> [WLAN’][ETH_II][IP] 03. Header insertion of [WLAN][ETH_II][IP] -> [RNDIS][ETH_II][IP] with RNDIS aggregation. 04. Header insertion scenario when adding total header sizes > 2048 05. Header insertion scenario of [ETH_II][IP] -> [WLAN][ETH_II][IP] 06. Header insertion scenario of [WLAN][ETH_II][IP] -> [ETH_II][IP 07. Header insertion scenario of [ETH_II][IP] -> [ETH_II][IP] 08. Header insertion scenario of [RNDIS][ETH_II][IP] -> [WLAN][802.3][IP] 09. Header insertion scenario of [WLAN][802.3][IP] -> [RNDIS][ETH_II][IP] 10. Header insertion scenario of [ETH_II][IP] -> [WLAN][802.3][IP] 11. Header insertion scenario of [WLAN][802.3][IP] -> [WLAN’][802.3][IP] */ class IpaHdrProcCtxTestFixture : public TestBase { public: enum HeaderHandleId { HEADER_HANDLE_ID_WLAN_ETH2, HEADER_HANDLE_ID_RNDIS_ETH2, HEADER_HANDLE_ID_ETH2, HEADER_HANDLE_ID_WLAN_802_3, HEADER_HANDLE_ID_VLAN_802_1Q, HEADER_HANDLE_ID_MAX }; enum ProcCtxHandleId { PROC_CTX_HANDLE_ID_ETH2_2_WLAN_ETH2, PROC_CTX_HANDLE_ID_ETH2_2_RNDIS_ETH2, PROC_CTX_HANDLE_ID_ETH2_ETH2_2_ETH2, PROC_CTX_HANDLE_ID_WLAN_ETH2_2_802_3, PROC_CTX_HANDLE_ID_RNDIS_802_3_2_ETH2, PROC_CTX_HANDLE_ID_WLAN_802_3_2_ETH2, PROC_CTX_HANDLE_ID_802_1Q_2_802_1Q, PROC_CTX_HANDLE_ID_ETH2_2_802_1Q, PROC_CTX_HANDLE_ID_802_1Q_2_ETH2, PROC_CTX_HANDLE_ID_ETH2_ETH2_2_ETH2_EX, PROC_CTX_HANDLE_ID_MAX }; // header table consist of 9 bits and 4B units -> 2048 static const int m_ALL_HEADER_SIZE_LIMIT = 2048; static const size_t m_BUFF_MAX_SIZE = 2 * RNDISAggregationHelper::RNDIS_AGGREGATION_BYTE_LIMIT; // [WLAN][ETH2] header static const Byte WLAN_ETH2_HDR[WLAN_ETH2_HDR_SIZE]; // [ETH2] header static const Byte ETH2_HDR[ETH_HLEN]; // [ETH2_802_1Q] vlan header static const Byte ETH2_8021Q_HDR[ETH8021Q_HEADER_LEN]; // [WLAN][802.3] header static const Byte WLAN_802_3_HDR[WLAN_802_3_HDR_SIZE]; static Filtering m_filtering; static RoutingDriverWrapper m_routing; static HeaderInsertion m_headerInsertion; // For each header type the handle is saved // to be used by the processing context uint32_t m_headerHandles[HEADER_HANDLE_ID_MAX]; // For each prco_ctx type the handle is saved // to be used by the routing rule uint32_t m_procCtxHHandles[PROC_CTX_HANDLE_ID_MAX]; // proc_ctx handle ID ProcCtxHandleId m_procCtxHandleId; // routing table handle uint32_t m_routingTableHdl; // Pipe with RNDIS and ETH2 header removal InterfaceAbstraction m_rndisEth2Producer; // Pipe with WLAN and ETH2 header removal InterfaceAbstraction m_wlanEth2producer; // Pipe with ETH2 header removal InterfaceAbstraction m_eth2Producer; // TODO: Pipe with WLAN and 802.3 header removal InterfaceAbstraction m_wlan802_3producer; // Pointer to current producer pipe used in the test InterfaceAbstraction *m_pCurrentProducer; ipa_client_type m_currProducerClient; // Pipe of the WLAN ETH2 consumer InterfaceAbstraction m_defaultConsumer; // Pipe of the RNDIS ETH2 consumer InterfaceAbstraction m_rndisEth2Consumer; // Pointer to current consumer pipe used in the test InterfaceAbstraction *m_pCurrentConsumer; ipa_client_type m_currConsumerPipeNum; // First input packet Byte m_sendBuffer1[m_BUFF_MAX_SIZE]; size_t m_sendSize1; // Second input packet Byte m_sendBuffer2[m_BUFF_MAX_SIZE]; size_t m_sendSize2; // First expected packet Byte m_expectedBuffer1[m_BUFF_MAX_SIZE]; size_t m_expectedBufferSize1; enum ipa_ip_type m_IpaIPType; IpaHdrProcCtxTestFixture(); virtual bool Setup(); virtual bool Teardown(); virtual void AddAllHeaders(); // Insert a single header virtual void AddHeader(HeaderHandleId handleId); virtual void AddAllProcCtx(); // Insert a single proc_ctx virtual void AddProcCtx(ProcCtxHandleId handleId); virtual void AddRtBypassRule(uint32_t hdrHdl, uint32_t procCtxHdl); virtual void AddFltBypassRule(); virtual bool LoadPackets(enum ipa_ip_type ip) = 0; virtual bool ReceivePacketsAndCompare(); // Create 1 IPv4 bypass routing entry and commits it virtual bool CreateIPv4BypassRoutingTable ( const char *name, uint32_t hdrHdl, uint32_t procCtxHdl); virtual bool GenerateExpectedPackets() = 0; virtual bool AddRules(); virtual bool SendPackets(); virtual bool Run(); ~IpaHdrProcCtxTestFixture(); private: };