123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
- #include <linux/log2.h>
- #include <linux/list.h>
- #include <linux/hashtable.h>
- #include "rmnet_descriptor.h"
- #include "rmnet_offload_state.h"
- #include "rmnet_offload_engine.h"
- #include "rmnet_offload_main.h"
- #include "rmnet_offload_tcp.h"
- #include "rmnet_offload_udp.h"
- #include "rmnet_offload_stats.h"
- #include "rmnet_offload_knob.h"
- #define DATARMNETc9a92fd5dc \
- (const_ilog2(DATARMNET51fcd2e93a))
- static DEFINE_HASHTABLE(DATARMNETab0dbdf89d,DATARMNETc9a92fd5dc);static u32
- DATARMNETb2ff7800c4(u8 DATARMNET22afafde5e){struct DATARMNET31caee06e2*
- DATARMNET0277af6816;int DATARMNET6090c652d3;u32 DATARMNET67497a3454=
- (0x145b+644-0x16df);hash_for_each(DATARMNETab0dbdf89d,DATARMNET6090c652d3,
- DATARMNET0277af6816,DATARMNET0a9c7c9a12){if(DATARMNET0277af6816->
- DATARMNET30d367f886&&DATARMNET0277af6816->DATARMNETb2a7197d60==
- DATARMNET22afafde5e){DATARMNET67497a3454++;DATARMNET3bdaf91675(
- DATARMNET0277af6816);}}return DATARMNET67497a3454;}static bool
- DATARMNET5d54389061(u8 DATARMNET22afafde5e){u64 DATARMNET75cb1c0f3f;
- DATARMNET75cb1c0f3f=DATARMNET3d487d950f(DATARMNETe9b360aea8);if(
- DATARMNET75cb1c0f3f==DATARMNET651e3c6554)return true;if(DATARMNET75cb1c0f3f==
- DATARMNETb94ae69059&&DATARMNET22afafde5e==DATARMNET70889e5696)return true;if(
- DATARMNET75cb1c0f3f==DATARMNETda679f58ba&&DATARMNET22afafde5e==
- DATARMNETb02d95e937)return true;return false;}static bool DATARMNET9c6847635e(
- struct DATARMNET31caee06e2*DATARMNETd44a80d414,struct DATARMNETadd6ff90d0*
- DATARMNETc3ffad4b30){if(!DATARMNETd44a80d414->DATARMNET30d367f886)return false;
- if(DATARMNETc3ffad4b30->DATARMNET9f5b2909c8==(0x54a+6318-0x1df4)){struct
- DATARMNETf61a39bce9*DATARMNETb5da236f91,*DATARMNET4e35bbb67d;DATARMNETb5da236f91
- =DATARMNETd44a80d414->DATARMNETd321db9bb1;DATARMNET4e35bbb67d=
- DATARMNETc3ffad4b30->DATARMNET574a565f78;if(DATARMNETb5da236f91->
- DATARMNET58886f3d9d^DATARMNET4e35bbb67d->DATARMNET58886f3d9d||
- DATARMNETb5da236f91->DATARMNET14d3de9c1a^DATARMNET4e35bbb67d->
- DATARMNET14d3de9c1a||DATARMNETb5da236f91->DATARMNETa803e4f68b^
- DATARMNET4e35bbb67d->DATARMNETa803e4f68b||DATARMNETb5da236f91->
- DATARMNET422c25939d^DATARMNET4e35bbb67d->DATARMNET422c25939d)return true;}else
- if(DATARMNETc3ffad4b30->DATARMNET9f5b2909c8==(0x1ff5+182-0x20a5)){__be32
- DATARMNET55aa748931,DATARMNET34282dc487;__be32 DATARMNETfc68f228ca;
- DATARMNET55aa748931=DATARMNETd44a80d414->DATARMNET85d5545fb8->
- DATARMNETd750a8b9e5;DATARMNET34282dc487=DATARMNETc3ffad4b30->DATARMNET1dab0af728
- ->DATARMNETd750a8b9e5;DATARMNETfc68f228ca=DATARMNET55aa748931^
- DATARMNET34282dc487;if(DATARMNETfc68f228ca&htonl(267386880))return true;}return
- false;}static bool DATARMNETa96491b775(struct DATARMNET31caee06e2*
- DATARMNETd44a80d414,struct DATARMNETadd6ff90d0*DATARMNETc3ffad4b30){__be16
- DATARMNETffe972c30a,DATARMNETfee6a33770,DATARMNET063a3638c1,DATARMNETf80930b49f;
- if(!DATARMNETd44a80d414->DATARMNET30d367f886)return DATARMNETd44a80d414->
- DATARMNET2bb18bc9dd==DATARMNETc3ffad4b30->DATARMNET68ad0738e2;if(
- DATARMNETd44a80d414->DATARMNETb2a7197d60!=DATARMNETc3ffad4b30->
- DATARMNET072708db10)return false;DATARMNETffe972c30a=DATARMNETd44a80d414->
- DATARMNETef42c82b6f->DATARMNETaad9b0a864;DATARMNET063a3638c1=DATARMNETd44a80d414
- ->DATARMNETef42c82b6f->DATARMNETd751c12d13;DATARMNETfee6a33770=
- DATARMNETc3ffad4b30->DATARMNETc51cdf696b->DATARMNETaad9b0a864;
- DATARMNETf80930b49f=DATARMNETc3ffad4b30->DATARMNETc51cdf696b->
- DATARMNETd751c12d13;if(DATARMNETffe972c30a^DATARMNETfee6a33770||
- DATARMNET063a3638c1^DATARMNETf80930b49f)return false;if(DATARMNETc3ffad4b30->
- DATARMNET9f5b2909c8==(0x19f+8819-0x240e)){struct DATARMNETf61a39bce9*
- DATARMNETb5da236f91,*DATARMNET4e35bbb67d;DATARMNETb5da236f91=DATARMNETd44a80d414
- ->DATARMNETd321db9bb1;DATARMNET4e35bbb67d=DATARMNETc3ffad4b30->
- DATARMNET574a565f78;if(DATARMNETb5da236f91->DATARMNET7c6ed51964^
- DATARMNET4e35bbb67d->DATARMNET7c6ed51964||DATARMNETb5da236f91->
- DATARMNET799b2a47a5^DATARMNET4e35bbb67d->DATARMNET799b2a47a5)return false;}else
- if(DATARMNETc3ffad4b30->DATARMNET9f5b2909c8==(0x53a+3466-0x12be)){struct
- DATARMNETfab66e680d*DATARMNETb5da236f91,*DATARMNET4e35bbb67d;DATARMNETb5da236f91
- =DATARMNETd44a80d414->DATARMNET85d5545fb8;DATARMNET4e35bbb67d=
- DATARMNETc3ffad4b30->DATARMNET1dab0af728;if(memcmp(DATARMNETb5da236f91->
- DATARMNET0f6f3a8868,DATARMNET4e35bbb67d->DATARMNET0f6f3a8868,sizeof(
- DATARMNET4e35bbb67d->DATARMNET0f6f3a8868))||memcmp(DATARMNETb5da236f91->
- DATARMNET818f335f71,DATARMNET4e35bbb67d->DATARMNET818f335f71,sizeof(
- DATARMNET4e35bbb67d->DATARMNET818f335f71)))return false;}else{return false;}
- return true;}static struct DATARMNET31caee06e2*DATARMNET30062b5353(void){struct
- DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();struct
- DATARMNET337e435e40*DATARMNET048da5e00c;struct DATARMNET31caee06e2*
- DATARMNETc5c31601b9;DATARMNET048da5e00c=&DATARMNETf7e8f6395c->
- DATARMNETa3d1da1cba;if(DATARMNET048da5e00c->DATARMNET762f0d12b6<
- DATARMNET51fcd2e93a){DATARMNETc5c31601b9=&DATARMNET048da5e00c->
- DATARMNET51e299cf9c[DATARMNET048da5e00c->DATARMNET762f0d12b6];
- DATARMNET048da5e00c->DATARMNET762f0d12b6++;return DATARMNETc5c31601b9;}
- DATARMNETc5c31601b9=&DATARMNET048da5e00c->DATARMNET51e299cf9c[
- DATARMNET048da5e00c->DATARMNETded3d12c96];DATARMNET048da5e00c->
- DATARMNETded3d12c96++;DATARMNET048da5e00c->DATARMNETded3d12c96%=
- DATARMNET51fcd2e93a;hash_del(&DATARMNETc5c31601b9->DATARMNET0a9c7c9a12);
- if(DATARMNETc5c31601b9->DATARMNET30d367f886){DATARMNET5d24865423(
- DATARMNETa05aa2c4a7);DATARMNET3bdaf91675(DATARMNETc5c31601b9);}return
- DATARMNETc5c31601b9;}static void DATARMNET3d9424a1f2(void){
- DATARMNET8f8c3a4cc3();if(DATARMNET54fd6bf483())DATARMNET5d24865423(
- DATARMNETc0fe927262);DATARMNET4c69e80b6f();}void DATARMNETafcdd1146f(void){
- rcu_assign_pointer(rmnet_perf_chain_end,DATARMNET3d9424a1f2);}void
- DATARMNET28dfa538f2(void){rcu_assign_pointer(rmnet_perf_chain_end,NULL);}int
- DATARMNET467c2610cd(u64 DATARMNET842aaafdc8,u64 DATARMNET7c1185ffbf){u32
- DATARMNET67497a3454=(0x52d+7239-0x2174);if(DATARMNET842aaafdc8==
- DATARMNET7d2f8bdc64||DATARMNET7c1185ffbf==DATARMNET651e3c6554)return
- (0x1053+1012-0x1447);switch(DATARMNET7c1185ffbf){case DATARMNETb94ae69059:
- DATARMNET67497a3454=DATARMNETb2ff7800c4(DATARMNETb02d95e937);break;case
- DATARMNETda679f58ba:DATARMNET67497a3454=DATARMNETb2ff7800c4(DATARMNET70889e5696)
- ;break;case DATARMNET7d2f8bdc64:DATARMNET67497a3454=DATARMNET54fd6bf483();break;
- }DATARMNETa3edc29191(DATARMNET2ec91e73cf,DATARMNET67497a3454);return
- (0x349+1374-0x8a7);}void DATARMNET3bdaf91675(struct DATARMNET31caee06e2*
- DATARMNETd44a80d414){struct DATARMNET8357daf015*DATARMNETf7e8f6395c=
- DATARMNETccc25794e0();struct rmnet_frag_descriptor*DATARMNETb2b92619af,*
- DATARMNETe6a1f8e9a8,*DATARMNETb9b0dca770;u32 DATARMNET439e3442b2=
- DATARMNETd44a80d414->DATARMNET5f92dbf405+DATARMNETd44a80d414->
- DATARMNET2e943b139f+DATARMNETd44a80d414->DATARMNET00656e1145;if(!
- DATARMNETd44a80d414->DATARMNET30d367f886)return;DATARMNETb2b92619af=
- list_first_entry(&DATARMNETd44a80d414->DATARMNETdaf24e965e,struct
- rmnet_frag_descriptor,list);if(!DATARMNETb2b92619af->gso_segs)
- DATARMNETb2b92619af->gso_segs=(0x1058+4757-0x22ec);DATARMNETb2b92619af->gso_size
- =DATARMNETd44a80d414->DATARMNET632219f39d;DATARMNETe6a1f8e9a8=
- DATARMNETb2b92619af;list_for_each_entry_safe_continue(DATARMNETe6a1f8e9a8,
- DATARMNETb9b0dca770,&DATARMNETd44a80d414->DATARMNETdaf24e965e,list){if(
- DATARMNETe6a1f8e9a8->hdr_ptr==rmnet_frag_data_ptr(DATARMNETe6a1f8e9a8)){if(!
- rmnet_frag_pull(DATARMNETe6a1f8e9a8,DATARMNETf7e8f6395c->DATARMNET547651077b,
- DATARMNETd44a80d414->DATARMNET2e943b139f+DATARMNETd44a80d414->
- DATARMNET00656e1145))continue;}list_del(&DATARMNETe6a1f8e9a8->list);
- list_add_tail(&DATARMNETe6a1f8e9a8->list,&DATARMNETb2b92619af->sub_frags);
- DATARMNETb2b92619af->gso_segs+=(DATARMNETe6a1f8e9a8->gso_segs)?:
- (0x11b6+461-0x1382);}DATARMNETb2b92619af->hash=DATARMNETd44a80d414->
- DATARMNET2bb18bc9dd;DATARMNET654b85a739(DATARMNETb2b92619af,DATARMNET439e3442b2)
- ;DATARMNETd44a80d414->DATARMNET30d367f886=(0x1c9b+1105-0x20ec);
- DATARMNETd44a80d414->DATARMNET5f92dbf405=(0xb26+2684-0x15a2);}void
- DATARMNET8b657e07e9(u32 DATARMNETb7b515b920){struct DATARMNET31caee06e2*
- DATARMNETd44a80d414;hash_for_each_possible(DATARMNETab0dbdf89d,
- DATARMNETd44a80d414,DATARMNET0a9c7c9a12,DATARMNETb7b515b920){if(
- DATARMNETd44a80d414->DATARMNET2bb18bc9dd==DATARMNETb7b515b920&&
- DATARMNETd44a80d414->DATARMNET30d367f886)DATARMNET3bdaf91675(DATARMNETd44a80d414
- );}}u32 DATARMNET54fd6bf483(void){struct DATARMNET31caee06e2*DATARMNETd44a80d414
- ;int DATARMNET6090c652d3;u32 DATARMNET67497a3454=(0x16b4+2078-0x1ed2);
- hash_for_each(DATARMNETab0dbdf89d,DATARMNET6090c652d3,DATARMNETd44a80d414,
- DATARMNET0a9c7c9a12){if(DATARMNETd44a80d414->DATARMNET30d367f886){
- DATARMNET67497a3454++;DATARMNET3bdaf91675(DATARMNETd44a80d414);}}return
- DATARMNET67497a3454;}void DATARMNETfc01092f09(struct DATARMNET31caee06e2*
- DATARMNETd44a80d414,struct DATARMNETadd6ff90d0*DATARMNETc3ffad4b30){if(
- DATARMNETc3ffad4b30->DATARMNET1e7926dc4c){DATARMNETd44a80d414->
- DATARMNET6b35defba1=DATARMNETc3ffad4b30->DATARMNET9f5b2909c8;DATARMNETd44a80d414
- ->DATARMNET2e943b139f=DATARMNETc3ffad4b30->DATARMNETa7eaea0d00;
- DATARMNETd44a80d414->DATARMNETd321db9bb1=DATARMNETc3ffad4b30->
- DATARMNET574a565f78;DATARMNETd44a80d414->DATARMNETb2a7197d60=DATARMNETc3ffad4b30
- ->DATARMNET072708db10;DATARMNETd44a80d414->DATARMNET00656e1145=
- DATARMNETc3ffad4b30->DATARMNETfeb7c81ac7;DATARMNETd44a80d414->
- DATARMNET9a5f6d68d4=DATARMNETc3ffad4b30->DATARMNET7ff34eacb7;DATARMNETd44a80d414
- ->DATARMNET2bb18bc9dd=DATARMNETc3ffad4b30->DATARMNET68ad0738e2;
- DATARMNETd44a80d414->DATARMNET632219f39d=(DATARMNETc3ffad4b30->
- DATARMNET798fafaf36->gso_size)?:DATARMNETc3ffad4b30->DATARMNET5671455f38;if(
- DATARMNETc3ffad4b30->DATARMNET072708db10==DATARMNET70889e5696){__be32
- DATARMNETff7464c709;if(DATARMNETc3ffad4b30->DATARMNET798fafaf36->tcp_seq_set)
- DATARMNETff7464c709=DATARMNETc3ffad4b30->DATARMNET798fafaf36->tcp_seq;else
- DATARMNETff7464c709=DATARMNETc3ffad4b30->DATARMNET7ff34eacb7->
- DATARMNET614032cc71;DATARMNETd44a80d414->DATARMNET956bd73340=ntohl(
- DATARMNETff7464c709);}}if(DATARMNETc3ffad4b30->DATARMNET072708db10==
- DATARMNET70889e5696)DATARMNETd44a80d414->DATARMNET956bd73340+=
- DATARMNETc3ffad4b30->DATARMNET5671455f38;list_add_tail(&DATARMNETc3ffad4b30->
- DATARMNET798fafaf36->list,&DATARMNETd44a80d414->DATARMNETdaf24e965e);
- DATARMNETd44a80d414->DATARMNET30d367f886++;DATARMNETd44a80d414->
- DATARMNET5f92dbf405+=DATARMNETc3ffad4b30->DATARMNET5671455f38;}bool
- DATARMNET9b8a1a69f3(struct DATARMNETadd6ff90d0*DATARMNETc3ffad4b30){struct
- DATARMNET31caee06e2*DATARMNETd44a80d414;bool DATARMNET262f926565=false;if(!
- DATARMNET5d54389061(DATARMNETc3ffad4b30->DATARMNET072708db10)){
- DATARMNET5d24865423(DATARMNETdae7cbfd97);return false;}hash_for_each_possible(
- DATARMNETab0dbdf89d,DATARMNETd44a80d414,DATARMNET0a9c7c9a12,DATARMNETc3ffad4b30
- ->DATARMNET68ad0738e2){bool DATARMNET4e4b105fa2;if(!DATARMNETa96491b775(
- DATARMNETd44a80d414,DATARMNETc3ffad4b30))continue;DATARMNETb9fc1ffb2f:
- DATARMNET4e4b105fa2=DATARMNET9c6847635e(DATARMNETd44a80d414,DATARMNETc3ffad4b30)
- ;DATARMNETc3ffad4b30->DATARMNET1e7926dc4c=true;DATARMNET262f926565=true;switch(
- DATARMNETc3ffad4b30->DATARMNET072708db10){case DATARMNET70889e5696:return
- DATARMNETb25a21aeeb(DATARMNETd44a80d414,DATARMNETc3ffad4b30,DATARMNET4e4b105fa2)
- ;case DATARMNETb02d95e937:return DATARMNET9dd18589e3(DATARMNETd44a80d414,
- DATARMNETc3ffad4b30,DATARMNET4e4b105fa2);default:return false;}}if(!
- DATARMNET262f926565){DATARMNETd44a80d414=DATARMNET30062b5353();
- DATARMNETd44a80d414->DATARMNET2bb18bc9dd=DATARMNETc3ffad4b30->
- DATARMNET68ad0738e2;hash_add(DATARMNETab0dbdf89d,&DATARMNETd44a80d414->
- DATARMNET0a9c7c9a12,DATARMNETd44a80d414->DATARMNET2bb18bc9dd);goto
- DATARMNETb9fc1ffb2f;}return false;}void DATARMNETde815547a0(void){struct
- DATARMNET31caee06e2*DATARMNETd44a80d414;struct hlist_node*DATARMNETb9b0dca770;
- int DATARMNET6090c652d3;hash_for_each_safe(DATARMNETab0dbdf89d,
- DATARMNET6090c652d3,DATARMNETb9b0dca770,DATARMNETd44a80d414,DATARMNET0a9c7c9a12)
- hash_del(&DATARMNETd44a80d414->DATARMNET0a9c7c9a12);}int DATARMNETcce014cb1d(
- void){struct DATARMNET8357daf015*DATARMNETf7e8f6395c=DATARMNETccc25794e0();u8
- DATARMNET5d971be8b8;for(DATARMNET5d971be8b8=(0xec5+3020-0x1a91);
- DATARMNET5d971be8b8<DATARMNET51fcd2e93a;DATARMNET5d971be8b8++){struct
- DATARMNET31caee06e2*DATARMNETd44a80d414;DATARMNETd44a80d414=&DATARMNETf7e8f6395c
- ->DATARMNETa3d1da1cba.DATARMNET51e299cf9c[DATARMNET5d971be8b8];INIT_LIST_HEAD(&
- DATARMNETd44a80d414->DATARMNETdaf24e965e);INIT_HLIST_NODE(&DATARMNETd44a80d414->
- DATARMNET0a9c7c9a12);}return DATARMNET6e89887168;}
|