rmnet_wlan_connection.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2021, The Linux Foundation. All rights reserved.
  3. *
  4. * RMNET WLAN connection management framework
  5. *
  6. */
  7. #include <linux/types.h>
  8. #include <linux/skbuff.h>
  9. #include <linux/netdevice.h>
  10. #include <linux/spinlock.h>
  11. #include <linux/rcupdate.h>
  12. #include <linux/hashtable.h>
  13. #include <linux/if_ether.h>
  14. #include <linux/hrtimer.h>
  15. #include <net/ip.h>
  16. #include <net/ipv6.h>
  17. #include "rmnet_wlan.h"
  18. #include "rmnet_wlan_connection.h"
  19. #define DATARMNET5da8c68c19 (2000000000)
  20. #define DATARMNET8fc07fbb24 ((0xeb7+1158-0x132d))
  21. #define DATARMNETeaf0945284 \
  22. (const_ilog2(DATARMNET8fc07fbb24))
  23. struct DATARMNET4f49486833{struct hlist_node DATARMNETe8608dd267;struct rcu_head
  24. DATARMNET28bfe9e6ad;struct hrtimer DATARMNET9f31ce5d2d;struct
  25. DATARMNET0ca9d8ead7 DATARMNET54338da2ff;struct DATARMNET8d3c2559ca
  26. DATARMNET7ed5754a5c;};static DEFINE_SPINLOCK(DATARMNET820642743b);static
  27. DEFINE_HASHTABLE(DATARMNET5413d6f8ec,DATARMNETeaf0945284);static bool
  28. DATARMNET5f3c9ed4da(struct DATARMNET0ca9d8ead7*DATARMNET75decd6f60,struct
  29. DATARMNET0ca9d8ead7*DATARMNET6745cad668){if(DATARMNET75decd6f60->
  30. DATARMNET0d956cc77a!=DATARMNET6745cad668->DATARMNET0d956cc77a)return false;if(
  31. DATARMNET75decd6f60->DATARMNET0d956cc77a==(0xd11+230-0xdf3))return
  32. DATARMNET75decd6f60->DATARMNETdfe430c2d6==DATARMNET6745cad668->
  33. DATARMNETdfe430c2d6&&DATARMNET75decd6f60->DATARMNET2cb607d686==
  34. DATARMNET6745cad668->DATARMNET2cb607d686;return!ipv6_addr_cmp(&
  35. DATARMNET75decd6f60->DATARMNET815cbb4bf5,&DATARMNET6745cad668->
  36. DATARMNET815cbb4bf5)&&!ipv6_addr_cmp(&DATARMNET75decd6f60->DATARMNETc3f31215b7,&
  37. DATARMNET6745cad668->DATARMNETc3f31215b7);}static void DATARMNETefaa1f4094(
  38. struct rcu_head*DATARMNET28bfe9e6ad){struct DATARMNET4f49486833*
  39. DATARMNET63b1a086d5;DATARMNET63b1a086d5=container_of(DATARMNET28bfe9e6ad,struct
  40. DATARMNET4f49486833,DATARMNET28bfe9e6ad);if(DATARMNET63b1a086d5)kfree(
  41. DATARMNET63b1a086d5);}static enum hrtimer_restart DATARMNET299a8a08b5(struct
  42. hrtimer*DATARMNET6e4292679f){struct DATARMNET4f49486833*DATARMNET63b1a086d5;
  43. unsigned long DATARMNETfb0677cc3c;spin_lock_irqsave(&DATARMNET820642743b,
  44. DATARMNETfb0677cc3c);DATARMNET63b1a086d5=container_of(DATARMNET6e4292679f,struct
  45. DATARMNET4f49486833,DATARMNET9f31ce5d2d);hash_del_rcu(&DATARMNET63b1a086d5->
  46. DATARMNETe8608dd267);call_rcu(&DATARMNET63b1a086d5->DATARMNET28bfe9e6ad,
  47. DATARMNETefaa1f4094);spin_unlock_irqrestore(&DATARMNET820642743b,
  48. DATARMNETfb0677cc3c);return HRTIMER_NORESTART;}static rx_handler_result_t
  49. DATARMNET68fe094884(struct sk_buff**DATARMNET89946cec52){struct
  50. DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct DATARMNET4f49486833*
  51. DATARMNET63b1a086d5;struct sk_buff*DATARMNET543491eb0f=*DATARMNET89946cec52;
  52. unsigned long DATARMNETfb0677cc3c;if(!DATARMNET543491eb0f||DATARMNET543491eb0f->
  53. pkt_type==PACKET_LOOPBACK)goto DATARMNETbf4095f79e;if(DATARMNET543491eb0f->
  54. protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9,DATARMNETbf6548198e;
  55. DATARMNET86f1f2cdc9=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  56. sizeof(*DATARMNET86f1f2cdc9),&DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9)goto
  57. DATARMNETbf4095f79e;if(DATARMNET86f1f2cdc9->protocol==IPPROTO_TCP)goto
  58. DATARMNET9b3d23a43b;if(DATARMNET86f1f2cdc9->protocol!=IPPROTO_ICMP)goto
  59. DATARMNETbf4095f79e;DATARMNETa76763310b.DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9
  60. ->saddr;DATARMNETa76763310b.DATARMNET2cb607d686=DATARMNET86f1f2cdc9->daddr;
  61. DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else if(
  62. DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
  63. DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;__be16 frag_off;u8 DATARMNET65293f17c4;
  64. DATARMNETbf55123e5b=skb_header_pointer(DATARMNET543491eb0f,(0xd2d+202-0xdf7),
  65. sizeof(*DATARMNETbf55123e5b),&DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)goto
  66. DATARMNETbf4095f79e;DATARMNET65293f17c4=DATARMNETbf55123e5b->nexthdr;if(
  67. ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*DATARMNETbf55123e5b),&
  68. DATARMNET65293f17c4,&frag_off)<(0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;if(
  69. frag_off&&DATARMNET65293f17c4==NEXTHDR_FRAGMENT)goto DATARMNETbf4095f79e;if(
  70. DATARMNET65293f17c4==IPPROTO_TCP)goto DATARMNET9b3d23a43b;if(DATARMNET65293f17c4
  71. !=IPPROTO_ICMPV6)goto DATARMNETbf4095f79e;memcpy(&DATARMNETa76763310b.
  72. DATARMNET815cbb4bf5,&DATARMNETbf55123e5b->saddr,sizeof(DATARMNETa76763310b.
  73. DATARMNET815cbb4bf5));memcpy(&DATARMNETa76763310b.DATARMNETc3f31215b7,&
  74. DATARMNETbf55123e5b->daddr,sizeof(DATARMNETa76763310b.DATARMNETc3f31215b7));
  75. DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd03+244-0xdf1);}else{goto
  76. DATARMNETbf4095f79e;}rcu_read_lock();hash_for_each_possible_rcu(
  77. DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNETa76763310b.
  78. DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
  79. DATARMNET54338da2ff,&DATARMNETa76763310b))continue;if(likely(hrtimer_is_queued(&
  80. DATARMNET63b1a086d5->DATARMNET9f31ce5d2d)))hrtimer_start(&DATARMNET63b1a086d5->
  81. DATARMNET9f31ce5d2d,DATARMNET5da8c68c19,HRTIMER_MODE_REL);rcu_read_unlock();goto
  82. DATARMNETbf4095f79e;}rcu_read_unlock();spin_lock_irqsave(&DATARMNET820642743b,
  83. DATARMNETfb0677cc3c);DATARMNET63b1a086d5=kzalloc(sizeof(*DATARMNET63b1a086d5),
  84. GFP_ATOMIC);if(!DATARMNET63b1a086d5){spin_unlock_irqrestore(&DATARMNET820642743b
  85. ,DATARMNETfb0677cc3c);goto DATARMNETbf4095f79e;}INIT_HLIST_NODE(&
  86. DATARMNET63b1a086d5->DATARMNETe8608dd267);memcpy(&DATARMNET63b1a086d5->
  87. DATARMNET54338da2ff,&DATARMNETa76763310b,sizeof(DATARMNETa76763310b));
  88. DATARMNET63b1a086d5->DATARMNET7ed5754a5c.DATARMNET57656f6f2f=DATARMNET543491eb0f
  89. ->dev;hrtimer_init(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,CLOCK_MONOTONIC,
  90. HRTIMER_MODE_REL);DATARMNET63b1a086d5->DATARMNET9f31ce5d2d.function=
  91. DATARMNET299a8a08b5;hrtimer_start(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d,
  92. DATARMNET5da8c68c19,HRTIMER_MODE_REL);hash_add_rcu(DATARMNET5413d6f8ec,&
  93. DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNETa76763310b.DATARMNET2cb607d686
  94. );spin_unlock_irqrestore(&DATARMNET820642743b,DATARMNETfb0677cc3c);
  95. DATARMNETbf4095f79e:return RX_HANDLER_PASS;DATARMNET9b3d23a43b:
  96. DATARMNET7ca470d54b(DATARMNET543491eb0f,TCP_FLAG_SYN);return RX_HANDLER_PASS;}
  97. static void DATARMNETbc6bd11f47(struct net_device*DATARMNET00dcb79bc4){struct
  98. DATARMNET4f49486833*DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();
  99. hash_for_each_rcu(DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,
  100. DATARMNETe8608dd267){if(DATARMNET63b1a086d5->DATARMNET7ed5754a5c.
  101. DATARMNET57656f6f2f==DATARMNET00dcb79bc4)hrtimer_cancel(&DATARMNET63b1a086d5->
  102. DATARMNET9f31ce5d2d);}rcu_read_unlock();}static int DATARMNET81ab4de243(struct
  103. notifier_block*DATARMNET272c159b3c,unsigned long DATARMNET7f045a1e6e,void*data){
  104. struct net_device*DATARMNET00dcb79bc4=netdev_notifier_info_to_dev(data);if(!
  105. DATARMNET00dcb79bc4||strncmp(DATARMNET00dcb79bc4->name,
  106. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61",(0xd19+238-0xdfb)))return
  107. NOTIFY_DONE;if(!strncmp(DATARMNET00dcb79bc4->name,
  108. "\x72\x5f\x72\x6d\x6e\x65\x74\x5f\x64\x61\x74\x61\x30",(0xd12+245-0xdfa)))return
  109. NOTIFY_DONE;switch(DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:
  110. netdev_rx_handler_unregister(DATARMNET00dcb79bc4);DATARMNETbc6bd11f47(
  111. DATARMNET00dcb79bc4);break;case NETDEV_REGISTER:if(netdev_rx_handler_register(
  112. DATARMNET00dcb79bc4,DATARMNET68fe094884,NULL))pr_err(
  113. "\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"
  114. ,__func__,DATARMNET00dcb79bc4->name);break;default:break;}return NOTIFY_DONE;}
  115. static struct notifier_block DATARMNET61d0113123={.notifier_call=
  116. DATARMNET81ab4de243,};struct DATARMNET8d3c2559ca*DATARMNET07f0e0f286(struct
  117. DATARMNET0ca9d8ead7*DATARMNET54338da2ff)__must_hold(RCU){struct
  118. DATARMNET4f49486833*DATARMNET63b1a086d5;hash_for_each_possible_rcu(
  119. DATARMNET5413d6f8ec,DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff
  120. ->DATARMNET2cb607d686){if(!DATARMNET5f3c9ed4da(&DATARMNET63b1a086d5->
  121. DATARMNET54338da2ff,DATARMNET54338da2ff))continue;return&DATARMNET63b1a086d5->
  122. DATARMNET7ed5754a5c;}return NULL;}void DATARMNETf4e1a29dbc(void){struct
  123. DATARMNET4f49486833*DATARMNET63b1a086d5;int DATARMNET5c2fd31d7b;rcu_read_lock();
  124. hash_for_each_rcu(DATARMNET5413d6f8ec,DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,
  125. DATARMNETe8608dd267)hrtimer_cancel(&DATARMNET63b1a086d5->DATARMNET9f31ce5d2d);
  126. rcu_read_unlock();}int DATARMNET9f106ed933(void){int DATARMNET268a8314cf;
  127. DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNET61d0113123);if(
  128. DATARMNET268a8314cf)pr_err(
  129. "\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
  130. ,__func__);return DATARMNET268a8314cf;}int DATARMNETf56cbaa2b1(void){int
  131. DATARMNET268a8314cf;DATARMNET268a8314cf=unregister_netdevice_notifier(&
  132. DATARMNET61d0113123);if(DATARMNET268a8314cf)pr_err(
  133. "\x25\x73\x28\x29\x3a\x20\x6e\x6f\x74\x69\x66\x65\x72\x20\x66\x61\x69\x6c\x65\x64" "\n"
  134. ,__func__);return DATARMNET268a8314cf;}