rmnet_offload_engine.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/log2.h>
  13. #include <linux/list.h>
  14. #include <linux/hashtable.h>
  15. #include "rmnet_descriptor.h"
  16. #include "rmnet_offload_state.h"
  17. #include "rmnet_offload_engine.h"
  18. #include "rmnet_offload_main.h"
  19. #include "rmnet_offload_tcp.h"
  20. #include "rmnet_offload_udp.h"
  21. #include "rmnet_offload_stats.h"
  22. #include "rmnet_offload_knob.h"
  23. #define DATARMNETc9a92fd5dc \
  24. (const_ilog2(DATARMNET51fcd2e93a))
  25. static DEFINE_HASHTABLE(DATARMNETab0dbdf89d,DATARMNETc9a92fd5dc);static u32
  26. DATARMNETb2ff7800c4(u8 DATARMNET22afafde5e){struct DATARMNET31caee06e2*
  27. DATARMNET0277af6816;int DATARMNET6090c652d3;u32 DATARMNET67497a3454=
  28. (0x145b+644-0x16df);hash_for_each(DATARMNETab0dbdf89d,DATARMNET6090c652d3,
  29. DATARMNET0277af6816,DATARMNET0a9c7c9a12){if(DATARMNET0277af6816->
  30. DATARMNET30d367f886&&DATARMNET0277af6816->DATARMNETb2a7197d60==
  31. DATARMNET22afafde5e){DATARMNET67497a3454++;DATARMNET3bdaf91675(
  32. DATARMNET0277af6816);}}return DATARMNET67497a3454;}static bool
  33. DATARMNET5d54389061(u8 DATARMNET22afafde5e){u64 DATARMNET75cb1c0f3f;
  34. DATARMNET75cb1c0f3f=DATARMNET3d487d950f(DATARMNETe9b360aea8);if(
  35. DATARMNET75cb1c0f3f==DATARMNET651e3c6554)return true;if(DATARMNET75cb1c0f3f==
  36. DATARMNETb94ae69059&&DATARMNET22afafde5e==DATARMNET70889e5696)return true;if(
  37. DATARMNET75cb1c0f3f==DATARMNETda679f58ba&&DATARMNET22afafde5e==
  38. DATARMNETb02d95e937)return true;return false;}static bool DATARMNET9c6847635e(
  39. struct DATARMNET31caee06e2*DATARMNETd44a80d414,struct DATARMNETadd6ff90d0*
  40. DATARMNETc3ffad4b30){if(!DATARMNETd44a80d414->DATARMNET30d367f886)return false;
  41. if(DATARMNETc3ffad4b30->DATARMNET9f5b2909c8==(0x54a+6318-0x1df4)){struct
  42. DATARMNETf61a39bce9*DATARMNETb5da236f91,*DATARMNET4e35bbb67d;DATARMNETb5da236f91
  43. =DATARMNETd44a80d414->DATARMNETd321db9bb1;DATARMNET4e35bbb67d=
  44. DATARMNETc3ffad4b30->DATARMNET574a565f78;if(DATARMNETb5da236f91->
  45. DATARMNET58886f3d9d^DATARMNET4e35bbb67d->DATARMNET58886f3d9d||
  46. DATARMNETb5da236f91->DATARMNET14d3de9c1a^DATARMNET4e35bbb67d->
  47. DATARMNET14d3de9c1a||DATARMNETb5da236f91->DATARMNETa803e4f68b^
  48. DATARMNET4e35bbb67d->DATARMNETa803e4f68b||DATARMNETb5da236f91->
  49. DATARMNET422c25939d^DATARMNET4e35bbb67d->DATARMNET422c25939d)return true;}else
  50. if(DATARMNETc3ffad4b30->DATARMNET9f5b2909c8==(0x1ff5+182-0x20a5)){__be32
  51. DATARMNET55aa748931,DATARMNET34282dc487;__be32 DATARMNETfc68f228ca;
  52. DATARMNET55aa748931=DATARMNETd44a80d414->DATARMNET85d5545fb8->
  53. DATARMNETd750a8b9e5;DATARMNET34282dc487=DATARMNETc3ffad4b30->DATARMNET1dab0af728
  54. ->DATARMNETd750a8b9e5;DATARMNETfc68f228ca=DATARMNET55aa748931^
  55. DATARMNET34282dc487;if(DATARMNETfc68f228ca&htonl(267386880))return true;}return
  56. false;}static bool DATARMNETa96491b775(struct DATARMNET31caee06e2*
  57. DATARMNETd44a80d414,struct DATARMNETadd6ff90d0*DATARMNETc3ffad4b30){__be16
  58. DATARMNETffe972c30a,DATARMNETfee6a33770,DATARMNET063a3638c1,DATARMNETf80930b49f;
  59. if(!DATARMNETd44a80d414->DATARMNET30d367f886)return DATARMNETd44a80d414->
  60. DATARMNET2bb18bc9dd==DATARMNETc3ffad4b30->DATARMNET68ad0738e2;if(
  61. DATARMNETd44a80d414->DATARMNETb2a7197d60!=DATARMNETc3ffad4b30->
  62. DATARMNET072708db10)return false;DATARMNETffe972c30a=DATARMNETd44a80d414->
  63. DATARMNETef42c82b6f->DATARMNETaad9b0a864;DATARMNET063a3638c1=DATARMNETd44a80d414
  64. ->DATARMNETef42c82b6f->DATARMNETd751c12d13;DATARMNETfee6a33770=
  65. DATARMNETc3ffad4b30->DATARMNETc51cdf696b->DATARMNETaad9b0a864;
  66. DATARMNETf80930b49f=DATARMNETc3ffad4b30->DATARMNETc51cdf696b->
  67. DATARMNETd751c12d13;if(DATARMNETffe972c30a^DATARMNETfee6a33770||
  68. DATARMNET063a3638c1^DATARMNETf80930b49f)return false;if(DATARMNETc3ffad4b30->
  69. DATARMNET9f5b2909c8==(0x19f+8819-0x240e)){struct DATARMNETf61a39bce9*
  70. DATARMNETb5da236f91,*DATARMNET4e35bbb67d;DATARMNETb5da236f91=DATARMNETd44a80d414
  71. ->DATARMNETd321db9bb1;DATARMNET4e35bbb67d=DATARMNETc3ffad4b30->
  72. DATARMNET574a565f78;if(DATARMNETb5da236f91->DATARMNET7c6ed51964^
  73. DATARMNET4e35bbb67d->DATARMNET7c6ed51964||DATARMNETb5da236f91->
  74. DATARMNET799b2a47a5^DATARMNET4e35bbb67d->DATARMNET799b2a47a5)return false;}else
  75. if(DATARMNETc3ffad4b30->DATARMNET9f5b2909c8==(0x53a+3466-0x12be)){struct
  76. DATARMNETfab66e680d*DATARMNETb5da236f91,*DATARMNET4e35bbb67d;DATARMNETb5da236f91
  77. =DATARMNETd44a80d414->DATARMNET85d5545fb8;DATARMNET4e35bbb67d=
  78. DATARMNETc3ffad4b30->DATARMNET1dab0af728;if(memcmp(DATARMNETb5da236f91->
  79. DATARMNET0f6f3a8868,DATARMNET4e35bbb67d->DATARMNET0f6f3a8868,sizeof(
  80. DATARMNET4e35bbb67d->DATARMNET0f6f3a8868))||memcmp(DATARMNETb5da236f91->
  81. DATARMNET818f335f71,DATARMNET4e35bbb67d->DATARMNET818f335f71,sizeof(
  82. DATARMNET4e35bbb67d->DATARMNET818f335f71)))return false;}else{return false;}
  83. return true;}static struct DATARMNET31caee06e2*DATARMNET30062b5353(void){struct
  84. DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();struct
  85. DATARMNET337e435e40*DATARMNET048da5e00c;struct DATARMNET31caee06e2*
  86. DATARMNETc5c31601b9;DATARMNET048da5e00c=&DATARMNETf7e8f6395c->
  87. DATARMNETa3d1da1cba;if(DATARMNET048da5e00c->DATARMNET762f0d12b6<
  88. DATARMNET51fcd2e93a){DATARMNETc5c31601b9=&DATARMNET048da5e00c->
  89. DATARMNET51e299cf9c[DATARMNET048da5e00c->DATARMNET762f0d12b6];
  90. DATARMNET048da5e00c->DATARMNET762f0d12b6++;return DATARMNETc5c31601b9;}
  91. DATARMNETc5c31601b9=&DATARMNET048da5e00c->DATARMNET51e299cf9c[
  92. DATARMNET048da5e00c->DATARMNETded3d12c96];DATARMNET048da5e00c->
  93. DATARMNETded3d12c96++;DATARMNET048da5e00c->DATARMNETded3d12c96%=
  94. DATARMNET51fcd2e93a;hash_del(&DATARMNETc5c31601b9->DATARMNET0a9c7c9a12);
  95. if(DATARMNETc5c31601b9->DATARMNET30d367f886){DATARMNET5d24865423(
  96. DATARMNETa05aa2c4a7);DATARMNET3bdaf91675(DATARMNETc5c31601b9);}return
  97. DATARMNETc5c31601b9;}static void DATARMNET3d9424a1f2(void){
  98. DATARMNET8f8c3a4cc3();if(DATARMNET54fd6bf483())DATARMNET5d24865423(
  99. DATARMNETc0fe927262);DATARMNET4c69e80b6f();}void DATARMNETafcdd1146f(void){
  100. rcu_assign_pointer(rmnet_perf_chain_end,DATARMNET3d9424a1f2);}void
  101. DATARMNET28dfa538f2(void){rcu_assign_pointer(rmnet_perf_chain_end,NULL);}int
  102. DATARMNET467c2610cd(u64 DATARMNET842aaafdc8,u64 DATARMNET7c1185ffbf){u32
  103. DATARMNET67497a3454=(0x52d+7239-0x2174);if(DATARMNET842aaafdc8==
  104. DATARMNET7d2f8bdc64||DATARMNET7c1185ffbf==DATARMNET651e3c6554)return
  105. (0x1053+1012-0x1447);switch(DATARMNET7c1185ffbf){case DATARMNETb94ae69059:
  106. DATARMNET67497a3454=DATARMNETb2ff7800c4(DATARMNETb02d95e937);break;case
  107. DATARMNETda679f58ba:DATARMNET67497a3454=DATARMNETb2ff7800c4(DATARMNET70889e5696)
  108. ;break;case DATARMNET7d2f8bdc64:DATARMNET67497a3454=DATARMNET54fd6bf483();break;
  109. }DATARMNETa3edc29191(DATARMNET2ec91e73cf,DATARMNET67497a3454);return
  110. (0x349+1374-0x8a7);}void DATARMNET3bdaf91675(struct DATARMNET31caee06e2*
  111. DATARMNETd44a80d414){struct DATARMNET8357daf015*DATARMNETf7e8f6395c=
  112. DATARMNETccc25794e0();struct rmnet_frag_descriptor*DATARMNETb2b92619af,*
  113. DATARMNETe6a1f8e9a8,*DATARMNETb9b0dca770;u32 DATARMNET439e3442b2=
  114. DATARMNETd44a80d414->DATARMNET5f92dbf405+DATARMNETd44a80d414->
  115. DATARMNET2e943b139f+DATARMNETd44a80d414->DATARMNET00656e1145;if(!
  116. DATARMNETd44a80d414->DATARMNET30d367f886)return;DATARMNETb2b92619af=
  117. list_first_entry(&DATARMNETd44a80d414->DATARMNETdaf24e965e,struct
  118. rmnet_frag_descriptor,list);if(!DATARMNETb2b92619af->gso_segs)
  119. DATARMNETb2b92619af->gso_segs=(0x1058+4757-0x22ec);DATARMNETb2b92619af->gso_size
  120. =DATARMNETd44a80d414->DATARMNET632219f39d;DATARMNETe6a1f8e9a8=
  121. DATARMNETb2b92619af;list_for_each_entry_safe_continue(DATARMNETe6a1f8e9a8,
  122. DATARMNETb9b0dca770,&DATARMNETd44a80d414->DATARMNETdaf24e965e,list){if(
  123. DATARMNETe6a1f8e9a8->hdr_ptr==rmnet_frag_data_ptr(DATARMNETe6a1f8e9a8)){if(!
  124. rmnet_frag_pull(DATARMNETe6a1f8e9a8,DATARMNETf7e8f6395c->DATARMNET547651077b,
  125. DATARMNETd44a80d414->DATARMNET2e943b139f+DATARMNETd44a80d414->
  126. DATARMNET00656e1145))continue;}list_del(&DATARMNETe6a1f8e9a8->list);
  127. list_add_tail(&DATARMNETe6a1f8e9a8->list,&DATARMNETb2b92619af->sub_frags);
  128. DATARMNETb2b92619af->gso_segs+=(DATARMNETe6a1f8e9a8->gso_segs)?:
  129. (0x11b6+461-0x1382);}DATARMNETb2b92619af->hash=DATARMNETd44a80d414->
  130. DATARMNET2bb18bc9dd;DATARMNET654b85a739(DATARMNETb2b92619af,DATARMNET439e3442b2)
  131. ;DATARMNETd44a80d414->DATARMNET30d367f886=(0x1c9b+1105-0x20ec);
  132. DATARMNETd44a80d414->DATARMNET5f92dbf405=(0xb26+2684-0x15a2);}void
  133. DATARMNET8b657e07e9(u32 DATARMNETb7b515b920){struct DATARMNET31caee06e2*
  134. DATARMNETd44a80d414;hash_for_each_possible(DATARMNETab0dbdf89d,
  135. DATARMNETd44a80d414,DATARMNET0a9c7c9a12,DATARMNETb7b515b920){if(
  136. DATARMNETd44a80d414->DATARMNET2bb18bc9dd==DATARMNETb7b515b920&&
  137. DATARMNETd44a80d414->DATARMNET30d367f886)DATARMNET3bdaf91675(DATARMNETd44a80d414
  138. );}}u32 DATARMNET54fd6bf483(void){struct DATARMNET31caee06e2*DATARMNETd44a80d414
  139. ;int DATARMNET6090c652d3;u32 DATARMNET67497a3454=(0x16b4+2078-0x1ed2);
  140. hash_for_each(DATARMNETab0dbdf89d,DATARMNET6090c652d3,DATARMNETd44a80d414,
  141. DATARMNET0a9c7c9a12){if(DATARMNETd44a80d414->DATARMNET30d367f886){
  142. DATARMNET67497a3454++;DATARMNET3bdaf91675(DATARMNETd44a80d414);}}return
  143. DATARMNET67497a3454;}void DATARMNETfc01092f09(struct DATARMNET31caee06e2*
  144. DATARMNETd44a80d414,struct DATARMNETadd6ff90d0*DATARMNETc3ffad4b30){if(
  145. DATARMNETc3ffad4b30->DATARMNET1e7926dc4c){DATARMNETd44a80d414->
  146. DATARMNET6b35defba1=DATARMNETc3ffad4b30->DATARMNET9f5b2909c8;DATARMNETd44a80d414
  147. ->DATARMNET2e943b139f=DATARMNETc3ffad4b30->DATARMNETa7eaea0d00;
  148. DATARMNETd44a80d414->DATARMNETd321db9bb1=DATARMNETc3ffad4b30->
  149. DATARMNET574a565f78;DATARMNETd44a80d414->DATARMNETb2a7197d60=DATARMNETc3ffad4b30
  150. ->DATARMNET072708db10;DATARMNETd44a80d414->DATARMNET00656e1145=
  151. DATARMNETc3ffad4b30->DATARMNETfeb7c81ac7;DATARMNETd44a80d414->
  152. DATARMNET9a5f6d68d4=DATARMNETc3ffad4b30->DATARMNET7ff34eacb7;DATARMNETd44a80d414
  153. ->DATARMNET2bb18bc9dd=DATARMNETc3ffad4b30->DATARMNET68ad0738e2;
  154. DATARMNETd44a80d414->DATARMNET632219f39d=(DATARMNETc3ffad4b30->
  155. DATARMNET798fafaf36->gso_size)?:DATARMNETc3ffad4b30->DATARMNET5671455f38;if(
  156. DATARMNETc3ffad4b30->DATARMNET072708db10==DATARMNET70889e5696){__be32
  157. DATARMNETff7464c709;if(DATARMNETc3ffad4b30->DATARMNET798fafaf36->tcp_seq_set)
  158. DATARMNETff7464c709=DATARMNETc3ffad4b30->DATARMNET798fafaf36->tcp_seq;else
  159. DATARMNETff7464c709=DATARMNETc3ffad4b30->DATARMNET7ff34eacb7->
  160. DATARMNET614032cc71;DATARMNETd44a80d414->DATARMNET956bd73340=ntohl(
  161. DATARMNETff7464c709);}}if(DATARMNETc3ffad4b30->DATARMNET072708db10==
  162. DATARMNET70889e5696)DATARMNETd44a80d414->DATARMNET956bd73340+=
  163. DATARMNETc3ffad4b30->DATARMNET5671455f38;list_add_tail(&DATARMNETc3ffad4b30->
  164. DATARMNET798fafaf36->list,&DATARMNETd44a80d414->DATARMNETdaf24e965e);
  165. DATARMNETd44a80d414->DATARMNET30d367f886++;DATARMNETd44a80d414->
  166. DATARMNET5f92dbf405+=DATARMNETc3ffad4b30->DATARMNET5671455f38;}bool
  167. DATARMNET9b8a1a69f3(struct DATARMNETadd6ff90d0*DATARMNETc3ffad4b30){struct
  168. DATARMNET31caee06e2*DATARMNETd44a80d414;bool DATARMNET262f926565=false;if(!
  169. DATARMNET5d54389061(DATARMNETc3ffad4b30->DATARMNET072708db10)){
  170. DATARMNET5d24865423(DATARMNETdae7cbfd97);return false;}hash_for_each_possible(
  171. DATARMNETab0dbdf89d,DATARMNETd44a80d414,DATARMNET0a9c7c9a12,DATARMNETc3ffad4b30
  172. ->DATARMNET68ad0738e2){bool DATARMNET4e4b105fa2;if(!DATARMNETa96491b775(
  173. DATARMNETd44a80d414,DATARMNETc3ffad4b30))continue;DATARMNETb9fc1ffb2f:
  174. DATARMNET4e4b105fa2=DATARMNET9c6847635e(DATARMNETd44a80d414,DATARMNETc3ffad4b30)
  175. ;DATARMNETc3ffad4b30->DATARMNET1e7926dc4c=true;DATARMNET262f926565=true;switch(
  176. DATARMNETc3ffad4b30->DATARMNET072708db10){case DATARMNET70889e5696:return
  177. DATARMNETb25a21aeeb(DATARMNETd44a80d414,DATARMNETc3ffad4b30,DATARMNET4e4b105fa2)
  178. ;case DATARMNETb02d95e937:return DATARMNET9dd18589e3(DATARMNETd44a80d414,
  179. DATARMNETc3ffad4b30,DATARMNET4e4b105fa2);default:return false;}}if(!
  180. DATARMNET262f926565){DATARMNETd44a80d414=DATARMNET30062b5353();
  181. DATARMNETd44a80d414->DATARMNET2bb18bc9dd=DATARMNETc3ffad4b30->
  182. DATARMNET68ad0738e2;hash_add(DATARMNETab0dbdf89d,&DATARMNETd44a80d414->
  183. DATARMNET0a9c7c9a12,DATARMNETd44a80d414->DATARMNET2bb18bc9dd);goto
  184. DATARMNETb9fc1ffb2f;}return false;}void DATARMNETde815547a0(void){struct
  185. DATARMNET31caee06e2*DATARMNETd44a80d414;struct hlist_node*DATARMNETb9b0dca770;
  186. int DATARMNET6090c652d3;hash_for_each_safe(DATARMNETab0dbdf89d,
  187. DATARMNET6090c652d3,DATARMNETb9b0dca770,DATARMNETd44a80d414,DATARMNET0a9c7c9a12)
  188. hash_del(&DATARMNETd44a80d414->DATARMNET0a9c7c9a12);}int DATARMNETcce014cb1d(
  189. void){struct DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();u8
  190. DATARMNET5d971be8b8;for(DATARMNET5d971be8b8=(0xec5+3020-0x1a91);
  191. DATARMNET5d971be8b8<DATARMNET51fcd2e93a;DATARMNET5d971be8b8++){struct
  192. DATARMNET31caee06e2*DATARMNETd44a80d414;DATARMNETd44a80d414=&DATARMNETf7e8f6395c
  193. ->DATARMNETa3d1da1cba.DATARMNET51e299cf9c[DATARMNET5d971be8b8];INIT_LIST_HEAD(&
  194. DATARMNETd44a80d414->DATARMNETdaf24e965e);INIT_HLIST_NODE(&DATARMNETd44a80d414->
  195. DATARMNET0a9c7c9a12);}return DATARMNET6e89887168;}