Skip to content

Commit d848a3c

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
mptcp: implement IPV6_TCLASS socket option support
This patch adds full support for the IPV6_TCLASS socket option in MPTCP, ensuring consistent traffic class handling across all subflows. Key changes: 1. setsockopt(IPV6_TCLASS): - First sets the traffic class value on the main MPTCP socket - Propagates the new value to all existing subflows - Uses lock synchronization to ensure atomic updates 2. getsockopt(IPV6_TCLASS): - Returns the current traffic class value stored in the main socket's inet6_sk structure This implementation mirrors the existing IPv4 TOS handling (IP_TOS) and ensures QoS settings are consistently applied to all underlying TCP connections in the MPTCP session. Closes: multipath-tcp/mptcp_net-next#568 Signed-off-by: Geliang Tang <[email protected]>
1 parent d278e28 commit d848a3c

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

net/mptcp/sockopt.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,33 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
384384
return -EOPNOTSUPP;
385385
}
386386

387+
static int mptcp_setsockopt_v6_set_tclass(struct mptcp_sock *msk, int optname,
388+
sockptr_t optval, unsigned int optlen)
389+
{
390+
struct mptcp_subflow_context *subflow;
391+
struct sock *sk = (struct sock *)msk;
392+
int err, val;
393+
394+
err = ipv6_setsockopt(sk, SOL_IPV6, optname, optval, optlen);
395+
if (err)
396+
return err;
397+
398+
lock_sock(sk);
399+
sockopt_seq_inc(msk);
400+
val = READ_ONCE(inet6_sk(sk)->tclass);
401+
mptcp_for_each_subflow(msk, subflow) {
402+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
403+
bool slow;
404+
405+
slow = lock_sock_fast(ssk);
406+
inet6_sk(ssk)->tclass = val;
407+
unlock_sock_fast(ssk, slow);
408+
}
409+
release_sock(sk);
410+
411+
return 0;
412+
}
413+
387414
static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
388415
sockptr_t optval, unsigned int optlen)
389416
{
@@ -426,6 +453,8 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
426453

427454
release_sock(sk);
428455
break;
456+
case IPV6_TCLASS:
457+
return mptcp_setsockopt_v6_set_tclass(msk, optname, optval, optlen);
429458
}
430459

431460
return ret;
@@ -1475,6 +1504,9 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *msk, int optname,
14751504
case IPV6_FREEBIND:
14761505
return mptcp_put_int_option(msk, optval, optlen,
14771506
inet_test_bit(FREEBIND, sk));
1507+
case IPV6_TCLASS:
1508+
return mptcp_put_int_option(msk, optval, optlen,
1509+
inet6_sk(sk)->tclass);
14781510
}
14791511

14801512
return -EOPNOTSUPP;

0 commit comments

Comments
 (0)