On 15/05/2020 18:00, Lorenzo Bianconi wrote: >>> On Thu, May 14, 2020 at 1:12 AM Dumitru Ceara <dce...@redhat.com> wrote: >>>> >>>> On 5/13/20 11:51 PM, Han Zhou wrote: >>>>> In commit c0bf32d the priorities of the regular routes were increased by >>>>> 400, but ECMP routes were not updated. This patch fixes it. Since >>>>> for ECMP routes the outport is unknown (there can be many different >>>>> outports) the condition check of whether the outport is distributed >>>>> gateway port is skipped. >>>>> >>>>> Fixes: c0bf32d ("Manage ARP process locally in a DVR scenario") >>>>> Cc: Lorenzo Bianconi <lorenzo.bianc...@redhat.com> >>>>> Signed-off-by: Han Zhou <hz...@ovn.org> >> >> [...] >> >>> So I wonder if we should change the solution of the commit c0bf32d, instead >>> of just increasing the ECMP routes priority only. I don't completely >>> understand the problem that commit was trying to solve. Is there an example >>> that describes the scenario in more detail and the reason why the route >>> priorities have to be different? >> >> Hi Han, >> >> this morning Dumitru and me worked trying to find a solution for this issue. >> We though to restore the original configuration in table 9 >> and add a new table used only to take care of FIP/DVR traffic. >> Does it work for you? >> I sent a RFC with the basic implementation. I tested it and it works fine >> regarding to FIP traffic. I will work on unitest waiting for feedbacks. >> >> Regards, >> Lorenzo > > ops I forgot, this is the patch: > https://patchwork.ozlabs.org/project/openvswitch/patch/a99d46b275a10a6d8278434f7cefa0466bb78af5.1589557561.git.lorenzo.bianc...@redhat.com/ > > Regards, > Lorenzo
I just cherry-picked this patch to OVN master on my devstack environment and tested it fixes the problem with Neutron and OpenStack. Kuba > >> >>> >>>> >>>>> --- >>>>> northd/ovn-northd.8.xml | 3 ++- >>>>> northd/ovn-northd.c | 22 ++++++++++++---------- >>>>> 2 files changed, 14 insertions(+), 11 deletions(-) >>>>> >>>>> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml >>>>> index 8f224b0..b0475d0 100644 >>>>> --- a/northd/ovn-northd.8.xml >>>>> +++ b/northd/ovn-northd.8.xml >>>>> @@ -2601,7 +2601,8 @@ next; >>>>> ids <var>MID1</var>, <var>MID2</var>, ..., a logical flow >>> with match >>>>> in CIDR notation <code>ip4.dst == >>> <var>N</var>/<var>M</var></code>, >>>>> or <code>ip6.dst == <var>N</var>/<var>M</var></code>, whose >>> priority >>>>> - is the integer value of <var>M</var>, has the following >>> actions: >>>>> + is <code>400</code> + the integer value of <var>M</var>, has >>> the >>>>> + following actions: >>>>> </p> >>>>> >>>>> <pre> >>>>> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c >>>>> index b25152d..c02e305 100644 >>>>> --- a/northd/ovn-northd.c >>>>> +++ b/northd/ovn-northd.c >>>>> @@ -7337,7 +7337,8 @@ build_route_prefix_s(const struct v46_ip *prefix, >>> unsigned int plen) >>>>> } >>>>> >>>>> static void >>>>> -build_route_match(const struct ovn_port *op_inport, const char >>> *network_s, >>>>> +build_route_match(const struct ovn_port *op_inport, >>>>> + const struct ovn_port *op_outport, const char >>> *network_s, >>>>> int plen, bool is_src_route, bool is_ipv4, struct ds >>> *match, >>>>> uint16_t *priority) >>>>> { >>>>> @@ -7351,6 +7352,13 @@ build_route_match(const struct ovn_port >>> *op_inport, const char *network_s, >>>>> dir = "dst"; >>>>> *priority = (plen * 2) + 1; >>>>> } >>>>> + /* traffic for internal IPs of logical switch ports must be sent to >>>>> + * the gw controller through the overlay tunnels >>>>> + */ >>>>> + if (!op_outport || >>>>> + (op_outport->nbrp && !op_outport->nbrp->n_gateway_chassis)) { >>>>> + priority += DROUTE_PRIO; >>>>> + } >>>>> >>>>> if (op_inport) { >>>>> ds_put_format(match, "inport == %s && ", op_inport->json_key); >>>>> @@ -7434,8 +7442,8 @@ build_ecmp_route_flow(struct hmap *lflows, struct >>> ovn_datapath *od, >>>>> uint16_t priority; >>>>> >>>>> char *prefix_s = build_route_prefix_s(&eg->prefix, eg->plen); >>>>> - build_route_match(NULL, prefix_s, eg->plen, eg->is_src_route, >>> is_ipv4, >>>>> - &match, &priority); >>>>> + build_route_match(NULL, NULL, prefix_s, eg->plen, eg->is_src_route, >>>>> + is_ipv4, &match, &priority); >>>>> free(prefix_s); >>>>> >>>>> struct ds actions = DS_EMPTY_INITIALIZER; >>>>> @@ -7548,14 +7556,8 @@ add_route(struct hmap *lflows, const struct >>> ovn_port *op, >>>>> op_inport = op; >>>>> } >>>>> } >>>>> - build_route_match(op_inport, network_s, plen, is_src_route, >>> is_ipv4, >>>>> + build_route_match(op_inport, op, network_s, plen, is_src_route, >>> is_ipv4, >>>>> &match, &priority); >>>>> - /* traffic for internal IPs of logical switch ports must be sent to >>>>> - * the gw controller through the overlay tunnels >>>>> - */ >>>>> - if (op->nbrp && !op->nbrp->n_gateway_chassis) { >>>>> - priority += DROUTE_PRIO; >>>>> - } >>>>> >>>>> struct ds actions = DS_EMPTY_INITIALIZER; >>>>> ds_put_format(&actions, "ip.ttl--; "REG_ECMP_GROUP_ID" = 0; %sreg0 >>> = ", >>>>> >>>> > > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev