From: Patrick McHardy <kaber@trash.net>
To: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Cc: netfilter-devel@vger.kernel.org, Pablo Neira Ayuso <pablo@netfilter.org>
Subject: Re: [PATCH 02/13] IP set core support
Date: Wed, 26 Jan 2011 12:57:16 +0100 [thread overview]
Message-ID: <4D400C1C.3000008@trash.net> (raw)
In-Reply-To: <alpine.DEB.2.00.1101252150450.19648@blackhole.kfki.hu>
Am 25.01.2011 22:23, schrieb Jozsef Kadlecsik:
> On Tue, 25 Jan 2011, Patrick McHardy wrote:
>
>>> +static int
>>> +ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb)
>>> +{
>>> + ip_set_id_t index = IPSET_INVALID_ID, max;
>>> + struct ip_set *set = NULL;
>>> + struct nlmsghdr *nlh = NULL;
>>> + unsigned int flags = NETLINK_CB(cb->skb).pid ? NLM_F_MULTI : 0;
>>> + int ret = 0;
>>> +
>>> + if (cb->args[0] == DUMP_INIT) {
>>> + ret = dump_init(cb);
>>> + if (ret < 0) {
>>> + /* We have to create and send the error message
>>> + * manually :-( */
>>> + netlink_ack(cb->skb, nlmsg_hdr(cb->skb), ret);
>>
>> This should probably only be done if the NLM_F_ACK flag was set
>> on the request.
>
> I never thought to set NLM_F_ACK for dumping. I'll set the flag in the
> request but I believe I have to send the error message regardless of the
> flag: the dump initialization fails iff the named set does not exist and
> it should be reported.
netlink_dump() will already include the errno code in the final
(in this case only) message. Perhaps we should also return it
back from sendmsg() if the first call to ->dump() fails without
putting anything in the message.
>
>>> +
>>> + if (attr[IPSET_ATTR_DATA]) {
>>> + ret = call_ad(skb, attr,
>>> + set, attr[IPSET_ATTR_DATA], IPSET_ADD, flags);
>>> + } else {
>>> + int nla_rem;
>>> +
>>> + nla_for_each_nested(nla, attr[IPSET_ATTR_ADT], nla_rem) {
>>> + if (nla_type(nla) != IPSET_ATTR_DATA ||
>>> + !flag_nested(nla))
>>> + return -IPSET_ERR_PROTOCOL;
>>
>> Since addition can fail due to size problems anyways it not very
>> important, but we could perform validation before attempting to
>> add members so the operation either succeeds or fails entirely.
>
> Yeah, it's a protocol check, so it should come first. But the call again
> to nla_for_each_nested wouldn't be too ugly? Wrapping the condition into
> unlikely() would make it better?
I guess it would make sense if we could make sure the following
operations won't fail. Unless that is done I'd leave it as it is.
>
>> To really make sense that would require to test for existance of
>> members on deletion and for enough space (+ possibly pre-allocation)
>> on addition though, so for now we can ignore it I guess.
>
>>> +
>>> + read_lock_bh(&set->lock);
>>> + ret = set->variant->uadt(set,
>>> + nla_data(attr[IPSET_ATTR_DATA]),
>>> + nla_len(attr[IPSET_ATTR_DATA]),
>>> + IPSET_TEST, NULL, 0);
>>> + read_unlock_bh(&set->lock);
>>> + /* Userspace can't trigger element to be re-added */
>>> + if (ret == -EAGAIN)
>>> + ret = 1;
>>
>> This value is returned to userspace, what does '1' mean?
>
> The test functions return a positive integer for success. The only
> exception is the -EAGAIN return value, which means an incomplete element
> was tested and it triggers the core to re-add the element. However
> re-adding is meaningful for kernel side tests only. So for the sake of
> consistency, the return value is corrected to a positive integer.
>
> The bitmap:ip,mac type uses -EAGAIN: if the element was added without the
> MAC part then when it's tested as a kernel requests, by re-adding the
> element we can fill out the MAC part from the tested packet.
Yes, but since this is a nfnetlink callback, we'll return that
value in the ACK message. Is that really intended? Usually we
indicate success to userspace using the value '0'.
>>> + set = ip_set_list[index];
>>> +
>>> + skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
>>> + if (skb2 == NULL)
>>> + return -ENOMEM;
>>> +
>>> + nlh2 = start_msg(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq, 0,
>>> + IPSET_CMD_HEADER);
>>> + if (!nlh2)
>>> + goto nlmsg_failure;
>>> + NLA_PUT_U8(skb2, IPSET_ATTR_PROTOCOL, IPSET_PROTOCOL);
>>> + NLA_PUT_STRING(skb2, IPSET_ATTR_SETNAME, set->name);
>>> + NLA_PUT_STRING(skb2, IPSET_ATTR_TYPENAME, set->type->name);
>>> + NLA_PUT_U8(skb2, IPSET_ATTR_FAMILY, set->family);
>>> + NLA_PUT_U8(skb2, IPSET_ATTR_REVISION, set->type->revision);
>>> + nlmsg_end(skb2, nlh2);
>>> +
>>> + ret = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT);
>>> + if (ret < 0)
>>> + return -EFAULT;
>>
>> Why not propagate the error?
>
> I don't quite understand what do you mean. Should I attempt to send a
> second message?
No, just return "ret" instead of EFAULT. netlink_rcv_skb() will include
it in the ACK message.
next prev parent reply other threads:[~2011-01-27 1:05 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-21 14:01 [PATCH 00/13] ipset kernel patches v2 Jozsef Kadlecsik
2011-01-21 14:01 ` [PATCH 01/13] NFNL_SUBSYS_IPSET id and NLA_PUT_NET* macros Jozsef Kadlecsik
2011-01-21 14:01 ` [PATCH 02/13] IP set core support Jozsef Kadlecsik
2011-01-21 14:01 ` [PATCH 03/13] bitmap:ip set type support Jozsef Kadlecsik
2011-01-21 14:01 ` [PATCH 04/13] bitmap:ip,mac " Jozsef Kadlecsik
2011-01-21 14:01 ` [PATCH 05/13] bitmap:port set " Jozsef Kadlecsik
2011-01-21 14:01 ` [PATCH 06/13] hash:ip " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 07/13] hash:ip,port " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 08/13] hash:ip,port,ip " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 09/13] hash:ip,port,net " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 10/13] hash:net " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 11/13] hash:net,port " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 12/13] list:set " Jozsef Kadlecsik
2011-01-21 14:02 ` [PATCH 13/13] "set" match and "SET" target support Jozsef Kadlecsik
2011-01-25 15:18 ` Patrick McHardy
2011-01-25 21:40 ` Jozsef Kadlecsik
2011-01-25 15:05 ` [PATCH 03/13] bitmap:ip set type support Patrick McHardy
2011-01-25 21:34 ` Jozsef Kadlecsik
2011-01-27 9:06 ` Jozsef Kadlecsik
2011-01-27 9:08 ` Patrick McHardy
2011-01-21 21:39 ` [PATCH 02/13] IP set core support Jozsef Kadlecsik
2011-01-25 14:47 ` Patrick McHardy
2011-01-25 21:23 ` Jozsef Kadlecsik
2011-01-26 11:57 ` Patrick McHardy [this message]
2011-01-26 11:57 ` Patrick McHardy
2011-01-25 15:06 ` Patrick McHardy
2011-01-25 21:28 ` Jozsef Kadlecsik
2011-01-27 8:58 ` Jozsef Kadlecsik
2011-01-25 15:38 ` [PATCH 00/13] ipset kernel patches v2 Patrick McHardy
2011-01-25 21:41 ` Jozsef Kadlecsik
-- strict thread matches above, loose matches on Subject: below --
2011-01-31 22:52 [PATCH 00/13] ipset kernel patches v3 Jozsef Kadlecsik
2011-01-31 22:52 ` [PATCH 01/13] NFNL_SUBSYS_IPSET id and NLA_PUT_NET* macros Jozsef Kadlecsik
2011-01-31 22:52 ` [PATCH 02/13] IP set core support Jozsef Kadlecsik
2011-02-01 14:31 ` Patrick McHardy
2011-02-01 15:34 ` Patrick McHardy
2011-02-01 19:43 ` Jozsef Kadlecsik
2011-02-01 21:22 ` Jozsef Kadlecsik
2011-02-01 21:28 ` Jozsef Kadlecsik
2011-02-02 6:50 ` Patrick McHardy
2011-02-02 19:46 ` Jozsef Kadlecsik
2011-02-02 22:56 ` Patrick McHardy
2011-02-02 6:40 ` Patrick McHardy
2011-02-02 6:45 ` Patrick McHardy
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=4D400C1C.3000008@trash.net \
--to=kaber@trash.net \
--cc=kadlec@blackhole.kfki.hu \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
/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;
as well as URLs for NNTP newsgroup(s).