Re: [PATCH nf-next] netfilter: nft_queue: add _SREG_FROM and _SRGE_TO to select the queue numbers

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

 



2016-09-13 17:19 GMT+08:00 Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>:
> Hi Liping,
>
> A bit more comments on top of Florian's suggestion to use one single
> _SREG.
>
> On Sun, Sep 11, 2016 at 10:05:28PM +0800, Liping Zhang wrote:
>> diff --git a/net/netfilter/nft_queue.c b/net/netfilter/nft_queue.c
>>  static void nft_queue_eval(const struct nft_expr *expr,
>> @@ -32,17 +34,30 @@ static void nft_queue_eval(const struct nft_expr *expr,
>>                          const struct nft_pktinfo *pkt)
>>  {
>>       struct nft_queue *priv = nft_expr_priv(expr);
>> -     u32 queue = priv->queuenum;
>> +     u32 queue, queues_total, queue_end;
>>       u32 ret;
>>
>> -     if (priv->queues_total > 1) {
>> +     if (priv->sreg_from) {
>> +             queue = (u16)regs->data[priv->sreg_from];
>> +             queue_end = (u16)regs->data[priv->sreg_to];
>> +
>> +             if (queue_end > queue)
>> +                     queues_total = queue_end - queue + 1;
>> +             else
>> +                     queues_total = 1;
>> +     } else {
>> +             queue = priv->queuenum;
>> +             queues_total = priv->queues_total;
>> +     }
>
> I suggest you use .select_ops to use a specific _eval function if
> _SREG is set. This would disentangle this code a bit.
>
>>
>> +     /* nftables has no idea whether the kernel supports _SREG_FROM or not,
>> +      * so for compatibility reason, it may specify the _SREG_FROM and
>> +      * _QUEUE_NUM attributes at the same time. We prefer to use _SREG_FROM,
>> +      * it is more flexible and has less restriction, for example, queue
>> +      * range 0-65535 is ok when use _SREG_FROM and _SREG_TO.
>> +      */
>
> No need for this large comment, look.
>
> From userspace, we have to modify the nft parser to take an expression
> as 'num'. Then, from the netlink_linearize path, we can check the
> expression type:
>
> * If it's a value expression, we can simply use NFTA_QUEUE_NUM.
> * If it's a range expression, we have to set up NFTA_QUEUE_NUM and
>   NFTA_QUEUE_TOTAL.
> * If it's a mapping, then we only use _SREG.
>
> Old kernels will bail out if the mapping is used, as this is not
> supported, which is what we expect. This should be fine by now, until
> I finish the patchset to provide a VM description that userspace can
> use to generate bytecode depending on the features available in the
> kernel.
>
>>
>> @@ -97,9 +142,21 @@ static int nft_queue_dump(struct sk_buff *skb, const struct nft_expr *expr)
>>  {
>>       const struct nft_queue *priv = nft_expr_priv(expr);
>>
>> -     if (nla_put_be16(skb, NFTA_QUEUE_NUM, htons(priv->queuenum)) ||
>> -         nla_put_be16(skb, NFTA_QUEUE_TOTAL, htons(priv->queues_total)) ||
>> -         nla_put_be16(skb, NFTA_QUEUE_FLAGS, htons(priv->flags)))
>> +     if (priv->sreg_from) {
>> +             if (nft_dump_register(skb, NFTA_QUEUE_SREG_FROM,
>> +                                   priv->sreg_from))
>> +                     goto nla_put_failure;
>> +             if (nft_dump_register(skb, NFTA_QUEUE_SREG_TO,
>> +                                   priv->sreg_to))
>> +                     goto nla_put_failure;
>> +     } else {
>> +             if (nla_put_be16(skb, NFTA_QUEUE_NUM, htons(priv->queuenum)) ||
>> +                 nla_put_be16(skb, NFTA_QUEUE_TOTAL,
>> +                              htons(priv->queues_total)))
>> +                     goto nla_put_failure;
>> +     }
>
> Looking at this, the code will look better if we should use
> .select_ops indeed.
>
> Thanks for resolving existing nft_queue limitations!

I will re-spin my patch based on your and Florian's suggestions.
Thanks Pablo.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux