• Liping Zhang's avatar
    netfilter: nft_queue: add _SREG_QNUM attr to select the queue number · 8061bb54
    Liping Zhang authored
    Currently, the user can specify the queue numbers by _QUEUE_NUM and
    _QUEUE_TOTAL attributes, this is enough in most situations.
    
    But acctually, it is not very flexible, for example:
      tcp dport 80 mapped to queue0
      tcp dport 81 mapped to queue1
      tcp dport 82 mapped to queue2
    In order to do this thing, we must add 3 nft rules, and more
    mapping meant more rules ...
    
    So take one register to select the queue number, then we can add one
    simple rule to mapping queues, maybe like this:
      queue num tcp dport map { 80:0, 81:1, 82:2 ... }
    
    Florian Westphal also proposed wider usage scenarios:
      queue num jhash ip saddr . ip daddr mod ...
      queue num meta cpu ...
      queue num meta mark ...
    
    The last point is how to load a queue number from sreg, although we can
    use *(u16*)&regs->data[reg] to load the queue number, just like nat expr
    to load its l4port do.
    
    But we will cooperate with hash expr, meta cpu, meta mark expr and so on.
    They all store the result to u32 type, so cast it to u16 pointer and
    dereference it will generate wrong result in the big endian system.
    
    So just keep it simple, we treat queue number as u32 type, although u16
    type is already enough.
    Suggested-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: default avatarLiping Zhang <liping.zhang@spreadtrum.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    8061bb54
nft_queue.c 5.35 KB