Skip to content

Commit 19300ba

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
mptcp: add TCP_MAXSEG sockopt support
The TCP_MAXSEG socket option is currently not supported by MPTCP, mainly because it has never been requested before. But there are still valid use-cases, e.g. with HAProxy. This patch adds its support in MPTCP by propagating the value to all subflows. Closes: multipath-tcp/mptcp_net-next#515 Signed-off-by: Geliang Tang <[email protected]>
1 parent 2857425 commit 19300ba

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

net/mptcp/sockopt.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,24 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, int
798798
return ret;
799799
}
800800

801+
static int mptcp_setsockopt_sol_tcp_maxseg(struct mptcp_sock *msk,
802+
sockptr_t optval,
803+
unsigned int optlen)
804+
{
805+
struct mptcp_subflow_context *subflow;
806+
807+
mptcp_for_each_subflow(msk, subflow) {
808+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
809+
int ret;
810+
811+
ret = tcp_setsockopt(ssk, SOL_TCP, TCP_MAXSEG, optval, optlen);
812+
if (ret)
813+
return ret;
814+
}
815+
816+
return 0;
817+
}
818+
801819
static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
802820
sockptr_t optval, unsigned int optlen)
803821
{
@@ -819,6 +837,8 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
819837
case TCP_FASTOPEN_NO_COOKIE:
820838
return mptcp_setsockopt_first_sf_only(msk, SOL_TCP, optname,
821839
optval, optlen);
840+
case TCP_MAXSEG:
841+
return mptcp_setsockopt_sol_tcp_maxseg(msk, optval, optlen);
822842
}
823843

824844
ret = mptcp_get_int_option(msk, optval, optlen, &val);
@@ -1368,6 +1388,13 @@ static int mptcp_put_int_option(struct mptcp_sock *msk, char __user *optval,
13681388
return 0;
13691389
}
13701390

1391+
static int mptcp_getsockopt_sol_tcp_maxseg(struct mptcp_sock *msk,
1392+
char __user *optval,
1393+
int __user *optlen)
1394+
{
1395+
return tcp_getsockopt(msk->first, SOL_TCP, TCP_MAXSEG, optval, optlen);
1396+
}
1397+
13711398
static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
13721399
char __user *optval, int __user *optlen)
13731400
{
@@ -1407,6 +1434,8 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
14071434
return mptcp_put_int_option(msk, optval, optlen, msk->notsent_lowat);
14081435
case TCP_IS_MPTCP:
14091436
return mptcp_put_int_option(msk, optval, optlen, 1);
1437+
case TCP_MAXSEG:
1438+
return mptcp_getsockopt_sol_tcp_maxseg(msk, optval, optlen);
14101439
}
14111440
return -EOPNOTSUPP;
14121441
}

0 commit comments

Comments
 (0)