On Mon, Nov 28, 2016 at 11:12:23PM +0100, Florian Westphal wrote:
> Elise Lennion <[email protected]> wrote:
> > Because a linear search is used, which is slower.
> > 
> > This approach demands that the symbol_table have a variable with its
> > size, also, it must be sorted by value.
> 
> Did Pablo put you up to this?  Bad Pablo, bad!  :-P

Yep, Elise don't feel bad, that's my fault ;-)

> because:
> 
> >  static const struct symbol_table ethertype_tbl = {
> > +   .size           = 4,
> >     .symbols        = {
> >             SYMBOL("ip",            __constant_htons(ETH_P_IP)),
> > +           SYMBOL("vlan",          __constant_htons(ETH_P_8021Q)),
> >             SYMBOL("arp",           __constant_htons(ETH_P_ARP)),
> >             SYMBOL("ip6",           __constant_htons(ETH_P_IPV6)),
> > -           SYMBOL("vlan",          __constant_htons(ETH_P_8021Q)),
> >             SYMBOL_LIST_END
> >     },
> 
> This is unmaintanable.  I have no clue what value ETH_P_8021Q is, and that
> this has to be placed at spot #2 to not break things.

OK, let's try to make this a bit more maintainable, another proposal
in steps:

1) Update symbol_table definition to:

struct symbol_table {
        unsignd int                     size;
        const struct symbolic_constant  *symbols; <---
};

so we don't have a flexible array anymore. Then, split this array of
symbols from struct symbol_table so this looks like:

static cont struct symbolic_constant ethertype_symbols[] = {
                SYMBOL("ip",            __constant_htons(ETH_P_IP)),
                SYMBOL("vlan",          __constant_htons(ETH_P_8021Q)),
                SYMBOL("arp",           __constant_htons(ETH_P_ARP)),
                SYMBOL("ip6",           __constant_htons(ETH_P_IPV6)),
                SYMBOL_LIST_END
};

static const struct symbol_table ethertype_tbl = {
        .size                   = SYMTBL_SIZE(ethertype_symbols),
        .symbolic_constant      = ethertype_symbols,
};

I can see 19 symbol_tables from here at quick glace, so this would be
an initial patch to update this. SYMTBL_SIZE needs to be define too, yes.

2) Then, second patch would look like:

struct symbol_table {
        unsignd int                     size;
        bool                            qsort; <---
        const struct symbolic_constant  *symbols;
};

If qsort field if true, then we can just validate when calling
datatype_register() that the array is not sorted and spot a BUG().
Moreover, the new qsort field would restrict this qsort to the large
inet_service symbol table.

Florian, are you OK if Elise follows this approach? If this is overly
complicated and not worth, rise your hand.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to