RNDISAggregationTestFixture.cpp 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. /*
  2. * Copyright (c) 2017-2018,2020 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 "RNDISAggregationTestFixture.h"
  30. #include "TestManager.h"
  31. /////////////////////////////////////////////////////////////////////////////////
  32. //define the static Pipes which will be used by all derived tests.
  33. Pipe RNDISAggregationTestFixture::m_IpaToUsbPipeAgg(IPA_CLIENT_TEST2_CONS,
  34. IPA_TEST_CONFIGURATION_17);
  35. Pipe RNDISAggregationTestFixture::m_UsbToIpaPipe(IPA_CLIENT_TEST_PROD,
  36. IPA_TEST_CONFIGURATION_17);
  37. Pipe RNDISAggregationTestFixture::m_IpaToUsbPipe(IPA_CLIENT_TEST3_CONS,
  38. IPA_TEST_CONFIGURATION_17);
  39. Pipe RNDISAggregationTestFixture::m_UsbToIpaPipeDeagg(IPA_CLIENT_TEST2_PROD,
  40. IPA_TEST_CONFIGURATION_17);
  41. Pipe RNDISAggregationTestFixture::m_IpaToUsbPipeAggTime(IPA_CLIENT_TEST_CONS,
  42. IPA_TEST_CONFIGURATION_17);
  43. Pipe RNDISAggregationTestFixture::m_IpaToUsbPipeAggPktLimit(IPA_CLIENT_TEST4_CONS,
  44. IPA_TEST_CONFIGURATION_17);
  45. Pipe RNDISAggregationTestFixture::m_HsicToIpaPipe(IPA_CLIENT_TEST3_PROD,
  46. IPA_TEST_CONFIGURATION_17);
  47. RoutingDriverWrapper RNDISAggregationTestFixture::m_Routing;
  48. Filtering RNDISAggregationTestFixture::m_Filtering;
  49. HeaderInsertion RNDISAggregationTestFixture::m_HeaderInsertion;
  50. /////////////////////////////////////////////////////////////////////////////////
  51. RNDISAggregationTestFixture::RNDISAggregationTestFixture()
  52. {
  53. m_testSuiteName.push_back("RndisAgg");
  54. Register(*this);
  55. }
  56. /////////////////////////////////////////////////////////////////////////////////
  57. static int SetupKernelModule(void)
  58. {
  59. int retval;
  60. struct ipa_channel_config from_ipa_channels[4];
  61. struct test_ipa_ep_cfg from_ipa_cfg[4];
  62. struct ipa_channel_config to_ipa_channels[3];
  63. struct test_ipa_ep_cfg to_ipa_cfg[3];
  64. struct ipa_test_config_header header = {0};
  65. struct ipa_channel_config *to_ipa_array[3];
  66. struct ipa_channel_config *from_ipa_array[4];
  67. bool en_status = false;
  68. /* From ipa configurations - 4 pipes */
  69. memset(&from_ipa_cfg[0], 0, sizeof(from_ipa_cfg[0]));
  70. from_ipa_cfg[0].aggr.aggr_en = IPA_ENABLE_AGGR;
  71. from_ipa_cfg[0].aggr.aggr = IPA_GENERIC;
  72. from_ipa_cfg[0].aggr.aggr_byte_limit = 1;
  73. from_ipa_cfg[0].aggr.aggr_time_limit = 0;
  74. from_ipa_cfg[0].hdr.hdr_ofst_pkt_size_valid = true;
  75. from_ipa_cfg[0].hdr.hdr_ofst_pkt_size = 12;
  76. from_ipa_cfg[0].hdr.hdr_additional_const_len = 14;
  77. from_ipa_cfg[0].hdr.hdr_len = 58;
  78. from_ipa_cfg[0].hdr_ext.hdr_little_endian = true;
  79. from_ipa_cfg[0].hdr_ext.hdr_total_len_or_pad_valid = true;
  80. from_ipa_cfg[0].hdr_ext.hdr_total_len_or_pad = IPA_HDR_TOTAL_LEN;
  81. from_ipa_cfg[0].hdr_ext.hdr_total_len_or_pad_offset = 4;
  82. prepare_channel_struct(&from_ipa_channels[0],
  83. header.from_ipa_channels_num++,
  84. IPA_CLIENT_TEST2_CONS,
  85. (void *)&from_ipa_cfg[0],
  86. sizeof(from_ipa_cfg[0]),
  87. en_status);
  88. from_ipa_array[0] = &from_ipa_channels[0];
  89. memset(&from_ipa_cfg[1], 0, sizeof(from_ipa_cfg[1]));
  90. prepare_channel_struct(&from_ipa_channels[1],
  91. header.from_ipa_channels_num++,
  92. IPA_CLIENT_TEST3_CONS,
  93. (void *)&from_ipa_cfg[1],
  94. sizeof(from_ipa_cfg[1]),
  95. en_status);
  96. from_ipa_array[1] = &from_ipa_channels[1];
  97. memset(&from_ipa_cfg[2], 0, sizeof(from_ipa_cfg[2]));
  98. from_ipa_cfg[2].aggr.aggr_en = IPA_ENABLE_AGGR;
  99. from_ipa_cfg[2].aggr.aggr = IPA_GENERIC;
  100. from_ipa_cfg[2].aggr.aggr_byte_limit = 1;
  101. from_ipa_cfg[2].aggr.aggr_time_limit = 30;
  102. if (TestManager::GetInstance()->GetIPAHwType() >= IPA_HW_v4_2)
  103. from_ipa_cfg[2].aggr.aggr_time_limit *= 1000;
  104. from_ipa_cfg[2].hdr.hdr_ofst_pkt_size_valid = true;
  105. from_ipa_cfg[2].hdr.hdr_ofst_pkt_size = 12;
  106. from_ipa_cfg[2].hdr.hdr_additional_const_len = 14;
  107. from_ipa_cfg[2].hdr.hdr_len = 58;
  108. from_ipa_cfg[2].hdr_ext.hdr_little_endian = true;
  109. from_ipa_cfg[2].hdr_ext.hdr_total_len_or_pad_valid = true;
  110. from_ipa_cfg[2].hdr_ext.hdr_total_len_or_pad = IPA_HDR_TOTAL_LEN;
  111. from_ipa_cfg[2].hdr_ext.hdr_total_len_or_pad_offset = 4;
  112. prepare_channel_struct(&from_ipa_channels[2],
  113. header.from_ipa_channels_num++,
  114. IPA_CLIENT_TEST_CONS,
  115. (void *)&from_ipa_cfg[2],
  116. sizeof(from_ipa_cfg[2]),
  117. en_status);
  118. from_ipa_array[2] = &from_ipa_channels[2];
  119. memset(&from_ipa_cfg[3], 0, sizeof(from_ipa_cfg[3]));
  120. from_ipa_cfg[3].aggr.aggr_en = IPA_ENABLE_AGGR;
  121. from_ipa_cfg[3].aggr.aggr = IPA_GENERIC;
  122. from_ipa_cfg[3].aggr.aggr_byte_limit = 0;
  123. from_ipa_cfg[3].aggr.aggr_time_limit = 0;
  124. from_ipa_cfg[3].aggr.aggr_pkt_limit = 2;
  125. from_ipa_cfg[3].hdr.hdr_ofst_pkt_size_valid = true;
  126. from_ipa_cfg[3].hdr.hdr_ofst_pkt_size = 12;
  127. from_ipa_cfg[3].hdr.hdr_additional_const_len = 14;
  128. from_ipa_cfg[3].hdr.hdr_len = 58;
  129. from_ipa_cfg[3].hdr_ext.hdr_little_endian = true;
  130. from_ipa_cfg[3].hdr_ext.hdr_total_len_or_pad_valid = true;
  131. from_ipa_cfg[3].hdr_ext.hdr_total_len_or_pad = IPA_HDR_TOTAL_LEN;
  132. from_ipa_cfg[3].hdr_ext.hdr_total_len_or_pad_offset = 4;
  133. prepare_channel_struct(&from_ipa_channels[3],
  134. header.from_ipa_channels_num++,
  135. IPA_CLIENT_TEST4_CONS,
  136. (void *)&from_ipa_cfg[3],
  137. sizeof(from_ipa_cfg[3]),
  138. en_status);
  139. from_ipa_array[3] = &from_ipa_channels[3];
  140. /* to ipa configurations - 3 pipes */
  141. memset(&to_ipa_cfg[0], 0, sizeof(to_ipa_cfg[0]));
  142. to_ipa_cfg[0].hdr.hdr_len = 14;
  143. prepare_channel_struct(&to_ipa_channels[0],
  144. header.to_ipa_channels_num++,
  145. IPA_CLIENT_TEST_PROD,
  146. (void *)&to_ipa_cfg[0],
  147. sizeof(to_ipa_cfg[0]),
  148. en_status);
  149. to_ipa_array[0] = &to_ipa_channels[0];
  150. memset(&to_ipa_cfg[1], 0, sizeof(to_ipa_cfg[1]));
  151. prepare_channel_struct(&to_ipa_channels[1],
  152. header.to_ipa_channels_num++,
  153. IPA_CLIENT_TEST3_PROD,
  154. (void *)&to_ipa_cfg[1],
  155. sizeof(to_ipa_cfg[1]),
  156. en_status);
  157. to_ipa_array[1] = &to_ipa_channels[1];
  158. memset(&to_ipa_cfg[2], 0, sizeof(to_ipa_cfg[2]));
  159. to_ipa_cfg[2].aggr.aggr_en = IPA_ENABLE_DEAGGR;
  160. to_ipa_cfg[2].aggr.aggr = IPA_GENERIC;
  161. to_ipa_cfg[2].deaggr.deaggr_hdr_len = 44;
  162. to_ipa_cfg[2].deaggr.packet_offset_valid = true;
  163. to_ipa_cfg[2].deaggr.packet_offset_location = 8;
  164. to_ipa_cfg[2].hdr.hdr_len = 14; /* Ethernet header */
  165. to_ipa_cfg[2].hdr.hdr_ofst_pkt_size = 12;
  166. to_ipa_cfg[2].hdr.hdr_remove_additional = false;
  167. to_ipa_cfg[2].hdr_ext.hdr_little_endian = 1;
  168. to_ipa_cfg[2].hdr_ext.hdr_total_len_or_pad_valid = 1;
  169. to_ipa_cfg[2].hdr_ext.hdr_total_len_or_pad = IPA_HDR_TOTAL_LEN;
  170. to_ipa_cfg[2].hdr_ext.hdr_payload_len_inc_padding = 0;
  171. to_ipa_cfg[2].hdr_ext.hdr_total_len_or_pad_offset = 4;
  172. prepare_channel_struct(&to_ipa_channels[2],
  173. header.to_ipa_channels_num++,
  174. IPA_CLIENT_TEST2_PROD,
  175. (void *)&to_ipa_cfg[2],
  176. sizeof(to_ipa_cfg[2]),
  177. en_status);
  178. to_ipa_array[2] = &to_ipa_channels[2];
  179. prepare_header_struct(&header, from_ipa_array, to_ipa_array);
  180. retval = GenericConfigureScenario(&header);
  181. return retval;
  182. }
  183. bool RNDISAggregationTestFixture::Setup()
  184. {
  185. bool bRetVal = true;
  186. //Set the configuration to support USB->IPA and IPA->USB pipes.
  187. bRetVal = SetupKernelModule();
  188. if (bRetVal != true) {
  189. return bRetVal;
  190. }
  191. //Initialize the pipe for all the tests - this will open the inode which represents the pipe.
  192. bRetVal &= m_IpaToUsbPipeAgg.Init();
  193. bRetVal &= m_UsbToIpaPipe.Init();
  194. bRetVal &= m_HsicToIpaPipe.Init();
  195. bRetVal &= m_IpaToUsbPipe.Init();
  196. bRetVal &= m_UsbToIpaPipeDeagg.Init();
  197. bRetVal &= m_IpaToUsbPipeAggTime.Init();
  198. bRetVal &= m_IpaToUsbPipeAggPktLimit.Init();
  199. if (!m_Routing.DeviceNodeIsOpened()) {
  200. LOG_MSG_ERROR(
  201. "Routing block is not ready for immediate commands!\n");
  202. return false;
  203. }
  204. if (!m_Filtering.DeviceNodeIsOpened()) {
  205. LOG_MSG_ERROR(
  206. "Filtering block is not ready for immediate commands!\n");
  207. return false;
  208. }
  209. if (!m_HeaderInsertion.DeviceNodeIsOpened())
  210. {
  211. LOG_MSG_ERROR("Header Insertion block is not ready for immediate commands!\n");
  212. return false;
  213. }
  214. m_HeaderInsertion.Reset();// resetting this component will reset both Routing and Filtering tables.
  215. return bRetVal;
  216. }
  217. /////////////////////////////////////////////////////////////////////////////////
  218. bool RNDISAggregationTestFixture::Teardown()
  219. {
  220. //The Destroy method will close the inode.
  221. m_IpaToUsbPipeAgg.Destroy();
  222. m_UsbToIpaPipe.Destroy();
  223. m_HsicToIpaPipe.Destroy();
  224. m_IpaToUsbPipe.Destroy();
  225. m_UsbToIpaPipeDeagg.Destroy();
  226. m_IpaToUsbPipeAggTime.Destroy();
  227. m_IpaToUsbPipeAggPktLimit.Destroy();
  228. return true;
  229. }
  230. /////////////////////////////////////////////////////////////////////////////////
  231. bool RNDISAggregationTestFixture::Run()
  232. {
  233. LOG_MSG_STACK("Entering Function");
  234. // Add the relevant filtering rules
  235. if (!AddRules()) {
  236. LOG_MSG_ERROR("Failed adding filtering rules.");
  237. return false;
  238. }
  239. if (!TestLogic()) {
  240. LOG_MSG_ERROR("Test failed, Input and expected output mismatch.");
  241. return false;
  242. }
  243. LOG_MSG_STACK("Leaving Function (Returning True)");
  244. return true;
  245. } // Run()
  246. /////////////////////////////////////////////////////////////////////////////////
  247. bool RNDISAggregationTestFixture::AddRulesNoAgg() {
  248. m_eIP = IPA_IP_v4;
  249. const char aBypass[20] = "Bypass1";
  250. bool bRetVal = true;
  251. IPAFilteringTable cFilterTable0;
  252. struct ipa_flt_rule_add sFilterRuleEntry;
  253. uint32_t nTableHdl;
  254. LOG_MSG_STACK("Entering Function");
  255. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  256. if (!CreateBypassRoutingTable(&m_Routing, m_eIP, aBypass, IPA_CLIENT_TEST3_CONS,
  257. 0, &nTableHdl)) {
  258. LOG_MSG_ERROR("CreateBypassRoutingTable Failed\n");
  259. bRetVal = false;
  260. goto bail;
  261. }
  262. LOG_MSG_INFO("Creation of bypass routing table completed successfully");
  263. // Creating Filtering Rules
  264. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST_PROD, false, 1);
  265. LOG_MSG_INFO("Creation of filtering table completed successfully");
  266. // Configuring Filtering Rule No.1
  267. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  268. sFilterRuleEntry.at_rear = true;
  269. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  270. sFilterRuleEntry.status = -1; // return value
  271. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  272. sFilterRuleEntry.rule.retain_hdr = true;
  273. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl; //put here the handle corresponding to Routing Rule 1
  274. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  275. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  276. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  277. if (
  278. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  279. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  280. )
  281. {
  282. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  283. bRetVal = false;
  284. goto bail;
  285. } else
  286. {
  287. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  288. }
  289. bail:
  290. LOG_MSG_STACK(
  291. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  292. return bRetVal;
  293. } // AddRules()
  294. bool RNDISAggregationTestFixture::AddRulesDeAggEther() {
  295. m_eIP = IPA_IP_v4;
  296. const char aBypass[20] = "Bypass1";
  297. bool bRetVal = true;
  298. IPAFilteringTable cFilterTable0;
  299. struct ipa_flt_rule_add sFilterRuleEntry;
  300. uint32_t nTableHdl;
  301. LOG_MSG_STACK("Entering Function");
  302. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  303. if (!CreateBypassRoutingTable(&m_Routing, m_eIP, aBypass, IPA_CLIENT_TEST3_CONS,
  304. 0, &nTableHdl)) {
  305. LOG_MSG_ERROR("CreateBypassRoutingTable Failed\n");
  306. bRetVal = false;
  307. goto bail;
  308. }
  309. LOG_MSG_INFO("Creation of bypass routing table completed successfully");
  310. // Creating Filtering Rules
  311. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST2_PROD, false, 1);
  312. LOG_MSG_INFO("Creation of filtering table completed successfully");
  313. // Configuring Filtering Rule No.1
  314. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  315. sFilterRuleEntry.at_rear = true;
  316. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  317. sFilterRuleEntry.status = -1; // return value
  318. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  319. sFilterRuleEntry.rule.retain_hdr = true;
  320. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl; //put here the handle corresponding to Routing Rule 1
  321. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  322. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  323. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  324. if (
  325. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  326. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  327. )
  328. {
  329. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  330. bRetVal = false;
  331. goto bail;
  332. } else
  333. {
  334. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  335. }
  336. bail:
  337. LOG_MSG_STACK(
  338. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  339. return bRetVal;
  340. } // AddRules()
  341. bool RNDISAggregationTestFixture::AddRulesAggTimeLimit() {
  342. m_eIP = IPA_IP_v4;
  343. const char aBypass[20] = "Bypass1";
  344. bool bRetVal = true;
  345. IPAFilteringTable cFilterTable0;
  346. struct ipa_flt_rule_add sFilterRuleEntry;
  347. struct ipa_ioc_get_hdr sGetHeader;
  348. uint32_t nTableHdl;
  349. struct RndisEtherHeader rndisEtherHeader;
  350. LOG_MSG_STACK("Entering Function");
  351. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  352. memset(&sGetHeader, 0, sizeof(sGetHeader));
  353. memset(&rndisEtherHeader, 0, sizeof(struct RndisEtherHeader));
  354. rndisEtherHeader.rndisHeader.MessageType = 0x01;
  355. rndisEtherHeader.rndisHeader.DataOffset = 0x24;
  356. memcpy(&rndisEtherHeader.etherHeader, Eth2Helper::m_ETH2_IP4_HDR, sizeof(struct ethhdr));
  357. // Create Header:
  358. // Allocate Memory, populate it, and add in to the Header Insertion.
  359. struct ipa_ioc_add_hdr * pHeaderDescriptor = NULL;
  360. pHeaderDescriptor = (struct ipa_ioc_add_hdr *) calloc(1,
  361. sizeof(struct ipa_ioc_add_hdr)
  362. + 1 * sizeof(struct ipa_hdr_add));
  363. if (!pHeaderDescriptor) {
  364. LOG_MSG_ERROR("calloc failed to allocate pHeaderDescriptor");
  365. bRetVal = false;
  366. goto bail;
  367. }
  368. pHeaderDescriptor->commit = true;
  369. pHeaderDescriptor->num_hdrs = 1;
  370. // Adding Header No1.
  371. strlcpy(pHeaderDescriptor->hdr[0].name, "RndisEthernet", sizeof(pHeaderDescriptor->hdr[0].name)); // Header's Name
  372. memcpy(pHeaderDescriptor->hdr[0].hdr, (void*)&rndisEtherHeader,
  373. sizeof(struct RndisEtherHeader)); //Header's Data
  374. pHeaderDescriptor->hdr[0].hdr_len = sizeof(struct RndisEtherHeader);
  375. pHeaderDescriptor->hdr[0].hdr_hdl = -1; //Return Value
  376. pHeaderDescriptor->hdr[0].is_partial = false;
  377. pHeaderDescriptor->hdr[0].status = -1; // Return Parameter
  378. strlcpy(sGetHeader.name, pHeaderDescriptor->hdr[0].name, sizeof(sGetHeader.name));
  379. if (!m_HeaderInsertion.AddHeader(pHeaderDescriptor))
  380. {
  381. LOG_MSG_ERROR("m_HeaderInsertion.AddHeader(pHeaderDescriptor) Failed.");
  382. bRetVal = false;
  383. goto bail;
  384. }
  385. if (!m_HeaderInsertion.GetHeaderHandle(&sGetHeader))
  386. {
  387. LOG_MSG_ERROR(" Failed");
  388. bRetVal = false;
  389. goto bail;
  390. }
  391. LOG_MSG_DEBUG("Received Header Handle = 0x%x", sGetHeader.hdl);
  392. if (!CreateBypassRoutingTable(&m_Routing, m_eIP, aBypass, IPA_CLIENT_TEST_CONS,
  393. sGetHeader.hdl, &nTableHdl)) {
  394. LOG_MSG_ERROR("CreateBypassRoutingTable Failed\n");
  395. bRetVal = false;
  396. goto bail;
  397. }
  398. LOG_MSG_INFO("Creation of bypass routing table completed successfully");
  399. // Creating Filtering Rules
  400. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST3_PROD, false, 1);
  401. LOG_MSG_INFO("Creation of filtering table completed successfully");
  402. // Configuring Filtering Rule No.1
  403. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  404. sFilterRuleEntry.at_rear = true;
  405. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  406. sFilterRuleEntry.status = -1; // return value
  407. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  408. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl; //put here the handle corresponding to Routing Rule 1
  409. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  410. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  411. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  412. if (
  413. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  414. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  415. )
  416. {
  417. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  418. bRetVal = false;
  419. goto bail;
  420. } else
  421. {
  422. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  423. }
  424. bail:
  425. Free(pHeaderDescriptor);
  426. LOG_MSG_STACK(
  427. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  428. return bRetVal;
  429. } // AddRules()
  430. bool RNDISAggregationTestFixture::AddRulesAggByteLimit() {
  431. m_eIP = IPA_IP_v4;
  432. const char aBypass[20] = "Bypass1";
  433. bool bRetVal = true;
  434. IPAFilteringTable cFilterTable0;
  435. struct ipa_flt_rule_add sFilterRuleEntry;
  436. struct ipa_ioc_get_hdr sGetHeader;
  437. uint32_t nTableHdl;
  438. struct RndisEtherHeader rndisEtherHeader;
  439. LOG_MSG_STACK("Entering Function");
  440. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  441. memset(&sGetHeader, 0, sizeof(sGetHeader));
  442. memset(&rndisEtherHeader, 0, sizeof(struct RndisEtherHeader));
  443. rndisEtherHeader.rndisHeader.MessageType = 0x01;
  444. rndisEtherHeader.rndisHeader.DataOffset = 0x24;
  445. memcpy(&rndisEtherHeader.etherHeader, Eth2Helper::m_ETH2_IP4_HDR, sizeof(struct ethhdr));
  446. // Create Header:
  447. // Allocate Memory, populate it, and add in to the Header Insertion.
  448. struct ipa_ioc_add_hdr * pHeaderDescriptor = NULL;
  449. pHeaderDescriptor = (struct ipa_ioc_add_hdr *) calloc(1,
  450. sizeof(struct ipa_ioc_add_hdr)
  451. + 1 * sizeof(struct ipa_hdr_add));
  452. if (!pHeaderDescriptor) {
  453. LOG_MSG_ERROR("calloc failed to allocate pHeaderDescriptor");
  454. bRetVal = false;
  455. goto bail;
  456. }
  457. pHeaderDescriptor->commit = true;
  458. pHeaderDescriptor->num_hdrs = 1;
  459. // Adding Header No1.
  460. strlcpy(pHeaderDescriptor->hdr[0].name, "RndisEthernet", sizeof(pHeaderDescriptor->hdr[0].name)); // Header's Name
  461. memcpy(pHeaderDescriptor->hdr[0].hdr, (void*)&rndisEtherHeader,
  462. sizeof(struct RndisEtherHeader)); //Header's Data
  463. pHeaderDescriptor->hdr[0].hdr_len = sizeof(struct RndisEtherHeader);
  464. pHeaderDescriptor->hdr[0].hdr_hdl = -1; //Return Value
  465. pHeaderDescriptor->hdr[0].is_partial = false;
  466. pHeaderDescriptor->hdr[0].status = -1; // Return Parameter
  467. strlcpy(sGetHeader.name, pHeaderDescriptor->hdr[0].name, sizeof(sGetHeader.name));
  468. if (!m_HeaderInsertion.AddHeader(pHeaderDescriptor))
  469. {
  470. LOG_MSG_ERROR("m_HeaderInsertion.AddHeader(pHeaderDescriptor) Failed.");
  471. bRetVal = false;
  472. goto bail;
  473. }
  474. if (!m_HeaderInsertion.GetHeaderHandle(&sGetHeader))
  475. {
  476. LOG_MSG_ERROR(" Failed");
  477. bRetVal = false;
  478. goto bail;
  479. }
  480. LOG_MSG_DEBUG("Received Header Handle = 0x%x", sGetHeader.hdl);
  481. if (!CreateBypassRoutingTable(&m_Routing, m_eIP, aBypass, IPA_CLIENT_TEST2_CONS,
  482. sGetHeader.hdl, &nTableHdl)) {
  483. LOG_MSG_ERROR("CreateBypassRoutingTable Failed\n");
  484. bRetVal = false;
  485. goto bail;
  486. }
  487. LOG_MSG_INFO("Creation of bypass routing table completed successfully");
  488. // Creating Filtering Rules
  489. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST3_PROD, false, 1);
  490. LOG_MSG_INFO("Creation of filtering table completed successfully");
  491. // Configuring Filtering Rule No.1
  492. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  493. sFilterRuleEntry.at_rear = true;
  494. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  495. sFilterRuleEntry.status = -1; // return value
  496. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  497. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl; //put here the handle corresponding to Routing Rule 1
  498. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  499. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  500. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  501. if (
  502. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  503. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  504. )
  505. {
  506. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  507. bRetVal = false;
  508. goto bail;
  509. } else
  510. {
  511. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  512. }
  513. bail:
  514. Free(pHeaderDescriptor);
  515. LOG_MSG_STACK(
  516. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  517. return bRetVal;
  518. } // AddRules()
  519. bool RNDISAggregationTestFixture::AddRulesAggByteLimit(bool bAggForceClose) {
  520. m_eIP = IPA_IP_v4;
  521. const char aBypass[20] = "Bypass1";
  522. bool bRetVal = true;
  523. IPAFilteringTable_v2 cFilterTable0;
  524. struct ipa_flt_rule_add_v2 sFilterRuleEntry;
  525. struct ipa_ioc_get_hdr sGetHeader;
  526. uint32_t nTableHdl;
  527. struct RndisEtherHeader rndisEtherHeader;
  528. LOG_MSG_STACK("Entering Function");
  529. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  530. memset(&sGetHeader, 0, sizeof(sGetHeader));
  531. memset(&rndisEtherHeader, 0, sizeof(struct RndisEtherHeader));
  532. rndisEtherHeader.rndisHeader.MessageType = 0x01;
  533. rndisEtherHeader.rndisHeader.DataOffset = 0x24;
  534. memcpy(&rndisEtherHeader.etherHeader, Eth2Helper::m_ETH2_IP4_HDR, sizeof(struct ethhdr));
  535. // Create Header:
  536. // Allocate Memory, populate it, and add in to the Header Insertion.
  537. struct ipa_ioc_add_hdr * pHeaderDescriptor = NULL;
  538. pHeaderDescriptor = (struct ipa_ioc_add_hdr *) calloc(1,
  539. sizeof(struct ipa_ioc_add_hdr)
  540. + 1 * sizeof(struct ipa_hdr_add));
  541. if (!pHeaderDescriptor) {
  542. LOG_MSG_ERROR("calloc failed to allocate pHeaderDescriptor");
  543. bRetVal = false;
  544. goto bail;
  545. }
  546. pHeaderDescriptor->commit = true;
  547. pHeaderDescriptor->num_hdrs = 1;
  548. // Adding Header No1.
  549. strlcpy(pHeaderDescriptor->hdr[0].name, "RndisEthernet", sizeof(pHeaderDescriptor->hdr[0].name)); // Header's Name
  550. memcpy(pHeaderDescriptor->hdr[0].hdr, (void*)&rndisEtherHeader,
  551. sizeof(struct RndisEtherHeader)); //Header's Data
  552. pHeaderDescriptor->hdr[0].hdr_len = sizeof(struct RndisEtherHeader);
  553. pHeaderDescriptor->hdr[0].hdr_hdl = -1; //Return Value
  554. pHeaderDescriptor->hdr[0].is_partial = false;
  555. pHeaderDescriptor->hdr[0].status = -1; // Return Parameter
  556. strlcpy(sGetHeader.name, pHeaderDescriptor->hdr[0].name, sizeof(sGetHeader.name));
  557. if (!m_HeaderInsertion.AddHeader(pHeaderDescriptor))
  558. {
  559. LOG_MSG_ERROR("m_HeaderInsertion.AddHeader(pHeaderDescriptor) Failed.");
  560. bRetVal = false;
  561. goto bail;
  562. }
  563. if (!m_HeaderInsertion.GetHeaderHandle(&sGetHeader))
  564. {
  565. LOG_MSG_ERROR(" Failed");
  566. bRetVal = false;
  567. goto bail;
  568. }
  569. LOG_MSG_DEBUG("Received Header Handle = 0x%x", sGetHeader.hdl);
  570. if (!CreateBypassRoutingTable_v2(&m_Routing, m_eIP, aBypass, IPA_CLIENT_TEST2_CONS,
  571. sGetHeader.hdl, &nTableHdl, 0)) {
  572. LOG_MSG_ERROR("CreateBypassRoutingTable Failed\n");
  573. bRetVal = false;
  574. goto bail;
  575. }
  576. LOG_MSG_INFO("Creation of bypass routing table completed successfully");
  577. // Creating Filtering Rules
  578. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST3_PROD, false, 1);
  579. LOG_MSG_INFO("Creation of filtering table completed successfully");
  580. // Configuring Filtering Rule No.1
  581. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  582. sFilterRuleEntry.at_rear = true;
  583. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  584. sFilterRuleEntry.status = -1; // return value
  585. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  586. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl; //put here the handle corresponding to Routing Rule 1
  587. printf("%s(), Nadav: sFilterRuleEntry.rule.rt_tbl_hdl = %d \n", __FUNCTION__, nTableHdl);
  588. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  589. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  590. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  591. sFilterRuleEntry.rule.close_aggr_irq_mod = bAggForceClose;
  592. if (
  593. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  594. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  595. )
  596. {
  597. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  598. bRetVal = false;
  599. goto bail;
  600. } else
  601. {
  602. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  603. }
  604. bail:
  605. Free(pHeaderDescriptor);
  606. LOG_MSG_STACK(
  607. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  608. return bRetVal;
  609. } // AddRules()
  610. bool RNDISAggregationTestFixture::AddRulesAggPacketLimit() {
  611. m_eIP = IPA_IP_v4;
  612. const char aBypass[20] = "Bypass1";
  613. bool bRetVal = true;
  614. IPAFilteringTable cFilterTable0;
  615. struct ipa_flt_rule_add sFilterRuleEntry;
  616. struct ipa_ioc_get_hdr sGetHeader;
  617. uint32_t nTableHdl;
  618. struct RndisEtherHeader rndisEtherHeader;
  619. LOG_MSG_STACK("Entering Function");
  620. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  621. memset(&sGetHeader, 0, sizeof(sGetHeader));
  622. memset(&rndisEtherHeader, 0, sizeof(struct RndisEtherHeader));
  623. rndisEtherHeader.rndisHeader.MessageType = 0x01;
  624. rndisEtherHeader.rndisHeader.DataOffset = 0x24;
  625. memcpy(&rndisEtherHeader.etherHeader, Eth2Helper::m_ETH2_IP4_HDR, sizeof(struct ethhdr));
  626. // Create Header:
  627. // Allocate Memory, populate it, and add in to the Header Insertion.
  628. struct ipa_ioc_add_hdr * pHeaderDescriptor = NULL;
  629. pHeaderDescriptor = (struct ipa_ioc_add_hdr *) calloc(1,
  630. sizeof(struct ipa_ioc_add_hdr)
  631. + 1 * sizeof(struct ipa_hdr_add));
  632. if (!pHeaderDescriptor) {
  633. LOG_MSG_ERROR("calloc failed to allocate pHeaderDescriptor");
  634. bRetVal = false;
  635. goto bail;
  636. }
  637. pHeaderDescriptor->commit = true;
  638. pHeaderDescriptor->num_hdrs = 1;
  639. // Adding Header No1.
  640. strlcpy(pHeaderDescriptor->hdr[0].name, "RndisEthernet", sizeof(pHeaderDescriptor->hdr[0].name)); // Header's Name
  641. memcpy(pHeaderDescriptor->hdr[0].hdr, (void*)&rndisEtherHeader,
  642. sizeof(struct RndisEtherHeader)); //Header's Data
  643. pHeaderDescriptor->hdr[0].hdr_len = sizeof(struct RndisEtherHeader);
  644. pHeaderDescriptor->hdr[0].hdr_hdl = -1; //Return Value
  645. pHeaderDescriptor->hdr[0].is_partial = false;
  646. pHeaderDescriptor->hdr[0].status = -1; // Return Parameter
  647. strlcpy(sGetHeader.name, pHeaderDescriptor->hdr[0].name, sizeof(sGetHeader.name));
  648. if (!m_HeaderInsertion.AddHeader(pHeaderDescriptor))
  649. {
  650. LOG_MSG_ERROR("m_HeaderInsertion.AddHeader(pHeaderDescriptor) Failed.");
  651. bRetVal = false;
  652. goto bail;
  653. }
  654. if (!m_HeaderInsertion.GetHeaderHandle(&sGetHeader))
  655. {
  656. LOG_MSG_ERROR(" Failed");
  657. bRetVal = false;
  658. goto bail;
  659. }
  660. LOG_MSG_DEBUG("Received Header Handle = 0x%x", sGetHeader.hdl);
  661. if (!CreateBypassRoutingTable(&m_Routing, m_eIP, aBypass, IPA_CLIENT_TEST4_CONS,
  662. sGetHeader.hdl, &nTableHdl)) {
  663. LOG_MSG_ERROR("CreateBypassRoutingTable Failed\n");
  664. bRetVal = false;
  665. goto bail;
  666. }
  667. LOG_MSG_INFO("Creation of bypass routing table completed successfully");
  668. // Creating Filtering Rules
  669. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST3_PROD, false, 1);
  670. LOG_MSG_INFO("Creation of filtering table completed successfully");
  671. // Configuring Filtering Rule No.1
  672. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  673. sFilterRuleEntry.at_rear = true;
  674. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  675. sFilterRuleEntry.status = -1; // return value
  676. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  677. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl; //put here the handle corresponding to Routing Rule 1
  678. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  679. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  680. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  681. if (
  682. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  683. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  684. )
  685. {
  686. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  687. bRetVal = false;
  688. goto bail;
  689. } else
  690. {
  691. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  692. }
  693. bail:
  694. Free(pHeaderDescriptor);
  695. LOG_MSG_STACK(
  696. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  697. return bRetVal;
  698. } // AddRules()
  699. bool RNDISAggregationTestFixture::AddRulesAggDualFC() {
  700. m_eIP = IPA_IP_v4;
  701. const char aBypass[2][20] = {"BypassTest2", "BypassTest4"};
  702. bool bRetVal = true;
  703. IPAFilteringTable_v2 cFilterTable0;
  704. struct ipa_flt_rule_add_v2 sFilterRuleEntry;
  705. struct ipa_ioc_get_hdr sGetHeader;
  706. uint32_t nTableHdl[2];
  707. struct RndisEtherHeader rndisEtherHeader;
  708. LOG_MSG_STACK("Entering Function");
  709. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  710. memset(&sGetHeader, 0, sizeof(sGetHeader));
  711. memset(&rndisEtherHeader, 0, sizeof(struct RndisEtherHeader));
  712. rndisEtherHeader.rndisHeader.MessageType = 0x01;
  713. rndisEtherHeader.rndisHeader.DataOffset = 0x24;
  714. memcpy(&rndisEtherHeader.etherHeader, Eth2Helper::m_ETH2_IP4_HDR, sizeof(struct ethhdr));
  715. // Create Header:
  716. // Allocate Memory, populate it, and add in to the Header Insertion.
  717. struct ipa_ioc_add_hdr * pHeaderDescriptor = NULL;
  718. pHeaderDescriptor = (struct ipa_ioc_add_hdr *) calloc(1,
  719. sizeof(struct ipa_ioc_add_hdr)
  720. + 1 * sizeof(struct ipa_hdr_add));
  721. if (!pHeaderDescriptor) {
  722. LOG_MSG_ERROR("calloc failed to allocate pHeaderDescriptor");
  723. bRetVal = false;
  724. goto bail;
  725. }
  726. pHeaderDescriptor->commit = true;
  727. pHeaderDescriptor->num_hdrs = 1;
  728. // Adding Header No1.
  729. strlcpy(pHeaderDescriptor->hdr[0].name, "RndisEthernet", sizeof(pHeaderDescriptor->hdr[0].name)); // Header's Name
  730. memcpy(pHeaderDescriptor->hdr[0].hdr, (void*)&rndisEtherHeader,
  731. sizeof(struct RndisEtherHeader)); //Header's Data
  732. pHeaderDescriptor->hdr[0].hdr_len = sizeof(struct RndisEtherHeader);
  733. pHeaderDescriptor->hdr[0].hdr_hdl = -1; //Return Value
  734. pHeaderDescriptor->hdr[0].is_partial = false;
  735. pHeaderDescriptor->hdr[0].status = -1; // Return Parameter
  736. strlcpy(sGetHeader.name, pHeaderDescriptor->hdr[0].name, sizeof(sGetHeader.name));
  737. if (!m_HeaderInsertion.AddHeader(pHeaderDescriptor))
  738. {
  739. LOG_MSG_ERROR("m_HeaderInsertion.AddHeader(pHeaderDescriptor) Failed.");
  740. bRetVal = false;
  741. goto bail;
  742. }
  743. if (!m_HeaderInsertion.GetHeaderHandle(&sGetHeader))
  744. {
  745. LOG_MSG_ERROR(" Failed");
  746. bRetVal = false;
  747. goto bail;
  748. }
  749. LOG_MSG_DEBUG("Received Header Handle = 0x%x", sGetHeader.hdl);
  750. if (!CreateBypassRoutingTable_v2(&m_Routing, m_eIP, aBypass[0],
  751. IPA_CLIENT_TEST2_CONS,
  752. sGetHeader.hdl, &nTableHdl[0], 0)) {
  753. LOG_MSG_ERROR("CreateSplitRoutingTable Failed\n");
  754. bRetVal = false;
  755. goto bail;
  756. }
  757. if (!CreateBypassRoutingTable_v2(&m_Routing, m_eIP, aBypass[1],
  758. IPA_CLIENT_TEST4_CONS,
  759. sGetHeader.hdl, &nTableHdl[1], 0)) {
  760. LOG_MSG_ERROR("CreateSplitRoutingTable Failed\n");
  761. bRetVal = false;
  762. goto bail;
  763. }
  764. LOG_MSG_INFO("Creation of bypass routing tables completed successfully");
  765. // Creating Filtering Rules
  766. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST3_PROD, false, 2);
  767. LOG_MSG_INFO("Creation of filtering table completed successfully");
  768. // Configuring Filtering Rule No.1
  769. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  770. sFilterRuleEntry.at_rear = true;
  771. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  772. sFilterRuleEntry.status = -1; // return value
  773. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  774. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl[0]; //put here the handle corresponding to Routing Rule 1
  775. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  776. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  777. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  778. sFilterRuleEntry.rule.close_aggr_irq_mod = 1;
  779. if (
  780. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  781. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  782. )
  783. {
  784. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  785. bRetVal = false;
  786. goto bail;
  787. } else
  788. {
  789. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  790. }
  791. // Configuring Filtering Rule No.2
  792. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  793. sFilterRuleEntry.at_rear = true;
  794. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  795. sFilterRuleEntry.status = -1; // return value
  796. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  797. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl[1]; //put here the handle corresponding to Routing Rule 1
  798. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  799. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  800. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000002; // Filter DST_IP == 127.0.0.1.
  801. sFilterRuleEntry.rule.close_aggr_irq_mod = 0;
  802. if (
  803. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  804. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  805. )
  806. {
  807. LOG_MSG_ERROR ("Adding Rule (1) to Filtering block Failed.");
  808. bRetVal = false;
  809. goto bail;
  810. } else
  811. {
  812. LOG_MSG_DEBUG("flt rule hdl1=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(1)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(1)->status);
  813. }
  814. bail:
  815. Free(pHeaderDescriptor);
  816. LOG_MSG_STACK(
  817. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  818. return bRetVal;
  819. } // AddRulesAggDualFC()
  820. bool RNDISAggregationTestFixture::AddRulesAggDualFcRoutingBased() {
  821. m_eIP = IPA_IP_v4;
  822. const char aBypass[2][20] = {"BypassTest2", "BypassTest4"};
  823. bool bRetVal = true;
  824. IPAFilteringTable_v2 cFilterTable0;
  825. struct ipa_flt_rule_add_v2 sFilterRuleEntry;
  826. struct ipa_ioc_get_hdr sGetHeader;
  827. uint32_t nTableHdl[2];
  828. struct RndisEtherHeader rndisEtherHeader;
  829. LOG_MSG_STACK("Entering Function");
  830. memset(&sFilterRuleEntry, 0, sizeof(sFilterRuleEntry));
  831. memset(&sGetHeader, 0, sizeof(sGetHeader));
  832. memset(&rndisEtherHeader, 0, sizeof(struct RndisEtherHeader));
  833. rndisEtherHeader.rndisHeader.MessageType = 0x01;
  834. rndisEtherHeader.rndisHeader.DataOffset = 0x24;
  835. memcpy(&rndisEtherHeader.etherHeader, Eth2Helper::m_ETH2_IP4_HDR, sizeof(struct ethhdr));
  836. // Create Header:
  837. // Allocate Memory, populate it, and add in to the Header Insertion.
  838. struct ipa_ioc_add_hdr * pHeaderDescriptor = NULL;
  839. pHeaderDescriptor = (struct ipa_ioc_add_hdr *) calloc(1,
  840. sizeof(struct ipa_ioc_add_hdr)
  841. + 1 * sizeof(struct ipa_hdr_add));
  842. if (!pHeaderDescriptor) {
  843. LOG_MSG_ERROR("calloc failed to allocate pHeaderDescriptor");
  844. bRetVal = false;
  845. goto bail;
  846. }
  847. pHeaderDescriptor->commit = true;
  848. pHeaderDescriptor->num_hdrs = 1;
  849. // Adding Header No1.
  850. strlcpy(pHeaderDescriptor->hdr[0].name, "RndisEthernet", sizeof(pHeaderDescriptor->hdr[0].name)); // Header's Name
  851. memcpy(pHeaderDescriptor->hdr[0].hdr, (void*)&rndisEtherHeader,
  852. sizeof(struct RndisEtherHeader)); //Header's Data
  853. pHeaderDescriptor->hdr[0].hdr_len = sizeof(struct RndisEtherHeader);
  854. pHeaderDescriptor->hdr[0].hdr_hdl = -1; //Return Value
  855. pHeaderDescriptor->hdr[0].is_partial = false;
  856. pHeaderDescriptor->hdr[0].status = -1; // Return Parameter
  857. strlcpy(sGetHeader.name, pHeaderDescriptor->hdr[0].name, sizeof(sGetHeader.name));
  858. if (!m_HeaderInsertion.AddHeader(pHeaderDescriptor))
  859. {
  860. LOG_MSG_ERROR("m_HeaderInsertion.AddHeader(pHeaderDescriptor) Failed.");
  861. bRetVal = false;
  862. goto bail;
  863. }
  864. if (!m_HeaderInsertion.GetHeaderHandle(&sGetHeader))
  865. {
  866. LOG_MSG_ERROR(" Failed");
  867. bRetVal = false;
  868. goto bail;
  869. }
  870. LOG_MSG_DEBUG("Received Header Handle = 0x%x", sGetHeader.hdl);
  871. if (!CreateBypassRoutingTable_v2(&m_Routing, m_eIP, aBypass[0],
  872. IPA_CLIENT_TEST2_CONS,
  873. sGetHeader.hdl, &nTableHdl[0], 1)) {
  874. LOG_MSG_ERROR("CreateSplitRoutingTable Failed\n");
  875. bRetVal = false;
  876. goto bail;
  877. }
  878. if (!CreateBypassRoutingTable_v2(&m_Routing, m_eIP, aBypass[1],
  879. IPA_CLIENT_TEST4_CONS,
  880. sGetHeader.hdl, &nTableHdl[1], 0)) {
  881. LOG_MSG_ERROR("CreateSplitRoutingTable Failed\n");
  882. bRetVal = false;
  883. goto bail;
  884. }
  885. LOG_MSG_INFO("Creation of bypass routing tables completed successfully");
  886. // Creating Filtering Rules
  887. cFilterTable0.Init(m_eIP,IPA_CLIENT_TEST3_PROD, false, 2);
  888. LOG_MSG_INFO("Creation of filtering table completed successfully");
  889. // Configuring Filtering Rule No.1
  890. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  891. sFilterRuleEntry.at_rear = true;
  892. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  893. sFilterRuleEntry.status = -1; // return value
  894. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  895. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl[0]; //put here the handle corresponding to Routing Rule 1
  896. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  897. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  898. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000001; // Filter DST_IP == 127.0.0.1.
  899. sFilterRuleEntry.rule.close_aggr_irq_mod = 0;
  900. if (
  901. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  902. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  903. )
  904. {
  905. LOG_MSG_ERROR ("Adding Rule (0) to Filtering block Failed.");
  906. bRetVal = false;
  907. goto bail;
  908. } else
  909. {
  910. LOG_MSG_DEBUG("flt rule hdl0=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(0)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(0)->status);
  911. }
  912. // Configuring Filtering Rule No.2
  913. cFilterTable0.GeneratePresetRule(1,sFilterRuleEntry);
  914. sFilterRuleEntry.at_rear = true;
  915. sFilterRuleEntry.flt_rule_hdl=-1; // return Value
  916. sFilterRuleEntry.status = -1; // return value
  917. sFilterRuleEntry.rule.action=IPA_PASS_TO_ROUTING;
  918. sFilterRuleEntry.rule.rt_tbl_hdl = nTableHdl[1]; //put here the handle corresponding to Routing Rule 1
  919. sFilterRuleEntry.rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; // Destination IP Based Filtering
  920. sFilterRuleEntry.rule.attrib.u.v4.dst_addr_mask = 0xFF0000FF; // Mask
  921. sFilterRuleEntry.rule.attrib.u.v4.dst_addr = 0x7F000002; // Filter DST_IP == 127.0.0.1.
  922. sFilterRuleEntry.rule.close_aggr_irq_mod = 0;
  923. if (
  924. ((uint8_t)-1 == cFilterTable0.AddRuleToTable(sFilterRuleEntry)) ||
  925. !m_Filtering.AddFilteringRule(cFilterTable0.GetFilteringTable())
  926. )
  927. {
  928. LOG_MSG_ERROR ("Adding Rule (1) to Filtering block Failed.");
  929. bRetVal = false;
  930. goto bail;
  931. } else
  932. {
  933. LOG_MSG_DEBUG("flt rule hdl1=0x%x, status=0x%x\n", cFilterTable0.ReadRuleFromTable(1)->flt_rule_hdl,cFilterTable0.ReadRuleFromTable(1)->status);
  934. }
  935. bail:
  936. Free(pHeaderDescriptor);
  937. LOG_MSG_STACK(
  938. "Leaving Function (Returning %s)", bRetVal?"True":"False");
  939. return bRetVal;
  940. } // AddRulesAggDualFcRoutingBased()