rmnet_offload_main.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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/compiler.h>
  13. #include <linux/rcupdate.h>
  14. #include <linux/jhash.h>
  15. #include <linux/spinlock.h>
  16. #include "rmnet_descriptor.h"
  17. #include "rmnet_handlers.h"
  18. #include "rmnet_map.h"
  19. #include "rmnet_offload_main.h"
  20. #include "rmnet_offload_state.h"
  21. #include "rmnet_offload_engine.h"
  22. #include "rmnet_offload_stats.h"
  23. static const char*DATARMNET9be3ddbe97[]__always_unused={
  24. "\x49\x37\x32\x31\x62\x64\x36\x39\x35\x32\x31\x66\x65\x34\x61\x61\x38\x64\x61\x65\x62\x65\x66\x62\x32\x38\x30\x64\x38\x64\x31\x35\x30\x39\x66\x39\x31\x65\x36\x37\x33"
  25. ,
  26. "\x49\x36\x64\x36\x66\x39\x32\x35\x66\x33\x65\x33\x32\x31\x65\x31\x32\x32\x38\x64\x33\x38\x37\x33\x66\x63\x37\x38\x32\x31\x38\x62\x61\x39\x30\x65\x39\x34\x35\x30\x36"
  27. ,
  28. "\x49\x36\x61\x62\x39\x37\x30\x65\x36\x62\x65\x65\x34\x33\x39\x34\x63\x36\x31\x30\x33\x38\x31\x62\x62\x38\x39\x66\x36\x33\x36\x31\x61\x34\x66\x30\x33\x36\x63\x66\x30"
  29. ,};static DEFINE_SPINLOCK(DATARMNET0b5e447f18);static u32 DATARMNETcb7325e02d(
  30. struct DATARMNETd812bcdbb5*DATARMNET458b70e7e5){__be32 DATARMNETdfd47b00ff[
  31. (0xd20+231-0xdfc)];u32 DATARMNET5ebf661879;__be16 DATARMNET08e913477e=
  32. (0xd2d+202-0xdf7),DATARMNETda7f7fa492=(0xd2d+202-0xdf7);if(DATARMNET458b70e7e5->
  33. DATARMNET098910da0f==DATARMNETa656f324b2||DATARMNET458b70e7e5->
  34. DATARMNET098910da0f==DATARMNETfd5c3d30e5){struct DATARMNET0b82084e89*
  35. DATARMNET75be5f3406=DATARMNET458b70e7e5->DATARMNET0da3c8035d;DATARMNET08e913477e
  36. =DATARMNET75be5f3406->DATARMNET1b1c406ae9;DATARMNETda7f7fa492=
  37. DATARMNET75be5f3406->DATARMNETdf0e8545ee;}if(DATARMNET458b70e7e5->
  38. DATARMNETaebe0581f2==(0xd11+230-0xdf3)){struct DATARMNET308c06fca6*
  39. DATARMNET86f1f2cdc9=DATARMNET458b70e7e5->DATARMNET1469d7a840;DATARMNETdfd47b00ff
  40. [(0xd2d+202-0xdf7)]=DATARMNET86f1f2cdc9->DATARMNET11ef55b2bb;DATARMNETdfd47b00ff
  41. [(0xd26+209-0xdf6)]=DATARMNET86f1f2cdc9->DATARMNET9bbd2ca483;DATARMNETdfd47b00ff
  42. [(0xd1f+216-0xdf5)]=DATARMNET86f1f2cdc9->DATARMNET953d32410f;DATARMNETdfd47b00ff
  43. [(0xd18+223-0xdf4)]=DATARMNETda7f7fa492;DATARMNETdfd47b00ff[(0xd11+230-0xdf3)]=
  44. DATARMNET08e913477e;DATARMNET5ebf661879=(0xd0a+237-0xdf2);}else{struct
  45. DATARMNET64bb8f616e*DATARMNETbf55123e5b=DATARMNET458b70e7e5->DATARMNET5559b05582
  46. ;memcpy(&DATARMNETdfd47b00ff[(0xd2d+202-0xdf7)],&DATARMNETbf55123e5b->
  47. DATARMNETc657c0a139[(0xd2d+202-0xdf7)],sizeof(DATARMNETbf55123e5b->
  48. DATARMNETc657c0a139));memcpy(&DATARMNETdfd47b00ff[(0xd0a+237-0xdf2)],&
  49. DATARMNETbf55123e5b->DATARMNET31202449fc[(0xd2d+202-0xdf7)],sizeof(
  50. DATARMNETbf55123e5b->DATARMNETc657c0a139));DATARMNETdfd47b00ff[(0xd35+210-0xdff)
  51. ]=DATARMNETbf55123e5b->DATARMNET7244bfdc4f;DATARMNETdfd47b00ff[9]=
  52. DATARMNETda7f7fa492;DATARMNETdfd47b00ff[(0xd27+224-0xdfd)]=DATARMNET08e913477e;
  53. DATARMNET5ebf661879=(0xd20+231-0xdfc);}return jhash2(DATARMNETdfd47b00ff,
  54. DATARMNET5ebf661879,(0xd2d+202-0xdf7));}static void DATARMNETe26a68d20e(u32
  55. DATARMNET5affe290b8){u32 DATARMNET2991ac9aa9;if(DATARMNET5affe290b8>50000)
  56. DATARMNET2991ac9aa9=DATARMNETa121404606;else if(DATARMNET5affe290b8>30000)
  57. DATARMNET2991ac9aa9=DATARMNET787b04223a;else if(DATARMNET5affe290b8>23000)
  58. DATARMNET2991ac9aa9=DATARMNET8e1480cff2;else if(DATARMNET5affe290b8>14500)
  59. DATARMNET2991ac9aa9=DATARMNETf335e26298;else if(DATARMNET5affe290b8>7000)
  60. DATARMNET2991ac9aa9=DATARMNET3067ea3199;else if(DATARMNET5affe290b8>
  61. (0x5b4+1875-0x78f))DATARMNET2991ac9aa9=DATARMNETa76d93355c;else
  62. DATARMNET2991ac9aa9=DATARMNET92f3434694;DATARMNETa00cda79d0(DATARMNET2991ac9aa9)
  63. ;}static bool DATARMNET1a7ed9a6a2(struct rmnet_frag_descriptor*
  64. DATARMNET9d1b321642,struct DATARMNETd812bcdbb5*DATARMNET458b70e7e5){u8*
  65. DATARMNETdf2dbc641f;u16 DATARMNET5affe290b8;u16 DATARMNETdaa9248df1;if(
  66. DATARMNET9d1b321642->hdrs_valid){DATARMNET458b70e7e5->DATARMNETaebe0581f2=
  67. DATARMNET9d1b321642->ip_proto;DATARMNET458b70e7e5->DATARMNETbecebb23ac=
  68. DATARMNET9d1b321642->ip_len;DATARMNET458b70e7e5->DATARMNET098910da0f=
  69. DATARMNET9d1b321642->trans_proto;DATARMNET458b70e7e5->DATARMNET0ab9b2ce3b=
  70. DATARMNET9d1b321642->trans_len;DATARMNET458b70e7e5->DATARMNET1469d7a840=(struct
  71. DATARMNET308c06fca6*)DATARMNET9d1b321642->hdr_ptr;DATARMNET458b70e7e5->
  72. DATARMNET96c6c71653=(struct DATARMNETd2991e8952*)(DATARMNET9d1b321642->hdr_ptr+
  73. DATARMNET9d1b321642->ip_len);DATARMNET458b70e7e5->DATARMNET645e8912b8=
  74. DATARMNETcb7325e02d(DATARMNET458b70e7e5);DATARMNET458b70e7e5->
  75. DATARMNET1ef22e4c76=skb_frag_size(&DATARMNET9d1b321642->frag);if(
  76. DATARMNET9d1b321642->hdr_ptr==rmnet_frag_data_ptr(DATARMNET9d1b321642))
  77. DATARMNET458b70e7e5->DATARMNET1ef22e4c76-=DATARMNET9d1b321642->ip_len+
  78. DATARMNET9d1b321642->trans_len;DATARMNET458b70e7e5->DATARMNET719f68fb88=
  79. DATARMNET9d1b321642;return false;}DATARMNETdf2dbc641f=rmnet_frag_data_ptr(
  80. DATARMNET9d1b321642);DATARMNET5affe290b8=skb_frag_size(&DATARMNET9d1b321642->
  81. frag);DATARMNET458b70e7e5->DATARMNET3eb91ee54d=true;DATARMNET458b70e7e5->
  82. DATARMNETaebe0581f2=(DATARMNETdf2dbc641f[(0xd2d+202-0xdf7)]&(0xbf7+4405-0x1c3c))
  83. >>(0xd11+230-0xdf3);if(DATARMNET458b70e7e5->DATARMNETaebe0581f2==
  84. (0xd11+230-0xdf3)){struct DATARMNET308c06fca6*DATARMNET86f1f2cdc9;
  85. DATARMNET86f1f2cdc9=(struct DATARMNET308c06fca6*)DATARMNETdf2dbc641f;
  86. DATARMNET458b70e7e5->DATARMNET1469d7a840=DATARMNET86f1f2cdc9;DATARMNET458b70e7e5
  87. ->DATARMNETbecebb23ac=DATARMNET86f1f2cdc9->DATARMNET610d06a887*(0xd11+230-0xdf3)
  88. ;DATARMNET458b70e7e5->DATARMNET098910da0f=DATARMNET86f1f2cdc9->
  89. DATARMNET953d32410f;if(DATARMNET86f1f2cdc9->DATARMNET2c091223da&htons(16383)){
  90. DATARMNETa00cda79d0(DATARMNET807e4dad18);goto DATARMNETaabe3a05f8;}
  91. DATARMNETdaa9248df1=ntohs(DATARMNET86f1f2cdc9->DATARMNET8e175ac02d);
  92. DATARMNET458b70e7e5->DATARMNET8f59f5a745=DATARMNETdaa9248df1!=
  93. DATARMNET5affe290b8;}else if(DATARMNET458b70e7e5->DATARMNETaebe0581f2==
  94. (0xd03+244-0xdf1)){struct DATARMNET64bb8f616e*DATARMNETbf55123e5b;int
  95. DATARMNET0549c61885;__be16 DATARMNET833503918f;u8 DATARMNET3f56a2bcf4;
  96. DATARMNETbf55123e5b=(struct DATARMNET64bb8f616e*)DATARMNETdf2dbc641f;
  97. DATARMNET458b70e7e5->DATARMNET5559b05582=DATARMNETbf55123e5b;DATARMNET3f56a2bcf4
  98. =DATARMNETbf55123e5b->DATARMNET7244bfdc4f;DATARMNET0549c61885=
  99. rmnet_frag_ipv6_skip_exthdr(DATARMNET9d1b321642,sizeof(*DATARMNETbf55123e5b),&
  100. DATARMNET3f56a2bcf4,&DATARMNET833503918f);if(DATARMNET0549c61885<
  101. (0xd2d+202-0xdf7)){goto DATARMNETaabe3a05f8;}DATARMNET458b70e7e5->
  102. DATARMNETbecebb23ac=(u16)DATARMNET0549c61885;DATARMNET458b70e7e5->
  103. DATARMNET098910da0f=DATARMNET3f56a2bcf4;if(DATARMNET833503918f){if(
  104. DATARMNET458b70e7e5->DATARMNET098910da0f==DATARMNET5b166167a8)
  105. DATARMNET458b70e7e5->DATARMNETbecebb23ac+=(0xd35+210-0xdff);DATARMNETa00cda79d0(
  106. DATARMNET807e4dad18);goto DATARMNETaabe3a05f8;}DATARMNETdaa9248df1=ntohs(
  107. DATARMNETbf55123e5b->DATARMNETaa340485c5)+sizeof(*DATARMNETbf55123e5b);
  108. DATARMNET458b70e7e5->DATARMNET8f59f5a745=DATARMNETdaa9248df1!=
  109. DATARMNET5affe290b8;}else{return true;}DATARMNETdf2dbc641f+=DATARMNET458b70e7e5
  110. ->DATARMNETbecebb23ac;if(DATARMNET458b70e7e5->DATARMNET098910da0f==
  111. DATARMNETfd5c3d30e5){struct DATARMNETd2991e8952*DATARMNET2e7cc88971;
  112. DATARMNET2e7cc88971=(struct DATARMNETd2991e8952*)DATARMNETdf2dbc641f;
  113. DATARMNET458b70e7e5->DATARMNET96c6c71653=DATARMNET2e7cc88971;DATARMNET458b70e7e5
  114. ->DATARMNET0ab9b2ce3b=DATARMNET2e7cc88971->DATARMNETcf2e43ad69*(0xd11+230-0xdf3)
  115. ;}else if(DATARMNET458b70e7e5->DATARMNET098910da0f==DATARMNETa656f324b2){struct
  116. DATARMNET0b82084e89*DATARMNET75be5f3406;DATARMNET75be5f3406=(struct
  117. DATARMNET0b82084e89*)DATARMNETdf2dbc641f;DATARMNET458b70e7e5->
  118. DATARMNET0da3c8035d=DATARMNET75be5f3406;DATARMNET458b70e7e5->DATARMNET0ab9b2ce3b
  119. =sizeof(*DATARMNET75be5f3406);}else{goto DATARMNETaabe3a05f8;}
  120. DATARMNET458b70e7e5->DATARMNET3eb91ee54d=false;DATARMNET458b70e7e5->
  121. DATARMNET645e8912b8=DATARMNETcb7325e02d(DATARMNET458b70e7e5);if(!
  122. DATARMNET458b70e7e5->DATARMNET8f59f5a745){DATARMNET9d1b321642->ip_proto=
  123. DATARMNET458b70e7e5->DATARMNETaebe0581f2;DATARMNET9d1b321642->ip_len=
  124. DATARMNET458b70e7e5->DATARMNETbecebb23ac;DATARMNET9d1b321642->trans_proto=
  125. DATARMNET458b70e7e5->DATARMNET098910da0f;DATARMNET9d1b321642->trans_len=
  126. DATARMNET458b70e7e5->DATARMNET0ab9b2ce3b;DATARMNET9d1b321642->hdrs_valid=
  127. (0xd26+209-0xdf6);}DATARMNETaabe3a05f8:DATARMNET458b70e7e5->DATARMNET1ef22e4c76=
  128. DATARMNET5affe290b8-DATARMNET458b70e7e5->DATARMNETbecebb23ac-DATARMNET458b70e7e5
  129. ->DATARMNET0ab9b2ce3b;if(DATARMNET458b70e7e5->DATARMNET8f59f5a745)
  130. DATARMNETa00cda79d0(DATARMNET52b7da9033);DATARMNET458b70e7e5->
  131. DATARMNET719f68fb88=DATARMNET9d1b321642;return false;}static void
  132. DATARMNET29e8d137c4(struct rmnet_frag_descriptor*DATARMNET9d1b321642,struct
  133. rmnet_port*DATARMNETf0d9de7e2f){struct DATARMNET70f3b87b5d*DATARMNETe05748b000=
  134. DATARMNETc2a630b113();struct DATARMNETd812bcdbb5 DATARMNET458b70e7e5;memset(&
  135. DATARMNET458b70e7e5,(0xd2d+202-0xdf7),sizeof(DATARMNET458b70e7e5));
  136. DATARMNET664568fcd0();DATARMNETe05748b000->DATARMNET403589239f=
  137. DATARMNETf0d9de7e2f;if(DATARMNET1a7ed9a6a2(DATARMNET9d1b321642,&
  138. DATARMNET458b70e7e5)){DATARMNETa00cda79d0(DATARMNET1cddffce49);
  139. rmnet_recycle_frag_descriptor(DATARMNET9d1b321642,DATARMNETf0d9de7e2f);goto
  140. DATARMNETbf4095f79e;}DATARMNETa00cda79d0(DATARMNET9b3fdb0e16);if(
  141. DATARMNET458b70e7e5.DATARMNET3eb91ee54d){goto DATARMNET806c6f8e60;}else if(
  142. DATARMNET458b70e7e5.DATARMNET8f59f5a745){DATARMNETc38c135c9f(DATARMNET458b70e7e5
  143. .DATARMNET645e8912b8);goto DATARMNET806c6f8e60;}if(!DATARMNET9d1b321642->
  144. csum_valid){goto DATARMNET806c6f8e60;}if(!DATARMNETfbf5798e15(&
  145. DATARMNET458b70e7e5))goto DATARMNET806c6f8e60;goto DATARMNETbf4095f79e;
  146. DATARMNET806c6f8e60:DATARMNET19d190f2bd(&DATARMNET458b70e7e5);
  147. DATARMNETbf4095f79e:DATARMNET6a76048590();}void DATARMNET664568fcd0(void){
  148. spin_lock_bh(&DATARMNET0b5e447f18);}void DATARMNET6a76048590(void){
  149. spin_unlock_bh(&DATARMNET0b5e447f18);}void DATARMNET818b960147(void){
  150. rcu_assign_pointer(rmnet_perf_desc_entry,DATARMNET29e8d137c4);}void
  151. DATARMNETba38823a2f(void){rcu_assign_pointer(rmnet_perf_desc_entry,NULL);}bool
  152. DATARMNET19eb0de3b2(void){void(*DATARMNET27ebcde4bf)(struct
  153. rmnet_frag_descriptor*DATARMNET9d1b321642,struct rmnet_port*DATARMNETf0d9de7e2f)
  154. ;rcu_read_lock();DATARMNET27ebcde4bf=rcu_dereference(rmnet_perf_desc_entry);
  155. rcu_read_unlock();return DATARMNET27ebcde4bf!=NULL;}void DATARMNET58a244b2fe(
  156. struct rmnet_frag_descriptor*DATARMNET9d1b321642,u32 DATARMNET0d47fb783d){struct
  157. DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();
  158. DATARMNETe26a68d20e(DATARMNET0d47fb783d);DATARMNETa00cda79d0(DATARMNET65843ad009
  159. );rmnet_frag_deliver(DATARMNET9d1b321642,DATARMNETe05748b000->
  160. DATARMNET403589239f);}void DATARMNET19d190f2bd(struct DATARMNETd812bcdbb5*
  161. DATARMNET458b70e7e5){struct rmnet_frag_descriptor*DATARMNET9d1b321642=
  162. DATARMNET458b70e7e5->DATARMNET719f68fb88;u32 DATARMNET5affe290b8=
  163. DATARMNET458b70e7e5->DATARMNET1ef22e4c76+DATARMNET458b70e7e5->
  164. DATARMNETbecebb23ac+DATARMNET458b70e7e5->DATARMNET0ab9b2ce3b;if(
  165. DATARMNET5affe290b8>65536)return;if(!DATARMNET458b70e7e5->DATARMNET3eb91ee54d)
  166. DATARMNET9d1b321642->hash=DATARMNET458b70e7e5->DATARMNET645e8912b8;
  167. DATARMNET58a244b2fe(DATARMNET9d1b321642,DATARMNET5affe290b8);}void
  168. DATARMNET9292bebdd3(void*DATARMNETf0d9de7e2f){(void)DATARMNETf0d9de7e2f;
  169. DATARMNETd4230b6bfe();}void DATARMNETb7e47d7254(void*DATARMNETf0d9de7e2f){struct
  170. DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();(void)
  171. DATARMNETf0d9de7e2f;if(DATARMNETe05748b000->DATARMNETa9f2b2f677.
  172. DATARMNETc2832b8f85)DATARMNET560e127137();}void DATARMNET95e1703026(struct
  173. rmnet_map_dl_ind_hdr*DATARMNET7c7748ef7a,struct rmnet_map_control_command_header
  174. *DATARMNET8b07ee3e82){struct DATARMNET70f3b87b5d*DATARMNETe05748b000=
  175. DATARMNETc2a630b113();(void)DATARMNET8b07ee3e82;if(DATARMNETe05748b000->
  176. DATARMNETa9f2b2f677.DATARMNETb165d2c5c4&&DATARMNETae70636c90())
  177. DATARMNETa00cda79d0(DATARMNET372ef39ae4);DATARMNETe05748b000->
  178. DATARMNETa9f2b2f677.DATARMNETb165d2c5c4=true;DATARMNETe05748b000->
  179. DATARMNETa9f2b2f677.DATARMNETe2251ce433=DATARMNET7c7748ef7a->le.seq;
  180. DATARMNETe05748b000->DATARMNETa9f2b2f677.DATARMNET7f59b108db=DATARMNET7c7748ef7a
  181. ->le.pkts;}void DATARMNETc9dd320f49(struct rmnet_map_dl_ind_trl*
  182. DATARMNET2541770fea,struct rmnet_map_control_command_header*DATARMNET8b07ee3e82)
  183. {struct DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();(void)
  184. DATARMNET8b07ee3e82;if(DATARMNETe05748b000->DATARMNETa9f2b2f677.
  185. DATARMNETe2251ce433!=DATARMNET2541770fea->seq_le)DATARMNETa00cda79d0(
  186. DATARMNET30a4d88ea6);if(DATARMNETae70636c90())DATARMNETa00cda79d0(
  187. DATARMNETa03ed3629e);DATARMNETe05748b000->DATARMNETa9f2b2f677.
  188. DATARMNETb165d2c5c4=false;DATARMNETe05748b000->DATARMNETa9f2b2f677.
  189. DATARMNETe2251ce433=(0xd2d+202-0xdf7);DATARMNETe05748b000->DATARMNETa9f2b2f677.
  190. DATARMNET7f59b108db=(0xd2d+202-0xdf7);}