On 4/6/23 16:26, Ales Musil wrote:
> On Thu, Apr 6, 2023 at 1:17 PM Dumitru Ceara <[email protected]> wrote:
>
>> On 3/29/23 16:57, Numan Siddique wrote:
>>> On Wed, Mar 29, 2023 at 6:15 AM Dumitru Ceara <[email protected]> wrote:
>>>>
>>>> On 3/29/23 11:20, Ales Musil wrote:
>>>>> There are essentially three problems with the current
>>>>> combination of DGP + SNAT + LB:
>>>>>
>>>>> 1) The first packet is being SNATed in common zone due
>>>>> to a problem with pinctrl not preserving ct_mark/ct_label.
>>>>> The commit would create a SNAT entry within the same with DNAT
>>>>> entry.
>>>>>
>>>>> 2) The unSNAT for reply always happened in common zone because of
>>>>> the loopback check which would be triggered only when we loop
>>>>> the packet through the LR. Now there are two possibilities how
>>>>> the reply packet would be handled:
>>>>>
>>>>> a) If the entry for SNAT in common zone did not time out yet, the
>>>>> packet would be passed through unSNAT in common zone which would
>>>>> be fine and continue on. However, the unDNAT wouldn't work due to
>>>>> the limitation of CT not capable of doing unSNAT/unDNAT on the same
>>>>> packet twice in the same zone. So the reply would arrive to
>>>>> the original interface, but with wrong source address.
>>>>>
>>>>> b) If the entry for SNAT timed out it would loop and do unSNAT
>> correctly
>>>>> in separate zone and then also unDNAT. This is not possible anymore
>> with
>>>>> a recent change 8c341b9d (northd: Drop packets destined to router
>> owned NAT IP for DGP).
>>>>> The reply would be dropped before looping after that change co the
>> traffic
>>>>> would never arrive to the original interface.
>>>>>
>>>>> 3) The unDNAT was happening only if the DGP was outport meaning
>>>>> the reply traffic was routed out, but in the opposite case
>>>>> the unDNAT was happening only because of the looping which made
>>>>> outport=inport. That's why it worked before introduction of explicit
>> drop.
>>>>>
>>>>> In order to fix all those issues do two changes:
>>>>>
>>>>> 1) Include inport in the unDNAT match, so that we have both
>>>>> routing directions covered e.g. (inport == "dgp_port" || outport ==
>> "dpg_port").
>>>>>
>>>>> 2) Always use the separate zone for SNAT and DNAT. As the common
>>>>> zone was needed for HWOL make the common zone optional with
>>>>> configuration option called "use_common_zone". This option is
>>>>> by default "false" and can be specified per LR. Use of separate
>>>>> zones also eliminates the need for the flag propagation
>>>>> in "lr_out_chk_dnat_local" stage, removing the match on
>> ct_mark/ct_label.
>>>>>
>>>>> Reported-at: https://bugzilla.redhat.com/2161281
>>>>> Signed-off-by: Ales Musil <[email protected]>
>>>>> ---
>>>>> v2: Fix flaky system test.
>>>>> v3: Rebase on top of current main.
>>>>> v4: Rebase on top of current main.
>>>>> Move the system test to system-ovn-kmod
>>>>> to unblock the failures with userspace.
>>>>> v5: Rebase on top of current main.
>>>>> v6: Rebase on top of current main.
>>>>> Change the config to a global option instead.
>>>>
>>>> I know this was discussed on v5 [0][1] but I wanted to raise another
>> point:
>>>>
>>>> The common zone was added to make deployments more "HWOL-friendly".
>>>> Turning it into a global option means we can never have hybrid clusters,
>>>> with only some of the nodes capable of offloading traffic efficiently.
>>>>
>>>> Do you foresee this becoming a problem?
>>>
>>> Having this option per router also is not going to solve this problem
>> right ?
>>> As the router would be distributed.
>>>
>>> From RedHat OSP perspective (after talking to Daniel) , I think this
>>> would be a global option during deployment
>>> and it's easier for the openstack installer to set this in NB_Global
>>> rather than neutron setting this option for every router.
>>>
>>> I think it should be fine to have a global option. In the case of
>>> hybrid clusters you mentioned, I suppose CMS should
>>> enable using common zones.
>>
>> OK, sounds reasonable, I guess.
>>
>> Ales, I finally got a chance to read through the patch and I have a few
>> comments below. Overall the patch looks in good shape but please
>> address those and then I think we can accept it.
>>
>> Regards,
>> Dumitru
>>
>>>
>>> Thanks
>>> Numan
>>>
>>>>
>>>> Thanks,
>>>> Dumitru
>>>>
>>>> [0]
>> https://mail.openvswitch.org/pipermail/ovs-dev/2023-March/403184.html
>>>> [1]
>> https://mail.openvswitch.org/pipermail/ovs-dev/2023-March/403187.html
>>>>
>>>>> ---
>>>>> northd/northd.c | 496 ++++++++++++++++++++-------------------
>>>>> northd/ovn-northd.8.xml | 90 +------
>>>>> ovn-nb.xml | 10 +
>>>>> tests/ovn-northd.at | 213 ++++++++++++-----
>>>>> tests/ovn.at | 3 +
>>>>> tests/system-ovn-kmod.at | 166 +++++++++++++
>>>>> tests/system-ovn.at | 117 ---------
>>>>> 7 files changed, 601 insertions(+), 494 deletions(-)
>>>>>
>>>>> diff --git a/northd/northd.c b/northd/northd.c
>>>>> index 7a10e4dcf..2e4e99f11 100644
>>>>> --- a/northd/northd.c
>>>>> +++ b/northd/northd.c
>>>>> @@ -66,6 +66,9 @@ static bool check_lsp_is_up;
>>>>>
>>>>> static bool install_ls_lb_from_router;
>>>>>
>>>>> +/* Use common zone for SNAT and DNAT if this option is set to "true".
>> */
>>>>> +static bool use_common_zone = false;
>>>>> +
>>>>> /* MAC allocated for service monitor usage. Just one mac is allocated
>>>>> * for this purpose and ovn-controller's on each chassis will make use
>>>>> * of this mac when sending out the packets to monitor the services
>>>>> @@ -10662,6 +10665,8 @@ build_distr_lrouter_nat_flows_for_lb(struct
>> lrouter_nat_lb_flows_ctx *ctx,
>>>>> enum lrouter_nat_lb_flow_type
>> type,
>>>>> struct ovn_datapath *od)
>>>>> {
>>>>> + struct ovn_port *dgp = od->l3dgw_ports[0];
>>>>> +
>>>>> const char *undnat_action;
>>>>>
>>>>> switch (type) {
>>>>> @@ -10673,9 +10678,12 @@ build_distr_lrouter_nat_flows_for_lb(struct
>> lrouter_nat_lb_flows_ctx *ctx,
>>>>> break;
>>>>> case LROUTER_NAT_LB_FLOW_NORMAL:
>>>>> case LROUTER_NAT_LB_FLOW_MAX:
>>>>> - undnat_action = od->is_gw_router ? "ct_dnat;" :
>> "ct_dnat_in_czone;";
>>>>> + undnat_action = !od->is_gw_router && use_common_zone
>>>>> + ? "ct_dnat_in_czone;"
>>>>> + : "ct_dnat;";
>>
>> I think it's more clear if we have a helper function that we use in all
>> places where we build the dnat action, e.g.:
>>
>> static const char *
>> lrouter_get_dnat_action(const struct ovn_datapath *od)
>> {
>> return !od->is_gw_router && use_common_zone
>> ? "ct_dnat_in_czone;"
>> : "ct_dnat;";
>> }
>>
>
> There are only two places and both require slightly different
> string in the end. This one is with ";" the other is without.
> Which to me seems a bit more hassle for the helper function for two cases
> WDYT?
>
You're right about the helper to get the action. It's not that helpful.
However, in my previous email I had started typing the comment above
with the goal of writing a helper function to determine if the router
should use the common zone or not but then I changed my mind. Maybe a
helper like that is still useful?
static bool
lrouter_use_common_zone(const struct ovn_datapath *od)
{
return !od->is_gw_router && use_common_zone;
}
Could we use this in all places where we currently check
'use_common_zone' directly?
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev