HeaderRemovalTestFixture.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. /*
  2. * Copyright (c) 2017 The Linux Foundation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are
  6. * met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above
  10. * copyright notice, this list of conditions and the following
  11. * disclaimer in the documentation and/or other materials provided
  12. * with the distribution.
  13. * * Neither the name of The Linux Foundation nor the names of its
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  18. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  21. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  24. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  25. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  26. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  27. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #include "HeaderRemovalTestFixture.h"
  30. #include "Constants.h"
  31. #include "Logger.h"
  32. #include "IPAFilteringTable.h"
  33. #define IPA_TEST_DMUX_HEADER_LENGTH 8
  34. #define IPA_TEST_META_DATA_IS_VALID 1
  35. #define IPA_TEST_DMUX_HEADER_META_DATA_OFFSET 4
  36. extern Logger g_Logger;
  37. /////////////////////////////////////////////////////////////////////////////////
  38. //define the static Pipes which will be used by all derived tests.
  39. Pipe HeaderRemovalTestFixture::m_A2NDUNToIpaPipe(IPA_CLIENT_TEST2_PROD, IPA_TEST_CONFIFURATION_3);
  40. Pipe HeaderRemovalTestFixture::m_IpaToUsbPipe(IPA_CLIENT_TEST_CONS, IPA_TEST_CONFIFURATION_3);
  41. Pipe HeaderRemovalTestFixture::m_IpaToA2NDUNPipe(IPA_CLIENT_TEST2_CONS, IPA_TEST_CONFIFURATION_3);
  42. Pipe HeaderRemovalTestFixture::m_IpaToQ6LANPipe(IPA_CLIENT_TEST4_CONS, IPA_TEST_CONFIFURATION_3);
  43. RoutingDriverWrapper HeaderRemovalTestFixture::m_routing;
  44. Filtering HeaderRemovalTestFixture::m_filtering;
  45. const char HeaderRemovalTestFixture_bypass0[20] = "Bypass0";
  46. const char HeaderRemovalTestFixture_bypassIPv60[20] = "BypassIPv60";
  47. /////////////////////////////////////////////////////////////////////////////////
  48. HeaderRemovalTestFixture::HeaderRemovalTestFixture()
  49. {
  50. m_testSuiteName.push_back("Removal");
  51. Register(*this);
  52. }
  53. static int SetupKernelModule(void)
  54. {
  55. int retval;
  56. struct ipa_channel_config from_ipa_channels[3];
  57. struct test_ipa_ep_cfg from_ipa_cfg[3];
  58. struct ipa_channel_config to_ipa_channels[1];
  59. struct test_ipa_ep_cfg to_ipa_cfg[1];
  60. struct ipa_test_config_header header = {0};
  61. struct ipa_channel_config *to_ipa_array[1];
  62. struct ipa_channel_config *from_ipa_array[3];
  63. /* From ipa configurations - 3 pipes */
  64. memset(&from_ipa_cfg[0], 0, sizeof(from_ipa_cfg[0]));
  65. prepare_channel_struct(&from_ipa_channels[0],
  66. header.from_ipa_channels_num++,
  67. IPA_CLIENT_TEST_CONS,
  68. (void *)&from_ipa_cfg[0],
  69. sizeof(from_ipa_cfg[0]));
  70. from_ipa_array[0] = &from_ipa_channels[0];
  71. memset(&from_ipa_cfg[1], 0, sizeof(from_ipa_cfg[1]));
  72. prepare_channel_struct(&from_ipa_channels[1],
  73. header.from_ipa_channels_num++,
  74. IPA_CLIENT_TEST2_CONS,
  75. (void *)&from_ipa_cfg[1],
  76. sizeof(from_ipa_cfg[1]));
  77. from_ipa_array[1] = &from_ipa_channels[1];
  78. memset(&from_ipa_cfg[2], 0, sizeof(from_ipa_cfg[2]));
  79. prepare_channel_struct(&from_ipa_channels[2],
  80. header.from_ipa_channels_num++,
  81. IPA_CLIENT_TEST4_CONS,
  82. (void *)&from_ipa_cfg[2],
  83. sizeof(from_ipa_cfg[2]));
  84. from_ipa_array[2] = &from_ipa_channels[2];
  85. /* To ipa configurations - 1 pipes */
  86. memset(&to_ipa_cfg[0], 0, sizeof(to_ipa_cfg[0]));
  87. to_ipa_cfg[0].hdr.hdr_len = IPA_TEST_DMUX_HEADER_LENGTH;
  88. to_ipa_cfg[0].hdr.hdr_ofst_metadata_valid = IPA_TEST_META_DATA_IS_VALID;
  89. to_ipa_cfg[0].hdr.hdr_ofst_metadata =
  90. IPA_TEST_DMUX_HEADER_META_DATA_OFFSET;
  91. prepare_channel_struct(&to_ipa_channels[0],
  92. header.to_ipa_channels_num++,
  93. IPA_CLIENT_TEST2_PROD,
  94. (void *)&to_ipa_cfg[0],
  95. sizeof(to_ipa_cfg[0]));
  96. to_ipa_array[0] = &to_ipa_channels[0];
  97. header.head_marker = IPA_TEST_CONFIG_MARKER;
  98. header.tail_marker = IPA_TEST_CONFIG_MARKER;
  99. prepare_header_struct(&header, from_ipa_array, to_ipa_array);
  100. retval = GenericConfigureScenario(&header);
  101. return retval;
  102. }
  103. /////////////////////////////////////////////////////////////////////////////////
  104. bool HeaderRemovalTestFixture::Setup()
  105. {
  106. bool bRetVal = true;
  107. //Set the configuration to support USB->IPA and IPA->USB pipes.
  108. //ConfigureScenario(PHASE_THREE_TEST_CONFIGURATION);
  109. bRetVal = SetupKernelModule();
  110. if (bRetVal != true) {
  111. return bRetVal;
  112. }
  113. //Initialize the pipe for all the tests - this will open the inode which represents the pipe.
  114. bRetVal &= m_A2NDUNToIpaPipe.Init();
  115. bRetVal &= m_IpaToUsbPipe.Init();
  116. bRetVal &= m_IpaToA2NDUNPipe.Init();
  117. bRetVal &= m_IpaToQ6LANPipe.Init();
  118. // remove default "LAN" routing table (as we want to pass to USB pipe)
  119. m_routing.Reset(IPA_IP_v4);
  120. m_routing.Reset(IPA_IP_v6);
  121. return bRetVal;
  122. }
  123. /////////////////////////////////////////////////////////////////////////////////
  124. bool HeaderRemovalTestFixture::Teardown()
  125. {
  126. //The Destroy method will close the inode.
  127. m_A2NDUNToIpaPipe.Destroy();
  128. m_IpaToUsbPipe.Destroy();
  129. m_IpaToA2NDUNPipe.Destroy();
  130. m_IpaToQ6LANPipe.Destroy();
  131. return true;
  132. }
  133. /////////////////////////////////////////////////////////////////////////////////
  134. Byte* HeaderRemovalTestFixture::CreateA2NDUNPacket(
  135. unsigned int magicNumber,
  136. unsigned int nID,
  137. string sPayloadFileName,
  138. unsigned int *nTotalLength)
  139. {
  140. size_t nIpv4ByteSize = 1024;
  141. bool bRetVal = false;
  142. Byte *pA2NDUNPacket = 0;
  143. unsigned int nA2NDUNPacketByteSize = 0;
  144. Byte *pIpv4Packet = (Byte*) malloc(1024);
  145. if(0 == pIpv4Packet)
  146. {
  147. LOG_MSG_ERROR("Cannot allocate the memory for IPv4 packet");
  148. return 0;
  149. }
  150. bRetVal = LoadDefaultPacket(IPA_IP_v4, pIpv4Packet, nIpv4ByteSize);
  151. if(false == bRetVal)
  152. {
  153. LOG_MSG_ERROR("Cannot load the packet");
  154. pA2NDUNPacket = 0;
  155. goto bail;
  156. }
  157. //Magic Number(4 Bytes) Logical Channel ID(2 Bytes) Length(2 Bytes)
  158. nA2NDUNPacketByteSize = m_A2NDUNToIpaPipe.GetHeaderLengthAdd() + nIpv4ByteSize;
  159. pA2NDUNPacket = new Byte[ nA2NDUNPacketByteSize ];
  160. //htobe32 for the magic number:
  161. pA2NDUNPacket[0] = (magicNumber & 0xFF000000) >> 24;//MSB
  162. pA2NDUNPacket[1] = (magicNumber & 0x00FF0000) >> 16;
  163. pA2NDUNPacket[2] = (magicNumber & 0x0000FF00) >> 8;
  164. pA2NDUNPacket[3] = (magicNumber & 0x000000FF) >> 0;//LSB
  165. //htobe16 for the Logical Channel ID:
  166. pA2NDUNPacket[4] = (nID & 0xFF00) >> 8;//MSB
  167. pA2NDUNPacket[5] = (nID & 0x00FF) >> 0;//LSB
  168. //htobe16 for the Length of the packet:
  169. pA2NDUNPacket[6] = (nA2NDUNPacketByteSize & 0xFF00) >> 8;//MSB
  170. pA2NDUNPacket[7] = (nA2NDUNPacketByteSize & 0x00FF) >> 0;//LSB
  171. //add the payload to the A2NDUN packet
  172. memcpy(&pA2NDUNPacket[8], pIpv4Packet, nIpv4ByteSize);
  173. *nTotalLength = nA2NDUNPacketByteSize;
  174. /* fall through */
  175. bail:
  176. Free(pIpv4Packet);
  177. return pA2NDUNPacket;
  178. }
  179. /////////////////////////////////////////////////////////////////////////////////
  180. bool HeaderRemovalTestFixture::SetIPATablesToPassAllToSpecificClient(
  181. enum ipa_client_type nClientTypeSrc,
  182. enum ipa_client_type nClientTypeDst)
  183. {
  184. bool bRetVal = true;
  185. bRetVal = SetRoutingTableToPassAllToSpecificClient(nClientTypeDst);
  186. if(false == bRetVal)
  187. goto bail;
  188. bRetVal = SetFilterTableToPassAllToSpecificClient(nClientTypeSrc);
  189. if(false == bRetVal)
  190. goto bail;
  191. bRetVal = SetHeaderInsertionTableAddEmptyHeaderForTheClient(nClientTypeSrc);
  192. if(false == bRetVal)
  193. goto bail;
  194. /* fall through */
  195. bail:
  196. return bRetVal;
  197. }
  198. /////////////////////////////////////////////////////////////////////////////////
  199. bool HeaderRemovalTestFixture::SetFilterTableToPassAllToSpecificClient(
  200. enum ipa_client_type nClientType)
  201. {
  202. IPAFilteringTable FilterTable;
  203. struct ipa_flt_rule_add flt_rule_entry;
  204. struct ipa_ioc_get_rt_tbl sRoutingTable;
  205. sRoutingTable.ip = IPA_IP_v4;
  206. strlcpy(sRoutingTable.name, "Bypass0", sizeof(sRoutingTable.name));
  207. if (false == m_routing.GetRoutingTable(&sRoutingTable)) {
  208. LOG_MSG_ERROR("Configure the routing block first");
  209. return false;
  210. }
  211. FilterTable.Init(IPA_IP_v4, nClientType, false, 1);
  212. FilterTable.GeneratePresetRule(0, flt_rule_entry);
  213. flt_rule_entry.at_rear = true;
  214. flt_rule_entry.flt_rule_hdl = -1;
  215. flt_rule_entry.status = -1;
  216. flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
  217. flt_rule_entry.rule.rt_tbl_hdl = sRoutingTable.hdl;
  218. flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
  219. flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000;
  220. flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000;
  221. if ((-1 == FilterTable.AddRuleToTable(flt_rule_entry)) ||
  222. !m_filtering.AddFilteringRule(FilterTable.GetFilteringTable())) {
  223. LOG_MSG_INFO ("%s::Error Adding RuleTable(0) to Filtering, aborting...");
  224. return false;
  225. } else {
  226. LOG_MSG_INFO( "flt rule hdl0=0x%x, status=0x%x",
  227. FilterTable.ReadRuleFromTable(0)->flt_rule_hdl,
  228. FilterTable.ReadRuleFromTable(0)->status);
  229. }
  230. LOG_MSG_INFO("Leaving ");
  231. return true;
  232. }
  233. /////////////////////////////////////////////////////////////////////////////////
  234. bool HeaderRemovalTestFixture::SetRoutingTableToPassAllToSpecificClient(
  235. enum ipa_client_type nClientType)
  236. {
  237. if (!CreateBypassRoutingTablesIPv4(
  238. HeaderRemovalTestFixture_bypass0,
  239. nClientType)) {
  240. LOG_MSG_INFO("CreateThreeBypassRoutingTables Failed");
  241. return false;
  242. }
  243. return true;
  244. }
  245. /////////////////////////////////////////////////////////////////////////////////
  246. bool HeaderRemovalTestFixture::SetHeaderInsertionTableAddEmptyHeaderForTheClient(
  247. enum ipa_client_type nClientType)
  248. {
  249. //TODO Header Removal: add header insertion data
  250. return true;
  251. }
  252. /////////////////////////////////////////////////////////////////////////////////
  253. // This function creates IPv4 bypass routing entry and commits it.
  254. bool HeaderRemovalTestFixture::CreateBypassRoutingTablesIPv4(
  255. const char * bypass0,
  256. enum ipa_client_type nClientType)
  257. {
  258. struct ipa_ioc_add_rt_rule *rt_rule0 = 0;
  259. struct ipa_rt_rule_add *rt_rule_entry;
  260. LOG_MSG_INFO("Entering");
  261. rt_rule0 = (struct ipa_ioc_add_rt_rule *)
  262. calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
  263. 1*sizeof(struct ipa_rt_rule_add));
  264. if (!rt_rule0) {
  265. LOG_MSG_INFO("calloc failed to allocate rt_rule0");
  266. return false;
  267. }
  268. rt_rule0->num_rules = 1;
  269. rt_rule0->ip = IPA_IP_v4;
  270. rt_rule0->commit = true;
  271. strlcpy(rt_rule0->rt_tbl_name, bypass0, sizeof(rt_rule0->rt_tbl_name));
  272. rt_rule_entry = &rt_rule0->rules[0];
  273. rt_rule_entry->at_rear = 0;
  274. rt_rule_entry->rule.dst = nClientType;
  275. // rt_rule_entry->rule.hdr_hdl = hdr_entry->hdr_hdl; // gidons, there is no support for header insertion / removal yet.
  276. rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
  277. rt_rule_entry->rule.attrib.u.v4.dst_addr = 0xaabbccdd;
  278. rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0x00000000;// All Packets will get a "Hit"
  279. if (false == m_routing.AddRoutingRule(rt_rule0)) {
  280. LOG_MSG_INFO("Routing rule addition(rt_rule0) failed!");
  281. Free (rt_rule0);
  282. return false;
  283. }
  284. Free (rt_rule0);
  285. LOG_MSG_INFO("Leaving ");
  286. return true;
  287. }
  288. bool HeaderRemovalTestFixture::ConfigureFilteringBlockWithMetaDataEq(
  289. enum ipa_client_type nClientType,
  290. unsigned int nMetaData,
  291. unsigned int nMetaDataMask)
  292. {
  293. const char bypass0[20] = "Bypass0";
  294. struct ipa_ioc_get_rt_tbl routing_table0;
  295. IPAFilteringTable FilterTable0;
  296. struct ipa_flt_rule_add flt_rule_entry;
  297. LOG_MSG_INFO("Entering ");
  298. if (!CreateBypassRoutingTablesIPv4(
  299. HeaderRemovalTestFixture_bypass0,
  300. nClientType)) {
  301. LOG_MSG_INFO("CreateBypassRoutingTablesIPv4 Failed");
  302. return false;
  303. }
  304. LOG_MSG_INFO("CreateBypassRoutingTablesIPv4 completed successfully");
  305. routing_table0.ip = IPA_IP_v4;
  306. strlcpy(routing_table0.name, bypass0, sizeof(routing_table0.name));
  307. if (!m_routing.GetRoutingTable(&routing_table0)) {
  308. LOG_MSG_INFO(
  309. "m_routing.GetRoutingTable(&routing_table0=0x%p) Failed."
  310. ,&routing_table0);
  311. return false;
  312. }
  313. FilterTable0.Init(IPA_IP_v4, IPA_CLIENT_TEST2_PROD, false, 1);
  314. LOG_MSG_INFO("FilterTable*.Init Completed Successfully..");
  315. // Configuring Filtering Rule No.0
  316. FilterTable0.GeneratePresetRule(1,flt_rule_entry);
  317. flt_rule_entry.at_rear = true;
  318. flt_rule_entry.flt_rule_hdl = -1; // return Value
  319. flt_rule_entry.status = -1; // return value
  320. flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
  321. flt_rule_entry.rule.rt_tbl_hdl = routing_table0.hdl; //put here the handle corresponding to Routing Rule 1
  322. flt_rule_entry.rule.attrib.attrib_mask = IPA_FLT_META_DATA;
  323. flt_rule_entry.rule.attrib.meta_data = nMetaData;
  324. flt_rule_entry.rule.attrib.meta_data_mask = nMetaDataMask;
  325. if ( (-1 == FilterTable0.AddRuleToTable(flt_rule_entry)) ||
  326. !m_filtering.AddFilteringRule(FilterTable0.GetFilteringTable()))
  327. {
  328. LOG_MSG_INFO ("%s::Error Adding RuleTable(0) to Filtering, aborting...");
  329. return false;
  330. } else {
  331. LOG_MSG_INFO("flt rule hdl0=0x%x, status=0x%x", FilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,FilterTable0.ReadRuleFromTable(0)->status);
  332. }
  333. LOG_MSG_INFO("Leaving ");
  334. return true;
  335. }