summaryrefslogtreecommitdiff
path: root/offload/rmnet_offload_engine.c
blob: 1d1f6c5f2bea81535859fc5a885002ff6caf1dd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/* Copyright (c) 2018-2021, 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 DATARMNET644a5e11da \
	(const_ilog2(DATARMNET78d9393ac8))
static DEFINE_HASHTABLE(DATARMNET4791268d67,DATARMNET644a5e11da);static u32 
DATARMNET1993bae165(u8 DATARMNET06d2413ad2,struct list_head*DATARMNET6f9bfa17e6)
{struct DATARMNETd7c9631acd*DATARMNET7c382e536d;int DATARMNETae0201901a;u32 
DATARMNET737bbd41c3=(0xd2d+202-0xdf7);hash_for_each(DATARMNET4791268d67,
DATARMNETae0201901a,DATARMNET7c382e536d,DATARMNETbd5d7d96d8){if(
DATARMNET7c382e536d->DATARMNET1db11fa85e&&DATARMNET7c382e536d->
DATARMNET78fd20ce0e.DATARMNET7fa8b2acbf==DATARMNET06d2413ad2){
DATARMNET737bbd41c3++;DATARMNETa3055c21f2(DATARMNET7c382e536d,
DATARMNET6f9bfa17e6);}}return DATARMNET737bbd41c3;}static bool 
DATARMNET2013036d80(u8 DATARMNET06d2413ad2){u64 DATARMNET3924f3f9e3;
DATARMNET3924f3f9e3=DATARMNETf1d1b8287f(DATARMNET6d2ed4b822);if(
DATARMNET3924f3f9e3==DATARMNET2d89680280)return true;if(DATARMNET3924f3f9e3==
DATARMNET03daf91a60&&DATARMNET06d2413ad2==DATARMNETfd5c3d30e5)return true;if(
DATARMNET3924f3f9e3==DATARMNET88a9920663&&DATARMNET06d2413ad2==
DATARMNETa656f324b2)return true;return false;}static bool DATARMNET5a0f9fc3a2(
struct DATARMNETd7c9631acd*DATARMNETaa568481cf,struct DATARMNETd812bcdbb5*
DATARMNET5fe4c722a8){if(!DATARMNETaa568481cf->DATARMNET1db11fa85e)return false;
if(DATARMNET5fe4c722a8->DATARMNET144d119066.DATARMNET388842c721==
(0xd11+230-0xdf3)){struct DATARMNET4287f07234*DATARMNET699c2c62cd,*
DATARMNET8814564ab9;DATARMNET699c2c62cd=&DATARMNETaa568481cf->
DATARMNET78fd20ce0e;DATARMNET8814564ab9=&DATARMNET5fe4c722a8->
DATARMNET144d119066;if(DATARMNET699c2c62cd->DATARMNET19b03754c4^
DATARMNET8814564ab9->DATARMNET19b03754c4||DATARMNET699c2c62cd->
DATARMNET57bf608183^DATARMNET8814564ab9->DATARMNET57bf608183||
DATARMNET699c2c62cd->DATARMNETcf915688f5^DATARMNET8814564ab9->
DATARMNETcf915688f5||DATARMNET699c2c62cd->DATARMNET4ca5ac9de1^
DATARMNET8814564ab9->DATARMNET4ca5ac9de1)return true;}else if(
DATARMNET5fe4c722a8->DATARMNET144d119066.DATARMNET388842c721==(0xd03+244-0xdf1))
{__be32 DATARMNET25ffacbec5,DATARMNETb351dd927f;__be32 DATARMNET9422f16113;
DATARMNET25ffacbec5=DATARMNETaa568481cf->DATARMNET78fd20ce0e.DATARMNETabd58f7f89
;DATARMNETb351dd927f=DATARMNET5fe4c722a8->DATARMNET144d119066.
DATARMNETabd58f7f89;;DATARMNET9422f16113=DATARMNET25ffacbec5^DATARMNETb351dd927f
;if(DATARMNET9422f16113&htonl(267386880))return true;}return false;}static bool 
DATARMNET6895620058(struct DATARMNETd7c9631acd*DATARMNETaa568481cf,struct 
DATARMNETd812bcdbb5*DATARMNET5fe4c722a8){struct DATARMNET4287f07234*
DATARMNET699c2c62cd,*DATARMNET8814564ab9;DATARMNET699c2c62cd=&
DATARMNETaa568481cf->DATARMNET78fd20ce0e;DATARMNET8814564ab9=&
DATARMNET5fe4c722a8->DATARMNET144d119066;if(!DATARMNETaa568481cf->
DATARMNET1db11fa85e)return DATARMNETaa568481cf->DATARMNET381f1cadc4==
DATARMNET5fe4c722a8->DATARMNET645e8912b8;if(DATARMNET699c2c62cd->
DATARMNET7fa8b2acbf!=DATARMNET8814564ab9->DATARMNET7fa8b2acbf)return false;if(
DATARMNET699c2c62cd->DATARMNETa60d2ae3f6^DATARMNET8814564ab9->
DATARMNETa60d2ae3f6||DATARMNET699c2c62cd->DATARMNET5e7452ec23^
DATARMNET8814564ab9->DATARMNET5e7452ec23)return false;if(DATARMNET8814564ab9->
DATARMNET388842c721==(0xd11+230-0xdf3)){if(DATARMNET699c2c62cd->
DATARMNET1a2be7b6c2^DATARMNET8814564ab9->DATARMNET1a2be7b6c2||
DATARMNET699c2c62cd->DATARMNET0a28fa80f4^DATARMNET8814564ab9->
DATARMNET0a28fa80f4)return false;}else if(DATARMNET8814564ab9->
DATARMNET388842c721==(0xd03+244-0xdf1)){if(memcmp(DATARMNET699c2c62cd->
DATARMNET949c2754de,DATARMNET8814564ab9->DATARMNET949c2754de,sizeof(
DATARMNET8814564ab9->DATARMNET949c2754de))||memcmp(DATARMNET699c2c62cd->
DATARMNET45ec858bc5,DATARMNET8814564ab9->DATARMNET45ec858bc5,sizeof(
DATARMNET8814564ab9->DATARMNET45ec858bc5)))return false;}else{return false;}
return true;}static struct DATARMNETd7c9631acd*DATARMNETd41def0046(void){struct 
DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();struct 
DATARMNET907d58c807*DATARMNETa6f73cbe10;struct DATARMNETd7c9631acd*
DATARMNET6745427f98;LIST_HEAD(DATARMNET6f9bfa17e6);DATARMNETa6f73cbe10=&
DATARMNETe05748b000->DATARMNETebb45c8d86;if(DATARMNETa6f73cbe10->
DATARMNET8dfc11cccd<DATARMNET78d9393ac8){DATARMNET6745427f98=&
DATARMNETa6f73cbe10->DATARMNET2846a01cce[DATARMNETa6f73cbe10->
DATARMNET8dfc11cccd];DATARMNETa6f73cbe10->DATARMNET8dfc11cccd++;return 
DATARMNET6745427f98;}DATARMNET6745427f98=&DATARMNETa6f73cbe10->
DATARMNET2846a01cce[DATARMNETa6f73cbe10->DATARMNET57d435b225];
DATARMNETa6f73cbe10->DATARMNET57d435b225++;DATARMNETa6f73cbe10->
DATARMNET57d435b225%=DATARMNET78d9393ac8;hash_del(&DATARMNET6745427f98->
DATARMNETbd5d7d96d8);if(DATARMNET6745427f98->DATARMNET1db11fa85e){
DATARMNETa00cda79d0(DATARMNETf3f92fc0b9);DATARMNETa3055c21f2(DATARMNET6745427f98
,&DATARMNET6f9bfa17e6);}DATARMNETc70e73c8d4(&DATARMNET6f9bfa17e6);return 
DATARMNET6745427f98;}static void DATARMNETbe30d096c6(void){LIST_HEAD(
DATARMNET6f9bfa17e6);DATARMNET664568fcd0();if(DATARMNETae70636c90(&
DATARMNET6f9bfa17e6))DATARMNETa00cda79d0(DATARMNET5727f095ec);
DATARMNET6a76048590();DATARMNETc70e73c8d4(&DATARMNET6f9bfa17e6);}void 
DATARMNETd4230b6bfe(void){rcu_assign_pointer(rmnet_perf_chain_end,
DATARMNETbe30d096c6);}void DATARMNET560e127137(void){rcu_assign_pointer(
rmnet_perf_chain_end,NULL);}int DATARMNET241493ab9a(u64 DATARMNET0470698d6c,u64 
DATARMNETfeff65e096){LIST_HEAD(DATARMNET6f9bfa17e6);u32 DATARMNET737bbd41c3=
(0xd2d+202-0xdf7);if(DATARMNET0470698d6c==DATARMNET5fe3af8828||
DATARMNETfeff65e096==DATARMNET2d89680280)return(0xd2d+202-0xdf7);switch(
DATARMNETfeff65e096){case DATARMNET03daf91a60:DATARMNET737bbd41c3=
DATARMNET1993bae165(DATARMNETa656f324b2,&DATARMNET6f9bfa17e6);break;case 
DATARMNET88a9920663:DATARMNET737bbd41c3=DATARMNET1993bae165(DATARMNETfd5c3d30e5,
&DATARMNET6f9bfa17e6);break;case DATARMNET5fe3af8828:DATARMNET737bbd41c3=
DATARMNETae70636c90(&DATARMNET6f9bfa17e6);break;}DATARMNETbad3b5165e(
DATARMNETddf572458d,DATARMNET737bbd41c3);DATARMNETc70e73c8d4(&
DATARMNET6f9bfa17e6);return(0xd2d+202-0xdf7);}void DATARMNETa3055c21f2(struct 
DATARMNETd7c9631acd*DATARMNETaa568481cf,struct list_head*DATARMNET6f9bfa17e6){
struct DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();struct 
rmnet_frag_descriptor*DATARMNETd74aeaa49a,*DATARMNETa1625e27e2,*
DATARMNET0386f6f82a;struct DATARMNET4287f07234*DATARMNET699c2c62cd=&
DATARMNETaa568481cf->DATARMNET78fd20ce0e;u32 DATARMNET567bdc7221=
DATARMNET699c2c62cd->DATARMNET4ca5ac9de1+DATARMNET699c2c62cd->
DATARMNET0aeee57ceb;if(!DATARMNETaa568481cf->DATARMNET1db11fa85e)return;
DATARMNETd74aeaa49a=list_first_entry(&DATARMNETaa568481cf->DATARMNETb76b79d0d5,
struct rmnet_frag_descriptor,list);if(!DATARMNETd74aeaa49a->gso_segs)
DATARMNETd74aeaa49a->gso_segs=(0xd26+209-0xdf6);DATARMNETd74aeaa49a->gso_size=
DATARMNETaa568481cf->DATARMNET1978d5d8de;DATARMNETa1625e27e2=DATARMNETd74aeaa49a
;list_for_each_entry_safe_continue(DATARMNETa1625e27e2,DATARMNET0386f6f82a,&
DATARMNETaa568481cf->DATARMNETb76b79d0d5,list){u32 DATARMNET904423d5e4=
DATARMNETa1625e27e2->len-DATARMNET567bdc7221;if(!
rmnet_frag_descriptor_add_frags_from(DATARMNETd74aeaa49a,DATARMNETa1625e27e2,
DATARMNET567bdc7221,DATARMNET904423d5e4)){DATARMNETd74aeaa49a->gso_segs+=(
DATARMNETa1625e27e2->gso_segs)?:(0xd26+209-0xdf6);DATARMNETd74aeaa49a->
coal_bytes+=DATARMNETa1625e27e2->coal_bytes;DATARMNETd74aeaa49a->coal_bufsize+=
DATARMNETa1625e27e2->coal_bufsize;}rmnet_recycle_frag_descriptor(
DATARMNETa1625e27e2,DATARMNETe05748b000->DATARMNET403589239f);}
DATARMNETd74aeaa49a->hash=DATARMNETaa568481cf->DATARMNET381f1cadc4;list_del_init
(&DATARMNETd74aeaa49a->list);list_add_tail(&DATARMNETd74aeaa49a->list,
DATARMNET6f9bfa17e6);DATARMNETaa568481cf->DATARMNET1db11fa85e=(0xd2d+202-0xdf7);
DATARMNETaa568481cf->DATARMNETcf28ae376b=(0xd2d+202-0xdf7);}void 
DATARMNETc38c135c9f(u32 DATARMNET3f8cc6fc24,struct list_head*DATARMNET6f9bfa17e6
){struct DATARMNETd7c9631acd*DATARMNETaa568481cf;hash_for_each_possible(
DATARMNET4791268d67,DATARMNETaa568481cf,DATARMNETbd5d7d96d8,DATARMNET3f8cc6fc24)
{if(DATARMNETaa568481cf->DATARMNET381f1cadc4==DATARMNET3f8cc6fc24&&
DATARMNETaa568481cf->DATARMNET1db11fa85e)DATARMNETa3055c21f2(DATARMNETaa568481cf
,DATARMNET6f9bfa17e6);}}u32 DATARMNETae70636c90(struct list_head*
DATARMNET6f9bfa17e6){struct DATARMNETd7c9631acd*DATARMNETaa568481cf;int 
DATARMNETae0201901a;u32 DATARMNET737bbd41c3=(0xd2d+202-0xdf7);hash_for_each(
DATARMNET4791268d67,DATARMNETae0201901a,DATARMNETaa568481cf,DATARMNETbd5d7d96d8)
{if(DATARMNETaa568481cf->DATARMNET1db11fa85e){DATARMNET737bbd41c3++;
DATARMNETa3055c21f2(DATARMNETaa568481cf,DATARMNET6f9bfa17e6);}}return 
DATARMNET737bbd41c3;}void DATARMNET33aa5df9ef(struct DATARMNETd7c9631acd*
DATARMNETaa568481cf,struct DATARMNETd812bcdbb5*DATARMNET5fe4c722a8){if(
DATARMNET5fe4c722a8->DATARMNETf1b6b0a6cc){memcpy(&DATARMNETaa568481cf->
DATARMNET78fd20ce0e,&DATARMNET5fe4c722a8->DATARMNET144d119066,sizeof(
DATARMNETaa568481cf->DATARMNET78fd20ce0e));DATARMNETaa568481cf->
DATARMNET381f1cadc4=DATARMNET5fe4c722a8->DATARMNET645e8912b8;DATARMNETaa568481cf
->DATARMNET1978d5d8de=(DATARMNET5fe4c722a8->DATARMNET719f68fb88->gso_size)?:
DATARMNET5fe4c722a8->DATARMNET1ef22e4c76;}if(DATARMNET5fe4c722a8->
DATARMNET144d119066.DATARMNET7fa8b2acbf==DATARMNETfd5c3d30e5)DATARMNETaa568481cf
->DATARMNET78fd20ce0e.DATARMNETbc28a5970f+=DATARMNET5fe4c722a8->
DATARMNET1ef22e4c76;list_add_tail(&DATARMNET5fe4c722a8->DATARMNET719f68fb88->
list,&DATARMNETaa568481cf->DATARMNETb76b79d0d5);DATARMNETaa568481cf->
DATARMNET1db11fa85e++;DATARMNETaa568481cf->DATARMNETcf28ae376b+=
DATARMNET5fe4c722a8->DATARMNET1ef22e4c76;}bool DATARMNETfbf5798e15(struct 
DATARMNETd812bcdbb5*DATARMNET5fe4c722a8,struct list_head*DATARMNET6f9bfa17e6){
struct DATARMNETd7c9631acd*DATARMNETaa568481cf;bool DATARMNET885970f252=false;u8
 DATARMNET9695aa5b1d=DATARMNET5fe4c722a8->DATARMNET144d119066.
DATARMNET7fa8b2acbf;if(!DATARMNET2013036d80(DATARMNET9695aa5b1d)){
DATARMNETa00cda79d0(DATARMNET6a894ab63d);return false;}hash_for_each_possible(
DATARMNET4791268d67,DATARMNETaa568481cf,DATARMNETbd5d7d96d8,DATARMNET5fe4c722a8
->DATARMNET645e8912b8){bool DATARMNET2dd83daa1c;if(!DATARMNET6895620058(
DATARMNETaa568481cf,DATARMNET5fe4c722a8))continue;DATARMNETc6f994577c:
DATARMNET2dd83daa1c=DATARMNET5a0f9fc3a2(DATARMNETaa568481cf,DATARMNET5fe4c722a8)
;DATARMNET5fe4c722a8->DATARMNETf1b6b0a6cc=true;DATARMNET885970f252=true;switch(
DATARMNET9695aa5b1d){case DATARMNETfd5c3d30e5:return DATARMNET4c7cdc25b7(
DATARMNETaa568481cf,DATARMNET5fe4c722a8,DATARMNET2dd83daa1c,DATARMNET6f9bfa17e6)
;case DATARMNETa656f324b2:return DATARMNET8dc47eb7af(DATARMNETaa568481cf,
DATARMNET5fe4c722a8,DATARMNET2dd83daa1c,DATARMNET6f9bfa17e6);default:return 
false;}}if(!DATARMNET885970f252){DATARMNETaa568481cf=DATARMNETd41def0046();
DATARMNETaa568481cf->DATARMNET381f1cadc4=DATARMNET5fe4c722a8->
DATARMNET645e8912b8;hash_add(DATARMNET4791268d67,&DATARMNETaa568481cf->
DATARMNETbd5d7d96d8,DATARMNETaa568481cf->DATARMNET381f1cadc4);goto 
DATARMNETc6f994577c;}return false;}void DATARMNETb98b78b8e3(void){struct 
DATARMNETd7c9631acd*DATARMNETaa568481cf;struct hlist_node*DATARMNET0386f6f82a;
int DATARMNETae0201901a;hash_for_each_safe(DATARMNET4791268d67,
DATARMNETae0201901a,DATARMNET0386f6f82a,DATARMNETaa568481cf,DATARMNETbd5d7d96d8)
hash_del(&DATARMNETaa568481cf->DATARMNETbd5d7d96d8);}int DATARMNETdbcaf01255(
void){struct DATARMNET70f3b87b5d*DATARMNETe05748b000=DATARMNETc2a630b113();u8 
DATARMNETefc9df3df2;for(DATARMNETefc9df3df2=(0xd2d+202-0xdf7);
DATARMNETefc9df3df2<DATARMNET78d9393ac8;DATARMNETefc9df3df2++){struct 
DATARMNETd7c9631acd*DATARMNETaa568481cf;DATARMNETaa568481cf=&DATARMNETe05748b000
->DATARMNETebb45c8d86.DATARMNET2846a01cce[DATARMNETefc9df3df2];INIT_LIST_HEAD(&
DATARMNETaa568481cf->DATARMNETb76b79d0d5);INIT_HLIST_NODE(&DATARMNETaa568481cf->
DATARMNETbd5d7d96d8);}return DATARMNET0529bb9c4e;}