Message ID | 20210426025001.7899-5-xiyou.wangcong@gmail.com |
---|---|
State | New |
Headers | show |
Series | sockmap: add sockmap support to Unix datagram socket | expand |
On Mon, Apr 26, 2021 at 04:49 AM CEST, Cong Wang wrote: > From: Cong Wang <cong.wang@bytedance.com> > > Currently only unix stream socket sets TCP_ESTABLISHED, > datagram socket can set this too when they connect to its > peer socket. At least __ip4_datagram_connect() does the same. > > This will be used by the next patch to determine whether an > AF_UNIX datagram socket can be redirected in sockmap. > > Cc: John Fastabend <john.fastabend@gmail.com> > Cc: Daniel Borkmann <daniel@iogearbox.net> > Cc: Jakub Sitnicki <jakub@cloudflare.com> > Cc: Lorenz Bauer <lmb@cloudflare.com> > Signed-off-by: Cong Wang <cong.wang@bytedance.com> > --- > net/unix/af_unix.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c > index 8968ed44a89f..c4afc5fbe137 100644 > --- a/net/unix/af_unix.c > +++ b/net/unix/af_unix.c > @@ -1206,6 +1206,8 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, > unix_peer(sk) = other; > unix_state_double_unlock(sk, other); > } > + > + sk->sk_state = other->sk_state = TCP_ESTABLISHED; `other` can be NULL. In such case we're back to UNCONNECTED state. > return 0; > > out_unlock: [...]
On Fri, May 7, 2021 at 1:18 AM Jakub Sitnicki <jakub@cloudflare.com> wrote: > > On Mon, Apr 26, 2021 at 04:49 AM CEST, Cong Wang wrote: > > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c > > index 8968ed44a89f..c4afc5fbe137 100644 > > --- a/net/unix/af_unix.c > > +++ b/net/unix/af_unix.c > > @@ -1206,6 +1206,8 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, > > unix_peer(sk) = other; > > unix_state_double_unlock(sk, other); > > } > > + > > + sk->sk_state = other->sk_state = TCP_ESTABLISHED; > > `other` can be NULL. In such case we're back to UNCONNECTED state. Right, we also need to move the sk_state back to TCP_CLOSE after disconnecting. Thanks.
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 8968ed44a89f..c4afc5fbe137 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1206,6 +1206,8 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, unix_peer(sk) = other; unix_state_double_unlock(sk, other); } + + sk->sk_state = other->sk_state = TCP_ESTABLISHED; return 0; out_unlock: @@ -1438,12 +1440,10 @@ static int unix_socketpair(struct socket *socka, struct socket *sockb) init_peercred(ska); init_peercred(skb); - if (ska->sk_type != SOCK_DGRAM) { - ska->sk_state = TCP_ESTABLISHED; - skb->sk_state = TCP_ESTABLISHED; - socka->state = SS_CONNECTED; - sockb->state = SS_CONNECTED; - } + ska->sk_state = TCP_ESTABLISHED; + skb->sk_state = TCP_ESTABLISHED; + socka->state = SS_CONNECTED; + sockb->state = SS_CONNECTED; return 0; }