Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mptcp: pm: in-kernel: refactor fill_remote_addresses_vec

Before this modification, this function was quite long with many levels
of indentations.

Each case can be split in a dedicated function: fullmesh, non-fullmesh.

To remove one level of indentation, msk->pm.subflows >= subflows_max is
now checked after having added one subflow, and stops the loop if it is
no longer possible to add new subflows. This is fine to do this because
this function should only be called if msk->pm.subflows < subflows_max.

No functional changes intended.

Reviewed-by: Geliang Tang <geliang@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20250925-net-next-mptcp-c-flag-laminar-v1-4-ad126cc47c6b@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Matthieu Baerts (NGI0) and committed by
Jakub Kicinski
a845b2bb 8dc63ade

+67 -49
+67 -49
net/mptcp/pm_kernel.c
··· 159 159 return found; 160 160 } 161 161 162 - /* Fill all the remote addresses into the array addrs[], 163 - * and return the array size. 164 - */ 165 - static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk, 166 - struct mptcp_addr_info *local, 167 - bool fullmesh, 168 - struct mptcp_addr_info *addrs) 162 + static unsigned int 163 + fill_remote_addr(struct mptcp_sock *msk, struct mptcp_addr_info *local, 164 + struct mptcp_addr_info *addrs) 169 165 { 170 166 bool deny_id0 = READ_ONCE(msk->pm.remote_deny_join_id0); 167 + struct mptcp_addr_info remote = { 0 }; 168 + struct sock *sk = (struct sock *)msk; 169 + 170 + if (deny_id0) 171 + return 0; 172 + 173 + mptcp_remote_address((struct sock_common *)sk, &remote); 174 + 175 + if (!mptcp_pm_addr_families_match(sk, local, &remote)) 176 + return 0; 177 + 178 + msk->pm.subflows++; 179 + *addrs = remote; 180 + 181 + return 1; 182 + } 183 + 184 + static unsigned int 185 + fill_remote_addresses_fullmesh(struct mptcp_sock *msk, 186 + struct mptcp_addr_info *local, 187 + struct mptcp_addr_info *addrs) 188 + { 189 + bool deny_id0 = READ_ONCE(msk->pm.remote_deny_join_id0); 190 + DECLARE_BITMAP(unavail_id, MPTCP_PM_MAX_ADDR_ID + 1); 171 191 struct sock *sk = (struct sock *)msk, *ssk; 172 192 struct mptcp_subflow_context *subflow; 173 - struct mptcp_addr_info remote = { 0 }; 174 193 unsigned int subflows_max; 175 194 int i = 0; 176 195 177 196 subflows_max = mptcp_pm_get_subflows_max(msk); 178 - mptcp_remote_address((struct sock_common *)sk, &remote); 179 197 180 - /* Non-fullmesh endpoint, fill in the single entry 181 - * corresponding to the primary MPC subflow remote address 198 + /* Forbid creation of new subflows matching existing ones, possibly 199 + * already created by incoming ADD_ADDR 182 200 */ 183 - if (!fullmesh) { 184 - if (deny_id0) 185 - return 0; 201 + bitmap_zero(unavail_id, MPTCP_PM_MAX_ADDR_ID + 1); 202 + mptcp_for_each_subflow(msk, subflow) 203 + if (READ_ONCE(subflow->local_id) == local->id) 204 + __set_bit(subflow->remote_id, unavail_id); 186 205 187 - if (!mptcp_pm_addr_families_match(sk, local, &remote)) 188 - return 0; 206 + mptcp_for_each_subflow(msk, subflow) { 207 + ssk = mptcp_subflow_tcp_sock(subflow); 208 + mptcp_remote_address((struct sock_common *)ssk, &addrs[i]); 209 + addrs[i].id = READ_ONCE(subflow->remote_id); 210 + if (deny_id0 && !addrs[i].id) 211 + continue; 189 212 213 + if (test_bit(addrs[i].id, unavail_id)) 214 + continue; 215 + 216 + if (!mptcp_pm_addr_families_match(sk, local, &addrs[i])) 217 + continue; 218 + 219 + /* forbid creating multiple address towards this id */ 220 + __set_bit(addrs[i].id, unavail_id); 190 221 msk->pm.subflows++; 191 - addrs[i++] = remote; 192 - } else { 193 - DECLARE_BITMAP(unavail_id, MPTCP_PM_MAX_ADDR_ID + 1); 222 + i++; 194 223 195 - /* Forbid creation of new subflows matching existing 196 - * ones, possibly already created by incoming ADD_ADDR 197 - */ 198 - bitmap_zero(unavail_id, MPTCP_PM_MAX_ADDR_ID + 1); 199 - mptcp_for_each_subflow(msk, subflow) 200 - if (READ_ONCE(subflow->local_id) == local->id) 201 - __set_bit(subflow->remote_id, unavail_id); 202 - 203 - mptcp_for_each_subflow(msk, subflow) { 204 - ssk = mptcp_subflow_tcp_sock(subflow); 205 - mptcp_remote_address((struct sock_common *)ssk, &addrs[i]); 206 - addrs[i].id = READ_ONCE(subflow->remote_id); 207 - if (deny_id0 && !addrs[i].id) 208 - continue; 209 - 210 - if (test_bit(addrs[i].id, unavail_id)) 211 - continue; 212 - 213 - if (!mptcp_pm_addr_families_match(sk, local, &addrs[i])) 214 - continue; 215 - 216 - if (msk->pm.subflows < subflows_max) { 217 - /* forbid creating multiple address towards 218 - * this id 219 - */ 220 - __set_bit(addrs[i].id, unavail_id); 221 - msk->pm.subflows++; 222 - i++; 223 - } 224 - } 224 + if (msk->pm.subflows >= subflows_max) 225 + break; 225 226 } 226 227 227 228 return i; 229 + } 230 + 231 + /* Fill all the remote addresses into the array addrs[], 232 + * and return the array size. 233 + */ 234 + static unsigned int 235 + fill_remote_addresses_vec(struct mptcp_sock *msk, struct mptcp_addr_info *local, 236 + bool fullmesh, struct mptcp_addr_info *addrs) 237 + { 238 + /* Non-fullmesh: fill in the single entry corresponding to the primary 239 + * MPC subflow remote address, and return 1, corresponding to 1 entry. 240 + */ 241 + if (!fullmesh) 242 + return fill_remote_addr(msk, local, addrs); 243 + 244 + /* Fullmesh endpoint: fill all possible remote addresses */ 245 + return fill_remote_addresses_fullmesh(msk, local, addrs); 228 246 } 229 247 230 248 static struct mptcp_pm_addr_entry *