rmnet_wlan_main.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2021, The Linux Foundation. All rights reserved.
  3. *
  4. * RMNET WLAN handler framework
  5. *
  6. */
  7. #include <linux/types.h>
  8. #include <linux/skbuff.h>
  9. #include <net/genetlink.h>
  10. #include <net/netlink.h>
  11. #include <net/ip.h>
  12. #include <net/ipv6.h>
  13. #include <net/tcp.h>
  14. #include <linux/rcupdate.h>
  15. #include <linux/list.h>
  16. #include <linux/rculist.h>
  17. #include <linux/mutex.h>
  18. #include <linux/hashtable.h>
  19. #include <linux/log2.h>
  20. #include <linux/netdevice.h>
  21. #include "rmnet_wlan_genl.h"
  22. #include "rmnet_wlan.h"
  23. #include "rmnet_wlan_stats.h"
  24. #include "rmnet_wlan_fragment.h"
  25. #include "rmnet_wlan_connection.h"
  26. #define DATARMNETaf49b04806 ((0xeb7+1158-0x132d))
  27. #define DATARMNET6b4ac8224c (const_ilog2(DATARMNETaf49b04806))
  28. struct DATARMNET745f724205{struct hlist_node DATARMNETe8608dd267;struct rcu_head
  29. DATARMNET28bfe9e6ad;struct DATARMNETb89ecedefc DATARMNET54338da2ff;};struct
  30. DATARMNET41b426061d{struct hlist_node DATARMNETe8608dd267;struct rcu_head
  31. DATARMNET28bfe9e6ad;struct notifier_block DATARMNET272c159b3c;char
  32. DATARMNET852d4d00e2[IFNAMSIZ];struct DATARMNET8d3c2559ca DATARMNET7ed5754a5c;};
  33. static DEFINE_MUTEX(DATARMNET63a2b7773e);static DEFINE_HASHTABLE(
  34. DATARMNET1903907456,DATARMNET6b4ac8224c);static DEFINE_MUTEX(DATARMNETf46fb02ac6
  35. );static DEFINE_HASHTABLE(DATARMNET78ed39f13b,DATARMNET6b4ac8224c);static char
  36. DATARMNET30500ba48c[IFNAMSIZ];static __be16 DATARMNETfbd1701415;static bool
  37. DATARMNET1e31b22eff(struct DATARMNETb89ecedefc*DATARMNETae0905b0b3,struct
  38. DATARMNETb89ecedefc*DATARMNETdb49f21565){if(DATARMNETae0905b0b3->
  39. DATARMNET0d956cc77a!=DATARMNETdb49f21565->DATARMNET0d956cc77a||
  40. DATARMNETae0905b0b3->DATARMNET4924e79411!=DATARMNETdb49f21565->
  41. DATARMNET4924e79411)return false;if(DATARMNETae0905b0b3->DATARMNET0d956cc77a==
  42. IPPROTO_ESP)return DATARMNETae0905b0b3->DATARMNET906b2ee561==DATARMNETdb49f21565
  43. ->DATARMNET906b2ee561;return DATARMNETae0905b0b3->DATARMNETf0d9de7e2f==
  44. DATARMNETdb49f21565->DATARMNETf0d9de7e2f;}static int DATARMNET0b72d312f9(struct
  45. DATARMNETb89ecedefc*DATARMNET3396919a68,struct genl_info*DATARMNET54338da2ff)
  46. __must_hold(&DATARMNET63a2b7773e){struct DATARMNET745f724205*DATARMNET63b1a086d5
  47. ;rcu_read_lock();if(DATARMNET4eafcdee07(DATARMNET3396919a68)){rcu_read_unlock();
  48. GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  49. "\x54\x75\x70\x6c\x65\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x70\x72\x65\x73\x65\x6e\x74"
  50. );return-EEXIST;}rcu_read_unlock();DATARMNET63b1a086d5=kzalloc(sizeof(*
  51. DATARMNET63b1a086d5),GFP_KERNEL);if(!DATARMNET63b1a086d5){GENL_SET_ERR_MSG(
  52. DATARMNET54338da2ff,
  53. "\x43\x61\x6e\x6e\x6f\x74\x20\x61\x6c\x6c\x6f\x63\x61\x74\x65\x20\x74\x75\x70\x6c\x65\x20\x6d\x65\x6d\x6f\x72\x79"
  54. );return-ENOMEM;}memcpy(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
  55. DATARMNET3396919a68,sizeof(*DATARMNET3396919a68));INIT_HLIST_NODE(&
  56. DATARMNET63b1a086d5->DATARMNETe8608dd267);hash_add_rcu(DATARMNET1903907456,&
  57. DATARMNET63b1a086d5->DATARMNETe8608dd267,DATARMNET3396919a68->
  58. DATARMNETf0d9de7e2f);DATARMNET5ca94dbc3c(DATARMNET12d881921a);return
  59. (0xd2d+202-0xdf7);}static void DATARMNET440ec83e44(struct rcu_head*
  60. DATARMNET28bfe9e6ad){struct DATARMNET745f724205*DATARMNET63b1a086d5;
  61. DATARMNET63b1a086d5=container_of(DATARMNET28bfe9e6ad,struct DATARMNET745f724205,
  62. DATARMNET28bfe9e6ad);if(DATARMNET63b1a086d5)kfree(DATARMNET63b1a086d5);}static
  63. int DATARMNET79343e3135(struct DATARMNETb89ecedefc*DATARMNET3396919a68,struct
  64. genl_info*DATARMNET54338da2ff)__must_hold(&DATARMNET63a2b7773e){struct
  65. DATARMNET745f724205*DATARMNET63b1a086d5;struct hlist_node*DATARMNET0386f6f82a;
  66. hash_for_each_possible_safe(DATARMNET1903907456,DATARMNET63b1a086d5,
  67. DATARMNET0386f6f82a,DATARMNETe8608dd267,DATARMNET3396919a68->DATARMNETf0d9de7e2f
  68. ){if(DATARMNET1e31b22eff(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
  69. DATARMNET3396919a68)){hash_del_rcu(&DATARMNET63b1a086d5->DATARMNETe8608dd267);
  70. call_rcu(&DATARMNET63b1a086d5->DATARMNET28bfe9e6ad,DATARMNET440ec83e44);
  71. DATARMNET5ca94dbc3c(DATARMNET9f24b86462);return(0xd2d+202-0xdf7);}}
  72. GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  73. "\x4e\x6f\x20\x73\x75\x63\x68\x20\x74\x75\x70\x6c\x65");return-ESRCH;}static
  74. void DATARMNETad43e44c7e(void){struct DATARMNET745f724205*DATARMNET63b1a086d5;
  75. struct hlist_node*DATARMNET0386f6f82a;int DATARMNET5c2fd31d7b;mutex_lock(&
  76. DATARMNET63a2b7773e);hash_for_each_safe(DATARMNET1903907456,DATARMNET5c2fd31d7b,
  77. DATARMNET0386f6f82a,DATARMNET63b1a086d5,DATARMNETe8608dd267){hash_del_rcu(&
  78. DATARMNET63b1a086d5->DATARMNETe8608dd267);call_rcu(&DATARMNET63b1a086d5->
  79. DATARMNET28bfe9e6ad,DATARMNET440ec83e44);}mutex_unlock(&DATARMNET63a2b7773e);}
  80. static bool DATARMNET55aac1386b(struct DATARMNET8d3c2559ca*DATARMNET1476c48228,
  81. struct DATARMNET8d3c2559ca*DATARMNET57a0f36a25){struct in6_addr
  82. DATARMNET4c8c2ca74e={.s6_addr32={4294967295,4294967295,(0xd2d+202-0xdf7),
  83. (0xd2d+202-0xdf7)},};if(DATARMNET1476c48228->DATARMNET0d956cc77a!=
  84. DATARMNET57a0f36a25->DATARMNET0d956cc77a)return false;if(DATARMNET1476c48228->
  85. DATARMNET0d956cc77a==(0xd11+230-0xdf3))return DATARMNET1476c48228->
  86. DATARMNET0dc14167a1==DATARMNET57a0f36a25->DATARMNET0dc14167a1;return!
  87. ipv6_masked_addr_cmp(&DATARMNET1476c48228->DATARMNET5700daac01,&
  88. DATARMNET4c8c2ca74e,&DATARMNET57a0f36a25->DATARMNET5700daac01);}static struct
  89. DATARMNET41b426061d*DATARMNETcc0a01df2a(struct DATARMNET8d3c2559ca*
  90. DATARMNET54338da2ff)__must_hold(RCU){struct DATARMNET41b426061d*
  91. DATARMNET63b1a086d5;hash_for_each_possible_rcu(DATARMNET78ed39f13b,
  92. DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET54338da2ff->DATARMNET0dc14167a1
  93. ){if(DATARMNET55aac1386b(&DATARMNET63b1a086d5->DATARMNET7ed5754a5c,
  94. DATARMNET54338da2ff))return DATARMNET63b1a086d5;}return NULL;}static int
  95. DATARMNETe98553a8fc(struct notifier_block*DATARMNET272c159b3c,unsigned long
  96. DATARMNET7f045a1e6e,void*data){struct net_device*DATARMNET00dcb79bc4=
  97. netdev_notifier_info_to_dev(data);struct DATARMNET41b426061d*DATARMNET2d4b4cfc9e
  98. ;DATARMNET2d4b4cfc9e=container_of(DATARMNET272c159b3c,struct DATARMNET41b426061d
  99. ,DATARMNET272c159b3c);if(!DATARMNET00dcb79bc4||strncmp(DATARMNET00dcb79bc4->name
  100. ,DATARMNET2d4b4cfc9e->DATARMNET852d4d00e2,IFNAMSIZ))return NOTIFY_DONE;switch(
  101. DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:if(DATARMNET2d4b4cfc9e->
  102. DATARMNET7ed5754a5c.DATARMNET57656f6f2f){dev_put(DATARMNET2d4b4cfc9e->
  103. DATARMNET7ed5754a5c.DATARMNET57656f6f2f);WRITE_ONCE(DATARMNET2d4b4cfc9e->
  104. DATARMNET7ed5754a5c.DATARMNET57656f6f2f,NULL);}break;case NETDEV_REGISTER:if(!
  105. DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c.DATARMNET57656f6f2f){dev_hold(
  106. DATARMNET00dcb79bc4);WRITE_ONCE(DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c.
  107. DATARMNET57656f6f2f,DATARMNET00dcb79bc4);}break;default:break;}return
  108. NOTIFY_DONE;}static int DATARMNET1ac13d5a2a(struct DATARMNET8d3c2559ca*
  109. DATARMNET7ed5754a5c,struct genl_info*DATARMNET54338da2ff)__must_hold(&
  110. DATARMNETf46fb02ac6){struct DATARMNET41b426061d*DATARMNET2d4b4cfc9e;int
  111. DATARMNET268a8314cf;rcu_read_lock();DATARMNET2d4b4cfc9e=DATARMNETcc0a01df2a(
  112. DATARMNET7ed5754a5c);if(DATARMNET2d4b4cfc9e){GENL_SET_ERR_MSG(
  113. DATARMNET54338da2ff,
  114. "\x46\x57\x44\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x70\x72\x65\x73\x65\x6e\x74"
  115. );rcu_read_unlock();return-EEXIST;}rcu_read_unlock();DATARMNET2d4b4cfc9e=kzalloc
  116. (sizeof(*DATARMNET2d4b4cfc9e),GFP_KERNEL);if(!DATARMNET2d4b4cfc9e){
  117. GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  118. "\x43\x61\x6e\x6e\x6f\x74\x20\x61\x6c\x6c\x6f\x63\x61\x74\x65\x20\x46\x57\x44\x20\x63\x6f\x6e\x74\x65\x78\x74"
  119. );return-ENOMEM;}memcpy(&DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c,
  120. DATARMNET7ed5754a5c,sizeof(*DATARMNET7ed5754a5c));DATARMNET2d4b4cfc9e->
  121. DATARMNET7ed5754a5c.DATARMNET57656f6f2f=NULL;strlcpy(DATARMNET2d4b4cfc9e->
  122. DATARMNET852d4d00e2,DATARMNET7ed5754a5c->DATARMNET57656f6f2f->name,IFNAMSIZ);
  123. DATARMNET2d4b4cfc9e->DATARMNET272c159b3c.notifier_call=DATARMNETe98553a8fc;
  124. DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNET2d4b4cfc9e->
  125. DATARMNET272c159b3c);if(DATARMNET268a8314cf){GENL_SET_ERR_MSG(
  126. DATARMNET54338da2ff,
  127. "\x52\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x46\x57\x44\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
  128. );kfree(DATARMNET2d4b4cfc9e);return DATARMNET268a8314cf;}INIT_HLIST_NODE(&
  129. DATARMNET2d4b4cfc9e->DATARMNETe8608dd267);hash_add_rcu(DATARMNET78ed39f13b,&
  130. DATARMNET2d4b4cfc9e->DATARMNETe8608dd267,DATARMNET7ed5754a5c->
  131. DATARMNET0dc14167a1);return(0xd2d+202-0xdf7);}static void DATARMNET70718e4fdd(
  132. struct rcu_head*DATARMNET28bfe9e6ad){struct DATARMNET41b426061d*
  133. DATARMNET63b1a086d5;DATARMNET63b1a086d5=container_of(DATARMNET28bfe9e6ad,struct
  134. DATARMNET41b426061d,DATARMNET28bfe9e6ad);if(DATARMNET63b1a086d5)kfree(
  135. DATARMNET63b1a086d5);}static int DATARMNET6518a28641(struct DATARMNET41b426061d*
  136. DATARMNET2d4b4cfc9e)__must_hold(&DATARMNETf46fb02ac6){int DATARMNET268a8314cf;
  137. DATARMNET268a8314cf=unregister_netdevice_notifier(&DATARMNET2d4b4cfc9e->
  138. DATARMNET272c159b3c);if(DATARMNET268a8314cf)return DATARMNET268a8314cf;
  139. hash_del_rcu(&DATARMNET2d4b4cfc9e->DATARMNETe8608dd267);DATARMNETedae8262e1(&
  140. DATARMNET2d4b4cfc9e->DATARMNET7ed5754a5c);call_rcu(&DATARMNET2d4b4cfc9e->
  141. DATARMNET28bfe9e6ad,DATARMNET70718e4fdd);return DATARMNET268a8314cf;}static int
  142. DATARMNET6b6be8e27f(struct DATARMNET8d3c2559ca*DATARMNET7ed5754a5c,struct
  143. genl_info*DATARMNET54338da2ff)__must_hold(&DATARMNETf46fb02ac6){struct
  144. DATARMNET41b426061d*DATARMNET2d4b4cfc9e;int DATARMNET268a8314cf;rcu_read_lock();
  145. DATARMNET2d4b4cfc9e=DATARMNETcc0a01df2a(DATARMNET7ed5754a5c);rcu_read_unlock();
  146. if(!DATARMNET2d4b4cfc9e){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  147. "\x4e\x6f\x20\x73\x75\x63\x68\x20\x46\x57\x44\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e"
  148. );return-ESRCH;}if(strncmp(DATARMNET2d4b4cfc9e->DATARMNET852d4d00e2,
  149. DATARMNET7ed5754a5c->DATARMNET57656f6f2f->name,IFNAMSIZ)){GENL_SET_ERR_MSG(
  150. DATARMNET54338da2ff,
  151. "\x49\x6e\x63\x6f\x72\x72\x65\x63\x74\x20\x46\x57\x44\x20\x64\x65\x76\x69\x63\x65"
  152. );return-ENODEV;}DATARMNET268a8314cf=DATARMNET6518a28641(DATARMNET2d4b4cfc9e);if
  153. (DATARMNET268a8314cf){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  154. "\x55\x6e\x72\x65\x67\x69\x73\x74\x65\x72\x69\x6e\x67\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
  155. );return DATARMNET268a8314cf;}return DATARMNET268a8314cf;}static void
  156. DATARMNETe5b03fe375(void){struct DATARMNET41b426061d*DATARMNET54338da2ff;struct
  157. hlist_node*DATARMNET0386f6f82a;int DATARMNET5c2fd31d7b;mutex_lock(&
  158. DATARMNETf46fb02ac6);hash_for_each_safe(DATARMNET78ed39f13b,DATARMNET5c2fd31d7b,
  159. DATARMNET0386f6f82a,DATARMNET54338da2ff,DATARMNETe8608dd267)DATARMNET6518a28641(
  160. DATARMNET54338da2ff);mutex_unlock(&DATARMNETf46fb02ac6);}static
  161. rx_handler_result_t DATARMNET37a92021f9(struct sk_buff**DATARMNET89946cec52){
  162. struct DATARMNET0ca9d8ead7 DATARMNETa76763310b={};struct DATARMNETb89ecedefc
  163. DATARMNET3396919a68={};struct DATARMNET41b426061d*DATARMNET72f0eefdce;struct
  164. DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e,DATARMNET54338da2ff;struct sk_buff*
  165. DATARMNET543491eb0f=*DATARMNET89946cec52;rx_handler_result_t DATARMNET1dec89a127
  166. =RX_HANDLER_PASS;int DATARMNET611d08d671;if(!DATARMNET543491eb0f||
  167. DATARMNET543491eb0f->pkt_type==PACKET_LOOPBACK)return DATARMNET1dec89a127;
  168. rcu_read_lock();DATARMNET5ca94dbc3c(DATARMNET735bb8578c);if(DATARMNET543491eb0f
  169. ->protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9=ip_hdr(
  170. DATARMNET543491eb0f);if(DATARMNET86f1f2cdc9->protocol==IPPROTO_ICMP){
  171. DATARMNETa76763310b.DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9->daddr;
  172. DATARMNETa76763310b.DATARMNET2cb607d686=DATARMNET86f1f2cdc9->saddr;
  173. DATARMNETa76763310b.DATARMNET0d956cc77a=(0xd11+230-0xdf3);DATARMNET2d4b4cfc9e=
  174. DATARMNET07f0e0f286(&DATARMNETa76763310b);if(DATARMNET2d4b4cfc9e)goto
  175. DATARMNET1e5291b369;}DATARMNET54338da2ff.DATARMNET0dc14167a1=DATARMNET86f1f2cdc9
  176. ->daddr;DATARMNET54338da2ff.DATARMNET0d956cc77a=(0xd11+230-0xdf3);
  177. DATARMNET72f0eefdce=DATARMNETcc0a01df2a(&DATARMNET54338da2ff);if(!
  178. DATARMNET72f0eefdce)goto DATARMNETbf4095f79e;DATARMNET2d4b4cfc9e=&
  179. DATARMNET72f0eefdce->DATARMNET7ed5754a5c;DATARMNET3396919a68.DATARMNET0d956cc77a
  180. =(0xd11+230-0xdf3);DATARMNET3396919a68.DATARMNET4924e79411=DATARMNET86f1f2cdc9->
  181. protocol;DATARMNET611d08d671=DATARMNET86f1f2cdc9->ihl*(0xd11+230-0xdf3);if(
  182. ip_is_fragment(DATARMNET86f1f2cdc9)){if(!DATARMNET579f75aa50(DATARMNET543491eb0f
  183. ,DATARMNET611d08d671,&DATARMNET3396919a68,DATARMNET2d4b4cfc9e))
  184. DATARMNET1dec89a127=RX_HANDLER_CONSUMED;goto DATARMNETbf4095f79e;}}else if(
  185. DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
  186. DATARMNETbf55123e5b=ipv6_hdr(DATARMNET543491eb0f);__be16 frag_off;u8
  187. DATARMNET65293f17c4;DATARMNET65293f17c4=DATARMNETbf55123e5b->nexthdr;
  188. DATARMNET611d08d671=ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*
  189. DATARMNETbf55123e5b),&DATARMNET65293f17c4,&frag_off);if(DATARMNET611d08d671<
  190. (0xd2d+202-0xdf7))goto DATARMNETbf4095f79e;if(DATARMNET65293f17c4==
  191. IPPROTO_ICMPV6){memcpy(&DATARMNETa76763310b.DATARMNET815cbb4bf5,&
  192. DATARMNETbf55123e5b->daddr,sizeof(DATARMNETa76763310b.DATARMNET815cbb4bf5));
  193. memcpy(&DATARMNETa76763310b.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->saddr,
  194. sizeof(DATARMNETa76763310b.DATARMNETc3f31215b7));DATARMNETa76763310b.
  195. DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNET2d4b4cfc9e=DATARMNET07f0e0f286(&
  196. DATARMNETa76763310b);if(DATARMNET2d4b4cfc9e)goto DATARMNET1e5291b369;}memcpy(&
  197. DATARMNET54338da2ff.DATARMNET5700daac01,&DATARMNETbf55123e5b->daddr,sizeof(
  198. DATARMNET54338da2ff.DATARMNET5700daac01));DATARMNET54338da2ff.
  199. DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNET72f0eefdce=DATARMNETcc0a01df2a(&
  200. DATARMNET54338da2ff);if(!DATARMNET72f0eefdce)goto DATARMNETbf4095f79e;
  201. DATARMNET2d4b4cfc9e=&DATARMNET72f0eefdce->DATARMNET7ed5754a5c;
  202. DATARMNET3396919a68.DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNET3396919a68.
  203. DATARMNET4924e79411=DATARMNET65293f17c4;if(frag_off){if(!DATARMNETaca8ca54ed(
  204. DATARMNET543491eb0f,DATARMNET611d08d671,&DATARMNET3396919a68,DATARMNET2d4b4cfc9e
  205. ))DATARMNET1dec89a127=RX_HANDLER_CONSUMED;goto DATARMNETbf4095f79e;}}else{goto
  206. DATARMNETbf4095f79e;}if(DATARMNET3396919a68.DATARMNET4924e79411==IPPROTO_TCP||
  207. DATARMNET3396919a68.DATARMNET4924e79411==IPPROTO_UDP){struct udphdr*
  208. DATARMNET75be5f3406=(struct udphdr*)(DATARMNET543491eb0f->data+
  209. DATARMNET611d08d671);DATARMNET3396919a68.DATARMNETf0d9de7e2f=DATARMNET75be5f3406
  210. ->dest;if(DATARMNETa8b2566e6a(DATARMNET543491eb0f,&DATARMNET3396919a68,
  211. DATARMNET611d08d671)){DATARMNET5ca94dbc3c(DATARMNETd1ad664d00);goto
  212. DATARMNETbf4095f79e;}}else if(DATARMNET3396919a68.DATARMNET4924e79411==
  213. IPPROTO_ESP){struct ip_esp_hdr*DATARMNET73ee6a7020=(struct ip_esp_hdr*)(
  214. DATARMNET543491eb0f->data+DATARMNET611d08d671);DATARMNET3396919a68.
  215. DATARMNET906b2ee561=DATARMNET73ee6a7020->spi;}else{goto DATARMNETbf4095f79e;}if(
  216. DATARMNET4eafcdee07(&DATARMNET3396919a68))goto DATARMNET1e5291b369;goto
  217. DATARMNETbf4095f79e;DATARMNET1e5291b369:if(!DATARMNET4899053671(
  218. DATARMNET543491eb0f,DATARMNET2d4b4cfc9e))DATARMNET1dec89a127=RX_HANDLER_CONSUMED
  219. ;DATARMNETbf4095f79e:rcu_read_unlock();return DATARMNET1dec89a127;}static int
  220. DATARMNET0ed065ddb7(struct notifier_block*DATARMNET272c159b3c,unsigned long
  221. DATARMNET7f045a1e6e,void*data){struct net_device*DATARMNET00dcb79bc4=
  222. netdev_notifier_info_to_dev(data);if(!DATARMNET00dcb79bc4||strncmp(
  223. DATARMNET00dcb79bc4->name,DATARMNET30500ba48c,IFNAMSIZ))return NOTIFY_DONE;
  224. switch(DATARMNET7f045a1e6e){case NETDEV_UNREGISTER:netdev_rx_handler_unregister(
  225. DATARMNET00dcb79bc4);break;case NETDEV_REGISTER:if(netdev_rx_handler_register(
  226. DATARMNET00dcb79bc4,DATARMNET37a92021f9,NULL))pr_err(
  227. "\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\x66\x61\x69\x6c\x65\x64" "\n"
  228. ,__func__);break;default:break;}return NOTIFY_DONE;}static struct notifier_block
  229. DATARMNETa1726000d8={.notifier_call=DATARMNET0ed065ddb7,};static int
  230. DATARMNET116f9a46aa(void){int DATARMNET268a8314cf;if(!DATARMNET30500ba48c[
  231. (0xd2d+202-0xdf7)])return(0xd2d+202-0xdf7);DATARMNET268a8314cf=
  232. unregister_netdevice_notifier(&DATARMNETa1726000d8);if(!DATARMNET268a8314cf)
  233. DATARMNET30500ba48c[(0xd2d+202-0xdf7)]=(0xd2d+202-0xdf7);return
  234. DATARMNET268a8314cf;}static void DATARMNETbb4efa5b3d(void){DATARMNET116f9a46aa()
  235. ;DATARMNETfbd1701415=(0xd2d+202-0xdf7);DATARMNET8c0e010dfb();DATARMNETe5b03fe375
  236. ();DATARMNETad43e44c7e();}static int DATARMNET38ebe8f319(struct sk_buff*
  237. DATARMNET543491eb0f,int DATARMNET1faf88208b){if(!pskb_may_pull(
  238. DATARMNET543491eb0f,DATARMNET1faf88208b))return-ENOMEM;if(!skb_cloned(
  239. DATARMNET543491eb0f)||skb_clone_writable(DATARMNET543491eb0f,DATARMNET1faf88208b
  240. ))return(0xd2d+202-0xdf7);return pskb_expand_head(DATARMNET543491eb0f,
  241. (0xd2d+202-0xdf7),(0xd2d+202-0xdf7),GFP_ATOMIC);}static void DATARMNET9a8d756527
  242. (__sum16*DATARMNETc2284e5688,struct sk_buff*DATARMNET543491eb0f,__be32
  243. DATARMNET9080427d4e,__be32 DATARMNETc0e620c987,bool DATARMNETcb0345b337){if(
  244. DATARMNET543491eb0f->ip_summed!=CHECKSUM_PARTIAL){csum_replace4(
  245. DATARMNETc2284e5688,DATARMNET9080427d4e,DATARMNETc0e620c987);if(
  246. DATARMNET543491eb0f->ip_summed==CHECKSUM_COMPLETE&&DATARMNETcb0345b337){
  247. DATARMNET543491eb0f->csum=csum_sub(~(DATARMNET543491eb0f->csum),(__wsum)
  248. DATARMNET9080427d4e);DATARMNET543491eb0f->csum=~csum_add(DATARMNET543491eb0f->
  249. csum,(__wsum)DATARMNETc0e620c987);}}else if(DATARMNETcb0345b337){__wsum
  250. DATARMNET0386f6f82a=csum_unfold(*DATARMNETc2284e5688);DATARMNET0386f6f82a=
  251. csum_sub(DATARMNET0386f6f82a,(__wsum)DATARMNET9080427d4e);DATARMNET0386f6f82a=
  252. csum_add(DATARMNET0386f6f82a,(__wsum)DATARMNETc0e620c987);*DATARMNETc2284e5688=~
  253. csum_fold(DATARMNET0386f6f82a);}}static void DATARMNETc03853e26d(__sum16*
  254. DATARMNETc2284e5688,struct sk_buff*DATARMNET543491eb0f,__be16
  255. DATARMNET9080427d4e,__be16 DATARMNETc0e620c987,bool DATARMNETcb0345b337){
  256. DATARMNET9a8d756527(DATARMNETc2284e5688,DATARMNET543491eb0f,(__be32)
  257. DATARMNET9080427d4e,(__be32)DATARMNETc0e620c987,DATARMNETcb0345b337);}static
  258. unsigned int DATARMNET7060ca9a47(u8*DATARMNET54fdee4fda,unsigned int
  259. DATARMNET6396f657b3){if(DATARMNET54fdee4fda[DATARMNET6396f657b3]==TCPOPT_EOL||
  260. DATARMNET54fdee4fda[DATARMNET6396f657b3]==TCPOPT_NOP||!DATARMNET54fdee4fda[
  261. DATARMNET6396f657b3+(0xd26+209-0xdf6)])return(0xd26+209-0xdf6);return
  262. DATARMNET54fdee4fda[DATARMNET6396f657b3+(0xd26+209-0xdf6)];}void
  263. DATARMNET7ca470d54b(struct sk_buff*DATARMNET543491eb0f,u32 DATARMNET1464100e7a){
  264. struct tcphdr*DATARMNET668416551c;u8 DATARMNET630b15102e[(0xf07+1090-0x130d)];u8
  265. *DATARMNET54fdee4fda;__be16 DATARMNETdda9f3dd51=htons((0xef7+3481-0x181c));u16
  266. DATARMNET611d08d671;u16 DATARMNET7fa3427233;unsigned int DATARMNETefc9df3df2;
  267. __be32 DATARMNET572f0d1999;u8 DATARMNET0d956cc77a;if(DATARMNET543491eb0f->
  268. protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9,DATARMNETbf6548198e;
  269. DATARMNET0d956cc77a=(0xd11+230-0xdf3);DATARMNET86f1f2cdc9=skb_header_pointer(
  270. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNET86f1f2cdc9),&
  271. DATARMNETbf6548198e);if(!DATARMNET86f1f2cdc9)goto DATARMNET268a8314cf;if(
  272. DATARMNET86f1f2cdc9->protocol!=IPPROTO_TCP)goto DATARMNETed6aa0a77f;
  273. DATARMNET611d08d671=DATARMNET86f1f2cdc9->ihl*(0xd11+230-0xdf3);}else if(
  274. DATARMNET543491eb0f->protocol==htons(ETH_P_IPV6)){struct ipv6hdr*
  275. DATARMNETbf55123e5b,DATARMNETcf1d9e2c1e;__be16 frag_off;u8 DATARMNETa8d8445982;
  276. DATARMNET0d956cc77a=(0xd03+244-0xdf1);DATARMNETbf55123e5b=skb_header_pointer(
  277. DATARMNET543491eb0f,(0xd2d+202-0xdf7),sizeof(*DATARMNETbf55123e5b),&
  278. DATARMNETcf1d9e2c1e);if(!DATARMNETbf55123e5b)goto DATARMNET268a8314cf;
  279. DATARMNETa8d8445982=DATARMNETbf55123e5b->nexthdr;DATARMNET611d08d671=
  280. ipv6_skip_exthdr(DATARMNET543491eb0f,sizeof(*DATARMNETbf55123e5b),&
  281. DATARMNETa8d8445982,&frag_off);if(DATARMNET611d08d671<(0xd2d+202-0xdf7))goto
  282. DATARMNET268a8314cf;if(DATARMNETa8d8445982!=IPPROTO_TCP)goto DATARMNETed6aa0a77f
  283. ;}else{goto DATARMNET268a8314cf;}DATARMNET668416551c=skb_header_pointer(
  284. DATARMNET543491eb0f,DATARMNET611d08d671,sizeof(*DATARMNET668416551c),&
  285. DATARMNET630b15102e);if(!DATARMNET668416551c)goto DATARMNET268a8314cf;if(!(
  286. tcp_flag_word(DATARMNET668416551c)&DATARMNET1464100e7a))goto DATARMNETed6aa0a77f
  287. ;DATARMNET7fa3427233=DATARMNET668416551c->doff*(0xd11+230-0xdf3);if(
  288. DATARMNET38ebe8f319(DATARMNET543491eb0f,DATARMNET611d08d671+DATARMNET7fa3427233)
  289. )goto DATARMNET268a8314cf;DATARMNET668416551c=skb_header_pointer(
  290. DATARMNET543491eb0f,DATARMNET611d08d671,DATARMNET7fa3427233,&DATARMNET630b15102e
  291. );if(!DATARMNET668416551c)goto DATARMNET268a8314cf;DATARMNET54fdee4fda=(u8*)
  292. DATARMNET668416551c;for(DATARMNETefc9df3df2=sizeof(*DATARMNET668416551c);
  293. DATARMNETefc9df3df2<DATARMNET7fa3427233;DATARMNETefc9df3df2+=DATARMNET7060ca9a47
  294. (DATARMNET54fdee4fda,DATARMNETefc9df3df2)){__be16*DATARMNETb3032fac16;if(
  295. DATARMNET54fdee4fda[DATARMNETefc9df3df2]!=TCPOPT_MSS||DATARMNET54fdee4fda[
  296. DATARMNETefc9df3df2+(0xd26+209-0xdf6)]!=TCPOLEN_MSS)continue;DATARMNETb3032fac16
  297. =(__be16*)(&DATARMNET54fdee4fda[DATARMNETefc9df3df2+(0xd1f+216-0xdf5)]);if(*
  298. DATARMNETb3032fac16<=DATARMNETdda9f3dd51)goto DATARMNETed6aa0a77f;
  299. DATARMNETc03853e26d(&DATARMNET668416551c->check,DATARMNET543491eb0f,*
  300. DATARMNETb3032fac16,DATARMNETdda9f3dd51,false);*DATARMNETb3032fac16=
  301. DATARMNETdda9f3dd51;DATARMNET5ca94dbc3c(DATARMNETef2af4f071);return;}if(
  302. DATARMNET543491eb0f->len>DATARMNET611d08d671+DATARMNET7fa3427233||
  303. DATARMNET7fa3427233>=(0xf07+1090-0x130d))goto DATARMNETed6aa0a77f;if(
  304. skb_tailroom(DATARMNET543491eb0f)<TCPOLEN_MSS){if(pskb_expand_head(
  305. DATARMNET543491eb0f,(0xd2d+202-0xdf7),TCPOLEN_MSS-skb_tailroom(
  306. DATARMNET543491eb0f),GFP_ATOMIC))goto DATARMNET268a8314cf;DATARMNET668416551c=
  307. skb_header_pointer(DATARMNET543491eb0f,DATARMNET611d08d671,DATARMNET7fa3427233,&
  308. DATARMNET630b15102e);if(!DATARMNET668416551c)goto DATARMNET268a8314cf;}
  309. DATARMNETc03853e26d(&DATARMNET668416551c->check,DATARMNET543491eb0f,htons(
  310. DATARMNET543491eb0f->len-DATARMNET611d08d671),htons(DATARMNET543491eb0f->len-
  311. DATARMNET611d08d671+TCPOLEN_MSS),true);DATARMNET54fdee4fda=skb_put(
  312. DATARMNET543491eb0f,TCPOLEN_MSS);if(DATARMNET0d956cc77a==(0xd11+230-0xdf3))
  313. DATARMNETdda9f3dd51=htons(min_t(u16,ntohs(DATARMNETdda9f3dd51),
  314. (0x545+2434-0xcaf)));else DATARMNETdda9f3dd51=htons(min_t(u16,ntohs(
  315. DATARMNETdda9f3dd51),(0xbf7+4058-0x170d)));DATARMNET54fdee4fda[(0xd2d+202-0xdf7)
  316. ]=TCPOPT_MSS;DATARMNET54fdee4fda[(0xd26+209-0xdf6)]=TCPOLEN_MSS;*((__be16*)(
  317. DATARMNET54fdee4fda+(0xd1f+216-0xdf5)))=DATARMNETdda9f3dd51;DATARMNET9a8d756527(
  318. &DATARMNET668416551c->check,DATARMNET543491eb0f,(0xd2d+202-0xdf7),*((__be32*)
  319. DATARMNET54fdee4fda),false);DATARMNET572f0d1999=tcp_flag_word(
  320. DATARMNET668416551c);DATARMNET668416551c->doff++;DATARMNET9a8d756527(&
  321. DATARMNET668416551c->check,DATARMNET543491eb0f,DATARMNET572f0d1999,tcp_flag_word
  322. (DATARMNET668416551c),false);if(DATARMNET0d956cc77a==(0xd11+230-0xdf3)){struct
  323. iphdr*DATARMNET86f1f2cdc9=ip_hdr(DATARMNET543491eb0f);csum_replace2(&
  324. DATARMNET86f1f2cdc9->check,DATARMNET86f1f2cdc9->tot_len,htons(
  325. DATARMNET543491eb0f->len));DATARMNET86f1f2cdc9->tot_len=htons(
  326. DATARMNET543491eb0f->len);}else{struct ipv6hdr*DATARMNETbf55123e5b=ipv6_hdr(
  327. DATARMNET543491eb0f);DATARMNETbf55123e5b->payload_len=htons(ntohs(
  328. DATARMNETbf55123e5b->payload_len)+TCPOLEN_MSS);}DATARMNET5ca94dbc3c(
  329. DATARMNETef2af4f071);return;DATARMNETed6aa0a77f:DATARMNET5ca94dbc3c(
  330. DATARMNETebc1b87b7d);return;DATARMNET268a8314cf:DATARMNET5ca94dbc3c(
  331. DATARMNET21bdbe6a27);return;}int DATARMNET4899053671(struct sk_buff*
  332. DATARMNET543491eb0f,struct DATARMNET8d3c2559ca*DATARMNET54338da2ff){struct
  333. net_device*DATARMNET00dcb79bc4;DATARMNET00dcb79bc4=READ_ONCE(DATARMNET54338da2ff
  334. ->DATARMNET57656f6f2f);if(!DATARMNET00dcb79bc4){DATARMNET5ca94dbc3c(
  335. DATARMNET591885a019);return-ENODEV;}DATARMNET7ca470d54b(DATARMNET543491eb0f,
  336. TCP_FLAG_SYN|TCP_FLAG_ACK);DATARMNET543491eb0f->dev=DATARMNET00dcb79bc4;
  337. dev_queue_xmit(DATARMNET543491eb0f);DATARMNET5ca94dbc3c(DATARMNETf4c2a83526);
  338. return(0xd2d+202-0xdf7);}bool DATARMNET4eafcdee07(struct DATARMNETb89ecedefc*
  339. DATARMNET3396919a68)__must_hold(RCU){struct DATARMNET745f724205*
  340. DATARMNET63b1a086d5;hash_for_each_possible_rcu(DATARMNET1903907456,
  341. DATARMNET63b1a086d5,DATARMNETe8608dd267,DATARMNET3396919a68->DATARMNETf0d9de7e2f
  342. ){if(DATARMNET1e31b22eff(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
  343. DATARMNET3396919a68))return true;}return false;}int DATARMNET53f12a0f7d(struct
  344. DATARMNETb89ecedefc*DATARMNETcadc2ef9aa,u32 DATARMNETef77661260,struct genl_info
  345. *DATARMNET54338da2ff){int DATARMNET268a8314cf;u32 DATARMNETefc9df3df2;mutex_lock
  346. (&DATARMNET63a2b7773e);for(DATARMNETefc9df3df2=(0xd2d+202-0xdf7);
  347. DATARMNETefc9df3df2<DATARMNETef77661260;DATARMNETefc9df3df2++){
  348. DATARMNET268a8314cf=DATARMNET0b72d312f9(&DATARMNETcadc2ef9aa[DATARMNETefc9df3df2
  349. ],DATARMNET54338da2ff);if(DATARMNET268a8314cf){if(DATARMNET268a8314cf==-EEXIST)
  350. DATARMNET268a8314cf=(0xd2d+202-0xdf7);else break;}}mutex_unlock(&
  351. DATARMNET63a2b7773e);return DATARMNET268a8314cf;}int DATARMNET07f6485c9b(struct
  352. DATARMNETb89ecedefc*DATARMNETcadc2ef9aa,u32 DATARMNETef77661260,struct genl_info
  353. *DATARMNET54338da2ff){int DATARMNET268a8314cf;u32 DATARMNETefc9df3df2;mutex_lock
  354. (&DATARMNET63a2b7773e);for(DATARMNETefc9df3df2=(0xd2d+202-0xdf7);
  355. DATARMNETefc9df3df2<DATARMNETef77661260;DATARMNETefc9df3df2++){
  356. DATARMNET268a8314cf=DATARMNET79343e3135(&DATARMNETcadc2ef9aa[DATARMNETefc9df3df2
  357. ],DATARMNET54338da2ff);if(DATARMNET268a8314cf){if(DATARMNET268a8314cf==-ESRCH)
  358. DATARMNET268a8314cf=(0xd2d+202-0xdf7);else break;}}mutex_unlock(&
  359. DATARMNET63a2b7773e);return DATARMNET268a8314cf;}int DATARMNET97b2388e63(char*
  360. DATARMNET852d4d00e2,struct genl_info*DATARMNET54338da2ff){int
  361. DATARMNET268a8314cf;if(!strncmp(DATARMNET30500ba48c,DATARMNET852d4d00e2,IFNAMSIZ
  362. )){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  363. "\x44\x65\x76\x69\x63\x65\x20\x69\x73\x20\x61\x6c\x72\x65\x61\x64\x79\x20\x73\x65\x74"
  364. );return(0xd2d+202-0xdf7);}DATARMNET268a8314cf=DATARMNET116f9a46aa();if(
  365. DATARMNET268a8314cf){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  366. "\x4b\x65\x72\x6e\x65\x6c\x20\x65\x72\x72\x6f\x72\x2c\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x75\x6e\x72\x65\x67\x69\x73\x74\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
  367. );return DATARMNET268a8314cf;}strlcpy(DATARMNET30500ba48c,DATARMNET852d4d00e2,
  368. IFNAMSIZ);DATARMNET268a8314cf=register_netdevice_notifier(&DATARMNETa1726000d8);
  369. if(DATARMNET268a8314cf){GENL_SET_ERR_MSG(DATARMNET54338da2ff,
  370. "\x4b\x65\x72\x6e\x65\x6c\x20\x65\x72\x72\x6f\x72\x2c\x20\x6e\x6f\x74\x69\x66\x69\x65\x72\x20\x66\x61\x69\x6c\x65\x64"
  371. );DATARMNET30500ba48c[(0xd2d+202-0xdf7)]=(0xd2d+202-0xdf7);}return
  372. DATARMNET268a8314cf;}int DATARMNETa903cd5994(char*DATARMNET852d4d00e2,struct
  373. genl_info*DATARMNET54338da2ff){return DATARMNET116f9a46aa();}int
  374. DATARMNET947eb110d2(struct DATARMNET8d3c2559ca*DATARMNET2d4b4cfc9e,struct
  375. genl_info*DATARMNET54338da2ff){int DATARMNET268a8314cf;mutex_lock(&
  376. DATARMNETf46fb02ac6);DATARMNET268a8314cf=DATARMNET1ac13d5a2a(DATARMNET2d4b4cfc9e
  377. ,DATARMNET54338da2ff);mutex_unlock(&DATARMNETf46fb02ac6);return
  378. DATARMNET268a8314cf;}int DATARMNETb8b35fdc18(struct DATARMNET8d3c2559ca*
  379. DATARMNET2d4b4cfc9e,struct genl_info*DATARMNET54338da2ff){int
  380. DATARMNET268a8314cf;mutex_lock(&DATARMNETf46fb02ac6);DATARMNET268a8314cf=
  381. DATARMNET6b6be8e27f(DATARMNET2d4b4cfc9e,DATARMNET54338da2ff);mutex_unlock(&
  382. DATARMNETf46fb02ac6);return DATARMNET268a8314cf;}int DATARMNET8d5a5a7047(__be16
  383. DATARMNETf0d9de7e2f,struct genl_info*DATARMNET54338da2ff){WRITE_ONCE(
  384. DATARMNETfbd1701415,DATARMNETf0d9de7e2f);return(0xd2d+202-0xdf7);}int
  385. DATARMNETc97c6a4265(__be16 DATARMNETf0d9de7e2f,struct genl_info*
  386. DATARMNET54338da2ff){__be16 DATARMNET07fc49caf2=READ_ONCE(DATARMNETfbd1701415);
  387. if(DATARMNET07fc49caf2!=DATARMNETf0d9de7e2f){GENL_SET_ERR_MSG(
  388. DATARMNET54338da2ff,
  389. "\x49\x6e\x76\x61\x6c\x69\x64\x20\x70\x6f\x72\x74\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e"
  390. );return-EINVAL;}WRITE_ONCE(DATARMNETfbd1701415,(0xd2d+202-0xdf7));return
  391. (0xd2d+202-0xdf7);}bool DATARMNETa8b2566e6a(struct sk_buff*DATARMNET543491eb0f,
  392. struct DATARMNETb89ecedefc*DATARMNET3396919a68,int DATARMNET611d08d671){struct
  393. udphdr*DATARMNET75be5f3406,DATARMNETc82d2f4e16;__be32*DATARMNETdf2dbc641f,
  394. DATARMNET6c56902362;if(DATARMNET3396919a68->DATARMNET4924e79411!=IPPROTO_UDP||
  395. DATARMNET3396919a68->DATARMNETf0d9de7e2f!=READ_ONCE(DATARMNETfbd1701415))return
  396. false;DATARMNET75be5f3406=skb_header_pointer(DATARMNET543491eb0f,
  397. DATARMNET611d08d671,sizeof(*DATARMNET75be5f3406),&DATARMNETc82d2f4e16);if(!
  398. DATARMNET75be5f3406)return false;if(DATARMNET75be5f3406->source==htons(
  399. (0xdf7+6169-0x241c)))return false;DATARMNETdf2dbc641f=skb_header_pointer(
  400. DATARMNET543491eb0f,DATARMNET611d08d671+sizeof(*DATARMNET75be5f3406),sizeof(*
  401. DATARMNETdf2dbc641f),&DATARMNET6c56902362);if(!DATARMNETdf2dbc641f)return false;
  402. return!!(*DATARMNETdf2dbc641f);}int DATARMNET078f6bd384(void){
  403. DATARMNETbb4efa5b3d();return(0xd2d+202-0xdf7);}void DATARMNETfae36afa03(void){
  404. DATARMNETbb4efa5b3d();}