• Jianguo Wu's avatar
    mptcp: fix syncookie process if mptcp can not_accept new subflow · 8547ea5f
    Jianguo Wu authored
    Lots of "TCP: tcp_fin: Impossible, sk->sk_state=7" in client side
    when doing stress testing using wrk and webfsd.
    
    There are at least two cases may trigger this warning:
    1.mptcp is in syncookie, and server recv MP_JOIN SYN request,
      in subflow_check_req(), the mptcp_can_accept_new_subflow()
      return false, so subflow_init_req_cookie_join_save() isn't
      called, i.e. not store the data present in the MP_JOIN syn
      request and the random nonce in hash table - join_entries[],
      but still send synack. When recv 3rd-ack,
      mptcp_token_join_cookie_init_state() will return false, and
      3rd-ack is dropped, then if mptcp conn is closed by client,
      client will send a DATA_FIN and a MPTCP FIN, the DATA_FIN
      doesn't have MP_CAPABLE or MP_JOIN,
      so mptcp_subflow_init_cookie_req() will return 0, and pass
      the cookie check, MP_JOIN request is fallback to normal TCP.
      Server will send a TCP FIN if closed, in client side,
      when process TCP FIN, it will do reset, the code path is:
        tcp_data_queue()->mptcp_incoming_options()
          ->check_fully_established()->mptcp_subflow_reset().
      mptcp_subflow_reset() will set sock state to TCP_CLOSE,
      so tcp_fin will hit TCP_CLOSE, and print the warning.
    
    2.mptcp is in syncookie, and server recv 3rd-ack, in
      mptcp_subflow_init_cookie_req(), mptcp_can_accept_new_subflow()
      return false, and subflow_req->mp_join is not set to 1,
      so in subflow_syn_recv_sock() will not reset the MP_JOIN
      subflow, but fallback to normal TCP, and then the same thing
      happens when server will send a TCP FIN if closed.
    
    For case1, subflow_check_req() return -EPERM,
    then tcp_conn_request() will drop MP_JOIN SYN.
    
    For case2, let subflow_syn_recv_sock() call
    mptcp_can_accept_new_subflow(), and do fatal fallback, send reset.
    
    Fixes: 9466a1cc ("mptcp: enable JOIN requests even if cookies are in use")
    Signed-off-by: default avatarJianguo Wu <wujianguo@chinatelecom.cn>
    Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8547ea5f
subflow.c 48.7 KB