@@ -11,11 +11,6 @@ char _license[] SEC("license") = "GPL";
1111
1212#define min (a , b ) ((a) < (b) ? (a) : (b))
1313
14- struct bpf_subflow_send_info {
15- __u8 subflow_id ;
16- __u64 linger_time ;
17- };
18-
1914extern bool mptcp_subflow_active (struct mptcp_subflow_context * subflow ) __ksym ;
2015extern void mptcp_set_timeout (struct sock * sk ) __ksym ;
2116extern __u64 mptcp_wnd_end (const struct mptcp_sock * msk ) __ksym ;
@@ -70,7 +65,7 @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
7065static int bpf_burst_get_send (struct mptcp_sock * msk ,
7166 struct mptcp_sched_data * data )
7267{
73- struct bpf_subflow_send_info send_info [SSK_MODE_MAX ];
68+ struct subflow_send_info send_info [SSK_MODE_MAX ];
7469 struct mptcp_subflow_context * subflow ;
7570 struct sock * sk = (struct sock * )msk ;
7671 __u32 pace , burst , wmem ;
@@ -80,17 +75,13 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
8075
8176 /* pick the subflow with the lower wmem/wspace ratio */
8277 for (i = 0 ; i < SSK_MODE_MAX ; ++ i ) {
83- send_info [i ].subflow_id = MPTCP_SUBFLOWS_MAX ;
78+ send_info [i ].ssk = NULL ;
8479 send_info [i ].linger_time = -1 ;
8580 }
8681
87- for ( i = 0 ; i < data -> subflows && i < MPTCP_SUBFLOWS_MAX ; i ++ ) {
82+ bpf_for_each ( mptcp_subflow , subflow , msk ) {
8883 bool backup ;
8984
90- subflow = bpf_mptcp_subflow_ctx_by_pos (data , i );
91- if (!subflow )
92- break ;
93-
9485 backup = subflow -> backup || subflow -> request_bkup ;
9586
9687 ssk = mptcp_subflow_tcp_sock (subflow );
@@ -109,23 +100,24 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
109100
110101 linger_time = div_u64 ((__u64 )ssk -> sk_wmem_queued << 32 , pace );
111102 if (linger_time < send_info [backup ].linger_time ) {
112- send_info [backup ].subflow_id = i ;
103+ send_info [backup ].ssk = ssk ;
113104 send_info [backup ].linger_time = linger_time ;
114105 }
115106 }
116107 mptcp_set_timeout (sk );
117108
118109 /* pick the best backup if no other subflow is active */
119110 if (!nr_active )
120- send_info [SSK_MODE_ACTIVE ].subflow_id = send_info [SSK_MODE_BACKUP ].subflow_id ;
111+ send_info [SSK_MODE_ACTIVE ].ssk = send_info [SSK_MODE_BACKUP ].ssk ;
121112
122- subflow = bpf_mptcp_subflow_ctx_by_pos (data , send_info [SSK_MODE_ACTIVE ].subflow_id );
123- if (!subflow )
124- return -1 ;
125- ssk = mptcp_subflow_tcp_sock (subflow );
113+ ssk = bpf_mptcp_send_info_to_ssk (& send_info [SSK_MODE_ACTIVE ]);
126114 if (!ssk || !sk_stream_memory_free (ssk ))
127115 return -1 ;
128116
117+ subflow = bpf_mptcp_subflow_ctx (ssk );
118+ if (!subflow )
119+ return -1 ;
120+
129121 burst = min (MPTCP_SEND_BURST_SIZE , mptcp_wnd_end (msk ) - msk -> snd_nxt );
130122 wmem = ssk -> sk_wmem_queued ;
131123 if (!burst )
@@ -144,16 +136,12 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
144136static int bpf_burst_get_retrans (struct mptcp_sock * msk ,
145137 struct mptcp_sched_data * data )
146138{
147- int backup = MPTCP_SUBFLOWS_MAX , pick = MPTCP_SUBFLOWS_MAX , subflow_id ;
139+ struct sock * backup = NULL , * pick = NULL ;
148140 struct mptcp_subflow_context * subflow ;
149141 int min_stale_count = INT_MAX ;
150142 struct sock * ssk ;
151143
152- for (int i = 0 ; i < data -> subflows && i < MPTCP_SUBFLOWS_MAX ; i ++ ) {
153- subflow = bpf_mptcp_subflow_ctx_by_pos (data , i );
154- if (!subflow )
155- break ;
156-
144+ bpf_for_each (mptcp_subflow , subflow , msk ) {
157145 if (!mptcp_subflow_active (subflow ))
158146 continue ;
159147
@@ -166,23 +154,23 @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
166154 }
167155
168156 if (subflow -> backup || subflow -> request_bkup ) {
169- if (backup == MPTCP_SUBFLOWS_MAX )
170- backup = i ;
157+ if (! backup )
158+ backup = ssk ;
171159 continue ;
172160 }
173161
174- if (pick == MPTCP_SUBFLOWS_MAX )
175- pick = i ;
162+ if (! pick )
163+ pick = ssk ;
176164 }
177165
178- if (pick < MPTCP_SUBFLOWS_MAX ) {
179- subflow_id = pick ;
166+ if (pick )
180167 goto out ;
181- }
182- subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX ;
168+ pick = min_stale_count > 1 ? backup : NULL ;
183169
184170out :
185- subflow = bpf_mptcp_subflow_ctx_by_pos (data , subflow_id );
171+ if (!pick )
172+ return -1 ;
173+ subflow = bpf_mptcp_subflow_ctx (pick );
186174 if (!subflow )
187175 return -1 ;
188176 mptcp_subflow_set_scheduled (subflow , true);
0 commit comments