Thanks for the reviews, Jarno!

On 04/12/2015 15:03, "Jarno Rajahalme" <ja...@ovn.org> wrote:

>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
>> 
>>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm
>>an_listinfo_dev&d=BQIFAg&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=
>>SmB5nZacmXNq0gKCC1s_Cw5yUNjxgD4v5kJqZ2uWLlE&m=9_FS9jUZK7ajjQBI3-eSdx7Q_ut
>>Jg86ig52aIZ39fRU&s=D0LZ2r0dC9bkQVANqepfZ5S_6LLGfY-YvcD4POBqlA0&e=
>

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to