On Tue, Mar 12, 2024 at 9:18 PM Martin Kalcok <martin.kal...@canonical.com> wrote:
Hi Martin, sorry for the late reply. 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. > I still think we should basically remove any other functionality from ct_commit_v1 and leave just those two options. > > 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. > Yeah that's correct, this is limitation/intention of the way we encode the actions in the test-ovn.c. > 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) > That is correct and a little confusing, if the formatting is the same as the original input the test utility doesn't produce the output again. > > 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. > I don't think the plan is to backport those or is it? In case of this being considered as a feature we don't need the feature flag, but that depends on decision from maintainers. > > @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? > That's fine, as you said there are instances where it is over the 79 limit. > > [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. > In general this patch looks fine, however there we still require to make the decision around ct_commit_v1. Thanks, Ales -- Ales Musil Senior Software Engineer - OVN Core Red Hat EMEA <https://www.redhat.com> amu...@redhat.com <https://red.ht/sig> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev