rmnet_offload_engine.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  2. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/log2.h>
  14. #include <linux/list.h>
  15. #include <linux/hashtable.h>
  16. #include "rmnet_descriptor.h"
  17. #include "rmnet_module.h"
  18. #include "rmnet_offload_state.h"
  19. #include "rmnet_offload_engine.h"
  20. #include "rmnet_offload_main.h"
  21. #include "rmnet_offload_tcp.h"
  22. #include "rmnet_offload_udp.h"
  23. #include "rmnet_offload_stats.h"
  24. #include "rmnet_offload_knob.h"
  25. #define DATARMNET644a5e11da \
  26. (const_ilog2(DATARMNET78d9393ac8))
  27. static DEFINE_HASHTABLE(DATARMNET4791268d67,DATARMNET644a5e11da);static u32
  28. DATARMNET1993bae165(u8 DATARMNET06d2413ad2,struct list_head*DATARMNET6f9bfa17e6)
  29. {struct DATARMNETd7c9631acd*DATARMNET7c382e536d;int DATARMNETae0201901a;u32
  30. DATARMNET737bbd41c3=(0xd2d+202-0xdf7);hash_for_each(DATARMNET4791268d67,
  31. DATARMNETae0201901a,DATARMNET7c382e536d,DATARMNETbd5d7d96d8){if(
  32. DATARMNET7c382e536d->DATARMNET1db11fa85e&&DATARMNET7c382e536d->
  33. DATARMNET78fd20ce0e.DATARMNET7fa8b2acbf==DATARMNET06d2413ad2){
  34. DATARMNET737bbd41c3++;DATARMNETa3055c21f2(DATARMNET7c382e536d,
  35. DATARMNET6f9bfa17e6);}}return DATARMNET737bbd41c3;}static bool
  36. DATARMNET2013036d80(u8 DATARMNET06d2413ad2){u64 DATARMNET3924f3f9e3;
  37. DATARMNET3924f3f9e3=DATARMNETf1d1b8287f(DATARMNET6d2ed4b822);if(
  38. DATARMNET3924f3f9e3==DATARMNET2d89680280)return true;if(DATARMNET3924f3f9e3==
  39. DATARMNET03daf91a60&&DATARMNET06d2413ad2==DATARMNETfd5c3d30e5)return true;if(
  40. DATARMNET3924f3f9e3==DATARMNET88a9920663&&DATARMNET06d2413ad2==
  41. DATARMNETa656f324b2)return true;return false;}static bool DATARMNET5a0f9fc3a2(
  42. struct DATARMNETd7c9631acd*DATARMNETaa568481cf,struct DATARMNETd812bcdbb5*
  43. DATARMNET5fe4c722a8){if(!DATARMNETaa568481cf->DATARMNET1db11fa85e)return false;
  44. if(DATARMNET5fe4c722a8->DATARMNET144d119066.DATARMNET388842c721==
  45. (0xd11+230-0xdf3)){struct DATARMNET4287f07234*DATARMNET699c2c62cd,*
  46. DATARMNET8814564ab9;DATARMNET699c2c62cd=&DATARMNETaa568481cf->
  47. DATARMNET78fd20ce0e;DATARMNET8814564ab9=&DATARMNET5fe4c722a8->
  48. DATARMNET144d119066;if(DATARMNET699c2c62cd->DATARMNET19b03754c4^
  49. DATARMNET8814564ab9->DATARMNET19b03754c4||DATARMNET699c2c62cd->
  50. DATARMNET57bf608183^DATARMNET8814564ab9->DATARMNET57bf608183||
  51. DATARMNET699c2c62cd->DATARMNETcf915688f5^DATARMNET8814564ab9->
  52. DATARMNETcf915688f5||DATARMNET699c2c62cd->DATARMNET4ca5ac9de1^
  53. DATARMNET8814564ab9->DATARMNET4ca5ac9de1)return true;}else if(
  54. DATARMNET5fe4c722a8->DATARMNET144d119066.DATARMNET388842c721==(0xd03+244-0xdf1))
  55. {__be32 DATARMNET25ffacbec5,DATARMNETb351dd927f;__be32 DATARMNET9422f16113;
  56. DATARMNET25ffacbec5=DATARMNETaa568481cf->DATARMNET78fd20ce0e.DATARMNETabd58f7f89
  57. ;DATARMNETb351dd927f=DATARMNET5fe4c722a8->DATARMNET144d119066.
  58. DATARMNETabd58f7f89;;DATARMNET9422f16113=DATARMNET25ffacbec5^DATARMNETb351dd927f
  59. ;if(DATARMNET9422f16113&htonl(267386880))return true;}return false;}static bool
  60. DATARMNET6895620058(struct DATARMNETd7c9631acd*DATARMNETaa568481cf,struct
  61. DATARMNETd812bcdbb5*DATARMNET5fe4c722a8){struct DATARMNET4287f07234*
  62. DATARMNET699c2c62cd,*DATARMNET8814564ab9;DATARMNET699c2c62cd=&
  63. DATARMNETaa568481cf->DATARMNET78fd20ce0e;DATARMNET8814564ab9=&
  64. DATARMNET5fe4c722a8->DATARMNET144d119066;if(!DATARMNETaa568481cf->
  65. DATARMNET1db11fa85e)return DATARMNETaa568481cf->DATARMNET381f1cadc4==
  66. DATARMNET5fe4c722a8->DATARMNET645e8912b8;if(DATARMNET699c2c62cd->
  67. DATARMNET7fa8b2acbf!=DATARMNET8814564ab9->DATARMNET7fa8b2acbf)return false;if(
  68. DATARMNET699c2c62cd->DATARMNETa60d2ae3f6^DATARMNET8814564ab9->
  69. DATARMNETa60d2ae3f6||DATARMNET699c2c62cd->DATARMNET5e7452ec23^
  70. DATARMNET8814564ab9->DATARMNET5e7452ec23)return false;if(DATARMNET8814564ab9->
  71. DATARMNET388842c721==(0xd11+230-0xdf3)){if(DATARMNET699c2c62cd->
  72. DATARMNET1a2be7b6c2^DATARMNET8814564ab9->DATARMNET1a2be7b6c2||
  73. DATARMNET699c2c62cd->DATARMNET0a28fa80f4^DATARMNET8814564ab9->
  74. DATARMNET0a28fa80f4)return false;}else if(DATARMNET8814564ab9->
  75. DATARMNET388842c721==(0xd03+244-0xdf1)){if(memcmp(DATARMNET699c2c62cd->
  76. DATARMNET949c2754de,DATARMNET8814564ab9->DATARMNET949c2754de,sizeof(
  77. DATARMNET8814564ab9->DATARMNET949c2754de))||memcmp(DATARMNET699c2c62cd->
  78. DATARMNET45ec858bc5,DATARMNET8814564ab9->DATARMNET45ec858bc5,sizeof(
  79. DATARMNET8814564ab9->DATARMNET45ec858bc5)))return false;}else{return false;}
  80. return true;}static struct DATARMNETd7c9631acd*DATARMNETd41def0046(void){struct
  81. DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();struct
  82. DATARMNET907d58c807*DATARMNETa6f73cbe10;struct DATARMNETd7c9631acd*
  83. DATARMNET6745427f98;LIST_HEAD(DATARMNET6f9bfa17e6);DATARMNETa6f73cbe10=&
  84. DATARMNETe05748b000->DATARMNETebb45c8d86;if(DATARMNETa6f73cbe10->
  85. DATARMNET8dfc11cccd<DATARMNET78d9393ac8){DATARMNET6745427f98=&
  86. DATARMNETa6f73cbe10->DATARMNET2846a01cce[DATARMNETa6f73cbe10->
  87. DATARMNET8dfc11cccd];DATARMNETa6f73cbe10->DATARMNET8dfc11cccd++;return
  88. DATARMNET6745427f98;}DATARMNET6745427f98=&DATARMNETa6f73cbe10->
  89. DATARMNET2846a01cce[DATARMNETa6f73cbe10->DATARMNET57d435b225];
  90. DATARMNETa6f73cbe10->DATARMNET57d435b225++;DATARMNETa6f73cbe10->
  91. DATARMNET57d435b225%=DATARMNET78d9393ac8;hash_del(&DATARMNET6745427f98->
  92. DATARMNETbd5d7d96d8);if(DATARMNET6745427f98->DATARMNET1db11fa85e){
  93. DATARMNETa00cda79d0(DATARMNETf3f92fc0b9);DATARMNETa3055c21f2(DATARMNET6745427f98
  94. ,&DATARMNET6f9bfa17e6);}DATARMNETc70e73c8d4(&DATARMNET6f9bfa17e6);return
  95. DATARMNET6745427f98;}static void DATARMNETbe30d096c6(void){LIST_HEAD(
  96. DATARMNET6f9bfa17e6);DATARMNET664568fcd0();if(DATARMNETae70636c90(&
  97. DATARMNET6f9bfa17e6))DATARMNETa00cda79d0(DATARMNET5727f095ec);
  98. DATARMNET6a76048590();DATARMNETc70e73c8d4(&DATARMNET6f9bfa17e6);}static const
  99. struct rmnet_module_hook_register_info DATARMNETcbc211d052={.hooknum=
  100. RMNET_MODULE_HOOK_OFFLOAD_CHAIN_END,.func=DATARMNETbe30d096c6,};void
  101. DATARMNETd4230b6bfe(void){rcu_assign_pointer(rmnet_perf_chain_end,
  102. DATARMNETbe30d096c6);rmnet_module_hook_register(&DATARMNETcbc211d052,
  103. (0xd26+209-0xdf6));}void DATARMNET560e127137(void){rcu_assign_pointer(
  104. rmnet_perf_chain_end,NULL);rmnet_module_hook_unregister_no_sync(&
  105. DATARMNETcbc211d052,(0xd26+209-0xdf6));}int DATARMNET241493ab9a(u64
  106. DATARMNET0470698d6c,u64 DATARMNETfeff65e096){LIST_HEAD(DATARMNET6f9bfa17e6);u32
  107. DATARMNET737bbd41c3=(0xd2d+202-0xdf7);if(DATARMNET0470698d6c==
  108. DATARMNET5fe3af8828||DATARMNETfeff65e096==DATARMNET2d89680280)return
  109. (0xd2d+202-0xdf7);switch(DATARMNETfeff65e096){case DATARMNET03daf91a60:
  110. DATARMNET737bbd41c3=DATARMNET1993bae165(DATARMNETa656f324b2,&DATARMNET6f9bfa17e6
  111. );break;case DATARMNET88a9920663:DATARMNET737bbd41c3=DATARMNET1993bae165(
  112. DATARMNETfd5c3d30e5,&DATARMNET6f9bfa17e6);break;case DATARMNET5fe3af8828:
  113. DATARMNET737bbd41c3=DATARMNETae70636c90(&DATARMNET6f9bfa17e6);break;}
  114. DATARMNETbad3b5165e(DATARMNETddf572458d,DATARMNET737bbd41c3);DATARMNETc70e73c8d4
  115. (&DATARMNET6f9bfa17e6);return(0xd2d+202-0xdf7);}void DATARMNETa3055c21f2(struct
  116. DATARMNETd7c9631acd*DATARMNETaa568481cf,struct list_head*DATARMNET6f9bfa17e6){
  117. struct DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();struct
  118. rmnet_frag_descriptor*DATARMNETd74aeaa49a,*DATARMNETa1625e27e2,*
  119. DATARMNET0386f6f82a;struct DATARMNET4287f07234*DATARMNET699c2c62cd=&
  120. DATARMNETaa568481cf->DATARMNET78fd20ce0e;u32 DATARMNET567bdc7221=
  121. DATARMNET699c2c62cd->DATARMNET4ca5ac9de1+DATARMNET699c2c62cd->
  122. DATARMNET0aeee57ceb;if(!DATARMNETaa568481cf->DATARMNET1db11fa85e)return;
  123. DATARMNETd74aeaa49a=list_first_entry(&DATARMNETaa568481cf->DATARMNETb76b79d0d5,
  124. struct rmnet_frag_descriptor,list);if(!DATARMNETd74aeaa49a->gso_segs)
  125. DATARMNETd74aeaa49a->gso_segs=(0xd26+209-0xdf6);DATARMNETd74aeaa49a->gso_size=
  126. DATARMNETaa568481cf->DATARMNET1978d5d8de;DATARMNETa1625e27e2=DATARMNETd74aeaa49a
  127. ;list_for_each_entry_safe_continue(DATARMNETa1625e27e2,DATARMNET0386f6f82a,&
  128. DATARMNETaa568481cf->DATARMNETb76b79d0d5,list){u32 DATARMNET904423d5e4=
  129. DATARMNETa1625e27e2->len-DATARMNET567bdc7221;if(!
  130. rmnet_frag_descriptor_add_frags_from(DATARMNETd74aeaa49a,DATARMNETa1625e27e2,
  131. DATARMNET567bdc7221,DATARMNET904423d5e4)){DATARMNETd74aeaa49a->gso_segs+=(
  132. DATARMNETa1625e27e2->gso_segs)?:(0xd26+209-0xdf6);DATARMNETd74aeaa49a->
  133. coal_bytes+=DATARMNETa1625e27e2->coal_bytes;DATARMNETd74aeaa49a->coal_bufsize+=
  134. DATARMNETa1625e27e2->coal_bufsize;}rmnet_recycle_frag_descriptor(
  135. DATARMNETa1625e27e2,DATARMNETe05748b000->DATARMNET403589239f);}
  136. DATARMNETd74aeaa49a->hash=DATARMNETaa568481cf->DATARMNET381f1cadc4;list_del_init
  137. (&DATARMNETd74aeaa49a->list);list_add_tail(&DATARMNETd74aeaa49a->list,
  138. DATARMNET6f9bfa17e6);DATARMNETaa568481cf->DATARMNET1db11fa85e=(0xd2d+202-0xdf7);
  139. DATARMNETaa568481cf->DATARMNETcf28ae376b=(0xd2d+202-0xdf7);}void
  140. DATARMNETc38c135c9f(u32 DATARMNET3f8cc6fc24,struct list_head*DATARMNET6f9bfa17e6
  141. ){struct DATARMNETd7c9631acd*DATARMNETaa568481cf;hash_for_each_possible(
  142. DATARMNET4791268d67,DATARMNETaa568481cf,DATARMNETbd5d7d96d8,DATARMNET3f8cc6fc24)
  143. {if(DATARMNETaa568481cf->DATARMNET381f1cadc4==DATARMNET3f8cc6fc24&&
  144. DATARMNETaa568481cf->DATARMNET1db11fa85e)DATARMNETa3055c21f2(DATARMNETaa568481cf
  145. ,DATARMNET6f9bfa17e6);}}u32 DATARMNETae70636c90(struct list_head*
  146. DATARMNET6f9bfa17e6){struct DATARMNETd7c9631acd*DATARMNETaa568481cf;int
  147. DATARMNETae0201901a;u32 DATARMNET737bbd41c3=(0xd2d+202-0xdf7);hash_for_each(
  148. DATARMNET4791268d67,DATARMNETae0201901a,DATARMNETaa568481cf,DATARMNETbd5d7d96d8)
  149. {if(DATARMNETaa568481cf->DATARMNET1db11fa85e){DATARMNET737bbd41c3++;
  150. DATARMNETa3055c21f2(DATARMNETaa568481cf,DATARMNET6f9bfa17e6);}}return
  151. DATARMNET737bbd41c3;}void DATARMNET33aa5df9ef(struct DATARMNETd7c9631acd*
  152. DATARMNETaa568481cf,struct DATARMNETd812bcdbb5*DATARMNET5fe4c722a8){if(
  153. DATARMNET5fe4c722a8->DATARMNETf1b6b0a6cc){memcpy(&DATARMNETaa568481cf->
  154. DATARMNET78fd20ce0e,&DATARMNET5fe4c722a8->DATARMNET144d119066,sizeof(
  155. DATARMNETaa568481cf->DATARMNET78fd20ce0e));DATARMNETaa568481cf->
  156. DATARMNET381f1cadc4=DATARMNET5fe4c722a8->DATARMNET645e8912b8;DATARMNETaa568481cf
  157. ->DATARMNET1978d5d8de=(DATARMNET5fe4c722a8->DATARMNET719f68fb88->gso_size)?:
  158. DATARMNET5fe4c722a8->DATARMNET1ef22e4c76;}if(DATARMNET5fe4c722a8->
  159. DATARMNET144d119066.DATARMNET7fa8b2acbf==DATARMNETfd5c3d30e5)DATARMNETaa568481cf
  160. ->DATARMNET78fd20ce0e.DATARMNETbc28a5970f+=DATARMNET5fe4c722a8->
  161. DATARMNET1ef22e4c76;list_add_tail(&DATARMNET5fe4c722a8->DATARMNET719f68fb88->
  162. list,&DATARMNETaa568481cf->DATARMNETb76b79d0d5);DATARMNETaa568481cf->
  163. DATARMNET1db11fa85e++;DATARMNETaa568481cf->DATARMNETcf28ae376b+=
  164. DATARMNET5fe4c722a8->DATARMNET1ef22e4c76;}bool DATARMNETfbf5798e15(struct
  165. DATARMNETd812bcdbb5*DATARMNET5fe4c722a8,struct list_head*DATARMNET6f9bfa17e6){
  166. struct DATARMNETd7c9631acd*DATARMNETaa568481cf;bool DATARMNET885970f252=false;u8
  167. DATARMNET9695aa5b1d=DATARMNET5fe4c722a8->DATARMNET144d119066.
  168. DATARMNET7fa8b2acbf;if(!DATARMNET2013036d80(DATARMNET9695aa5b1d)){
  169. DATARMNETa00cda79d0(DATARMNET6a894ab63d);return false;}hash_for_each_possible(
  170. DATARMNET4791268d67,DATARMNETaa568481cf,DATARMNETbd5d7d96d8,DATARMNET5fe4c722a8
  171. ->DATARMNET645e8912b8){bool DATARMNET2dd83daa1c;if(!DATARMNET6895620058(
  172. DATARMNETaa568481cf,DATARMNET5fe4c722a8))continue;DATARMNETc6f994577c:
  173. DATARMNET2dd83daa1c=DATARMNET5a0f9fc3a2(DATARMNETaa568481cf,DATARMNET5fe4c722a8)
  174. ;DATARMNET5fe4c722a8->DATARMNETf1b6b0a6cc=true;DATARMNET885970f252=true;switch(
  175. DATARMNET9695aa5b1d){case DATARMNETfd5c3d30e5:return DATARMNET4c7cdc25b7(
  176. DATARMNETaa568481cf,DATARMNET5fe4c722a8,DATARMNET2dd83daa1c,DATARMNET6f9bfa17e6)
  177. ;case DATARMNETa656f324b2:return DATARMNET8dc47eb7af(DATARMNETaa568481cf,
  178. DATARMNET5fe4c722a8,DATARMNET2dd83daa1c,DATARMNET6f9bfa17e6);default:return
  179. false;}}if(!DATARMNET885970f252){DATARMNETaa568481cf=DATARMNETd41def0046();
  180. DATARMNETaa568481cf->DATARMNET381f1cadc4=DATARMNET5fe4c722a8->
  181. DATARMNET645e8912b8;hash_add(DATARMNET4791268d67,&DATARMNETaa568481cf->
  182. DATARMNETbd5d7d96d8,DATARMNETaa568481cf->DATARMNET381f1cadc4);goto
  183. DATARMNETc6f994577c;}return false;}void DATARMNETb98b78b8e3(void){struct
  184. DATARMNETd7c9631acd*DATARMNETaa568481cf;struct hlist_node*DATARMNET0386f6f82a;
  185. int DATARMNETae0201901a;hash_for_each_safe(DATARMNET4791268d67,
  186. DATARMNETae0201901a,DATARMNET0386f6f82a,DATARMNETaa568481cf,DATARMNETbd5d7d96d8)
  187. hash_del(&DATARMNETaa568481cf->DATARMNETbd5d7d96d8);}int DATARMNETdbcaf01255(
  188. void){struct DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();u8
  189. DATARMNETefc9df3df2;for(DATARMNETefc9df3df2=(0xd2d+202-0xdf7);
  190. DATARMNETefc9df3df2<DATARMNET78d9393ac8;DATARMNETefc9df3df2++){struct
  191. DATARMNETd7c9631acd*DATARMNETaa568481cf;DATARMNETaa568481cf=&DATARMNETe05748b000
  192. ->DATARMNETebb45c8d86.DATARMNET2846a01cce[DATARMNETefc9df3df2];INIT_LIST_HEAD(&
  193. DATARMNETaa568481cf->DATARMNETb76b79d0d5);INIT_HLIST_NODE(&DATARMNETaa568481cf->
  194. DATARMNETbd5d7d96d8);}return DATARMNET0529bb9c4e;}