Skip to content

Commit ffcacff

Browse files
Poorva Sonparotedavem330
authored andcommitted
mptcp: Support for IP_TOS for MPTCP setsockopt()
SOL_IP provides a way to configure network layer attributes in a socket. This patch adds support for IP_TOS for setsockopt(.. ,SOL_IP, ..) Support for SOL_IP is added in mptcp_setsockopt() and IP_TOS is handled in a private function. The idea here is to take in the value passed for IP_TOS and set it to the current subflow, open subflows as well new subflows that might be created after the initial call to setsockopt(). This sync is done using sync_socket_options(.., ssk) and setting the value of tos using __ip_sock_set_tos(ssk,..). The patch has been tested using the packetdrill script here - multipath-tcp/mptcp_net-next#220 (comment) Closes: multipath-tcp/mptcp_net-next#220 Signed-off-by: Poorva Sonparote <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4f47d5d commit ffcacff

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

net/mptcp/sockopt.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,42 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct mptcp_sock *msk, sockptr_t
598598
return ret;
599599
}
600600

601+
static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname,
602+
sockptr_t optval, unsigned int optlen)
603+
{
604+
struct mptcp_subflow_context *subflow;
605+
struct sock *sk = (struct sock *)msk;
606+
int err, val;
607+
608+
err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
609+
610+
if (err != 0)
611+
return err;
612+
613+
lock_sock(sk);
614+
sockopt_seq_inc(msk);
615+
val = inet_sk(sk)->tos;
616+
mptcp_for_each_subflow(msk, subflow) {
617+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
618+
619+
__ip_sock_set_tos(ssk, val);
620+
}
621+
release_sock(sk);
622+
623+
return err;
624+
}
625+
626+
static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
627+
sockptr_t optval, unsigned int optlen)
628+
{
629+
switch (optname) {
630+
case IP_TOS:
631+
return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen);
632+
}
633+
634+
return -EOPNOTSUPP;
635+
}
636+
601637
static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
602638
sockptr_t optval, unsigned int optlen)
603639
{
@@ -637,6 +673,9 @@ int mptcp_setsockopt(struct sock *sk, int level, int optname,
637673
if (ssk)
638674
return tcp_setsockopt(ssk, level, optname, optval, optlen);
639675

676+
if (level == SOL_IP)
677+
return mptcp_setsockopt_v4(msk, optname, optval, optlen);
678+
640679
if (level == SOL_IPV6)
641680
return mptcp_setsockopt_v6(msk, optname, optval, optlen);
642681

@@ -1003,6 +1042,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
10031042
ssk->sk_priority = sk->sk_priority;
10041043
ssk->sk_bound_dev_if = sk->sk_bound_dev_if;
10051044
ssk->sk_incoming_cpu = sk->sk_incoming_cpu;
1045+
__ip_sock_set_tos(ssk, inet_sk(sk)->tos);
10061046

10071047
if (sk->sk_userlocks & tx_rx_locks) {
10081048
ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;

0 commit comments

Comments
 (0)