On 2025-08-01 10:43 PM, Ilya Maximets wrote:
> External email: Use caution opening links or attachments
>
>
> On 7/23/25 3:12 PM, Dima Chumak via dev wrote:
>> Introduce support for route lookup across several routing tables
>> following a priority from highest to lowest.
>>
>> To properly prioritize route lookup order, the single router table in
>> OVS is now split into three tables: local, main and default.
>> Corresponding routing rules are created by default, where local table
>> has the highest priority and main and default tables have two lowest
>> priorities respectively. All non-standard tables can be added with a
>> priority in between local and main.
>>
>> Non-standard routing tables are created by reading the Routing Policy
>
> Why only the non-standard tables?
>
>> Database (RPDB) from the kernel, on systems that support it, and
>> importing only those tables which are referenced in the RPDB rules with
>> a table lookup action. The table IDs and rule priority are copied from
>> the kernel RPDB as is.
>>
>> Current implementation only supports RPDB rules with a source address
>> selector, in form of '[not] from IP' match.
>>
>> Signed-off-by: Dima Chumak <[email protected]>
>> ---
>> lib/ovs-router.c | 231 +++++++++++++++++++++++++++++------
>> lib/ovs-router.h | 7 ++
>> lib/packets.c | 20 +++
>> lib/packets.h | 2 +
>> lib/route-table-bsd.c | 4 +-
>> lib/route-table-stub.c | 4 +-
>> lib/route-table.c | 225 ++++++++++++++++++++++++++++++++--
>> lib/route-table.h | 18 ++-
>> tests/test-lib-route-table.c | 5 +-
>> 9 files changed, 465 insertions(+), 51 deletions(-)
<snip>
>> +bool
>> +ovs_router_is_referenced(uint32_t table)
>> +{
>> + struct router_rule *rule;
>> +
>> + if (route_table_is_standard_id(table)) {
>> + return true;
>> + }
>> +
>> + PVECTOR_FOR_EACH (rule, &rules) {
>> + if (rule->lookup_table == table) {
>> + return true;
>> + }
>> + }
>
> A lookup in the hash map may be better here instead of iteration.
>
If I understand it right, this would require a dedicated hash table to
store table IDs from the rule list. And the value stored would probably
be refcounted because one table can appear multiple times in the rule
list. I can add it as a follow up optimization change, what do you
think?
Alternatively, if we try to consult the clsmap hash to check if table
already exists it will prevent the logic in route_table_change() to work
correctly - a new table could never be synchronized from the kernel
because it would be considered as un-referenced.
Thanks, Dima
<snip>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev