Thanks Daniele! Acked-by: Jarno Rajahalme <ja...@ovn.org>
Pushed to master, Jarno > On Dec 3, 2015, at 10:35 AM, Daniele Di Proietto <diproiet...@vmware.com> > wrote: > > The NAT validation is similar (and based on) the existing conntrack > validation: when a dpif backer is created, we try to install a flow with > the ct_state NAT bits set. If the flow setup fails we assume that the > backer doesn't support NAT and we reject OpenFlow flows with a NAT > action or a match on the ct_state NAT bits. > > Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> > --- > lib/odp-util.h | 5 +++++ > ofproto/ofproto-dpif.c | 22 ++++++++++++++++------ > 2 files changed, 21 insertions(+), 6 deletions(-) > > diff --git a/lib/odp-util.h b/lib/odp-util.h > index a936416..35849ae 100644 > --- a/lib/odp-util.h > +++ b/lib/odp-util.h > @@ -178,6 +178,11 @@ struct odp_support { > bool ct_zone; > bool ct_mark; > bool ct_label; > + > + /* If true, it means that the datapath supports the NAT bits in > + * 'ct_state'. The above 'ct_state' member must be true for this > + * to make sense */ > + bool ct_state_nat; > }; > > struct odp_flow_key_parms { > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index e76d8fe..d920ed0 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -1236,7 +1236,7 @@ check_masked_set_action(struct dpif_backer *backer) > return !error; > } > > -#define CHECK_FEATURE__(NAME, FIELD) \ > +#define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE) \ > static bool \ > check_##NAME(struct dpif_backer *backer) \ > { \ > @@ -1247,12 +1247,12 @@ check_##NAME(struct dpif_backer *backer) > \ > struct odp_flow_key_parms odp_parms = { \ > .flow = &flow, \ > .support = { \ > - .NAME = true, \ > + .SUPPORT = true, \ > }, \ > }; \ > \ > memset(&flow, 0, sizeof flow); \ > - flow.FIELD = 1; \ > + flow.FIELD = VALUE; \ > \ > ofpbuf_use_stack(&key, &keybuf, sizeof keybuf); \ > odp_flow_key_from_flow(&odp_parms, &key); \ > @@ -1267,12 +1267,13 @@ check_##NAME(struct dpif_backer *backer) > \ > \ > return enable; \ > } > -#define CHECK_FEATURE(FIELD) CHECK_FEATURE__(FIELD, FIELD) > +#define CHECK_FEATURE(FIELD) CHECK_FEATURE__(FIELD, FIELD, FIELD, 1) > > CHECK_FEATURE(ct_state) > CHECK_FEATURE(ct_zone) > CHECK_FEATURE(ct_mark) > -CHECK_FEATURE__(ct_label, ct_label.u64.lo) > +CHECK_FEATURE__(ct_label, ct_label, ct_label.u64.lo, 1) > +CHECK_FEATURE__(ct_state_nat, ct_state, ct_state, CS_TRACKED|CS_SRC_NAT) > > #undef CHECK_FEATURE > #undef CHECK_FEATURE__ > @@ -1293,6 +1294,8 @@ check_support(struct dpif_backer *backer) > backer->support.odp.ct_zone = check_ct_zone(backer); > backer->support.odp.ct_mark = check_ct_mark(backer); > backer->support.odp.ct_label = check_ct_label(backer); > + > + backer->support.odp.ct_state_nat = check_ct_state_nat(backer); > } > > static int > @@ -4023,7 +4026,7 @@ check_mask(struct ofproto_dpif *ofproto, const struct > miniflow *flow) > support = &ofproto_dpif_get_support(ofproto)->odp; > ct_state = MINIFLOW_GET_U16(flow, ct_state); > if (support->ct_state && support->ct_zone && support->ct_mark > - && support->ct_label) { > + && support->ct_label && support->ct_state_nat) { > return ct_state & CS_UNSUPPORTED_MASK ? OFPERR_OFPBMC_BAD_MASK : 0; > } > > @@ -4033,6 +4036,7 @@ check_mask(struct ofproto_dpif *ofproto, const struct > miniflow *flow) > > if ((ct_state && !support->ct_state) > || (ct_state & CS_UNSUPPORTED_MASK) > + || ((ct_state & (CS_SRC_NAT | CS_DST_NAT)) && !support->ct_state_nat) > || (ct_zone && !support->ct_zone) > || (ct_mark && !support->ct_mark) > || (!ovs_u128_is_zero(&ct_label) && !support->ct_label)) { > @@ -4070,6 +4074,12 @@ check_actions(const struct ofproto_dpif *ofproto, > OFPACT_FOR_EACH(a, ct->actions, ofpact_ct_get_action_len(ct)) { > const struct mf_field *dst = ofpact_get_mf_dst(a); > > + if (a->type == OFPACT_NAT && !support->ct_state_nat) { > + /* The backer doesn't seem to support the NAT bits in > + * 'ct_state': assume that it doesn't support the NAT > + * action. */ > + return OFPERR_OFPBAC_BAD_TYPE; > + } > if (dst && ((dst->id == MFF_CT_MARK && !support->ct_mark) > || (dst->id == MFF_CT_LABEL && !support->ct_label))) { > return OFPERR_OFPBAC_BAD_SET_ARGUMENT; > -- > 2.1.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev