| .. | .. |
|---|
| 1988 | 1988 | { |
|---|
| 1989 | 1989 | struct sock *sk = sock->sk; |
|---|
| 1990 | 1990 | struct smc_sock *smc; |
|---|
| 1991 | | - int rc = -EPIPE; |
|---|
| 1991 | + int rc; |
|---|
| 1992 | 1992 | |
|---|
| 1993 | 1993 | smc = smc_sk(sk); |
|---|
| 1994 | 1994 | lock_sock(sk); |
|---|
| 1995 | | - if ((sk->sk_state != SMC_ACTIVE) && |
|---|
| 1996 | | - (sk->sk_state != SMC_APPCLOSEWAIT1) && |
|---|
| 1997 | | - (sk->sk_state != SMC_INIT)) |
|---|
| 1998 | | - goto out; |
|---|
| 1999 | 1995 | |
|---|
| 1996 | + /* SMC does not support connect with fastopen */ |
|---|
| 2000 | 1997 | if (msg->msg_flags & MSG_FASTOPEN) { |
|---|
| 1998 | + /* not connected yet, fallback */ |
|---|
| 2001 | 1999 | if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) { |
|---|
| 2002 | 2000 | smc_switch_to_fallback(smc); |
|---|
| 2003 | 2001 | smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP; |
|---|
| .. | .. |
|---|
| 2005 | 2003 | rc = -EINVAL; |
|---|
| 2006 | 2004 | goto out; |
|---|
| 2007 | 2005 | } |
|---|
| 2006 | + } else if ((sk->sk_state != SMC_ACTIVE) && |
|---|
| 2007 | + (sk->sk_state != SMC_APPCLOSEWAIT1) && |
|---|
| 2008 | + (sk->sk_state != SMC_INIT)) { |
|---|
| 2009 | + rc = -EPIPE; |
|---|
| 2010 | + goto out; |
|---|
| 2008 | 2011 | } |
|---|
| 2009 | 2012 | |
|---|
| 2010 | 2013 | if (smc->use_fallback) |
|---|