Skip to content

Commit 7f71a33

Browse files
Paolo Abenidavem330
Paolo Abeni
authored andcommitted
mptcp: cleanup SOL_TCP handling
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]>
1 parent 29b5e5e commit 7f71a33

File tree

1 file changed

+30
-45
lines changed

1 file changed

+30
-45
lines changed

net/mptcp/sockopt.c

+30-45
Original file line numberDiff line numberDiff line change
@@ -624,18 +624,11 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct mptcp_sock *msk, sockptr_t
624624
return ret;
625625
}
626626

627-
static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optval,
628-
unsigned int optlen)
627+
static int __mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, int val)
629628
{
630629
struct mptcp_subflow_context *subflow;
631630
struct sock *sk = (struct sock *)msk;
632-
int val, ret;
633631

634-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
635-
if (ret)
636-
return ret;
637-
638-
lock_sock(sk);
639632
sockopt_seq_inc(msk);
640633
msk->cork = !!val;
641634
mptcp_for_each_subflow(msk, subflow) {
@@ -647,23 +640,15 @@ static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t optva
647640
}
648641
if (!val)
649642
mptcp_check_and_set_pending(sk);
650-
release_sock(sk);
651643

652644
return 0;
653645
}
654646

655-
static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t optval,
656-
unsigned int optlen)
647+
static int __mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, int val)
657648
{
658649
struct mptcp_subflow_context *subflow;
659650
struct sock *sk = (struct sock *)msk;
660-
int val, ret;
661651

662-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
663-
if (ret)
664-
return ret;
665-
666-
lock_sock(sk);
667652
sockopt_seq_inc(msk);
668653
msk->nodelay = !!val;
669654
mptcp_for_each_subflow(msk, subflow) {
@@ -675,8 +660,6 @@ static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t op
675660
}
676661
if (val)
677662
mptcp_check_and_set_pending(sk);
678-
release_sock(sk);
679-
680663
return 0;
681664
}
682665

@@ -799,35 +782,10 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
799782
int ret, val;
800783

801784
switch (optname) {
802-
case TCP_INQ:
803-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
804-
if (ret)
805-
return ret;
806-
if (val < 0 || val > 1)
807-
return -EINVAL;
808-
809-
lock_sock(sk);
810-
msk->recvmsg_inq = !!val;
811-
release_sock(sk);
812-
return 0;
813785
case TCP_ULP:
814786
return -EOPNOTSUPP;
815-
case TCP_NOTSENT_LOWAT:
816-
ret = mptcp_get_int_option(msk, optval, optlen, &val);
817-
if (ret)
818-
return ret;
819-
820-
lock_sock(sk);
821-
WRITE_ONCE(msk->notsent_lowat, val);
822-
mptcp_write_space(sk);
823-
release_sock(sk);
824-
return 0;
825787
case TCP_CONGESTION:
826788
return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen);
827-
case TCP_CORK:
828-
return mptcp_setsockopt_sol_tcp_cork(msk, optval, optlen);
829-
case TCP_NODELAY:
830-
return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen);
831789
case TCP_DEFER_ACCEPT:
832790
/* See tcp.c: TCP_DEFER_ACCEPT does not fail */
833791
mptcp_setsockopt_first_sf_only(msk, SOL_TCP, optname, optval, optlen);
@@ -840,7 +798,34 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
840798
optval, optlen);
841799
}
842800

843-
return -EOPNOTSUPP;
801+
ret = mptcp_get_int_option(msk, optval, optlen, &val);
802+
if (ret)
803+
return ret;
804+
805+
lock_sock(sk);
806+
switch (optname) {
807+
case TCP_INQ:
808+
if (val < 0 || val > 1)
809+
ret = -EINVAL;
810+
else
811+
msk->recvmsg_inq = !!val;
812+
break;
813+
case TCP_NOTSENT_LOWAT:
814+
WRITE_ONCE(msk->notsent_lowat, val);
815+
mptcp_write_space(sk);
816+
break;
817+
case TCP_CORK:
818+
ret = __mptcp_setsockopt_sol_tcp_cork(msk, val);
819+
break;
820+
case TCP_NODELAY:
821+
ret = __mptcp_setsockopt_sol_tcp_nodelay(msk, val);
822+
break;
823+
default:
824+
ret = -ENOPROTOOPT;
825+
}
826+
827+
release_sock(sk);
828+
return ret;
844829
}
845830

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

0 commit comments

Comments
 (0)