rmnet_perf_udp.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2023,Qualcomm Innovation Center, Inc. All rights reserved.
  3. *
  4. * RMNET PERF UDP framework
  5. *
  6. */
  7. #include <linux/types.h>
  8. #include <linux/module.h>
  9. #include <linux/moduleparam.h>
  10. #include <linux/skbuff.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/rcupdate.h>
  13. #include <linux/hashtable.h>
  14. #include <linux/log2.h>
  15. #include <linux/workqueue.h>
  16. #include <linux/refcount.h>
  17. #include <net/ip.h>
  18. #include <net/ipv6.h>
  19. #include <net/udp.h>
  20. #include <net/sock.h>
  21. #include "rmnet_private.h"
  22. #include "rmnet_perf_udp.h"
  23. #define DATARMNET15dbec5cc0 ((0x16a8+1565-0x14f5))
  24. #define DATARMNET1b69f5599a ((0xdf7+6169-0x241c))
  25. #define DATARMNETe19b881e3e ((0xeb7+1158-0x132d))
  26. #define DATARMNET98862aed95 \
  27. (const_ilog2(DATARMNETe19b881e3e))
  28. enum{DATARMNETcffce1f6da,DATARMNET1d79c7ae4b,DATARMNETf1cd747d89,
  29. DATARMNETf5e31b47ad,DATARMNETbaf32ca0ac,};struct DATARMNETee0c11924c{union{
  30. __be32 DATARMNETdfe430c2d6;struct in6_addr DATARMNET815cbb4bf5;};union{__be32
  31. DATARMNET2cb607d686;struct in6_addr DATARMNETc3f31215b7;};union{struct{__be16
  32. DATARMNET08e913477e;__be16 DATARMNETda7f7fa492;};u32 DATARMNET556bcfcf8f;};u8
  33. DATARMNET0d956cc77a;};struct DATARMNETac2887e8c4{struct hlist_node hash;struct
  34. rcu_head DATARMNET28bfe9e6ad;struct DATARMNETee0c11924c DATARMNET54338da2ff;
  35. struct sock*DATARMNETa3e9a18f1b;unsigned long DATARMNET763f2e5fac;u8
  36. DATARMNET1717afebc7;};struct DATARMNET451f84b309{struct delayed_work
  37. DATARMNET190b4452e8;bool DATARMNETcd94e0d3c7;};static DEFINE_SPINLOCK(
  38. DATARMNETa125272ee8);static DEFINE_HASHTABLE(DATARMNET187c01aba9,
  39. DATARMNET98862aed95);static u32 DATARMNETe0c4a54a69;static struct
  40. DATARMNET451f84b309 DATARMNET3ed0b852e9;static u64 DATARMNETf41987fea1[
  41. DATARMNETbaf32ca0ac];module_param_array_named(rmnet_perf_udp_stat,
  42. DATARMNETf41987fea1,ullong,NULL,(0xcb7+5769-0x221c));static void
  43. DATARMNET19b3edd6de(u32 DATARMNET248f120dd5){if(DATARMNET248f120dd5<
  44. DATARMNETbaf32ca0ac)DATARMNETf41987fea1[DATARMNET248f120dd5]+=(0xd26+209-0xdf6);
  45. }static bool DATARMNETa8d347a4e6(struct DATARMNETac2887e8c4*DATARMNET63b1a086d5,
  46. unsigned long DATARMNET763f2e5fac){unsigned long DATARMNETc2d5c71ce1;
  47. DATARMNETc2d5c71ce1=msecs_to_jiffies(DATARMNET15dbec5cc0);if(DATARMNET763f2e5fac
  48. -DATARMNET63b1a086d5->DATARMNET763f2e5fac>DATARMNETc2d5c71ce1)return true;return
  49. false;}static void DATARMNETfcb3ce7715(struct rcu_head*DATARMNET5d432e897f){
  50. struct DATARMNETac2887e8c4*DATARMNET63b1a086d5;DATARMNET63b1a086d5=container_of(
  51. DATARMNET5d432e897f,struct DATARMNETac2887e8c4,DATARMNET28bfe9e6ad);if(!
  52. IS_ERR_OR_NULL(DATARMNET63b1a086d5->DATARMNETa3e9a18f1b))sock_put(
  53. DATARMNET63b1a086d5->DATARMNETa3e9a18f1b);kfree(DATARMNET63b1a086d5);}static
  54. bool DATARMNET18d263f0ec(bool DATARMNETe78ad140cc){struct DATARMNETac2887e8c4*
  55. DATARMNET63b1a086d5;struct hlist_node*DATARMNET0386f6f82a;unsigned long
  56. DATARMNET763f2e5fac;int DATARMNET5c2fd31d7b;DATARMNET763f2e5fac=jiffies;
  57. hash_for_each_safe(DATARMNET187c01aba9,DATARMNET5c2fd31d7b,DATARMNET0386f6f82a,
  58. DATARMNET63b1a086d5,hash){if(DATARMNET63b1a086d5->DATARMNET1717afebc7)continue;
  59. if(DATARMNETe78ad140cc||DATARMNETa8d347a4e6(DATARMNET63b1a086d5,
  60. DATARMNET763f2e5fac)){DATARMNET63b1a086d5->DATARMNET1717afebc7=(0xd26+209-0xdf6)
  61. ;hash_del_rcu(&DATARMNET63b1a086d5->hash);call_rcu(&DATARMNET63b1a086d5->
  62. DATARMNET28bfe9e6ad,DATARMNETfcb3ce7715);DATARMNET19b3edd6de(DATARMNETf1cd747d89
  63. );DATARMNETe0c4a54a69--;}}return!!DATARMNETe0c4a54a69;}static void
  64. DATARMNET47ed281d61(struct work_struct*DATARMNET190b4452e8){struct
  65. DATARMNET451f84b309*DATARMNET3a3a7762bb;unsigned long DATARMNETfb0677cc3c;bool
  66. DATARMNET6e1c466378;DATARMNET3a3a7762bb=container_of(to_delayed_work(
  67. DATARMNET190b4452e8),struct DATARMNET451f84b309,DATARMNET190b4452e8);
  68. spin_lock_irqsave(&DATARMNETa125272ee8,DATARMNETfb0677cc3c);DATARMNET6e1c466378=
  69. DATARMNET18d263f0ec(DATARMNET3a3a7762bb->DATARMNETcd94e0d3c7);if(
  70. DATARMNET6e1c466378){unsigned long DATARMNETf71ef1b8da;DATARMNETf71ef1b8da=
  71. msecs_to_jiffies(DATARMNET1b69f5599a);schedule_delayed_work(&DATARMNET3a3a7762bb
  72. ->DATARMNET190b4452e8,DATARMNETf71ef1b8da);}spin_unlock_irqrestore(&
  73. DATARMNETa125272ee8,DATARMNETfb0677cc3c);}static bool DATARMNET47899a016a(struct
  74. DATARMNETee0c11924c*DATARMNETae0905b0b3,struct DATARMNETee0c11924c*
  75. DATARMNETdb49f21565){if(DATARMNETae0905b0b3->DATARMNET0d956cc77a!=
  76. DATARMNETdb49f21565->DATARMNET0d956cc77a||DATARMNETae0905b0b3->
  77. DATARMNET08e913477e!=DATARMNETdb49f21565->DATARMNET08e913477e||
  78. DATARMNETae0905b0b3->DATARMNETda7f7fa492!=DATARMNETdb49f21565->
  79. DATARMNETda7f7fa492)return false;if(DATARMNETae0905b0b3->DATARMNET0d956cc77a==
  80. (0xd11+230-0xdf3))return DATARMNETae0905b0b3->DATARMNETdfe430c2d6==
  81. DATARMNETdb49f21565->DATARMNETdfe430c2d6&&DATARMNETae0905b0b3->
  82. DATARMNET2cb607d686==DATARMNETdb49f21565->DATARMNET2cb607d686;return!
  83. ipv6_addr_cmp(&DATARMNETae0905b0b3->DATARMNET815cbb4bf5,&DATARMNETdb49f21565->
  84. DATARMNET815cbb4bf5)&&!ipv6_addr_cmp(&DATARMNETae0905b0b3->DATARMNETc3f31215b7,&
  85. DATARMNETdb49f21565->DATARMNETc3f31215b7);}static struct DATARMNETac2887e8c4*
  86. DATARMNET7b1084dc09(struct DATARMNETee0c11924c*DATARMNET3396919a68)__must_hold(&
  87. DATARMNETa125272ee8){struct DATARMNETac2887e8c4*DATARMNET63b1a086d5;
  88. DATARMNET63b1a086d5=kzalloc(sizeof(*DATARMNET63b1a086d5),GFP_ATOMIC);if(!
  89. DATARMNET63b1a086d5){DATARMNET19b3edd6de(DATARMNET1d79c7ae4b);return NULL;}
  90. INIT_HLIST_NODE(&DATARMNET63b1a086d5->hash);memcpy(&DATARMNET63b1a086d5->
  91. DATARMNET54338da2ff,DATARMNET3396919a68,sizeof(*DATARMNET3396919a68));
  92. DATARMNET63b1a086d5->DATARMNET763f2e5fac=jiffies;hash_add_rcu(
  93. DATARMNET187c01aba9,&DATARMNET63b1a086d5->hash,DATARMNET3396919a68->
  94. DATARMNET556bcfcf8f);DATARMNET19b3edd6de(DATARMNETcffce1f6da);if(!
  95. DATARMNETe0c4a54a69){unsigned long DATARMNETf71ef1b8da;DATARMNETf71ef1b8da=
  96. msecs_to_jiffies(DATARMNET1b69f5599a);schedule_delayed_work(&DATARMNET3ed0b852e9
  97. .DATARMNET190b4452e8,DATARMNETf71ef1b8da);}DATARMNETe0c4a54a69++;return
  98. DATARMNET63b1a086d5;}static struct DATARMNETac2887e8c4*DATARMNET270a2369fc(
  99. struct DATARMNETee0c11924c*DATARMNET3396919a68)__must_hold(RCU){struct
  100. DATARMNETac2887e8c4*DATARMNET63b1a086d5;unsigned long DATARMNETfb0677cc3c;
  101. spin_lock_irqsave(&DATARMNETa125272ee8,DATARMNETfb0677cc3c);
  102. hash_for_each_possible_rcu(DATARMNET187c01aba9,DATARMNET63b1a086d5,hash,
  103. DATARMNET3396919a68->DATARMNET556bcfcf8f){if(DATARMNET63b1a086d5->
  104. DATARMNET1717afebc7)continue;if(DATARMNET47899a016a(&DATARMNET63b1a086d5->
  105. DATARMNET54338da2ff,DATARMNET3396919a68))goto DATARMNETbf4095f79e;}
  106. DATARMNET63b1a086d5=DATARMNET7b1084dc09(DATARMNET3396919a68);DATARMNETbf4095f79e
  107. :spin_unlock_irqrestore(&DATARMNETa125272ee8,DATARMNETfb0677cc3c);return
  108. DATARMNET63b1a086d5;}static struct sock*DATARMNETa9a99daddb(struct
  109. DATARMNETee0c11924c*DATARMNET3396919a68,struct sk_buff*DATARMNET543491eb0f){
  110. struct sock*DATARMNET370b0f4269;if(DATARMNET3396919a68->DATARMNET0d956cc77a==
  111. (0xd11+230-0xdf3))DATARMNET370b0f4269=__udp4_lib_lookup(dev_net(
  112. DATARMNET543491eb0f->dev),DATARMNET3396919a68->DATARMNETdfe430c2d6,
  113. DATARMNET3396919a68->DATARMNET08e913477e,DATARMNET3396919a68->
  114. DATARMNET2cb607d686,DATARMNET3396919a68->DATARMNETda7f7fa492,inet_iif(
  115. DATARMNET543491eb0f),(0xd2d+202-0xdf7),&udp_table,NULL);else DATARMNET370b0f4269
  116. =__udp6_lib_lookup(dev_net(DATARMNET543491eb0f->dev),&DATARMNET3396919a68->
  117. DATARMNET815cbb4bf5,DATARMNET3396919a68->DATARMNET08e913477e,&
  118. DATARMNET3396919a68->DATARMNETc3f31215b7,DATARMNET3396919a68->
  119. DATARMNETda7f7fa492,inet6_iif(DATARMNET543491eb0f),(0xd2d+202-0xdf7),&udp_table,
  120. NULL);if(DATARMNET370b0f4269&&!refcount_inc_not_zero(&DATARMNET370b0f4269->
  121. sk_refcnt))DATARMNET370b0f4269=NULL;return DATARMNET370b0f4269;}static void
  122. DATARMNET991df48508(struct DATARMNETac2887e8c4*DATARMNET63b1a086d5,struct
  123. sk_buff*DATARMNET543491eb0f)__must_hold(RCU){struct rmnet_skb_cb*
  124. DATARMNET1ec4882bf7=RMNET_SKB_CB(DATARMNET543491eb0f);DATARMNET63b1a086d5->
  125. DATARMNET763f2e5fac=jiffies;if(IS_ERR(DATARMNET63b1a086d5->DATARMNETa3e9a18f1b))
  126. {DATARMNET1ec4882bf7->tethered=true;return;}if(!DATARMNET63b1a086d5->
  127. DATARMNETa3e9a18f1b){DATARMNET63b1a086d5->DATARMNETa3e9a18f1b=
  128. DATARMNETa9a99daddb(&DATARMNET63b1a086d5->DATARMNET54338da2ff,
  129. DATARMNET543491eb0f);if(!DATARMNET63b1a086d5->DATARMNETa3e9a18f1b){
  130. DATARMNET19b3edd6de(DATARMNETf5e31b47ad);DATARMNET63b1a086d5->
  131. DATARMNETa3e9a18f1b=ERR_PTR(-EINVAL);DATARMNET1ec4882bf7->tethered=true;return;}
  132. }}void DATARMNET2a6d02a6a5(struct sk_buff*DATARMNET543491eb0f){struct
  133. DATARMNETee0c11924c DATARMNET3396919a68={};struct DATARMNETac2887e8c4*
  134. DATARMNET63b1a086d5;struct udphdr*DATARMNETa1abb4897c;if(!
  135. skb_transport_header_was_set(DATARMNET543491eb0f)||DATARMNET543491eb0f->
  136. ip_summed==CHECKSUM_NONE)return;DATARMNETa1abb4897c=udp_hdr(DATARMNET543491eb0f)
  137. ;DATARMNET3396919a68.DATARMNET08e913477e=DATARMNETa1abb4897c->source;
  138. DATARMNET3396919a68.DATARMNETda7f7fa492=DATARMNETa1abb4897c->dest;if(
  139. DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9
  140. =ip_hdr(DATARMNET543491eb0f);DATARMNET3396919a68.DATARMNETdfe430c2d6=
  141. DATARMNET86f1f2cdc9->saddr;DATARMNET3396919a68.DATARMNET2cb607d686=
  142. DATARMNET86f1f2cdc9->daddr;DATARMNET3396919a68.DATARMNET0d956cc77a=
  143. (0xd11+230-0xdf3);}else{struct ipv6hdr*DATARMNETbf55123e5b=ipv6_hdr(
  144. DATARMNET543491eb0f);memcpy(&DATARMNET3396919a68.DATARMNET815cbb4bf5,&
  145. DATARMNETbf55123e5b->saddr,sizeof(DATARMNETbf55123e5b->saddr));memcpy(&
  146. DATARMNET3396919a68.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->daddr,sizeof(
  147. DATARMNETbf55123e5b->daddr));DATARMNET3396919a68.DATARMNET0d956cc77a=
  148. (0xd03+244-0xdf1);}rcu_read_lock();DATARMNET63b1a086d5=DATARMNET270a2369fc(&
  149. DATARMNET3396919a68);if(DATARMNET63b1a086d5){if(likely(!DATARMNETa8d347a4e6(
  150. DATARMNET63b1a086d5,jiffies)))DATARMNET991df48508(DATARMNET63b1a086d5,
  151. DATARMNET543491eb0f);}rcu_read_unlock();}void DATARMNET5ecc30669c(struct sk_buff
  152. *DATARMNET543491eb0f){struct DATARMNETee0c11924c DATARMNET3396919a68={};struct
  153. DATARMNETac2887e8c4*DATARMNET63b1a086d5;struct udphdr*DATARMNETa1abb4897c;if(!
  154. skb_transport_header_was_set(DATARMNET543491eb0f))return;DATARMNETa1abb4897c=
  155. udp_hdr(DATARMNET543491eb0f);DATARMNET3396919a68.DATARMNET08e913477e=
  156. DATARMNETa1abb4897c->dest;DATARMNET3396919a68.DATARMNETda7f7fa492=
  157. DATARMNETa1abb4897c->source;if(DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){
  158. struct iphdr*DATARMNET86f1f2cdc9=ip_hdr(DATARMNET543491eb0f);DATARMNET3396919a68
  159. .DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9->daddr;DATARMNET3396919a68.
  160. DATARMNET2cb607d686=DATARMNET86f1f2cdc9->saddr;DATARMNET3396919a68.
  161. DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else{struct ipv6hdr*DATARMNETbf55123e5b=
  162. ipv6_hdr(DATARMNET543491eb0f);memcpy(&DATARMNET3396919a68.DATARMNET815cbb4bf5,&
  163. DATARMNETbf55123e5b->daddr,sizeof(DATARMNETbf55123e5b->daddr));memcpy(&
  164. DATARMNET3396919a68.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->saddr,sizeof(
  165. DATARMNETbf55123e5b->saddr));DATARMNET3396919a68.DATARMNET0d956cc77a=
  166. (0xd03+244-0xdf1);}rcu_read_lock();DATARMNET63b1a086d5=DATARMNET270a2369fc(&
  167. DATARMNET3396919a68);if(DATARMNET63b1a086d5){if(likely(!DATARMNETa8d347a4e6(
  168. DATARMNET63b1a086d5,jiffies)))DATARMNET991df48508(DATARMNET63b1a086d5,
  169. DATARMNET543491eb0f);}rcu_read_unlock();}int DATARMNETe80a33d544(void){
  170. INIT_DELAYED_WORK(&DATARMNET3ed0b852e9.DATARMNET190b4452e8,DATARMNET47ed281d61);
  171. return(0xd2d+202-0xdf7);}void DATARMNET4b5170a1ef(void){cancel_delayed_work_sync
  172. (&DATARMNET3ed0b852e9.DATARMNET190b4452e8);DATARMNET3ed0b852e9.
  173. DATARMNETcd94e0d3c7=true;schedule_delayed_work(&DATARMNET3ed0b852e9.
  174. DATARMNET190b4452e8,(0xd2d+202-0xdf7));cancel_delayed_work_sync(&
  175. DATARMNET3ed0b852e9.DATARMNET190b4452e8);}