On Wed, Aug 21, 2019 at 11:26:02AM +0200, Phil Sutter wrote:
[...]
> +/* Make sure previous payload expression(s) is/are consistent and extract if
> + * matching on source or destination address and if matching on MAC and IP or
> + * only MAC address. */
> +static int lookup_analyze_payloads(const struct nft_xt_ctx *ctx,
> +                                bool *dst, bool *ip)
> +{
> +     int val, val2 = -1;
> +
> +     if (ctx->flags & NFT_XT_CTX_PREV_PAYLOAD) {

Can you probably achieve this by storing protocol context?

Something like storing the current network base in the nft_xt_ctx
structure, rather than the last payload that you have seen.

>From the context you annotate, then among will find the information
that it needs in the context.

We can reuse this context later on to generate native tcp/udp/etc.
matching.

[...]
> +static int __add_nft_among(struct nft_handle *h, const char *table,
> +                        struct nftnl_rule *r, struct nft_among_pair *pairs,
> +                        int cnt, bool dst, bool inv, bool ip)
> +{
> +     uint32_t set_id, type = 9, len = 6;
> +     /*                      !dst, dst */
> +     int eth_addr_off[] = { 6, 0 };
> +     int ip_addr_off[] = { 12, 16 };
> +     struct nftnl_expr *e;
> +     struct nftnl_set *s;
> +     int idx = 0;
> +
> +     if (ip) {
> +             type = type << 6 | 7;
> +             len += 4 + 2;
> +     }

Magic numbers, please help me understand this.

I think this is the way to go, let's just sort out these few glitches.

Reply via email to