Skip to content

Commit 89e11fe

Browse files
Paolo Abenigregkh
Paolo Abeni
authored andcommitted
mptcp: cleanup SOL_TCP handling
commit 7f71a33 upstream. Most TCP-level socket options get an integer from user space, and set the corresponding field under the msk-level socket lock. Reduce the code duplication moving such operations in the common code. Signed-off-by: Paolo Abeni <[email protected]> Reviewed-by: Mat Martineau <[email protected]> Signed-off-by: Matthieu Baerts (NGI0) <[email protected]> Signed-off-by: David S. Miller <[email protected]> Stable-dep-of: bd11dc4 ("mptcp: fix full TCP keep-alive support") [ Without TCP_NOTSENT_LOWAT support, as it is not in this version, see commit 29b5e5e ("mptcp: implement TCP_NOTSENT_LOWAT support") ] Signed-off-by: Matthieu Baerts (NGI0) <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 41089d9 commit 89e11fe

File tree

1 file changed

+26
-35
lines changed

1 file changed

+26
-35
lines changed

net/mptcp/sockopt.c

+26-35
Original file line numberDiff line numberDiff line change
@@ -621,18 +621,11 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct mptcp_sock *msk, sockptr_t
621621
return ret;
622622
}
623623

624-
static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optval,
625-
unsigned int optlen)
624+
static int __mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, int val)
626625
{
627626
struct mptcp_subflow_context *subflow;
628627
struct sock *sk = (struct sock *)msk;
629-
int val, ret;
630-
631-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
632-
if (ret)
633-
return ret;
634628

635-
lock_sock(sk);
636629
sockopt_seq_inc(msk);
637630
msk->cork = !!val;
638631
mptcp_for_each_subflow(msk, subflow) {
@@ -644,23 +637,15 @@ static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optva
644637
}
645638
if (!val)
646639
mptcp_check_and_set_pending(sk);
647-
release_sock(sk);
648640

649641
return 0;
650642
}
651643

652-
static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t optval,
653-
unsigned int optlen)
644+
static int __mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, int val)
654645
{
655646
struct mptcp_subflow_context *subflow;
656647
struct sock *sk = (struct sock *)msk;
657-
int val, ret;
658-
659-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
660-
if (ret)
661-
return ret;
662648

663-
lock_sock(sk);
664649
sockopt_seq_inc(msk);
665650
msk->nodelay = !!val;
666651
mptcp_for_each_subflow(msk, subflow) {
@@ -672,8 +657,6 @@ static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t op
672657
}
673658
if (val)
674659
mptcp_check_and_set_pending(sk);
675-
release_sock(sk);
676-
677660
return 0;
678661
}
679662

@@ -786,25 +769,10 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
786769
int ret, val;
787770

788771
switch (optname) {
789-
case TCP_INQ:
790-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
791-
if (ret)
792-
return ret;
793-
if (val < 0 || val > 1)
794-
return -EINVAL;
795-
796-
lock_sock(sk);
797-
msk->recvmsg_inq = !!val;
798-
release_sock(sk);
799-
return 0;
800772
case TCP_ULP:
801773
return -EOPNOTSUPP;
802774
case TCP_CONGESTION:
803775
return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen);
804-
case TCP_CORK:
805-
return mptcp_setsockopt_sol_tcp_cork(msk, optval, optlen);
806-
case TCP_NODELAY:
807-
return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen);
808776
case TCP_DEFER_ACCEPT:
809777
/* See tcp.c: TCP_DEFER_ACCEPT does not fail */
810778
mptcp_setsockopt_first_sf_only(msk, SOL_TCP, optname, optval, optlen);
@@ -817,7 +785,30 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
817785
optval, optlen);
818786
}
819787

820-
return -EOPNOTSUPP;
788+
ret = mptcp_get_int_option(msk, optval, optlen, &val);
789+
if (ret)
790+
return ret;
791+
792+
lock_sock(sk);
793+
switch (optname) {
794+
case TCP_INQ:
795+
if (val < 0 || val > 1)
796+
ret = -EINVAL;
797+
else
798+
msk->recvmsg_inq = !!val;
799+
break;
800+
case TCP_CORK:
801+
ret = __mptcp_setsockopt_sol_tcp_cork(msk, val);
802+
break;
803+
case TCP_NODELAY:
804+
ret = __mptcp_setsockopt_sol_tcp_nodelay(msk, val);
805+
break;
806+
default:
807+
ret = -ENOPROTOOPT;
808+
}
809+
810+
release_sock(sk);
811+
return ret;
821812
}
822813

823814
int mptcp_setsockopt(struct sock *sk, int level, int optname,

0 commit comments

Comments
 (0)