|
@@ -0,0 +1,196 @@
|
|
|
+/* 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;}
|