[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <499417E3.5010304@netfilter.org>
Date: Thu, 12 Feb 2009 13:36:51 +0100
From: Pablo Neira Ayuso <pablo@...filter.org>
To: Patrick McHardy <kaber@...sh.net>
CC: David Miller <davem@...emloft.net>, netdev@...r.kernel.org,
netfilter-devel@...r.kernel.org
Subject: Re: [RFC] netlink broadcast return value
Patrick McHardy wrote:
> Pablo Neira Ayuso wrote:
>> And again, you point that this should be per-socket, but how can you
>> make this option per-socket? The only way that I see to make
>> state-change reporting reliable is to drop the packet to force the peer
>> to retransmit the packet and trigger the same state-change, and that
>> affect all ctnetlink listeners.
>
> For unicast its obviously simple, for broadcast you'd need something
> like this:
>
> err = 0;
> for (all netlink sockets; sk && !err; ...) {
> skb = skb_clone(...)
> if (skb == NULL) {
> if (sk->flags & NETLINK_HIGHLY_RELIABLE)
> err = -ENOBUFS;
> continue;
> }
> ...
> }
>
> So you're returning an error when at least one of the "reliable"
> sockets doesn't get its delivery.
Patrick, I like it, I'm fine with this approach as soon as it let me add
the "reliable" ctnetlink state-change reporting. I can add the following
on top of the patch that David already applied:
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
[...]
@@ -999,6 +1000,7 @@ static inline int do_one_broadcast(struct sock *sk,
p->skb2 = NULL;
} else if ((val = netlink_broadcast_deliver(sk, p->skb2)) < 0) {
netlink_overrun(sk);
+ p->delivery_failure = 1;
^^^^^^^^^^^^^^^^^^^^^^^^
Replace this by:
+ if (nlk->flags & NETLINK_HIGHLY_RELIABLE)
+ p->delivery_failure = 1;
And include the flag definition and setsockopt() operations in the new
patch, of course.
Please, find the previous patch that was applied to net-next tree
enclosed to save you some time in case that you don't know what patch I
was refering to. I think that the changes (several drivers and such) are
still useful, as they should ignore the return value of
netlink_broadcast() since it's not of any use for them (as we already
discussed, they printk the error, that's useless).
--
"Los honestos son inadaptados sociales" -- Les Luthiers
View attachment "netlink-broadcast-delivery-failure.patch" of type "text/x-diff" (9620 bytes)
Powered by blists - more mailing lists