Current NFQUEUE target uses a hash, computed over source and destination address (and other parameters), for steering the packet to the actual NFQUEUE. This, however forgets about the fact that the packet eventually is handled by a particular CPU on user request. If E. g. 1) IRQ affinity is used to handle packets on a particular CPU already (both single-queue or multi-queue case) and/or 2) RPS is used to steer packets to a specific softirq the target easily chooses an NFQUEUE which is not handled by a process pinned to the same CPU. The idea is therefore to use the CPU index for determining the NFQUEUE handling the packet. E. g. when having a system with 4 CPUs, 4 MQ queues and 4 NFQUEUEs it looks like this: +-----+ +-----+ +-----+ +-----+ |NFQ#0| |NFQ#1| |NFQ#2| |NFQ#3| +-----+ +-----+ +-----+ +-----+ ^ ^ ^ ^ | |NFQUEUE | | + + + + +-----+ +-----+ +-----+ +-----+ |rx-0 | |rx-1 | |rx-2 | |rx-3 | +-----+ +-----+ +-----+ +-----+ The NFQUEUEs not necessarily have to start with number 0, setups with less NFQUEUEs than packet-handling CPUs are not a problem as well. This patch extends the NFQUEUE target to accept a new NFQ_FLAG_CPU_FANOUT flag. If this is specified the target uses the CPU index for determining the NFQUEUE being used. I have to introduce rev3 for this. The 'flags' are folded into _v2 'bypass'. By changing the way which queue is assigned, I'm able to improve the performance if the processes reading on the NFQUEUs are pinned correctly.
Showing the changes to include/uapi/linux (1 of 2 files). Show all
Unified · Split
| @@ -26,4 +26,13 @@ struct xt_NFQ_info_v2 { · 25 unmodified lines | ||
| 26 | 26 | __u16 bypass; |
| 27 | 27 | }; |
| 28 | 28 | |
| 29 | +struct xt_NFQ_info_v3 { | |
| 30 | + __u16 queuenum; | |
| 31 | + __u16 queues_total; | |
| 32 | + __u16 flags; | |
| 33 | +#define NFQ_FLAG_BYPASS 0x01 /* for compatibility with v2 */ | |
| 34 | +#define NFQ_FLAG_CPU_FANOUT 0x02 /* use current CPU (no hashing) */ | |
| 35 | +#define NFQ_FLAG_MASK 0x03 | |
| 36 | +}; | |
| 37 | + | |
| 29 | 38 | #endif /* _XT_NFQ_TARGET_H */ |