mptcp_subflow_reset(sk);
 }
 
-static struct request_sock_ops mptcp_subflow_request_sock_ops __ro_after_init;
+static struct request_sock_ops mptcp_subflow_v4_request_sock_ops __ro_after_init;
 static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops __ro_after_init;
 
 static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb)
        if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
                goto drop;
 
-       return tcp_conn_request(&mptcp_subflow_request_sock_ops,
+       return tcp_conn_request(&mptcp_subflow_v4_request_sock_ops,
                                &subflow_request_sock_ipv4_ops,
                                sk, skb);
 drop:
 }
 
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
+static struct request_sock_ops mptcp_subflow_v6_request_sock_ops __ro_after_init;
 static struct tcp_request_sock_ops subflow_request_sock_ipv6_ops __ro_after_init;
 static struct inet_connection_sock_af_ops subflow_v6_specific __ro_after_init;
 static struct inet_connection_sock_af_ops subflow_v6m_specific __ro_after_init;
                return 0;
        }
 
-       return tcp_conn_request(&mptcp_subflow_request_sock_ops,
+       return tcp_conn_request(&mptcp_subflow_v6_request_sock_ops,
                                &subflow_request_sock_ipv6_ops, sk, skb);
 
 drop:
                                               struct sock *sk_listener,
                                               bool attach_listener)
 {
-       ops = &mptcp_subflow_request_sock_ops;
+       if (ops->family == AF_INET)
+               ops = &mptcp_subflow_v4_request_sock_ops;
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+       else if (ops->family == AF_INET6)
+               ops = &mptcp_subflow_v6_request_sock_ops;
+#endif
 
        return inet_reqsk_alloc(ops, sk_listener, attach_listener);
 }
 static int subflow_ops_init(struct request_sock_ops *subflow_ops)
 {
        subflow_ops->obj_size = sizeof(struct mptcp_subflow_request_sock);
-       subflow_ops->slab_name = "request_sock_subflow";
 
        subflow_ops->slab = kmem_cache_create(subflow_ops->slab_name,
                                              subflow_ops->obj_size, 0,
 
 void __init mptcp_subflow_init(void)
 {
-       mptcp_subflow_request_sock_ops = tcp_request_sock_ops;
-       if (subflow_ops_init(&mptcp_subflow_request_sock_ops) != 0)
-               panic("MPTCP: failed to init subflow request sock ops\n");
+       mptcp_subflow_v4_request_sock_ops = tcp_request_sock_ops;
+       mptcp_subflow_v4_request_sock_ops.slab_name = "request_sock_subflow_v4";
+       if (subflow_ops_init(&mptcp_subflow_v4_request_sock_ops) != 0)
+               panic("MPTCP: failed to init subflow v4 request sock ops\n");
 
        subflow_request_sock_ipv4_ops = tcp_request_sock_ipv4_ops;
        subflow_request_sock_ipv4_ops.route_req = subflow_v4_route_req;
        tcp_prot_override.release_cb = tcp_release_cb_override;
 
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
+       /* In struct mptcp_subflow_request_sock, we assume the TCP request sock
+        * structures for v4 and v6 have the same size. It should not changed in
+        * the future but better to make sure to be warned if it is no longer
+        * the case.
+        */
+       BUILD_BUG_ON(sizeof(struct tcp_request_sock) != sizeof(struct tcp6_request_sock));
+
+       mptcp_subflow_v6_request_sock_ops = tcp6_request_sock_ops;
+       mptcp_subflow_v6_request_sock_ops.slab_name = "request_sock_subflow_v6";
+       if (subflow_ops_init(&mptcp_subflow_v6_request_sock_ops) != 0)
+               panic("MPTCP: failed to init subflow v6 request sock ops\n");
+
        subflow_request_sock_ipv6_ops = tcp_request_sock_ipv6_ops;
        subflow_request_sock_ipv6_ops.route_req = subflow_v6_route_req;