On 3/13/24 10:27, Martin Kalcok wrote: > On Tue, Mar 12, 2024 at 9:17 PM Martin Kalcok <martin.kal...@canonical.com> > wrote: > >> Following up on the comments from v1. >> >> @amusil You were right that the struct in actions.h was not necessary >> then. However I also noticed that I forgot to modify `format_CT_COMMIT_V1` >> function and for that I think the struct is necessary. I need to >> distinguish whether the `ct_commit` action was called with dnat, snat, or >> without any argument to format it properly. If you still don't like it, I >> can try to figure out how to do it without the struct, but I couldn't >> figure out an obvious solution, so I left it in there in this version. >> >> Regarding the action formatting unit tests, I have two >> assumptions/questions: >> 1. There's no way to distinguish router/switch datapaths in these tests. I >> saw that both `ct_commit_nat(dnat)` and `ct_commit_nat(snat)` [0] expect to >> encode into the same zone, although they'd output different zones if they >> were used in LR datapath. >> 2. When action formats into identical string as was its input (e.g. >> "ct_commit(snat)" -> "ct_commit(snat)"), the test should not use "format >> as" check, otherwise it fails. (This one took me a while to figure out, as >> it was not obvious from the testlog why it was failing) >> >> Are these correct? >> >> @numans I though a lot about your suggestions for different action names, >> but I think that current "ct_commit(snat/dnat)" fits semantically the most. >> Brand new actions would share pretty much all of the code with current >> "ct_commit_v1" handling. So to address your comments regarding the backward >> compatibility, I added new feature flag, following Ales' approach in [1]. I >> believe that this should avoid problems of backward incompatibility in >> cases when northd is upgraded but controller is not. >> >> > Sorry to re-iterate on this @numans, I just hope I didn't misunderstood > your original comments on the v1. The way I took it is that you are OK with > using `ct_commit(dnat/snat)` and repurposing the implementation of > `ct_commit_v1`, as long as it doesn't break backwards compatibility. Or do > you think completely new action names with separate implementations are > still needed? I just don't wan't to give impression that I'm ignoring your > suggestions from v1. >
I'm with Numan on this one. I think we shouldn't repurpose an action that's not used anymore. I think we should just delete it from the code base and add new actions. It avoids any potential confusion. I posted a patch to remove the old action. Please let me know what you think. https://patchwork.ozlabs.org/project/ovn/patch/20240402153134.261811-1-dce...@redhat.com/ > >> @0-day Robot: I forgot to run checkpatch.py, my bad. However the only >> problem is 81 char line in ovn-sb.xml and there are already many lines that >> go over this limit. Should I create v3 if this turns out to be the only >> modification needed? >> >> [0] >> https://github.com/ovn-org/ovn/blob/b92ad9e0b408a202273d69ba573f2538e53c6e48/tests/ovn.at#L1500-L1511 >> [1] >> https://github.com/ovn-org/ovn/commit/43f741c2f029a68a11436e5b14c5bbda6e207dd3#diff-ca917e7415d06776f8ee2baf6102a866c5c31f998e4df93ff8eaa246b65e1da2 >> >> On Tue, Mar 12, 2024 at 8:45 PM Martin Kalcok <martin.kal...@canonical.com> >> wrote: >> >>> Action `ct_commit` currently does not allow specifying zone into >>> which connection is committed. For example, in LR datapath, the >>> `ct_commit` >>> will always use the DNAT zone. >>> >>> This change adds option to use `ct_commit(snat)` or `ct_commit(dnat)` to >>> explicitly specify the zone into which the connection will be committed. >>> It also comes with new feature flag OVN_FEATURE_CT_COMMIT_TO_ZONE to avoid >>> incompatibility between northd and controller in case when controller does >>> not suport these actions. >>> >>> Original behavior of `ct_commit` without the arguments remains unchanged. >>> >>> Signed-off-by: Martin Kalcok <martin.kal...@canonical.com> >>> --- >>> controller/chassis.c | 8 ++++++++ >>> include/ovn/actions.h | 9 +++++++++ >>> include/ovn/features.h | 1 + >>> lib/actions.c | 29 ++++++++++++++++++++++++++++- >>> northd/en-global-config.c | 10 ++++++++++ >>> northd/en-global-config.h | 1 + >>> ovn-sb.xml | 10 ++++++++++ >>> tests/ovn.at | 7 +++++++ >>> 8 files changed, 74 insertions(+), 1 deletion(-) >>> >>> diff --git a/controller/chassis.c b/controller/chassis.c >>> index ad75df288..9bb2eba95 100644 >>> --- a/controller/chassis.c >>> +++ b/controller/chassis.c >>> @@ -371,6 +371,7 @@ chassis_build_other_config(const struct >>> ovs_chassis_cfg *ovs_cfg, >>> smap_replace(config, OVN_FEATURE_FDB_TIMESTAMP, "true"); >>> smap_replace(config, OVN_FEATURE_LS_DPG_COLUMN, "true"); >>> smap_replace(config, OVN_FEATURE_CT_COMMIT_NAT_V2, "true"); >>> + smap_replace(config, OVN_FEATURE_CT_COMMIT_TO_ZONE, "true"); >>> } >>> >>> /* >>> @@ -516,6 +517,12 @@ chassis_other_config_changed(const struct >>> ovs_chassis_cfg *ovs_cfg, >>> return true; >>> } >>> >>> + if (!smap_get_bool(&chassis_rec->other_config, >>> + OVN_FEATURE_CT_COMMIT_TO_ZONE, >>> + false)) { >>> + return true; >>> + } >>> + >>> return false; >>> } >>> >>> @@ -648,6 +655,7 @@ update_supported_sset(struct sset *supported) >>> sset_add(supported, OVN_FEATURE_FDB_TIMESTAMP); >>> sset_add(supported, OVN_FEATURE_LS_DPG_COLUMN); >>> sset_add(supported, OVN_FEATURE_CT_COMMIT_NAT_V2); >>> + sset_add(supported, OVN_FEATURE_CT_COMMIT_TO_ZONE); >>> } >>> >>> static void >>> diff --git a/include/ovn/actions.h b/include/ovn/actions.h >>> index 49fb96fc6..ce9597cf5 100644 >>> --- a/include/ovn/actions.h >>> +++ b/include/ovn/actions.h >>> @@ -259,11 +259,20 @@ struct ovnact_ct_next { >>> uint8_t ltable; /* Logical table ID of next table. */ >>> }; >>> >>> +/* Conntrack zone to be used for commiting CT entries by the action. >>> + * DEFAULT uses default zone for given datapath. */ >>> +enum ovnact_ct_zone { >>> + OVNACT_CT_ZONE_DEFAULT, >>> + OVNACT_CT_ZONE_SNAT, >>> + OVNACT_CT_ZONE_DNAT, >>> +}; >>> + >>> /* OVNACT_CT_COMMIT_V1. */ >>> struct ovnact_ct_commit_v1 { >>> struct ovnact ovnact; >>> uint32_t ct_mark, ct_mark_mask; >>> ovs_be128 ct_label, ct_label_mask; >>> + enum ovnact_ct_zone zone; >>> }; >>> >>> /* Type of NAT used for the particular action. >>> diff --git a/include/ovn/features.h b/include/ovn/features.h >>> index 08f1d8288..35a5d8ba0 100644 >>> --- a/include/ovn/features.h >>> +++ b/include/ovn/features.h >>> @@ -28,6 +28,7 @@ >>> #define OVN_FEATURE_FDB_TIMESTAMP "fdb-timestamp" >>> #define OVN_FEATURE_LS_DPG_COLUMN "ls-dpg-column" >>> #define OVN_FEATURE_CT_COMMIT_NAT_V2 "ct-commit-nat-v2" >>> +#define OVN_FEATURE_CT_COMMIT_TO_ZONE "ct-commit-to-zone" >>> >>> /* OVS datapath supported features. Based on availability OVN might >>> generate >>> * different types of openflows. >>> diff --git a/lib/actions.c b/lib/actions.c >>> index a45874dfb..9e27a68a5 100644 >>> --- a/lib/actions.c >>> +++ b/lib/actions.c >>> @@ -707,6 +707,7 @@ static void >>> parse_ct_commit_v1_arg(struct action_context *ctx, >>> struct ovnact_ct_commit_v1 *cc) >>> { >>> + cc->zone = OVNACT_CT_ZONE_DEFAULT; >>> if (lexer_match_id(ctx->lexer, "ct_mark")) { >>> if (!lexer_force_match(ctx->lexer, LEX_T_EQUALS)) { >>> return; >>> @@ -737,6 +738,10 @@ parse_ct_commit_v1_arg(struct action_context *ctx, >>> return; >>> } >>> lexer_get(ctx->lexer); >>> + } else if (lexer_match_id(ctx->lexer, "snat")) { >>> + cc->zone = OVNACT_CT_ZONE_SNAT; >>> + } else if (lexer_match_id(ctx->lexer, "dnat")) { >>> + cc->zone = OVNACT_CT_ZONE_DNAT; >>> } else { >>> lexer_syntax_error(ctx->lexer, NULL); >>> } >>> @@ -800,6 +805,18 @@ format_CT_COMMIT_V1(const struct ovnact_ct_commit_v1 >>> *cc, struct ds *s) >>> ds_put_hex(s, &cc->ct_label_mask, sizeof cc->ct_label_mask); >>> } >>> } >>> + if (cc->zone != OVNACT_CT_ZONE_DEFAULT) { >>> + if (ds_last(s) != '(') { >>> + ds_put_cstr(s, ", "); >>> + } >>> + >>> + if (cc->zone == OVNACT_CT_ZONE_SNAT) { >>> + ds_put_cstr(s, "snat"); >>> + } else if (cc->zone == OVNACT_CT_ZONE_DNAT) { >>> + ds_put_cstr(s, "dnat"); >>> + } >>> + } >>> + >>> if (!ds_chomp(s, '(')) { >>> ds_put_char(s, ')'); >>> } >>> @@ -814,7 +831,17 @@ encode_CT_COMMIT_V1(const struct ovnact_ct_commit_v1 >>> *cc, >>> struct ofpact_conntrack *ct = ofpact_put_CT(ofpacts); >>> ct->flags = NX_CT_F_COMMIT; >>> ct->recirc_table = NX_CT_RECIRC_NONE; >>> - ct->zone_src.field = mf_from_id(MFF_LOG_CT_ZONE); >>> + >>> + if (ep->is_switch) { >>> + ct->zone_src.field = mf_from_id(MFF_LOG_CT_ZONE); >>> + } else { >>> + if (cc->zone == OVNACT_CT_ZONE_SNAT) { >>> + ct->zone_src.field = mf_from_id(MFF_LOG_SNAT_ZONE); >>> + } else { >>> + ct->zone_src.field = mf_from_id(MFF_LOG_DNAT_ZONE); >>> + } >>> + } >>> + >>> ct->zone_src.ofs = 0; >>> ct->zone_src.n_bits = 16; >>> >>> diff --git a/northd/en-global-config.c b/northd/en-global-config.c >>> index 34e393b33..193deaebc 100644 >>> --- a/northd/en-global-config.c >>> +++ b/northd/en-global-config.c >>> @@ -370,6 +370,7 @@ northd_enable_all_features(struct >>> ed_type_global_config *data) >>> .fdb_timestamp = true, >>> .ls_dpg_column = true, >>> .ct_commit_nat_v2 = true, >>> + .ct_commit_to_zone = true, >>> }; >>> } >>> >>> @@ -439,6 +440,15 @@ build_chassis_features(const struct >>> sbrec_chassis_table *sbrec_chassis_table, >>> chassis_features->ct_commit_nat_v2) { >>> chassis_features->ct_commit_nat_v2 = false; >>> } >>> + >>> + bool ct_commit_to_zone = >>> + smap_get_bool(&chassis->other_config, >>> + OVN_FEATURE_CT_COMMIT_TO_ZONE, >>> + false); >>> + if (!ct_commit_to_zone && >>> + chassis_features->ct_commit_to_zone) { >>> + chassis_features->ct_commit_to_zone = false; >>> + } >>> } >>> } >>> >>> diff --git a/northd/en-global-config.h b/northd/en-global-config.h >>> index 38d732808..842bcee70 100644 >>> --- a/northd/en-global-config.h >>> +++ b/northd/en-global-config.h >>> @@ -20,6 +20,7 @@ struct chassis_features { >>> bool fdb_timestamp; >>> bool ls_dpg_column; >>> bool ct_commit_nat_v2; >>> + bool ct_commit_to_zone; >>> }; >>> >>> struct global_config_tracked_data { >>> diff --git a/ovn-sb.xml b/ovn-sb.xml >>> index ac4e585f2..f5f2208da 100644 >>> --- a/ovn-sb.xml >>> +++ b/ovn-sb.xml >>> @@ -1405,6 +1405,8 @@ >>> <dt><code>ct_commit { ct_mark=<var>value[/mask]</var>; >>> };</code></dt> >>> <dt><code>ct_commit { ct_label=<var>value[/mask]</var>; >>> };</code></dt> >>> <dt><code>ct_commit { ct_mark=<var>value[/mask]</var>; >>> ct_label=<var>value[/mask]</var>; };</code></dt> >>> + <dt><code>ct_commit(snat);</code></dt> >>> + <dt><code>ct_commit(dnat);</code></dt> >>> <dd> >>> <p> >>> Commit the flow to the connection tracking entry associated >>> with it >>> @@ -1421,6 +1423,14 @@ >>> in order to have specific bits set. >>> </p> >>> >>> + <p> >>> + In Logical Router Datapath, parameters >>> <code>ct_commit(snat)</code> >>> + or <code>ct_commit(dnat) </code> can be used to explicitly >>> specify >>> + into which zone should be connection committed. Without this >>> + parameter, the connection is committed to the default zone >>> for the >>> + Datapath. These parameters have no effect in Logical Switch >>> Datapath. >>> + </p> >>> + >>> <p> >>> Note that if you want processing to continue in the next >>> table, >>> you must execute the <code>next</code> action after >>> diff --git a/tests/ovn.at b/tests/ovn.at >>> index d26c95054..11e6430ed 100644 >>> --- a/tests/ovn.at >>> +++ b/tests/ovn.at >>> @@ -1349,6 +1349,13 @@ ct_commit(ct_label=18446744073709551615); >>> ct_commit(ct_label=18446744073709551616); >>> Decimal constants must be less than 2**64. >>> >>> +ct_commit(dnat); >>> + encodes as ct(commit,zone=NXM_NX_REG13[0..15]) >>> + has prereqs ip >>> +ct_commit(snat); >>> + encodes as ct(commit,zone=NXM_NX_REG13[0..15]) >>> + has prereqs ip >>> + >>> ct_mark = 12345 >>> Field ct_mark is not modifiable. >>> ct_label = 0xcafe >>> -- >>> 2.40.1 >>> >>> >> >> -- >> Best Regards, >> Martin Kalcok. >> > > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev