rmnet_wlan_connection.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2021, The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2022 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/netfilter/nf_conntrack.h>
  19. #include "rmnet_wlan.h"
  20. #include "rmnet_wlan_connection.h"
  21. #include "rmnet_wlan_stats.h"
  22. #define DATARMNET5da8c68c19 (2000000000)
  23. #define DATARMNET8fc07fbb24 ((0xeb7+1158-0x132d))
  24. #define DATARMNETeaf0945284 \
  25. (const_ilog2(DATARMNET8fc07fbb24))
  26. struct DATARMNET4f49486833{struct hlist_node DATARMNETe8608dd267;struct rcu_head
  27. DATARMNET28bfe9e6ad;struct hrtimer DATARMNET9f31ce5d2d;struct
  28. DATARMNET0ca9d8ead7 DATARMNET54338da2ff;struct DATARMNET8d3c2559ca
  29. DATARMNET7ed5754a5c;};static DEFINE_SPINLOCK(DATARMNET820642743b);static
  30. DEFINE_HASHTABLE(DATARMNET5413d6f8ec,DATARMNETeaf0945284);static bool
  31. DATARMNET5f3c9ed4da(struct DATARMNET0ca9d8ead7*DATARMNET75decd6f60,struct
  32. DATARMNET0ca9d8ead7*DATARMNET6745cad668){if(DATARMNET75decd6f60->
  33. DATARMNET0d956cc77a!=DATARMNET6745cad668->DATARMNET0d956cc77a)return false;if(
  34. DATARMNET75decd6f60->DATARMNET0d956cc77a==(0xd11+230-0xdf3))return
  35. DATARMNET75decd6f60->DATARMNETdfe430c2d6==DATARMNET6745cad668->
  36. DATARMNETdfe430c2d6&&DATARMNET75decd6f60->DATARMNET2cb607d686==
  37. DATARMNET6745cad668->DATARMNET2cb607d686;return!ipv6_addr_cmp(&
  38. DATARMNET75decd6f60->DATARMNET815cbb4bf5,&DATARMNET6745cad668->
  39. DATARMNET815cbb4bf5)&&!ipv6_addr_cmp(&DATARMNET75decd6f60->DATARMNETc3f31215b7,&
  40. DATARMNET6745cad668->DATARMNETc3f31215b7);}static enum hrtimer_restart
  41. DATARMNET299a8a08b5(struct hrtimer*DATARMNET6e4292679f){struct
  42. DATARMNET4f49486833*DATARMNET63b1a086d5;unsigned long DATARMNETfb0677cc3c;
  43. spin_lock_irqsave(&DATARMNET820642743b,DATARMNETfb0677cc3c);DATARMNET63b1a086d5=
  44. container_of(DATARMNET6e4292679f,struct DATARMNET4f49486833,DATARMNET9f31ce5d2d)
  45. ;hash_del_rcu(&DATARMNET63b1a086d5->DATARMNETe8608dd267);kfree_rcu(
  46. DATARMNET63b1a086d5,DATARMNET28bfe9e6ad);spin_unlock_irqrestore(&
  47. DATARMNET820642743b,DATARMNETfb0677cc3c);return HRTIMER_NORESTART;}static
  48. rx_handler_result_t DATARMNETc9ed97754a(struct sk_buff*DATARMNET543491eb0f){if(
  49. DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&!(
  50. strncmp(DATARMNET543491eb0f->dev->name,
  51. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",IFNAMSIZ))){struct iphdr*
  52. DATARMNET86f1f2cdc9,DATARMNETbf6548198e;struct net_device*DATARMNET813ca18d06=
  53. NULL;struct flowi4 DATARMNET099aa93adc={};struct rtable*DATARMNET066b8bd537;
  54. struct neighbour*DATARMNET3f85732c70;int DATARMNET268a8314cf=(0xd2d+202-0xdf7);
  55. DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  56. sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){
  57. DATARMNET17f6bc1be5(DATARMNETd1c349b9fc);goto DATARMNETc1174a0f45;}
  58. DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,DATARMNET934406764d());if(!
  59. DATARMNET813ca18d06){DATARMNET17f6bc1be5(DATARMNETfa4b3dd44a);goto
  60. DATARMNETc1174a0f45;}DATARMNET543491eb0f->dev=DATARMNET813ca18d06;memcpy(&
  61. DATARMNET099aa93adc.saddr,&DATARMNET86f1f2cdc9->saddr,sizeof(__be32));memcpy(&
  62. DATARMNET099aa93adc.daddr,&DATARMNET86f1f2cdc9->daddr,sizeof(__be32));
  63. DATARMNET099aa93adc.flowi4_oif=DATARMNET813ca18d06->ifindex;DATARMNET099aa93adc.
  64. flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=ip_route_output_key(&
  65. init_net,&DATARMNET099aa93adc);if(IS_ERR(DATARMNET066b8bd537)){
  66. DATARMNET17f6bc1be5(DATARMNET72ab5e86d8);goto DATARMNETc1174a0f45;}
  67. DATARMNET3f85732c70=dst_neigh_lookup(&DATARMNET066b8bd537->dst,&
  68. DATARMNET099aa93adc.daddr);ip_rt_put(DATARMNET066b8bd537);if(!
  69. DATARMNET3f85732c70){DATARMNET17f6bc1be5(DATARMNET0e6bd55b8b);goto
  70. DATARMNETc1174a0f45;}if(DATARMNET3f85732c70->dev!=DATARMNET543491eb0f->dev||!
  71. DATARMNET3f85732c70->dev->header_ops){DATARMNET17f6bc1be5(DATARMNET64aecaa865);
  72. neigh_release(DATARMNET3f85732c70);goto DATARMNETc1174a0f45;}DATARMNET268a8314cf
  73. =neigh_resolve_output(DATARMNET3f85732c70,DATARMNET543491eb0f);neigh_release(
  74. DATARMNET3f85732c70);if(likely(DATARMNET268a8314cf==NET_XMIT_SUCCESS||
  75. DATARMNET268a8314cf==NET_XMIT_CN)){DATARMNET17f6bc1be5(DATARMNETc1b437465b);}
  76. else{DATARMNET17f6bc1be5(DATARMNET43a65c0be7);}return RX_HANDLER_CONSUMED;}else
  77. if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))
  78. &&!(strncmp(DATARMNET543491eb0f->dev->name,
  79. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",IFNAMSIZ))){struct
  80. ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;struct net_device*
  81. DATARMNET813ca18d06=NULL;struct flowi6 DATARMNET8fbe36a2fa={};struct neighbour*
  82. DATARMNET3f85732c70;struct dst_entry*dst;int DATARMNET268a8314cf=
  83. (0xd2d+202-0xdf7);DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,
  84. (0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!
  85. DATARMNETbf55123e5b){DATARMNET17f6bc1be5(DATARMNET72f4fdd48a);goto
  86. DATARMNETc1174a0f45;}DATARMNET813ca18d06=dev_get_by_name_rcu(&init_net,
  87. DATARMNET934406764d());if(!DATARMNET813ca18d06){DATARMNET17f6bc1be5(
  88. DATARMNET9cff15f94d);goto DATARMNETc1174a0f45;}DATARMNET543491eb0f->dev=
  89. DATARMNET813ca18d06;memcpy(&DATARMNET8fbe36a2fa.saddr,&DATARMNETbf55123e5b->
  90. saddr,sizeof(struct in6_addr));memcpy(&DATARMNET8fbe36a2fa.daddr,&
  91. DATARMNETbf55123e5b->daddr,sizeof(struct in6_addr));DATARMNET8fbe36a2fa.
  92. flowi6_oif=DATARMNET813ca18d06->ifindex;DATARMNET8fbe36a2fa.flowi6_flags=
  93. FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&
  94. DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){DATARMNET17f6bc1be5(
  95. DATARMNETbf6e6853f9);goto DATARMNETc1174a0f45;}DATARMNET3f85732c70=
  96. dst_neigh_lookup(dst,&DATARMNET8fbe36a2fa.daddr);dst_release(dst);if(!
  97. DATARMNET3f85732c70){DATARMNET17f6bc1be5(DATARMNETa0da722329);goto
  98. DATARMNETc1174a0f45;}if(DATARMNET3f85732c70->dev!=DATARMNET543491eb0f->dev||!
  99. DATARMNET3f85732c70->dev->header_ops){DATARMNET17f6bc1be5(DATARMNET729e252fb9);
  100. neigh_release(DATARMNET3f85732c70);goto DATARMNETc1174a0f45;}DATARMNET268a8314cf
  101. =neigh_resolve_output(DATARMNET3f85732c70,DATARMNET543491eb0f);neigh_release(
  102. DATARMNET3f85732c70);if(likely(DATARMNET268a8314cf==NET_XMIT_SUCCESS||
  103. DATARMNET268a8314cf==NET_XMIT_CN)){DATARMNET17f6bc1be5(DATARMNET04311361a2);}
  104. else{DATARMNET17f6bc1be5(DATARMNET13bbe5f5c5);}return RX_HANDLER_CONSUMED;}else
  105. if(DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6))
  106. &&(strncmp(DATARMNET543491eb0f->dev->name,
  107. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",IFNAMSIZ))){struct
  108. ipv6hdr*DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;struct flowi6
  109. DATARMNET8fbe36a2fa={};struct dst_entry*dst,*dst_xfrm;struct rtable*
  110. DATARMNET066b8bd537;struct net_device*DATARMNET39542b437e=NULL;
  111. DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  112. sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b){
  113. DATARMNET17f6bc1be5(DATARMNET6b0ed53aab);goto DATARMNETc1174a0f45;}memcpy(&
  114. DATARMNET8fbe36a2fa.saddr,&DATARMNETbf55123e5b->saddr,sizeof(struct in6_addr));
  115. memcpy(&DATARMNET8fbe36a2fa.daddr,&DATARMNETbf55123e5b->daddr,sizeof(struct
  116. in6_addr));dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&
  117. DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){DATARMNET17f6bc1be5(
  118. DATARMNET22ac945cae);DATARMNET39542b437e=dev_get_by_name_rcu(&init_net,
  119. "\x64\x75\x6d\x6d\x79\x30");if(!DATARMNET39542b437e){DATARMNET17f6bc1be5(
  120. DATARMNETf326b7c906);goto DATARMNETc1174a0f45;}DATARMNET8fbe36a2fa.flowi6_oif=
  121. DATARMNET39542b437e->ifindex;DATARMNET8fbe36a2fa.flowi6_flags=
  122. FLOWI_FLAG_KNOWN_NH;dst=ipv6_stub->ipv6_dst_lookup_flow(&init_net,NULL,&
  123. DATARMNET8fbe36a2fa,NULL);if(IS_ERR(dst)){DATARMNET17f6bc1be5(
  124. DATARMNET544d78ede7);goto DATARMNET74b365f6cc;}}dst_xfrm=xfrm_lookup(&init_net,
  125. dst,flowi6_to_flowi(&DATARMNET8fbe36a2fa),NULL,(0xd2d+202-0xdf7));
  126. DATARMNET066b8bd537=(struct rtable*)dst_xfrm;if(IS_ERR(DATARMNET066b8bd537)){
  127. DATARMNET17f6bc1be5(DATARMNET97b44d0c09);goto DATARMNETc1174a0f45;}skb_dst_set(
  128. DATARMNET543491eb0f,dst_xfrm);dst_output(&init_net,NULL,DATARMNET543491eb0f);
  129. DATARMNET17f6bc1be5(DATARMNETf954265acb);return RX_HANDLER_CONSUMED;}else if(
  130. DATARMNET543491eb0f->dev&&(DATARMNET543491eb0f->protocol==htons(ETH_P_IP))&&(
  131. strncmp(DATARMNET543491eb0f->dev->name,
  132. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",IFNAMSIZ))){struct iphdr*
  133. DATARMNET86f1f2cdc9,DATARMNETbf6548198e;struct flowi4 DATARMNET099aa93adc={};
  134. struct rtable*DATARMNET066b8bd537;struct dst_entry*dst_xfrm;struct net_device*
  135. DATARMNET39542b437e=NULL;DATARMNET86f1f2cdc9=skb_header_pointer(
  136. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNET86f1f2cdc9),&
  137. DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9){DATARMNET17f6bc1be5(
  138. DATARMNET15454f969d);goto DATARMNETc1174a0f45;}memcpy(&DATARMNET099aa93adc.saddr
  139. ,&DATARMNET86f1f2cdc9->saddr,sizeof(__be32));memcpy(&DATARMNET099aa93adc.daddr,&
  140. DATARMNET86f1f2cdc9->daddr,sizeof(__be32));DATARMNET066b8bd537=
  141. ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  142. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET9bdb1c4072);
  143. DATARMNET39542b437e=dev_get_by_name_rcu(&init_net,"\x64\x75\x6d\x6d\x79\x30");if
  144. (!DATARMNET39542b437e){DATARMNET17f6bc1be5(DATARMNET5abdc89190);goto
  145. DATARMNETc1174a0f45;}DATARMNET099aa93adc.flowi4_oif=DATARMNET39542b437e->ifindex
  146. ;DATARMNET099aa93adc.flowi4_flags=FLOWI_FLAG_KNOWN_NH;DATARMNET066b8bd537=
  147. ip_route_output_key(&init_net,&DATARMNET099aa93adc);if(IS_ERR(
  148. DATARMNET066b8bd537)){DATARMNET17f6bc1be5(DATARMNET101af46c1c);goto
  149. DATARMNET74b365f6cc;}}dst_xfrm=xfrm_lookup(&init_net,&DATARMNET066b8bd537->dst,
  150. flowi4_to_flowi(&DATARMNET099aa93adc),NULL,(0xd2d+202-0xdf7));
  151. DATARMNET066b8bd537=(struct rtable*)dst_xfrm;if(IS_ERR(DATARMNET066b8bd537)){
  152. DATARMNET17f6bc1be5(DATARMNET9a57ef32d3);goto DATARMNETc1174a0f45;}skb_dst_set(
  153. DATARMNET543491eb0f,dst_xfrm);dst_output(&init_net,NULL,DATARMNET543491eb0f);
  154. DATARMNET17f6bc1be5(DATARMNET9a940d93dc);return RX_HANDLER_CONSUMED;}
  155. DATARMNET74b365f6cc:return RX_HANDLER_PASS;DATARMNETc1174a0f45:kfree_skb(
  156. DATARMNET543491eb0f);return RX_HANDLER_CONSUMED;}static rx_handler_result_t
  157. DATARMNET68fe094884(struct sk_buff**DATARMNET89946cec52){struct
  158. DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct DATARMNET4f49486833*
  159. DATARMNET63b1a086d5;struct sk_buff*DATARMNET543491eb0f=*DATARMNET89946cec52;
  160. unsigned long DATARMNETfb0677cc3c;if(!DATARMNET543491eb0f||DATARMNET543491eb0f->
  161. pkt_type==PACKET_LOOPBACK)return RX_HANDLER_PASS;if(DATARMNET543491eb0f->dev&&
  162. strncmp(DATARMNET543491eb0f->dev->name,
  163. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",IFNAMSIZ))nf_ct_set(
  164. DATARMNET543491eb0f,NULL,IP_CT_UNTRACKED);if(DATARMNET543491eb0f->protocol==
  165. htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9,DATARMNETbf6548198e;
  166. DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  167. sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9)goto
  168. DATARMNETbf4095f79e;if(DATARMNET86f1f2cdc9->protocol==IPPROTO_TCP)goto
  169. DATARMNET9b3d23a43b;if(DATARMNET86f1f2cdc9->protocol!=IPPROTO_ICMP)goto
  170. DATARMNETbf4095f79e;DATARMNETa76763310b.DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9
  171. ->saddr;DATARMNETa76763310b.DATARMNET2cb607d686=DATARMNET86f1f2cdc9->daddr;
  172. DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else if(
  173. DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
  174. DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;__be16 frag_off;u8 DATARMNET65293f17c4;
  175. DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  176. sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)goto
  177. DATARMNETbf4095f79e;DATARMNET65293f17c4=DATARMNETbf55123e5b->nexthdr;if(
  178. ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*DATARMNETbf55123e5b),&
  179. DATARMNET65293f17c4,&frag_off)<(0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;if(
  180. frag_off&&DATARMNET65293f17c4==NEXTHDR_FRAGMENT)goto DATARMNETbf4095f79e;if(
  181. DATARMNET65293f17c4==IPPROTO_TCP)goto DATARMNET9b3d23a43b;if(DATARMNET65293f17c4
  182. !=IPPROTO_ICMPV6)goto DATARMNETbf4095f79e;memcpy(&DATARMNETa76763310b.
  183. DATARMNET815cbb4bf5,&DATARMNETbf55123e5b->saddr,sizeof(DATARMNETa76763310b.
  184. DATARMNET815cbb4bf5));memcpy(&DATARMNETa76763310b.DATARMNETc3f31215b7,&
  185. DATARMNETbf55123e5b->daddr,sizeof(DATARMNETa76763310b.DATARMNETc3f31215b7));
  186. DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else{goto
  187. DATARMNETbf4095f79e;}rcu_read_lock();hash_for_each_possible_rcu(
  188. DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNETa76763310b.
  189. DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
  190. DATARMNET54338da2ff,&DATARMNETa76763310b))continue;if(likely(hrtimer_is_queued(&
  191. DATARMNET63b1a086d5->DATARMNET9f31ce5d2d)))hrtimer_start(&DATARMNET63b1a086d5->
  192. DATARMNET9f31ce5d2d,DATARMNET5da8c68c19,HRTIMER_MODE_REL);rcu_read_unlock();goto
  193. DATARMNETbf4095f79e;}rcu_read_unlock();spin_lock_irqsave(&DATARMNET820642743b,
  194. DATARMNETfb0677cc3c);DATARMNET63b1a086d5=kzalloc(sizeof(*DATARMNET63b1a086d5),
  195. GFP_ATOMIC);if(!DATARMNET63b1a086d5){spin_unlock_irqrestore(&DATARMNET820642743b
  196. ,DATARMNETfb0677cc3c);goto DATARMNETbf4095f79e;}INIT_HLIST_NODE(&
  197. DATARMNET63b1a086d5->DATARMNETe8608dd267);memcpy(&DATARMNET63b1a086d5->
  198. DATARMNET54338da2ff,&DATARMNETa76763310b,sizeof(DATARMNETa76763310b));
  199. DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f=DATARMNET543491eb0f
  200. ->dev;hrtimer_init(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,CLOCK_MONOTONIC,
  201. HRTIMER_MODE_REL);DATARMNET63b1a086d5->DATARMNET9f31ce5d2d.function=
  202. DATARMNET299a8a08b5;hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,
  203. DATARMNET5da8c68c19,HRTIMER_MODE_REL);hash_add_rcu(DATARMNET5413d6f8ec,&
  204. DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNETa76763310b.DATARMNET2cb607d686
  205. );spin_unlock_irqrestore(&DATARMNET820642743b,DATARMNETfb0677cc3c);
  206. DATARMNETbf4095f79e:return DATARMNETc9ed97754a(DATARMNET543491eb0f);
  207. DATARMNET9b3d23a43b:DATARMNET7ca470d54b(DATARMNET543491eb0f,TCP_FLAG_SYN);return
  208. DATARMNETc9ed97754a(DATARMNET543491eb0f);}static void DATARMNETbc6bd11f47(
  209. struct net_device*DATARMNET00dcb79bc4){struct DATARMNET4f49486833*
  210. DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();hash_for_each_rcu(
  211. DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,DATARMNETe8608dd267)
  212. {if(DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f==
  213. DATARMNET00dcb79bc4)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);}
  214. rcu_read_unlock();}static int DATARMNET81ab4de243(struct notifier_block*
  215. DATARMNET272c159b3c,unsigned long DATARMNET7f045a1e6e,void*data){struct
  216. net_device*DATARMNET00dcb79bc4=netdev_notifier_info_to_dev(data);if(!
  217. DATARMNET00dcb79bc4||strncmp(DATARMNET00dcb79bc4->name,
  218. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd19+238-0xdfb)))return
  219. NOTIFY_DONE;switch(DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:
  220. netdev_rx_handler_unregister(DATARMNET00dcb79bc4);DATARMNETbc6bd11f47(
  221. DATARMNET00dcb79bc4);break;case NETDEV_REGISTER:if(netdev_rx_handler_register(
  222. DATARMNET00dcb79bc4,DATARMNET68fe094884,NULL))pr_err(
  223. "\x25\x73\x28\x29\x3a\x20\x52\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x6f\x6e\x20\x25\x73\x20\x66\x61\x69\x6c\x65\x64" "\n"
  224. ,__func__,DATARMNET00dcb79bc4->name);break;default:break;}return NOTIFY_DONE;}
  225. static struct notifier_block DATARMNET61d0113123={.notifier_call=
  226. DATARMNET81ab4de243,};struct DATARMNET8d3c2559ca*DATARMNET07f0e0f286(struct
  227. DATARMNET0ca9d8ead7*DATARMNET54338da2ff)__must_hold(RCU){struct
  228. DATARMNET4f49486833*DATARMNET63b1a086d5;hash_for_each_possible_rcu(
  229. DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff
  230. ->DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
  231. DATARMNET54338da2ff,DATARMNET54338da2ff))continue;return&DATARMNET63b1a086d5->
  232. DATARMNET7ed5754a5c;}return NULL;}void DATARMNETf4e1a29dbc(void){struct
  233. DATARMNET4f49486833*DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();
  234. hash_for_each_rcu(DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,
  235. DATARMNETe8608dd267)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);
  236. rcu_read_unlock();}int DATARMNET9f106ed933(void){int DATARMNET268a8314cf;
  237. DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNET61d0113123);if(
  238. DATARMNET268a8314cf)pr_err(
  239. "\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
  240. ,__func__);return DATARMNET268a8314cf;}int DATARMNETf56cbaa2b1(void){int
  241. DATARMNET268a8314cf;DATARMNET268a8314cf=unregister_netdevice_notifier(&
  242. DATARMNET61d0113123);if(DATARMNET268a8314cf)pr_err(
  243. "\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
  244. ,__func__);return DATARMNET268a8314cf;}