123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- /*
- * 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 <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdint.h>
- #include <cstring> // 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:
- };
|