rmnet_wlan_connection.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2021, The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * RMNET WLAN connection management framework
  6. *
  7. */
  8. #include <linux/types.h>
  9. #include <linux/skbuff.h>
  10. #include <linux/netdevice.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/rcupdate.h>
  13. #include <linux/hashtable.h>
  14. #include <linux/if_ether.h>
  15. #include <linux/hrtimer.h>
  16. #include <net/ip.h>
  17. #include <net/ipv6.h>
  18. #include <net/dst.h>
  19. #include <net/netfilter/nf_conntrack.h>
  20. #include "rmnet_module.h"
  21. #include "rmnet_wlan.h"
  22. #include "rmnet_wlan_connection.h"
  23. #include "rmnet_wlan_stats.h"
  24. #define DATARMNET5da8c68c19 (2000000000)
  25. #define DATARMNET8fc07fbb24 ((0xeb7+1158-0x132d))
  26. #define DATARMNETeaf0945284 \
  27. (const_ilog2(DATARMNET8fc07fbb24))
  28. extern void(*rmnet_wlan_ll_tuple_hook)(struct sk_buff*DATARMNET543491eb0f);
  29. struct DATARMNET4f49486833{struct hlist_node DATARMNETe8608dd267;struct rcu_head
  30. DATARMNET28bfe9e6ad;struct hrtimer DATARMNET9f31ce5d2d;struct
  31. DATARMNET0ca9d8ead7 DATARMNET54338da2ff;struct DATARMNET8d3c2559ca
  32. DATARMNET7ed5754a5c;};static DEFINE_SPINLOCK(DATARMNET820642743b);static
  33. DEFINE_HASHTABLE(DATARMNET5413d6f8ec,DATARMNETeaf0945284);
  34. #define DATARMNET898fc3651c (0xef7+694-0x112d)
  35. #define DATARMNET20defbe7a0 (0xf07+3965-0x1a3c)
  36. static bool DATARMNET5f3c9ed4da(struct DATARMNET0ca9d8ead7*DATARMNET75decd6f60,
  37. struct DATARMNET0ca9d8ead7*DATARMNET6745cad668){if(DATARMNET75decd6f60->
  38. DATARMNET0d956cc77a!=DATARMNET6745cad668->DATARMNET0d956cc77a)return false;if(
  39. DATARMNET75decd6f60->DATARMNET0d956cc77a==(0xd11+230-0xdf3))return
  40. DATARMNET75decd6f60->DATARMNETdfe430c2d6==DATARMNET6745cad668->
  41. DATARMNETdfe430c2d6&&DATARMNET75decd6f60->DATARMNET2cb607d686==
  42. DATARMNET6745cad668->DATARMNET2cb607d686;return!ipv6_addr_cmp(&
  43. DATARMNET75decd6f60->DATARMNET815cbb4bf5,&DATARMNET6745cad668->
  44. DATARMNET815cbb4bf5)&&!ipv6_addr_cmp(&DATARMNET75decd6f60->DATARMNETc3f31215b7,&
  45. DATARMNET6745cad668->DATARMNETc3f31215b7);}static enum hrtimer_restart
  46. DATARMNET299a8a08b5(struct hrtimer*DATARMNET6e4292679f){struct
  47. DATARMNET4f49486833*DATARMNET63b1a086d5;unsigned long DATARMNETfb0677cc3c;
  48. spin_lock_irqsave(&DATARMNET820642743b,DATARMNETfb0677cc3c);DATARMNET63b1a086d5=
  49. container_of(DATARMNET6e4292679f,struct DATARMNET4f49486833,DATARMNET9f31ce5d2d)
  50. ;hash_del_rcu(&DATARMNET63b1a086d5->DATARMNETe8608dd267);kfree_rcu(
  51. DATARMNET63b1a086d5,DATARMNET28bfe9e6ad);spin_unlock_irqrestore(&
  52. DATARMNET820642743b,DATARMNETfb0677cc3c);return HRTIMER_NORESTART;}static
  53. rx_handler_result_t DATARMNETc9ed97754a(struct sk_buff*DATARMNET543491eb0f,
  54. uint8_t DATARMNET1a901c3d09){if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->
  55. protocol==htons(ETH_P_IP))&&DATARMNET1a901c3d09==DATARMNET9bfbc31cd6){struct
  56. iphdr*DATARMNET86f1f2cdc9,DATARMNETbf6548198e;struct net_device*
  57. DATARMNET813ca18d06=NULL;struct flowi4 DATARMNET099aa93adc={};struct rtable*
  58. DATARMNET066b8bd537;struct neighbour*DATARMNET3f85732c70;int DATARMNET268a8314cf
  59. =(0xd2d+202-0xdf7);DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,
  60. (0xd2d+202-0xdf7),sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!
  61. DATARMNET86f1f2cdc9){DATARMNET17f6bc1be5(DATARMNET15454f969d);goto
  62. DATARMNETc1174a0f45;}DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,
  63. DATARMNET934406764d());if(!DATARMNET813ca18d06){DATARMNET17f6bc1be5(
  64. DATARMNETfa4b3dd44a);goto DATARMNETc1174a0f45;}DATARMNET543491eb0f->dev=
  65. DATARMNET813ca18d06;memcpy(&DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->
  66. saddr,sizeof(__be32));memcpy(&DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->
  67. daddr,sizeof(__be32));DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->
  68. ifindex;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537
  69. =ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  70. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET72ab5e86d8);goto
  71. DATARMNETc1174a0f45;}DATARMNET3f85732c70=dst_neigh_lookup(&DATARMNET066b8bd537->
  72. dst,&DATARMNET099aa93adc.daddr);ip_rt_put(DATARMNET066b8bd537);if(!
  73. DATARMNET3f85732c70){DATARMNET17f6bc1be5(DATARMNET0e6bd55b8b);goto
  74. DATARMNETc1174a0f45;}if(DATARMNET3f85732c70->dev!=DATARMNET543491eb0f->dev||!
  75. DATARMNET3f85732c70->dev->header_ops){DATARMNET17f6bc1be5(DATARMNET64aecaa865);
  76. neigh_release(DATARMNET3f85732c70);goto DATARMNETc1174a0f45;}DATARMNET268a8314cf
  77. =neigh_resolve_output(DATARMNET3f85732c70,DATARMNET543491eb0f);neigh_release(
  78. DATARMNET3f85732c70);if(likely(DATARMNET268a8314cf==NET_XMIT_SUCCESS||
  79. DATARMNET268a8314cf==NET_XMIT_CN)){DATARMNET17f6bc1be5(DATARMNETc1b437465b);}
  80. else{DATARMNET17f6bc1be5(DATARMNET43a65c0be7);}return RX_HANDLER_CONSUMED;}else
  81. if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))
  82. &&DATARMNET1a901c3d09==DATARMNET9bfbc31cd6){struct ipv6hdr*DATARMNETbf55123e5b,
  83. DATARMNETcf1d9e2c1e;struct net_device*DATARMNET813ca18d06=NULL;struct flowi6
  84. DATARMNET8fbe36a2fa={};struct neighbour*DATARMNET3f85732c70;struct dst_entry*dst
  85. ;int DATARMNET268a8314cf=(0xd2d+202-0xdf7);DATARMNETbf55123e5b=
  86. skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*
  87. DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){
  88. DATARMNET17f6bc1be5(DATARMNET72f4fdd48a);goto DATARMNETc1174a0f45;}
  89. DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNET934406764d());if(!
  90. DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNET9cff15f94d);goto
  91. DATARMNETc1174a0f45;}DATARMNET543491eb0f->dev=DATARMNET813ca18d06;memcpy(&
  92. DATARMNET8fbe36a2fa.saddr,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));
  93. memcpy(&DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct
  94. in6_addr));DATARMNET8fbe36a2fa.flowi6_oif=DATARMNET813ca18d06->ifindex;
  95. DATARMNET8fbe36a2fa.flowi6_flags=FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->
  96. ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){
  97. DATARMNET17f6bc1be5(DATARMNETbf6e6853f9);goto DATARMNETc1174a0f45;}
  98. DATARMNET3f85732c70=dst_neigh_lookup(dst,&DATARMNET8fbe36a2fa.daddr);dst_release
  99. (dst);if(!DATARMNET3f85732c70){DATARMNET17f6bc1be5(DATARMNETa0da722329);goto
  100. DATARMNETc1174a0f45;}if(DATARMNET3f85732c70->dev!=DATARMNET543491eb0f->dev||!
  101. DATARMNET3f85732c70->dev->header_ops){DATARMNET17f6bc1be5(DATARMNET729e252fb9);
  102. neigh_release(DATARMNET3f85732c70);goto DATARMNETc1174a0f45;}DATARMNET268a8314cf
  103. =neigh_resolve_output(DATARMNET3f85732c70,DATARMNET543491eb0f);neigh_release(
  104. DATARMNET3f85732c70);if(likely(DATARMNET268a8314cf==NET_XMIT_SUCCESS||
  105. DATARMNET268a8314cf==NET_XMIT_CN)){DATARMNET17f6bc1be5(DATARMNET04311361a2);}
  106. else{DATARMNET17f6bc1be5(DATARMNET13bbe5f5c5);}return RX_HANDLER_CONSUMED;}else
  107. if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&
  108. DATARMNET1a901c3d09==DATARMNET45ee632553){struct iphdr*DATARMNET86f1f2cdc9,
  109. DATARMNETbf6548198e;struct net_device*DATARMNET813ca18d06=NULL;struct flowi4
  110. DATARMNET099aa93adc={};struct dst_entry*DATARMNETb5af46179c;struct rtable*
  111. DATARMNET066b8bd537;struct net_device*DATARMNET39542b437e=NULL;
  112. DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  113. sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){
  114. DATARMNET17f6bc1be5(DATARMNET7803c877c0);goto DATARMNETc1174a0f45;}
  115. DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNETe447822105());if(!
  116. DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNET0978ff973f);goto
  117. DATARMNETc1174a0f45;}memcpy(&DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->
  118. daddr,sizeof(__be32));DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->
  119. ifindex;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537
  120. =ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  121. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET666fc9a664);
  122. DATARMNET39542b437e=dev_get_by_name_rcu(&init_net,"dummy0");if(!
  123. DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET521b065310);goto
  124. DATARMNETc1174a0f45;}DATARMNET099aa93adc.flowi4_oif=DATARMNET39542b437e->ifindex
  125. ;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=
  126. ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  127. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET8a15bcdcc7);goto
  128. DATARMNETc1174a0f45;}}memcpy(&DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->
  129. saddr,sizeof(__be32));DATARMNETb5af46179c=xfrm_lookup(&init_net,&
  130. DATARMNET066b8bd537->dst,flowi4_to_flowi(&DATARMNET099aa93adc),NULL,
  131. (0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*)DATARMNETb5af46179c;if(
  132. IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNETddb1bc27cb);goto
  133. DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,DATARMNETb5af46179c);
  134. dst_output(&init_net,NULL,DATARMNET543491eb0f);DATARMNET17f6bc1be5(
  135. DATARMNETc730640bf7);return RX_HANDLER_CONSUMED;}else if(DATARMNET543491eb0f->
  136. dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))&&DATARMNET1a901c3d09==
  137. DATARMNET45ee632553){struct ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;
  138. struct flowi6 DATARMNET8fbe36a2fa={};struct dst_entry*dst=NULL,*
  139. DATARMNETb5af46179c;struct rtable*DATARMNET066b8bd537;struct net_device*
  140. DATARMNET39542b437e=NULL;DATARMNETbf55123e5b=skb_header_pointer(
  141. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
  142. DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){DATARMNET17f6bc1be5(
  143. DATARMNET0b9541c9b3);goto DATARMNETc1174a0f45;}memcpy(&DATARMNET8fbe36a2fa.saddr
  144. ,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));memcpy(&
  145. DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct in6_addr));
  146. dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if
  147. (IS_ERR(dst)){DATARMNET17f6bc1be5(DATARMNET0078f1d36d);DATARMNET39542b437e=
  148. dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if(!
  149. DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET7c6c30b7d2);goto
  150. DATARMNETc1174a0f45;}DATARMNET8fbe36a2fa.flowi6_oif=DATARMNET39542b437e->ifindex
  151. ;DATARMNET8fbe36a2fa.flowi6_flags=FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->
  152. ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){
  153. DATARMNET17f6bc1be5(DATARMNET39d80cc483);goto DATARMNETc1174a0f45;}}
  154. DATARMNETb5af46179c=xfrm_lookup(&init_net,dst,flowi6_to_flowi(&
  155. DATARMNET8fbe36a2fa),NULL,(0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*
  156. )DATARMNETb5af46179c;if(IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(
  157. DATARMNET661bdeccd4);goto DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,
  158. DATARMNETb5af46179c);dst_output(&init_net,NULL,DATARMNET543491eb0f);
  159. DATARMNET17f6bc1be5(DATARMNET28e7704d13);return RX_HANDLER_CONSUMED;}else if(
  160. DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&
  161. DATARMNET1a901c3d09==DATARMNET356f2a237e){struct iphdr*DATARMNET86f1f2cdc9,
  162. DATARMNETbf6548198e;struct flowi4 DATARMNET099aa93adc={};struct net_device*
  163. DATARMNET813ca18d06=NULL;struct dst_entry*DATARMNETb5af46179c;struct net_device*
  164. DATARMNET39542b437e=NULL;struct rtable*DATARMNET066b8bd537;DATARMNET86f1f2cdc9=
  165. skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*
  166. DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){
  167. DATARMNET17f6bc1be5(DATARMNET15454f969d);goto DATARMNETc1174a0f45;}
  168. DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNET934406764d());if(!
  169. DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNET4c5aeeb476);goto
  170. DATARMNETc1174a0f45;}memcpy(&DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->
  171. daddr,sizeof(__be32));DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->
  172. ifindex;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537
  173. =ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  174. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET9bdb1c4072);
  175. DATARMNET39542b437e=dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if
  176. (!DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET5abdc89190);goto
  177. DATARMNETc1174a0f45;}DATARMNET099aa93adc.flowi4_oif=DATARMNET39542b437e->ifindex
  178. ;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=
  179. ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  180. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET101af46c1c);goto
  181. DATARMNETc1174a0f45;}}memcpy(&DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->
  182. saddr,sizeof(__be32));DATARMNETb5af46179c=xfrm_lookup(&init_net,&
  183. DATARMNET066b8bd537->dst,flowi4_to_flowi(&DATARMNET099aa93adc),NULL,
  184. (0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*)DATARMNETb5af46179c;if(
  185. IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET9a57ef32d3);goto
  186. DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,DATARMNETb5af46179c);
  187. dst_output(&init_net,NULL,DATARMNET543491eb0f);DATARMNET17f6bc1be5(
  188. DATARMNET9a940d93dc);return RX_HANDLER_CONSUMED;}else if(DATARMNET543491eb0f->
  189. dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))&&DATARMNET1a901c3d09==
  190. DATARMNET356f2a237e){struct ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;
  191. struct flowi6 DATARMNET8fbe36a2fa={};struct dst_entry*dst=NULL,*
  192. DATARMNETb5af46179c;struct rtable*DATARMNET066b8bd537;struct net_device*
  193. DATARMNET39542b437e=NULL;DATARMNETbf55123e5b=skb_header_pointer(
  194. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
  195. DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){DATARMNET17f6bc1be5(
  196. DATARMNET6b0ed53aab);goto DATARMNETc1174a0f45;}memcpy(&DATARMNET8fbe36a2fa.saddr
  197. ,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));memcpy(&
  198. DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct in6_addr));
  199. dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if
  200. (IS_ERR(dst)){DATARMNET17f6bc1be5(DATARMNET22ac945cae);DATARMNET39542b437e=
  201. dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if(!
  202. DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNETf326b7c906);goto
  203. DATARMNETc1174a0f45;}DATARMNET8fbe36a2fa.flowi6_oif=DATARMNET39542b437e->ifindex
  204. ;DATARMNET8fbe36a2fa.flowi6_flags=FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->
  205. ipv6_dst_lookup_flow(&init_net,NULL,&DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){
  206. DATARMNET17f6bc1be5(DATARMNET544d78ede7);goto DATARMNETc1174a0f45;}}
  207. DATARMNETb5af46179c=xfrm_lookup(&init_net,dst,flowi6_to_flowi(&
  208. DATARMNET8fbe36a2fa),NULL,(0xd2d+202-0xdf7));DATARMNET066b8bd537=(struct rtable*
  209. )DATARMNETb5af46179c;if(IS_ERR(DATARMNET066b8bd537)){DATARMNET17f6bc1be5(
  210. DATARMNET97b44d0c09);goto DATARMNETc1174a0f45;}skb_dst_set(DATARMNET543491eb0f,
  211. DATARMNETb5af46179c);dst_output(&init_net,NULL,DATARMNET543491eb0f);
  212. DATARMNET17f6bc1be5(DATARMNETf954265acb);return RX_HANDLER_CONSUMED;}
  213. DATARMNETc1174a0f45:kfree_skb(DATARMNET543491eb0f);return RX_HANDLER_CONSUMED;}
  214. static rx_handler_result_t DATARMNET6e2f632fce(struct sk_buff*
  215. DATARMNET543491eb0f,uint8_t DATARMNET1a901c3d09){struct sk_buff*
  216. DATARMNETb6d6995997=NULL;unsigned int DATARMNETc26140baf9=(0xd2d+202-0xdf7);
  217. unsigned int DATARMNET3301d81682=(0xd2d+202-0xdf7);struct ipv6hdr*
  218. DATARMNETbf55123e5b,*DATARMNET0b51978dd7;struct frag_hdr*DATARMNET2d5a34898d,*
  219. DATARMNET4a64bfeda0;if(skb_linearize(DATARMNET543491eb0f)){DATARMNET17f6bc1be5(
  220. DATARMNET4f59e3a6e4);goto DATARMNET27d4697979;}if(DATARMNET543491eb0f->protocol
  221. !=htons(ETH_P_IPV6)){DATARMNET17f6bc1be5(DATARMNET87c37ed8cc);goto
  222. DATARMNETb042feb7e2;}DATARMNETb6d6995997=skb_copy_expand(DATARMNET543491eb0f,
  223. DATARMNET898fc3651c,DATARMNET898fc3651c,GFP_ATOMIC);if(!DATARMNETb6d6995997){
  224. DATARMNET17f6bc1be5(DATARMNET03b5eea9bc);goto DATARMNETb042feb7e2;}
  225. DATARMNETbf55123e5b=(struct ipv6hdr*)(DATARMNET543491eb0f->data);
  226. DATARMNET0b51978dd7=(struct ipv6hdr*)(DATARMNETb6d6995997->data);
  227. DATARMNET2d5a34898d=(struct frag_hdr*)((char*)DATARMNET543491eb0f->data+sizeof(
  228. struct ipv6hdr));DATARMNET4a64bfeda0=(struct frag_hdr*)((char*)
  229. DATARMNETb6d6995997->data+sizeof(struct ipv6hdr));DATARMNETc26140baf9=ntohs(
  230. DATARMNETbf55123e5b->payload_len)-sizeof(struct frag_hdr);DATARMNET3301d81682=
  231. DATARMNETc26140baf9-DATARMNET20defbe7a0;memcpy(DATARMNETb6d6995997->data+sizeof(
  232. struct ipv6hdr)+sizeof(struct frag_hdr),DATARMNET543491eb0f->data+sizeof(struct
  233. ipv6hdr)+sizeof(struct frag_hdr)+DATARMNET20defbe7a0,DATARMNET3301d81682);
  234. DATARMNET2d5a34898d->frag_off=(0xd2d+202-0xdf7);DATARMNET2d5a34898d->frag_off|=
  235. htons(IP6_MF);skb_trim(DATARMNET543491eb0f,sizeof(struct ipv6hdr)+sizeof(struct
  236. frag_hdr)+DATARMNET20defbe7a0);DATARMNETbf55123e5b->payload_len=htons(sizeof(
  237. struct frag_hdr)+DATARMNET20defbe7a0);DATARMNET4a64bfeda0->frag_off=
  238. (0xd2d+202-0xdf7);DATARMNET4a64bfeda0->frag_off=htons(DATARMNET20defbe7a0);
  239. DATARMNET4a64bfeda0->frag_off|=htons(IP6_MF);skb_trim(DATARMNETb6d6995997,sizeof
  240. (struct ipv6hdr)+sizeof(struct frag_hdr)+DATARMNET3301d81682);
  241. DATARMNET0b51978dd7->payload_len=htons(sizeof(struct frag_hdr)+
  242. DATARMNET3301d81682);DATARMNETc9ed97754a(DATARMNET543491eb0f,DATARMNET1a901c3d09
  243. );DATARMNETc9ed97754a(DATARMNETb6d6995997,DATARMNET1a901c3d09);goto
  244. DATARMNET27d4697979;DATARMNETb042feb7e2:kfree_skb(DATARMNET543491eb0f);
  245. DATARMNET27d4697979:return RX_HANDLER_CONSUMED;}static rx_handler_result_t
  246. DATARMNET68fe094884(struct sk_buff**DATARMNET89946cec52){struct
  247. DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct DATARMNET4f49486833*
  248. DATARMNET63b1a086d5;struct sk_buff*DATARMNET543491eb0f=*DATARMNET89946cec52;
  249. unsigned long DATARMNETfb0677cc3c;struct DATARMNET8d3c2559ca DATARMNET2d4b4cfc9e
  250. ;struct DATARMNET41b426061d*DATARMNET8184934307;uint8_t DATARMNET1a901c3d09=
  251. DATARMNETdcafdec32a;if(!DATARMNET543491eb0f||DATARMNET543491eb0f->pkt_type==
  252. PACKET_LOOPBACK)return RX_HANDLER_PASS;if(DATARMNET543491eb0f->protocol==htons(
  253. ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9,DATARMNETbf6548198e;
  254. DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  255. sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9)goto
  256. DATARMNETbf4095f79e;DATARMNET2d4b4cfc9e.DATARMNET0dc14167a1=DATARMNET86f1f2cdc9
  257. ->saddr;DATARMNET2d4b4cfc9e.DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else if(
  258. DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
  259. DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;DATARMNETbf55123e5b=skb_header_pointer(
  260. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
  261. DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)goto DATARMNETbf4095f79e;memcpy(&
  262. DATARMNET2d4b4cfc9e.DATARMNET5700daac01,&DATARMNETbf55123e5b->saddr,sizeof(
  263. DATARMNET2d4b4cfc9e.DATARMNET5700daac01));DATARMNET2d4b4cfc9e.
  264. DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else{goto DATARMNETbf4095f79e;}
  265. rcu_read_lock();DATARMNET8184934307=DATARMNETcc0a01df2a(&DATARMNET2d4b4cfc9e);
  266. rcu_read_unlock();if(!DATARMNET8184934307)goto DATARMNETbf4095f79e;
  267. DATARMNET1a901c3d09=DATARMNET8184934307->DATARMNET7ed5754a5c.DATARMNET9954a624ac
  268. ;if(DATARMNET1a901c3d09==DATARMNETdcafdec32a)goto DATARMNETbf4095f79e;if(
  269. DATARMNET543491eb0f->dev)nf_ct_set(DATARMNET543491eb0f,NULL,IP_CT_UNTRACKED);if(
  270. DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9
  271. ,DATARMNETbf6548198e;DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,
  272. (0xd2d+202-0xdf7),sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!
  273. DATARMNET86f1f2cdc9)goto DATARMNETbf4095f79e;if(DATARMNET86f1f2cdc9->protocol==
  274. IPPROTO_TCP)goto DATARMNET9b3d23a43b;if(DATARMNET86f1f2cdc9->protocol!=
  275. IPPROTO_ICMP)goto DATARMNETbf4095f79e;DATARMNETa76763310b.DATARMNETdfe430c2d6=
  276. DATARMNET86f1f2cdc9->saddr;DATARMNETa76763310b.DATARMNET2cb607d686=
  277. DATARMNET86f1f2cdc9->daddr;DATARMNETa76763310b.DATARMNET0d956cc77a=
  278. (0xd11+230-0xdf3);}else if(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){
  279. struct ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;__be16 frag_off;u8
  280. DATARMNET65293f17c4;DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,
  281. (0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!
  282. DATARMNETbf55123e5b)goto DATARMNETbf4095f79e;DATARMNET65293f17c4=
  283. DATARMNETbf55123e5b->nexthdr;if(ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*
  284. DATARMNETbf55123e5b),&DATARMNET65293f17c4,&frag_off)<(0xd2d+202-0xdf7))goto
  285. DATARMNETbf4095f79e;if(frag_off&&DATARMNET65293f17c4==NEXTHDR_FRAGMENT)goto
  286. DATARMNETbf4095f79e;if(DATARMNETbf55123e5b->nexthdr==NEXTHDR_FRAGMENT&&(ntohs(
  287. DATARMNETbf55123e5b->payload_len)>(sizeof(struct frag_hdr)+DATARMNET20defbe7a0))
  288. )goto DATARMNETf10b3df68d;if(DATARMNET65293f17c4==IPPROTO_TCP)goto
  289. DATARMNET9b3d23a43b;if(DATARMNET65293f17c4!=IPPROTO_ICMPV6)goto
  290. DATARMNETbf4095f79e;memcpy(&DATARMNETa76763310b.DATARMNET815cbb4bf5,&
  291. DATARMNETbf55123e5b->saddr,sizeof(DATARMNETa76763310b.DATARMNET815cbb4bf5));
  292. memcpy(&DATARMNETa76763310b.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->daddr,
  293. sizeof(DATARMNETa76763310b.DATARMNETc3f31215b7));DATARMNETa76763310b.
  294. DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else{goto DATARMNETbf4095f79e;}
  295. rcu_read_lock();hash_for_each_possible_rcu(DATARMNET5413d6f8ec,
  296. DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNETa76763310b.DATARMNET2cb607d686)
  297. {if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->DATARMNET54338da2ff,&
  298. DATARMNETa76763310b))continue;if(likely(hrtimer_is_queued(&DATARMNET63b1a086d5->
  299. DATARMNET9f31ce5d2d)))hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,
  300. DATARMNET5da8c68c19,HRTIMER_MODE_REL);rcu_read_unlock();goto DATARMNETbf4095f79e
  301. ;}rcu_read_unlock();spin_lock_irqsave(&DATARMNET820642743b,DATARMNETfb0677cc3c);
  302. DATARMNET63b1a086d5=kzalloc(sizeof(*DATARMNET63b1a086d5),GFP_ATOMIC);if(!
  303. DATARMNET63b1a086d5){spin_unlock_irqrestore(&DATARMNET820642743b,
  304. DATARMNETfb0677cc3c);goto DATARMNETbf4095f79e;}INIT_HLIST_NODE(&
  305. DATARMNET63b1a086d5->DATARMNETe8608dd267);memcpy(&DATARMNET63b1a086d5->
  306. DATARMNET54338da2ff,&DATARMNETa76763310b,sizeof(DATARMNETa76763310b));
  307. DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f=DATARMNET543491eb0f
  308. ->dev;hrtimer_init(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,CLOCK_MONOTONIC,
  309. HRTIMER_MODE_REL);DATARMNET63b1a086d5->DATARMNET9f31ce5d2d.function=
  310. DATARMNET299a8a08b5;hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,
  311. DATARMNET5da8c68c19,HRTIMER_MODE_REL);hash_add_rcu(DATARMNET5413d6f8ec,&
  312. DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNETa76763310b.DATARMNET2cb607d686
  313. );spin_unlock_irqrestore(&DATARMNET820642743b,DATARMNETfb0677cc3c);
  314. DATARMNETbf4095f79e:return DATARMNETc9ed97754a(DATARMNET543491eb0f,
  315. DATARMNET1a901c3d09);DATARMNET9b3d23a43b:DATARMNET7ca470d54b(DATARMNET543491eb0f
  316. ,TCP_FLAG_SYN);return DATARMNETc9ed97754a(DATARMNET543491eb0f,
  317. DATARMNET1a901c3d09);DATARMNETf10b3df68d:return DATARMNET6e2f632fce(
  318. DATARMNET543491eb0f,DATARMNET1a901c3d09);}static void DATARMNETbc6bd11f47(struct
  319. net_device*DATARMNET00dcb79bc4){struct DATARMNET4f49486833*DATARMNET63b1a086d5;
  320. int DATARMNET5c2fd31d7b;rcu_read_lock();hash_for_each_rcu(DATARMNET5413d6f8ec,
  321. DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,DATARMNETe8608dd267){if(
  322. DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f==
  323. DATARMNET00dcb79bc4)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);}
  324. rcu_read_unlock();}static int DATARMNET81ab4de243(struct notifier_block*
  325. DATARMNET272c159b3c,unsigned long DATARMNET7f045a1e6e,void*data){struct
  326. net_device*DATARMNET00dcb79bc4=netdev_notifier_info_to_dev(data);if(!
  327. DATARMNET00dcb79bc4||DATARMNETaba2beb199(DATARMNET00dcb79bc4->name,
  328. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd19+238-0xdfb)))return
  329. NOTIFY_DONE;switch(DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:
  330. DATARMNETbc6bd11f47(DATARMNET00dcb79bc4);break;default:break;}return NOTIFY_DONE
  331. ;}static struct notifier_block DATARMNET61d0113123={.notifier_call=
  332. DATARMNET81ab4de243,};struct DATARMNET8d3c2559ca*DATARMNET07f0e0f286(struct
  333. DATARMNET0ca9d8ead7*DATARMNET54338da2ff)__must_hold(RCU){struct
  334. DATARMNET4f49486833*DATARMNET63b1a086d5;hash_for_each_possible_rcu(
  335. DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff
  336. ->DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
  337. DATARMNET54338da2ff,DATARMNET54338da2ff))continue;return&DATARMNET63b1a086d5->
  338. DATARMNET7ed5754a5c;}return NULL;}void DATARMNETf4e1a29dbc(void){struct
  339. DATARMNET4f49486833*DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();
  340. hash_for_each_rcu(DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,
  341. DATARMNETe8608dd267)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);
  342. rcu_read_unlock();}void DATARMNET6f73df41cd(struct sk_buff*DATARMNET543491eb0f){
  343. int protocol=-(0xd26+209-0xdf6);struct DATARMNETe117226f58*DATARMNET3396919a68=
  344. rcu_dereference(DATARMNETcde6e442f5);if(!DATARMNET3396919a68)return;if(
  345. DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9
  346. ,DATARMNETbf6548198e;DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,
  347. (0xd2d+202-0xdf7),sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!
  348. DATARMNET86f1f2cdc9)return;if(DATARMNET86f1f2cdc9->version!=DATARMNET3396919a68
  349. ->DATARMNET0d956cc77a&&DATARMNET86f1f2cdc9->saddr!=DATARMNET3396919a68->
  350. DATARMNETdfe430c2d6&&DATARMNET86f1f2cdc9->daddr!=DATARMNET3396919a68->
  351. DATARMNET2cb607d686)return;protocol=DATARMNET86f1f2cdc9->protocol;}else if(
  352. DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
  353. DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;DATARMNETbf55123e5b=skb_header_pointer(
  354. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
  355. DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)return;if(DATARMNETbf55123e5b->
  356. version!=DATARMNET3396919a68->DATARMNET0d956cc77a&&ipv6_addr_cmp(&
  357. DATARMNETbf55123e5b->saddr,&DATARMNET3396919a68->DATARMNET815cbb4bf5)&&
  358. ipv6_addr_cmp(&DATARMNETbf55123e5b->daddr,&DATARMNET3396919a68->
  359. DATARMNETc3f31215b7))return;protocol=DATARMNETbf55123e5b->nexthdr;}if(protocol==
  360. IPPROTO_UDP){if(udp_hdr(DATARMNET543491eb0f)->source==DATARMNET3396919a68->
  361. DATARMNET08e913477e&&udp_hdr(DATARMNET543491eb0f)->dest==DATARMNET3396919a68->
  362. DATARMNETda7f7fa492)goto DATARMNET9573fcc9c6;}return;DATARMNET9573fcc9c6:
  363. DATARMNET543491eb0f->priority=2607612160;DATARMNET5ca94dbc3c(DATARMNETc2cade1d75
  364. );}static rx_handler_result_t DATARMNETd2f80b03ce(struct sk_buff**
  365. DATARMNET89946cec52){struct net_device*DATARMNET00dcb79bc4;if(!
  366. DATARMNET89946cec52||!(*DATARMNET89946cec52)||!(*DATARMNET89946cec52)->dev)
  367. return RX_HANDLER_PASS;DATARMNET00dcb79bc4=(*DATARMNET89946cec52)->dev;if(!
  368. DATARMNETaba2beb199(DATARMNET00dcb79bc4->name,
  369. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd19+238-0xdfb)))return
  370. DATARMNET68fe094884(DATARMNET89946cec52);if(!DATARMNETaba2beb199(
  371. DATARMNET00dcb79bc4->name,DATARMNETe447822105(),IFNAMSIZ))return
  372. DATARMNET37a92021f9(DATARMNET89946cec52);if(!DATARMNETaba2beb199(
  373. DATARMNET00dcb79bc4->name,DATARMNET934406764d(),IFNAMSIZ))return
  374. DATARMNET37a92021f9(DATARMNET89946cec52);return RX_HANDLER_PASS;}static const
  375. struct rmnet_module_hook_register_info DATARMNET1928843de7[]={{.hooknum=
  376. RMNET_MODULE_HOOK_WLAN_FLOW_MATCH,.func=DATARMNET6f73df41cd,},{.hooknum=
  377. RMNET_MODULE_HOOK_WLAN_INGRESS_RX_HANDLER,.func=DATARMNETd2f80b03ce,},};void
  378. DATARMNET333c107558(void){rcu_assign_pointer(rmnet_wlan_ll_tuple_hook,
  379. DATARMNET6f73df41cd);rmnet_module_hook_register(DATARMNET1928843de7,ARRAY_SIZE(
  380. DATARMNET1928843de7));}void DATARMNET4c08c7210c(void){rcu_assign_pointer(
  381. rmnet_wlan_ll_tuple_hook,NULL);rmnet_module_hook_unregister(DATARMNET1928843de7,
  382. ARRAY_SIZE(DATARMNET1928843de7));}int DATARMNET9f106ed933(void){int
  383. DATARMNET268a8314cf;DATARMNET268a8314cf=register_netdevice_notifier(&
  384. DATARMNET61d0113123);if(DATARMNET268a8314cf)pr_err(
  385. "\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
  386. ,__func__);return DATARMNET268a8314cf;}int DATARMNETf56cbaa2b1(void){int
  387. DATARMNET268a8314cf;DATARMNET268a8314cf=unregister_netdevice_notifier(&
  388. DATARMNET61d0113123);if(DATARMNET268a8314cf)pr_err(
  389. "\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
  390. ,__func__);return DATARMNET268a8314cf;}