rmnet_offload_main.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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*DATARMNET9a36480134[]__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. ,};static DEFINE_SPINLOCK(DATARMNET56235f0bb4);static u32 DATARMNETf6597f07e9(
  26. struct DATARMNETadd6ff90d0*DATARMNET809d788099){__be32 DATARMNET51e56c6582[
  27. (0x5b9+1700-0xc52)];u32 DATARMNETb65409e3b5;__be16 DATARMNETe048999b85=
  28. (0xb0c+7037-0x2689),DATARMNET6b15e99cb9=(0x6dc+1549-0xce9);if(
  29. DATARMNET809d788099->DATARMNET072708db10==DATARMNETb02d95e937||
  30. DATARMNET809d788099->DATARMNET072708db10==DATARMNET70889e5696){struct
  31. DATARMNET2d87db499d*DATARMNET5829e80183=DATARMNET809d788099->DATARMNETc51cdf696b
  32. ;DATARMNETe048999b85=DATARMNET5829e80183->DATARMNETaad9b0a864;
  33. DATARMNET6b15e99cb9=DATARMNET5829e80183->DATARMNETd751c12d13;}if(
  34. DATARMNET809d788099->DATARMNET9f5b2909c8==(0x10f3+703-0x13ae)){struct
  35. DATARMNETf61a39bce9*DATARMNETf7a5ea0c29=DATARMNET809d788099->DATARMNET574a565f78
  36. ;DATARMNET51e56c6582[(0x167b+1973-0x1e30)]=DATARMNETf7a5ea0c29->
  37. DATARMNET799b2a47a5;DATARMNET51e56c6582[(0xcb3+6554-0x264c)]=DATARMNETf7a5ea0c29
  38. ->DATARMNET7c6ed51964;DATARMNET51e56c6582[(0x1c51+2147-0x24b2)]=
  39. DATARMNETf7a5ea0c29->DATARMNET065f40367c;DATARMNET51e56c6582[
  40. (0x1092+2502-0x1a55)]=DATARMNET6b15e99cb9;DATARMNET51e56c6582[
  41. (0x1300+1818-0x1a16)]=DATARMNETe048999b85;DATARMNETb65409e3b5=
  42. (0x1ac+8562-0x2319);}else{struct DATARMNETfab66e680d*DATARMNET6bd3c60da4=
  43. DATARMNET809d788099->DATARMNET1dab0af728;memcpy(&DATARMNET51e56c6582[
  44. (0x11d+5240-0x1595)],&DATARMNET6bd3c60da4->DATARMNET818f335f71[
  45. (0x8dd+4882-0x1bef)],sizeof(DATARMNET6bd3c60da4->DATARMNET818f335f71));memcpy(&
  46. DATARMNET51e56c6582[(0xbbd+5094-0x1f9e)],&DATARMNET6bd3c60da4->
  47. DATARMNET0f6f3a8868[(0x2fb+6889-0x1de4)],sizeof(DATARMNET6bd3c60da4->
  48. DATARMNET818f335f71));DATARMNET51e56c6582[(0x1438+742-0x1716)]=
  49. DATARMNET6bd3c60da4->DATARMNETa2be9ad0de;DATARMNET51e56c6582[(0x411+5381-0x190d)
  50. ]=DATARMNET6b15e99cb9;DATARMNET51e56c6582[(0x1e1+3364-0xefb)]=
  51. DATARMNETe048999b85;DATARMNETb65409e3b5=(0x59b+5231-0x19ff);}return jhash2(
  52. DATARMNET51e56c6582,DATARMNETb65409e3b5,(0xeea+3831-0x1de1));}static void
  53. DATARMNETee281dc788(u32 DATARMNET0eb96739bf){u32 DATARMNETc7bc65a2a5;if(
  54. DATARMNET0eb96739bf>50000)DATARMNETc7bc65a2a5=DATARMNETd096b7b9cd;else if(
  55. DATARMNET0eb96739bf>30000)DATARMNETc7bc65a2a5=DATARMNET1e2ecb33d1;else if(
  56. DATARMNET0eb96739bf>23000)DATARMNETc7bc65a2a5=DATARMNET3b1a812e5c;else if(
  57. DATARMNET0eb96739bf>14500)DATARMNETc7bc65a2a5=DATARMNET64bf04bc47;else if(
  58. DATARMNET0eb96739bf>(0x22ed+7824-0x2625))DATARMNETc7bc65a2a5=DATARMNET7069e38e48
  59. ;else if(DATARMNET0eb96739bf>(0x1fd3+2486-0x2411))DATARMNETc7bc65a2a5=
  60. DATARMNETc005f7933f;else DATARMNETc7bc65a2a5=DATARMNET2eb3321438;
  61. DATARMNET5d24865423(DATARMNETc7bc65a2a5);}static bool DATARMNET00b745f472(struct
  62. rmnet_frag_descriptor*DATARMNETa41162aa9b,struct DATARMNETadd6ff90d0*
  63. DATARMNET809d788099){u8*DATARMNET218e3007fa;u16 DATARMNET0eb96739bf;u16
  64. DATARMNET0d3dcef7b0;if(DATARMNETa41162aa9b->hdrs_valid){DATARMNET809d788099->
  65. DATARMNET9f5b2909c8=DATARMNETa41162aa9b->ip_proto;DATARMNET809d788099->
  66. DATARMNETa7eaea0d00=DATARMNETa41162aa9b->ip_len;DATARMNET809d788099->
  67. DATARMNET072708db10=DATARMNETa41162aa9b->trans_proto;DATARMNET809d788099->
  68. DATARMNETfeb7c81ac7=DATARMNETa41162aa9b->trans_len;DATARMNET809d788099->
  69. DATARMNET574a565f78=(struct DATARMNETf61a39bce9*)DATARMNETa41162aa9b->hdr_ptr;
  70. DATARMNET809d788099->DATARMNET7ff34eacb7=(struct DATARMNET1bffb1c388*)(
  71. DATARMNETa41162aa9b->hdr_ptr+DATARMNETa41162aa9b->ip_len);DATARMNET809d788099->
  72. DATARMNET68ad0738e2=DATARMNETf6597f07e9(DATARMNET809d788099);DATARMNET809d788099
  73. ->DATARMNET5671455f38=skb_frag_size(&DATARMNETa41162aa9b->frag);if(
  74. DATARMNETa41162aa9b->hdr_ptr==rmnet_frag_data_ptr(DATARMNETa41162aa9b))
  75. DATARMNET809d788099->DATARMNET5671455f38-=DATARMNETa41162aa9b->ip_len+
  76. DATARMNETa41162aa9b->trans_len;DATARMNET809d788099->DATARMNET798fafaf36=
  77. DATARMNETa41162aa9b;return false;}DATARMNET218e3007fa=rmnet_frag_data_ptr(
  78. DATARMNETa41162aa9b);DATARMNET0eb96739bf=skb_frag_size(&DATARMNETa41162aa9b->
  79. frag);DATARMNET809d788099->DATARMNET2f3cb41448=true;DATARMNET809d788099->
  80. DATARMNET9f5b2909c8=(DATARMNET218e3007fa[(0x2a+5400-0x1542)]&
  81. (0x1881+3821-0x267e))>>(0x16d+792-0x481);if(DATARMNET809d788099->
  82. DATARMNET9f5b2909c8==(0x73a+2289-0x1027)){struct DATARMNETf61a39bce9*
  83. DATARMNETf7a5ea0c29;DATARMNETf7a5ea0c29=(struct DATARMNETf61a39bce9*)
  84. DATARMNET218e3007fa;DATARMNET809d788099->DATARMNET574a565f78=DATARMNETf7a5ea0c29
  85. ;DATARMNET809d788099->DATARMNETa7eaea0d00=DATARMNETf7a5ea0c29->
  86. DATARMNET422c25939d*(0x1235+3369-0x1f5a);DATARMNET809d788099->
  87. DATARMNET072708db10=DATARMNETf7a5ea0c29->DATARMNET065f40367c;if(
  88. DATARMNETf7a5ea0c29->DATARMNETa803e4f68b&htons(16383)){DATARMNET5d24865423(
  89. DATARMNET433e163a43);goto DATARMNET02a8afcd23;}DATARMNET0d3dcef7b0=ntohs(
  90. DATARMNETf7a5ea0c29->DATARMNETefd12e7a2b);DATARMNET809d788099->
  91. DATARMNET6cc77c7b3f=DATARMNET0d3dcef7b0!=DATARMNET0eb96739bf;}else if(
  92. DATARMNET809d788099->DATARMNET9f5b2909c8==(0x79a+292-0x8b8)){struct
  93. DATARMNETfab66e680d*DATARMNET6bd3c60da4;int DATARMNET5fc606c6dc;__be16
  94. DATARMNETe95a0a73b9;u8 DATARMNETcb5c3d9e39;DATARMNET6bd3c60da4=(struct
  95. DATARMNETfab66e680d*)DATARMNET218e3007fa;DATARMNET809d788099->
  96. DATARMNET1dab0af728=DATARMNET6bd3c60da4;DATARMNETcb5c3d9e39=DATARMNET6bd3c60da4
  97. ->DATARMNETa2be9ad0de;DATARMNET5fc606c6dc=rmnet_frag_ipv6_skip_exthdr(
  98. DATARMNETa41162aa9b,sizeof(*DATARMNET6bd3c60da4),&DATARMNETcb5c3d9e39,&
  99. DATARMNETe95a0a73b9);if(DATARMNET5fc606c6dc<(0x13d7+456-0x159f)){goto
  100. DATARMNET02a8afcd23;}DATARMNET809d788099->DATARMNETa7eaea0d00=(u16)
  101. DATARMNET5fc606c6dc;DATARMNET809d788099->DATARMNET072708db10=DATARMNETcb5c3d9e39
  102. ;if(DATARMNETe95a0a73b9){if(DATARMNET809d788099->DATARMNET072708db10==
  103. DATARMNET75cddb74df)DATARMNET809d788099->DATARMNETa7eaea0d00+=
  104. (0xc6f+3338-0x1971);DATARMNET5d24865423(DATARMNET433e163a43);goto
  105. DATARMNET02a8afcd23;}DATARMNET0d3dcef7b0=ntohs(DATARMNET6bd3c60da4->
  106. DATARMNET5aeba29b95)+sizeof(*DATARMNET6bd3c60da4);DATARMNET809d788099->
  107. DATARMNET6cc77c7b3f=DATARMNET0d3dcef7b0!=DATARMNET0eb96739bf;}else{return true;}
  108. DATARMNET218e3007fa+=DATARMNET809d788099->DATARMNETa7eaea0d00;if(
  109. DATARMNET809d788099->DATARMNET072708db10==DATARMNET70889e5696){struct
  110. DATARMNET1bffb1c388*DATARMNETbd1c0986f8;DATARMNETbd1c0986f8=(struct
  111. DATARMNET1bffb1c388*)DATARMNET218e3007fa;DATARMNET809d788099->
  112. DATARMNET7ff34eacb7=DATARMNETbd1c0986f8;DATARMNET809d788099->DATARMNETfeb7c81ac7
  113. =DATARMNETbd1c0986f8->DATARMNET686636af95*(0xcb9+267-0xdc0);}else if(
  114. DATARMNET809d788099->DATARMNET072708db10==DATARMNETb02d95e937){struct
  115. DATARMNET2d87db499d*DATARMNET5829e80183;DATARMNET5829e80183=(struct
  116. DATARMNET2d87db499d*)DATARMNET218e3007fa;DATARMNET809d788099->
  117. DATARMNETc51cdf696b=DATARMNET5829e80183;DATARMNET809d788099->DATARMNETfeb7c81ac7
  118. =sizeof(*DATARMNET5829e80183);}else{goto DATARMNET02a8afcd23;}
  119. DATARMNET809d788099->DATARMNET2f3cb41448=false;DATARMNET809d788099->
  120. DATARMNET68ad0738e2=DATARMNETf6597f07e9(DATARMNET809d788099);if(!
  121. DATARMNET809d788099->DATARMNET6cc77c7b3f){DATARMNETa41162aa9b->ip_proto=
  122. DATARMNET809d788099->DATARMNET9f5b2909c8;DATARMNETa41162aa9b->ip_len=
  123. DATARMNET809d788099->DATARMNETa7eaea0d00;DATARMNETa41162aa9b->trans_proto=
  124. DATARMNET809d788099->DATARMNET072708db10;DATARMNETa41162aa9b->trans_len=
  125. DATARMNET809d788099->DATARMNETfeb7c81ac7;DATARMNETa41162aa9b->hdrs_valid=
  126. (0x9a3+3898-0x18dc);}DATARMNET02a8afcd23:DATARMNET809d788099->
  127. DATARMNET5671455f38=DATARMNET0eb96739bf-DATARMNET809d788099->DATARMNETa7eaea0d00
  128. -DATARMNET809d788099->DATARMNETfeb7c81ac7;if(DATARMNET809d788099->
  129. DATARMNET6cc77c7b3f)DATARMNET5d24865423(DATARMNETf4e67e1692);DATARMNET809d788099
  130. ->DATARMNET798fafaf36=DATARMNETa41162aa9b;return false;}static void
  131. DATARMNET5eaded9c32(struct rmnet_frag_descriptor*DATARMNETa41162aa9b,struct
  132. rmnet_port*DATARMNETe8a5f322f0){struct DATARMNET8357daf015*DATARMNETf7e8f6395c=
  133. DATARMNETccc25794e0();struct DATARMNETadd6ff90d0 DATARMNET809d788099;memset(&
  134. DATARMNET809d788099,(0x1b23+1630-0x2181),sizeof(DATARMNET809d788099));
  135. DATARMNET8f8c3a4cc3();DATARMNETf7e8f6395c->DATARMNET547651077b=
  136. DATARMNETe8a5f322f0;if(DATARMNET00b745f472(DATARMNETa41162aa9b,&
  137. DATARMNET809d788099)){DATARMNET5d24865423(DATARMNET056a0fe195);
  138. rmnet_recycle_frag_descriptor(DATARMNETa41162aa9b,DATARMNETe8a5f322f0);goto
  139. DATARMNETe1f307999b;}DATARMNET5d24865423(DATARMNET18d408a5a5);if(
  140. DATARMNET809d788099.DATARMNET2f3cb41448){goto DATARMNET52a3ca33f8;}else if(
  141. DATARMNET809d788099.DATARMNET6cc77c7b3f){DATARMNET8b657e07e9(DATARMNET809d788099
  142. .DATARMNET68ad0738e2);goto DATARMNET52a3ca33f8;}if(!DATARMNETa41162aa9b->
  143. csum_valid){goto DATARMNET52a3ca33f8;}if(!DATARMNET9b8a1a69f3(&
  144. DATARMNET809d788099))goto DATARMNET52a3ca33f8;goto DATARMNETe1f307999b;
  145. DATARMNET52a3ca33f8:DATARMNETf9d626d72b(&DATARMNET809d788099);
  146. DATARMNETe1f307999b:DATARMNET4c69e80b6f();}void DATARMNET8f8c3a4cc3(void){
  147. spin_lock_bh(&DATARMNET56235f0bb4);}void DATARMNET4c69e80b6f(void){
  148. spin_unlock_bh(&DATARMNET56235f0bb4);}void DATARMNETd9ec5f4e65(void){
  149. rcu_assign_pointer(rmnet_perf_desc_entry,DATARMNET5eaded9c32);}void
  150. DATARMNET848914898b(void){rcu_assign_pointer(rmnet_perf_desc_entry,NULL);}bool
  151. DATARMNET4e490d9d37(void){void(*DATARMNETb4f3500b6d)(struct
  152. rmnet_frag_descriptor*DATARMNETa41162aa9b,struct rmnet_port*DATARMNETe8a5f322f0)
  153. ;rcu_read_lock();DATARMNETb4f3500b6d=rcu_dereference(rmnet_perf_desc_entry);
  154. rcu_read_unlock();return DATARMNETb4f3500b6d!=NULL;}void DATARMNET654b85a739(
  155. struct rmnet_frag_descriptor*DATARMNETa41162aa9b,u32 DATARMNET30fde83b85){struct
  156. DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();
  157. DATARMNETee281dc788(DATARMNET30fde83b85);DATARMNET5d24865423(DATARMNET6b8a6c4f4e
  158. );rmnet_frag_deliver(DATARMNETa41162aa9b,DATARMNETf7e8f6395c->
  159. DATARMNET547651077b);}void DATARMNETf9d626d72b(struct DATARMNETadd6ff90d0*
  160. DATARMNET809d788099){struct rmnet_frag_descriptor*DATARMNETa41162aa9b=
  161. DATARMNET809d788099->DATARMNET798fafaf36;u32 DATARMNET0eb96739bf=
  162. DATARMNET809d788099->DATARMNET5671455f38+DATARMNET809d788099->
  163. DATARMNETa7eaea0d00+DATARMNET809d788099->DATARMNETfeb7c81ac7;if(
  164. DATARMNET0eb96739bf>65536)return;if(!DATARMNET809d788099->DATARMNET2f3cb41448)
  165. DATARMNETa41162aa9b->hash=DATARMNET809d788099->DATARMNET68ad0738e2;
  166. DATARMNET654b85a739(DATARMNETa41162aa9b,DATARMNET0eb96739bf);}void
  167. DATARMNETfaa320a86a(void*DATARMNETe8a5f322f0){(void)DATARMNETe8a5f322f0;
  168. DATARMNETafcdd1146f();}void DATARMNET6b57fa3471(void*DATARMNETe8a5f322f0){struct
  169. DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();(void)
  170. DATARMNETe8a5f322f0;if(DATARMNETf7e8f6395c->DATARMNETfe5583a585.
  171. DATARMNETf82a9c29ed)DATARMNET28dfa538f2();}void DATARMNET4aefca6d3c(struct
  172. rmnet_map_dl_ind_hdr*DATARMNETf3449c6d59,struct rmnet_map_control_command_header
  173. *DATARMNET23a4adcff8){struct DATARMNET8357daf015*DATARMNETf7e8f6395c=
  174. DATARMNETccc25794e0();(void)DATARMNET23a4adcff8;if(DATARMNETf7e8f6395c->
  175. DATARMNETfe5583a585.DATARMNETecff29bcbf&&DATARMNET54fd6bf483())
  176. DATARMNET5d24865423(DATARMNET51527f883c);DATARMNETf7e8f6395c->
  177. DATARMNETfe5583a585.DATARMNETecff29bcbf=true;DATARMNETf7e8f6395c->
  178. DATARMNETfe5583a585.DATARMNET26e013d9f7=DATARMNETf3449c6d59->le.seq;
  179. DATARMNETf7e8f6395c->DATARMNETfe5583a585.DATARMNETdd6feb57a5=DATARMNETf3449c6d59
  180. ->le.pkts;}void DATARMNET94edfae28d(struct rmnet_map_dl_ind_trl*
  181. DATARMNET0303d63d24,struct rmnet_map_control_command_header*DATARMNET23a4adcff8)
  182. {struct DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();(void)
  183. DATARMNET23a4adcff8;if(DATARMNETf7e8f6395c->DATARMNETfe5583a585.
  184. DATARMNET26e013d9f7!=DATARMNET0303d63d24->seq_le)DATARMNET5d24865423(
  185. DATARMNETae9ed9e102);if(DATARMNET54fd6bf483())DATARMNET5d24865423(
  186. DATARMNET3f56a10f4d);DATARMNETf7e8f6395c->DATARMNETfe5583a585.
  187. DATARMNETecff29bcbf=false;DATARMNETf7e8f6395c->DATARMNETfe5583a585.
  188. DATARMNET26e013d9f7=(0x1dfd+911-0x218c);DATARMNETf7e8f6395c->DATARMNETfe5583a585
  189. .DATARMNETdd6feb57a5=(0x2bb+6482-0x1c0d);}