@@ -560,6 +560,7 @@ static bool mptcp_supported_sockopt(int level, int optname)
560560 case TCP_TX_DELAY :
561561 case TCP_INQ :
562562 case TCP_FASTOPEN_CONNECT :
563+ case TCP_FASTOPEN_NO_COOKIE :
563564 return true;
564565 }
565566
@@ -568,8 +569,8 @@ static bool mptcp_supported_sockopt(int level, int optname)
568569 /* TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS,
569570 * TCP_REPAIR_WINDOW are not supported, better avoid this mess
570571 */
571- /* TCP_FASTOPEN_KEY, TCP_FASTOPEN, TCP_FASTOPEN_NO_COOKIE,
572- * are not supported fastopen is currently unsupported
572+ /* TCP_FASTOPEN_KEY, TCP_FASTOPEN are not supported because
573+ * fastopen for the listener side is currently unsupported
573574 */
574575 }
575576 return false;
@@ -757,29 +758,17 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
757758 return - EOPNOTSUPP ;
758759}
759760
760- static int mptcp_setsockopt_sol_tcp_defer (struct mptcp_sock * msk , sockptr_t optval ,
761- unsigned int optlen )
762- {
763- struct socket * listener ;
764-
765- listener = __mptcp_nmpc_socket (msk );
766- if (!listener )
767- return 0 ; /* TCP_DEFER_ACCEPT does not fail */
768-
769- return tcp_setsockopt (listener -> sk , SOL_TCP , TCP_DEFER_ACCEPT , optval , optlen );
770- }
771-
772- static int mptcp_setsockopt_sol_tcp_fastopen_connect (struct mptcp_sock * msk , sockptr_t optval ,
773- unsigned int optlen )
761+ static int mptcp_setsockopt_first_sf_only (struct mptcp_sock * msk , int level , int optname ,
762+ sockptr_t optval , unsigned int optlen )
774763{
775764 struct socket * sock ;
776765
777- /* Limit to first subflow */
766+ /* Limit to first subflow, before the connection establishment */
778767 sock = __mptcp_nmpc_socket (msk );
779768 if (!sock )
780769 return - EINVAL ;
781770
782- return tcp_setsockopt (sock -> sk , SOL_TCP , TCP_FASTOPEN_CONNECT , optval , optlen );
771+ return tcp_setsockopt (sock -> sk , level , optname , optval , optlen );
783772}
784773
785774static int mptcp_setsockopt_sol_tcp (struct mptcp_sock * msk , int optname ,
@@ -809,9 +798,13 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
809798 case TCP_NODELAY :
810799 return mptcp_setsockopt_sol_tcp_nodelay (msk , optval , optlen );
811800 case TCP_DEFER_ACCEPT :
812- return mptcp_setsockopt_sol_tcp_defer (msk , optval , optlen );
801+ /* See tcp.c: TCP_DEFER_ACCEPT does not fail */
802+ mptcp_setsockopt_first_sf_only (msk , SOL_TCP , optname , optval , optlen );
803+ return 0 ;
813804 case TCP_FASTOPEN_CONNECT :
814- return mptcp_setsockopt_sol_tcp_fastopen_connect (msk , optval , optlen );
805+ case TCP_FASTOPEN_NO_COOKIE :
806+ return mptcp_setsockopt_first_sf_only (msk , SOL_TCP , optname ,
807+ optval , optlen );
815808 }
816809
817810 return - EOPNOTSUPP ;
@@ -1174,6 +1167,7 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
11741167 case TCP_CC_INFO :
11751168 case TCP_DEFER_ACCEPT :
11761169 case TCP_FASTOPEN_CONNECT :
1170+ case TCP_FASTOPEN_NO_COOKIE :
11771171 return mptcp_getsockopt_first_sf_only (msk , SOL_TCP , optname ,
11781172 optval , optlen );
11791173 case TCP_INQ :
0 commit comments