return ret;
 }
 
+static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level,
+                                  int optname, sockptr_t optval,
+                                  unsigned int optlen)
+{
+       struct mptcp_subflow_context *subflow;
+       int ret = 0;
+
+       mptcp_for_each_subflow(msk, subflow) {
+               struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
+
+               ret = tcp_setsockopt(ssk, level, optname, optval, optlen);
+               if (ret)
+                       break;
+       }
+       return ret;
+}
+
 static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
                                    sockptr_t optval, unsigned int optlen)
 {
                                                 &msk->keepalive_cnt,
                                                 val);
                break;
+       case TCP_MAXSEG:
+               msk->maxseg = val;
+               ret = mptcp_setsockopt_all_sf(msk, SOL_TCP, optname, optval,
+                                             optlen);
+               break;
        default:
                ret = -ENOPROTOOPT;
        }
                return mptcp_put_int_option(msk, optval, optlen, msk->notsent_lowat);
        case TCP_IS_MPTCP:
                return mptcp_put_int_option(msk, optval, optlen, 1);
+       case TCP_MAXSEG:
+               return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname,
+                                                     optval, optlen);
        }
        return -EOPNOTSUPP;
 }
        tcp_sock_set_keepidle_locked(ssk, msk->keepalive_idle);
        tcp_sock_set_keepintvl(ssk, msk->keepalive_intvl);
        tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt);
+       tcp_sock_set_maxseg(ssk, msk->maxseg);
 
        inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk));
        inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk));