Skip to content

Commit 256f5cd

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. Similar to mptcp_setsockopt_first_sf_only(), a generic helper mptcp_setsockopt_all_subflows() is added to set sockopt for each subflows of the mptcp socket. Add a new member for struct mptcp_sock to store the TCP_MAXSEG value, and return this value in getsockopt. Closes: multipath-tcp/mptcp_net-next#515 Signed-off-by: Geliang Tang <[email protected]>
1 parent 8b8b4f7 commit 256f5cd

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

net/mptcp/protocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ struct mptcp_sock {
327327
int keepalive_cnt;
328328
int keepalive_idle;
329329
int keepalive_intvl;
330+
int maxseg;
330331
struct work_struct work;
331332
struct sk_buff *ooo_last_skb;
332333
struct rb_root out_of_order_queue;

net/mptcp/sockopt.c

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

801+
static int mptcp_setsockopt_all_subflows(struct mptcp_sock *msk, int level, int optname,
802+
sockptr_t optval, unsigned int optlen)
803+
{
804+
struct mptcp_subflow_context *subflow;
805+
806+
mptcp_for_each_subflow(msk, subflow) {
807+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
808+
int ret = 0;
809+
810+
ret = tcp_setsockopt(ssk, level, optname, optval, optlen);
811+
if (ret)
812+
return ret;
813+
}
814+
return 0;
815+
}
816+
801817
static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
802818
sockptr_t optval, unsigned int optlen)
803819
{
@@ -859,6 +875,11 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
859875
&msk->keepalive_cnt,
860876
val);
861877
break;
878+
case TCP_MAXSEG:
879+
msk->maxseg = val;
880+
ret = mptcp_setsockopt_all_subflows(msk, SOL_TCP, optname,
881+
optval, optlen);
882+
break;
862883
default:
863884
ret = -ENOPROTOOPT;
864885
}
@@ -1406,6 +1427,9 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
14061427
return mptcp_put_int_option(msk, optval, optlen, msk->notsent_lowat);
14071428
case TCP_IS_MPTCP:
14081429
return mptcp_put_int_option(msk, optval, optlen, 1);
1430+
case TCP_MAXSEG:
1431+
return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname,
1432+
optval, optlen);
14091433
}
14101434
return -EOPNOTSUPP;
14111435
}
@@ -1552,6 +1576,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
15521576
tcp_sock_set_keepidle_locked(ssk, msk->keepalive_idle);
15531577
tcp_sock_set_keepintvl(ssk, msk->keepalive_intvl);
15541578
tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt);
1579+
tcp_sock_set_maxseg(ssk, msk->maxseg);
15551580

15561581
inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk));
15571582
inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk));

0 commit comments

Comments
 (0)