On Wed, 2023-07-12 at 14:50 -0700, Mat Martineau wrote:
> On Mon, 10 Jul 2023, Paolo Abeni wrote:
>
> > The mptcp protocol maintains an additional socket just to easily
> > invoke a few stream operations on the first subflow. One of them
> > is inet_listen().
> >
> > Factor out an helper operating directly on the (locked) struct sock,
> > to allow get rid of the above dependency in the next patch without
> > duplicating the existing code.
> >
> > No functional changes intended.
> >
> > Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> > ---
> > include/net/inet_common.h | 1 +
> > net/ipv4/af_inet.c | 39 +++++++++++++++++++++++----------------
> > 2 files changed, 24 insertions(+), 16 deletions(-)
> >
> > diff --git a/include/net/inet_common.h b/include/net/inet_common.h
> > index 8e97de700991..f50a644d87a9 100644
> > --- a/include/net/inet_common.h
> > +++ b/include/net/inet_common.h
> > @@ -40,6 +40,7 @@ int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
> > int flags);
> > int inet_shutdown(struct socket *sock, int how);
> > int inet_listen(struct socket *sock, int backlog);
> > +int __inet_listen_sk(struct sock *sk, int backlog);
> > void inet_sock_destruct(struct sock *sk);
> > int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
> > int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len);
> > diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
> > index 2fd23437c1d2..fa482e314162 100644
> > --- a/net/ipv4/af_inet.c
> > +++ b/net/ipv4/af_inet.c
> > @@ -187,24 +187,13 @@ static int inet_autobind(struct sock *sk)
> > return 0;
> > }
> >
> > -/*
> > - * Move a socket into listening state.
> > - */
> > -int inet_listen(struct socket *sock, int backlog)
> > +int __inet_listen_sk(struct sock *sk, int backlog)
> > {
> > - struct sock *sk = sock->sk;
> > - unsigned char old_state;
> > + unsigned char old_state = sk->sk_state;
> > int err, tcp_fastopen;
> >
> > - lock_sock(sk);
> > -
> > - err = -EINVAL;
> > - if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM)
> > - goto out;
> > -
> > - old_state = sk->sk_state;
> > if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))
> > - goto out;
> > + return -EINVAL;
> >
> > WRITE_ONCE(sk->sk_max_ack_backlog, backlog);
> > /* Really, if the socket is already in listen state
> > @@ -227,10 +216,28 @@ int inet_listen(struct socket *sock, int backlog)
> >
> > err = inet_csk_listen_start(sk);
> > if (err)
> > - goto out;
> > + return err;
> > +
> > tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_LISTEN_CB, 0, NULL);
> > }
> > - err = 0;
> > + return 0;
> > +}
> > +
> > +/*
> > + * Move a socket into listening state.
> > + */
> > +int inet_listen(struct socket *sock, int backlog)
> > +{
> > + struct sock *sk = sock->sk;
> > + int err;
> > +
> > + lock_sock(sk);
> > +
> > + err = -EINVAL;
>
> Minor tweak: can initialize in the declaration above.
Right you are! Not sure how I missed it. I'll do in v2.
Thanks!
Paolo