From: Gur Stavi <gur.stavi@huawei.com>
To: 'Willem de Bruijn' <willemdebruijn.kernel@gmail.com>
Cc: <netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Shuah Khan <shuah@kernel.org>, <linux-kselftest@vger.kernel.org>
Subject: RE: [PATCH net-next v03 1/3] af_packet: allow fanout_add when socket is not RUNNING
Date: Thu, 10 Oct 2024 19:00:58 +0300 [thread overview]
Message-ID: <000001db1b2d$9f9a00f0$dece02d0$@huawei.com> (raw)
In-Reply-To: <6707d56835f42_2029212942b@willemb.c.googlers.com.notmuch>
> Gur Stavi wrote:
> > PACKET socket can retain its fanout membership through link down and up
> > and leave a fanout while closed regardless of link state.
> > However, socket was forbidden from joining a fanout while it was not
> > RUNNING.
> >
> > This patch allows PACKET socket to join fanout while not RUNNING.
> >
> > The previous test for RUNNING also implicitly tested that the socket is
> > bound to a device. An explicit test of ifindex was added instead.
> >
> > Signed-off-by: Gur Stavi <gur.stavi@huawei.com>
> > ---
> > net/packet/af_packet.c | 35 +++++++++++++++++++++--------------
> > 1 file changed, 21 insertions(+), 14 deletions(-)
> >
> > diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> > index f8942062f776..8137c33ab0fd 100644
> > --- a/net/packet/af_packet.c
> > +++ b/net/packet/af_packet.c
> > @@ -1843,26 +1843,29 @@ static int fanout_add(struct sock *sk, struct
> fanout_args *args)
> > match->prot_hook.ignore_outgoing = type_flags &
> PACKET_FANOUT_FLAG_IGNORE_OUTGOING;
> > list_add(&match->list, &fanout_list);
> > }
> > - err = -EINVAL;
> >
> > spin_lock(&po->bind_lock);
> > - if (packet_sock_flag(po, PACKET_SOCK_RUNNING) &&
> > - match->type == type &&
> > - match->prot_hook.type == po->prot_hook.type &&
> > - match->prot_hook.dev == po->prot_hook.dev) {
> > + if (po->ifindex == -1 || po->num == 0) {
>
> This patch is more complex than it needs to be.
>
> No need to block the case of ETH_P_NONE or not bound to a socket.
ETH_P_NONE was blocked before as well.
packet_do_bind will not switch socket to RUNNING when proto is 0.
if (proto == 0 || !need_rehook)
goto out_unlock;
Same for packet_create.
So the old condition could only pass the RUNNING condition if proto
was non-zero.
The new condition is exactly equivalent except for allowing IFF_UP
to be cleared in the bound device.
Yes, the same result could be achieved with a FEW less line changes
but I think that the new logic is more readable where every clause
explains itself with a comment instead of constructing one large if
statement. And since the solution does add another nested if for the
RUNNING the extra indentation started to look ugly.
>
> I would have discussed that in v2, but you already respun.
>
> > + /* Socket can not receive packets */
> > + err = -ENXIO;
> > + } else if (match->type != type ||
> > + match->prot_hook.type != po->prot_hook.type ||
> > + match->prot_hook.dev != po->prot_hook.dev) {
> > + /* Joining an existing group, properties must be identical */
> > + err = -EINVAL;
> > + } else if (refcount_read(&match->sk_ref) >= match->max_num_members)
> {
> > err = -ENOSPC;
> > - if (refcount_read(&match->sk_ref) < match->max_num_members) {
> > + } else {
> > + /* Paired with packet_setsockopt(PACKET_FANOUT_DATA) */
> > + WRITE_ONCE(po->fanout, match);
> > + po->rollover = rollover;
> > + rollover = NULL;
> > + refcount_set(&match->sk_ref, refcount_read(&match->sk_ref) +
> 1);
> > + if (packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
> > __dev_remove_pack(&po->prot_hook);
> > -
> > - /* Paired with packet_setsockopt(PACKET_FANOUT_DATA) */
> > - WRITE_ONCE(po->fanout, match);
> > -
> > - po->rollover = rollover;
> > - rollover = NULL;
> > - refcount_set(&match->sk_ref, refcount_read(&match-
> >sk_ref) + 1);
> > __fanout_link(sk, po);
> > - err = 0;
> > }
> > + err = 0;
> > }
> > spin_unlock(&po->bind_lock);
> >
> > @@ -3452,8 +3455,12 @@ static int packet_create(struct net *net, struct
> socket *sock, int protocol,
> > po->prot_hook.af_packet_net = sock_net(sk);
> >
> > if (proto) {
> > + /* Implicitly bind socket to "any interface" */
> > + po->ifindex = 0;
> > po->prot_hook.type = proto;
> > __register_prot_hook(sk);
> > + } else {
> > + po->ifindex = -1;
> > }
> >
> > mutex_lock(&net->packet.sklist_lock);
> > --
> > 2.45.2
> >
>
next prev parent reply other threads:[~2024-10-10 16:01 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-10 10:25 [PATCH net-next v03 0/3] net: af_packet: allow joining a fanout when link is down Gur Stavi
2024-10-10 10:25 ` [PATCH net-next v03 1/3] af_packet: allow fanout_add when socket is not RUNNING Gur Stavi
2024-10-10 10:38 ` Gur Stavi
2024-10-10 13:23 ` Willem de Bruijn
2024-10-10 16:00 ` Gur Stavi [this message]
2024-10-10 10:25 ` [PATCH net-next v03 2/3] selftests: net/psock_fanout: socket joins fanout when link is down Gur Stavi
2024-10-10 10:25 ` [PATCH net-next v03 3/3] selftests: net/psock_fanout: unbound socket fanout Gur Stavi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='000001db1b2d$9f9a00f0$dece02d0$@huawei.com' \
--to=gur.stavi@huawei.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
--cc=willemdebruijn.kernel@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox