Re: libnetfilter_queue issues

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Many thanks for explanations & updates.

Seems now I have a proper (although probably not full) image how
libnetfilter_queue works

Thanks once again.

Dorian

> Hello,
>
> Thanks for all these questions, I will improve/update the article thanks
> to that.
>
> On Sat, 2013-01-12 at 22:16 +0100, dorian wrote:
>> Hi Eric,
>> Thanks a lot for reply.
>>
>> I read your article but apart from clarifying my doubts it created the
>> new ones :)
>>
>> Below are the issues....
>>
>> 1.- - - - -
>> You wrote: "packet can be verdict without order".
>> I am very sorry but my English is not perfect so I understand above as
>> "having packets in the order 1,2,3,4 the verdict can be set in any order
>> (f.ex. in the order 4,1,3,2)"
>> Am I right?
> Exactly.
>
>> If my above understanding is correct it also contains implied
>> information that I can call successfully several times recv() function
>> and none of the calls block despite the fact that the verdicts have not
>> been set for the recv'ed packets.
>> Am I right till now?
> Yes. You can read packets, take a coffee and came back later to verdict
> them all at once.
>
>> 2. - - - - - -
>> Next you wrote
>> a) "The packet queue is a real queue"
>> and next
>> b) "A packet is released when userspace issue a verdict"
>>
>> Well, I have some doubts here.
>>
>> According to my primitive understanding (but which is the same as at
>> http://en.wikipedia.org/wiki/Queue_%28abstract_data_type%29)  the queue
>> is First-In-First-Out (FIFO) data structure.
>> So statement (b) is not true or not complete.
>>
>> Because having several packets in queue (let's say 1,2,3,4) and setting
>> verdict for packet 2 doesn't mean that it will be released (=sent) since
>> it is  _in the middle_ of the queue.
> OK real queue was not a correct term. See explanation below.
>
>> Please explain above.
>>
>> Anyway at the bottom you also mentioned about 'packet reordering' which
>> suggests that queue you are writing about in the article is not a queue
>> or my understanding of therm 'queue' is too primitive.
> It is a chained list with the following operation:
>       * Enqueue: element is added at the end
>       * Dequeue (verdict): element is removed from the chained list.
>
>> 3. - - - - - -
>> And "new doubt" appeared after reading your article.
>> You wrote: "The send/recv operation need to be protected by lock to
>> avoid concurrent writing"
>>
>> Well, I wrote a number of  multi-processed programs (run also on
>> multi-core CPUs) which used the same file descriptor by each
>> child-process and I never found the situation that any locking has been
>> required.
>> Each read or written messages (=sequence of bytes)  were consistent.
>> Of course without locking I do not have control on the order of the
>> messages read/written from/to file descriptor but none of the
>> read/written data were corrupted (i.e. messages were not mixed)
>>
>> So is the lock really required? Why?
>> Is it a matter of the fact that 'fd' is the netlink socket?
> Humm, you may have a point here. I'm doing this by habit and a check
> could be needed.
>
>> 4. - - - - - -
>> Another "new doubt" requires longer explanation.
>>
>> Using the file 'source-nfq.c' as reference we can found there
>>
>>    while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
>>       nfq_handle_packet(h, buf, rv);
>>    }
>> At the article you wrote: "the kernel sends a message containing packet
>> data and related information to a socket and userpace reads this message"
>> Does it means that 'buf' contains packet data?
>>
>> I am asking about since 'fd' is the only socket I can find in the
>> source-nfq.c.
>> On the other hand the packet data are accessible via struct nfq_data
>> *nfa in callback function and 'nfa' has nothing in common (at least
>> documentation does not state it) with the 'buf'.
>>
>> And if the 'buf' really contains packet data what for the callback
>> function is required?
>> Wasn't be simpler to access packet directly from 'buf'?
>>
>> Till now I assumed that 'buf' contained only some kind of 
>> "libnetfilter_queue internal metadata" which was not interesting for me.
> buf is containing a nfnetlink message not the packet by itself. The
> protocol messages are nfnetlink formatted.
>
>> Any comment will be appreciated.
>>
>>
>> - - - - - - - -
>> And that's all.
>> I would be be grateful to you for helping me to understand how to use
>> the libnetfilter_queue and what can be done using it.
>>
>> With best regards,
>> Dorian
> BR,
> --
> Eric
>
>
>>
>>
>>> Hello,
>>>
>>> On Sat, 2013-01-12 at 07:23 -0600, Felix wrote:
>>>> excellent question !
>>>> I too am interested in this.
>>>>
>>>> Another similar, related question is do packets that are not filtered
>>>> wait on a verdict for a filtered packet?
>>>> Again, if not, it means we can change packet order?
>>>> If so,it means we can degrade system performance unrelated to our
>>>> filtered packets.
>>> I've just wrote an article describing libnetfilter_queue and NFQUEUE. It
>>> has been written to answer your questions:
>>> https://home.regit.org/netfilter-en/using-nfqueue-and-libnetfilter_queue/
>>>
>>> Let me know if it is the case and don't hesitate if you have any
>>> suggestions.
>>>
>>> BR,
>>> --
>>> Eric
>>>
>>>> Thanks,
>>>> Credzba
>>>>
>>>> On Sat, Jan 12, 2013 at 6:43 AM, dorian <dorian33@xxxxx> wrote:
>>>>> Hi all,
>>>>> Sorry if the queries has been answered yet but I can't find the reliable
>>>>> informations about issues concerned with libnetfilter_queue.
>>>>>
>>>>> I need to run a program which would firstly fork let's say 10 times (or
>>>>> creates 10 threads) and next each child-process (or thread) will include
>>>>>
>>>>>    while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
>>>>>       nfq_handle_packet(h, buf, rv);
>>>>>    }
>>>>>
>>>>> sequence.
>>>>>
>>>>> The fork/multiple threads reason usage is that for some packets the
>>>>> processing time will be relatively long.
>>>>> So I would like to handle next packets in "the meantime" using another
>>>>> process (or thread)
>>>>>
>>>>> But I have 2 doubts which I would like to clarify.
>>>>>
>>>>> 1. - - - - - -
>>>>> Is it possible to handle concurrently several packets with several
>>>>> processes ?
>>>>> i.e. if the process1 is handling a packet will the process2 receive the
>>>>> next existing packet?
>>>>>
>>>>> The essence of my doubt is:
>>>>> if process1 receives the packet1 but the verdict is not issued  will
>>>>> next recv() (in process2) be successful and not hold process2 until
>>>>> verdict for packet1 is made?
>>>>>
>>>>> Please confirm.
>>>>>
>>>>>
>>>>> 2. - - - - - -
>>>>> Let's assume that we have process1 which handles packet 1, process 2
>>>>> which handles packet 2, etc
>>>>> Let's say verdict for packet2 is issued before verdict for packet1
>>>>>
>>>>> Will packet2 leave the queue or has it to "wait" for verdict for packet1 ?
>>>>>
>>>>> The essence of my doubt is:
>>>>> can packet2 leave the queue before packet1 ?
>>>>>
>>>>> In other words can we change the packets order leaving system ?
>>>>>
>>>>> Or, maybe, although verdict for packet2 is done it has to wait for
>>>>> verdict for packet1 and next both leave the queue in original order?
>>>>>
>>>>> I would be obliged if you clarify above two matter
>>>>>
>>>>> Best Regards,
>>>>> Dorian
>>>>>
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe netfilter" in
>>>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe netfilter" in
>>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> --
>> To unsubscribe from this list: send the line "unsubscribe netfilter" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe netfilter" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux