/* 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 #include #include #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); DATARMNET5d971be8b8DATARMNETa3d1da1cba.DATARMNET51e299cf9c[DATARMNET5d971be8b8];INIT_LIST_HEAD(& DATARMNETd44a80d414->DATARMNETdaf24e965e);INIT_HLIST_NODE(&DATARMNETd44a80d414-> DATARMNET0a9c7c9a12);}return DATARMNET6e89887168;}