This patch is intended to repalace "nx-match: Optionally allow unknown
NXM headers in nx_pull_match()."

Ethan

On Mon, Jan 9, 2012 at 14:35, Ethan Jackson <et...@nicira.com> wrote:
> Future patches will need the ability to skip over unsupported NXM
> headers.
>
> Signed-off-by: Ethan Jackson <et...@nicira.com>
> ---
>  lib/nx-match.c        |   59 
> ++++++++++++++++++++++++++++++++++---------------
>  lib/nx-match.h        |    3 ++
>  tests/ovs-ofctl.at    |   17 +++++++++++++-
>  utilities/ovs-ofctl.c |   14 +++++++++--
>  4 files changed, 71 insertions(+), 22 deletions(-)
>
> diff --git a/lib/nx-match.c b/lib/nx-match.c
> index a93a693..eaccce1 100644
> --- a/lib/nx-match.c
> +++ b/lib/nx-match.c
> @@ -96,18 +96,10 @@ nx_entry_ok(const void *p, unsigned int match_len)
>     return header;
>  }
>
> -/* Parses the nx_match formatted match description in 'b' with length
> - * 'match_len'.  The results are stored in 'rule', which is initialized
> - * with 'priority'.  If 'cookie' and 'cookie_mask' contain valid
> - * pointers, then the cookie and mask will be stored in them if a
> - * "NXM_NX_COOKIE*" match is defined.  Otherwise, 0 is stored in both.
> - *
> - * Returns 0 if successful, otherwise an OpenFlow error code.
> - */
> -int
> -nx_pull_match(struct ofpbuf *b, unsigned int match_len, uint16_t priority,
> -              struct cls_rule *rule,
> -              ovs_be64 *cookie, ovs_be64 *cookie_mask)
> +static int
> +nx_pull_match__(struct ofpbuf *b, unsigned int match_len, bool strict,
> +                uint16_t priority, struct cls_rule *rule,
> +                ovs_be64 *cookie, ovs_be64 *cookie_mask)
>  {
>     uint32_t header;
>     uint8_t *p;
> @@ -126,14 +118,19 @@ nx_pull_match(struct ofpbuf *b, unsigned int match_len, 
> uint16_t priority,
>     if (cookie) {
>         *cookie = *cookie_mask = htonll(0);
>     }
> -    while ((header = nx_entry_ok(p, match_len)) != 0) {
> -        unsigned length = NXM_LENGTH(header);
> +    for (;
> +         (header = nx_entry_ok(p, match_len)) != 0;
> +         p += 4 + NXM_LENGTH(header), match_len -= 4 + NXM_LENGTH(header)) {
>         const struct mf_field *mf;
>         int error;
>
>         mf = mf_from_nxm_header(header);
>         if (!mf) {
> -            error = NXM_BAD_TYPE;
> +            if (strict) {
> +                error = NXM_BAD_TYPE;
> +            } else {
> +                continue;
> +            }
>         } else if (!mf_are_prereqs_ok(mf, &rule->flow)) {
>             error = NXM_BAD_PREREQ;
>         } else if (!mf_is_all_wild(mf, &rule->wc)) {
> @@ -190,13 +187,39 @@ nx_pull_match(struct ofpbuf *b, unsigned int match_len, 
> uint16_t priority,
>
>             return error;
>         }
> -
> -        p += 4 + length;
> -        match_len -= 4 + length;
>     }
>
>     return match_len ? NXM_INVALID : 0;
>  }
> +
> +/* Parses the nx_match formatted match description in 'b' with length
> + * 'match_len'.  The results are stored in 'rule', which is initialized with
> + * 'priority'.  If 'cookie' and 'cookie_mask' contain valid pointers, then 
> the
> + * cookie and mask will be stored in them if a "NXM_NX_COOKIE*" match is
> + * defined.  Otherwise, 0 is stored in both.
> + *
> + * Fails with an error when encountering unknown NXM headers.
> + *
> + * Returns 0 if successful, otherwise an OpenFlow error code. */
> +int
> +nx_pull_match(struct ofpbuf *b, unsigned int match_len,
> +              uint16_t priority, struct cls_rule *rule,
> +              ovs_be64 *cookie, ovs_be64 *cookie_mask)
> +{
> +    return nx_pull_match__(b, match_len, true, priority, rule, cookie,
> +                           cookie_mask);
> +}
> +
> +/* Behaves the same as nx_pull_match() with one exception.  Skips over 
> unknown
> + * NXM headers instead of failing with an error when they are encountered. */
> +int
> +nx_pull_match_loose(struct ofpbuf *b, unsigned int match_len,
> +                    uint16_t priority, struct cls_rule *rule,
> +                    ovs_be64 *cookie, ovs_be64 *cookie_mask)
> +{
> +    return nx_pull_match__(b, match_len, false, priority, rule, cookie,
> +                           cookie_mask);
> +}
>
>  /* nx_put_match() and helpers.
>  *
> diff --git a/lib/nx-match.h b/lib/nx-match.h
> index c7ee0f8..8931d58 100644
> --- a/lib/nx-match.h
> +++ b/lib/nx-match.h
> @@ -36,6 +36,9 @@ struct nx_action_reg_move;
>
>  int nx_pull_match(struct ofpbuf *, unsigned int match_len, uint16_t priority,
>                   struct cls_rule *, ovs_be64 *cookie, ovs_be64 *cookie_mask);
> +int nx_pull_match_loose(struct ofpbuf *, unsigned int match_len,
> +                        uint16_t priority, struct cls_rule *,
> +                        ovs_be64 *cookie, ovs_be64 *cookie_mask);
>  int nx_put_match(struct ofpbuf *, const struct cls_rule *,
>                  ovs_be64 cookie, ovs_be64 cookie_mask);
>
> diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
> index d89d398..57712c0 100644
> --- a/tests/ovs-ofctl.at
> +++ b/tests/ovs-ofctl.at
> @@ -370,7 +370,7 @@ NXM_NX_REG0_W(a0e0d050/f0f0f0f0)
>  00011e04(12345678)
>  00011f08(12345678/12345678)
>  ])
> -AT_CHECK([ovs-ofctl parse-nx-match < nx-match.txt], [0], [dnl
> +AT_CHECK([ovs-ofctl --strict parse-nx-match < nx-match.txt], [0], [dnl
>  <any>
>
>  # in port
> @@ -565,6 +565,21 @@ nx_pull_match() returned error 44010101 (type 
> OFPET_BAD_REQUEST, code NXBRC_NXM_
>  ])
>  AT_CLEANUP
>
> +AT_SETUP([ovs-ofctl parse-nx-match loose])
> +AT_KEYWORDS([nx-match])
> +AT_DATA([nx-match.txt], [dnl
> +NXM_OF_IN_PORT(0001), 01020304(1111/2222), NXM_OF_ETH_TYPE(0800)
> +])
> +
> +AT_CHECK([ovs-ofctl --strict parse-nx-match < nx-match.txt], [0], [dnl
> +nx_pull_match() returned error 44010101 (type OFPET_BAD_REQUEST, code 
> NXBRC_NXM_BAD_TYPE)
> +])
> +
> +AT_CHECK([ovs-ofctl parse-nx-match < nx-match.txt], [0], [dnl
> +NXM_OF_IN_PORT(0001), NXM_OF_ETH_TYPE(0800)
> +])
> +AT_CLEANUP
> +
>  dnl Check that "-F openflow10" rejects a flow_mod with a tun_id, since
>  dnl OpenFlow 1.0 doesn't support tunnels.
>  AT_SETUP([ovs-ofctl -F option and tun_id])
> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
> index 044f74c..ec7eee5 100644
> --- a/utilities/ovs-ofctl.c
> +++ b/utilities/ovs-ofctl.c
> @@ -55,7 +55,9 @@
>
>  VLOG_DEFINE_THIS_MODULE(ofctl);
>
> -/* --strict: Use strict matching for flow mod commands? */
> +/* --strict: Use strict matching for flow mod commands?  Additionally governs
> + * use of nx_pull_match() instead of nx_pull_match_loose() in parse-nx-match.
> + */
>  static bool strict;
>
>  /* --readd: If ture, on replace-flows, re-add even flows that have not 
> changed
> @@ -1539,8 +1541,14 @@ do_parse_nx_match(int argc OVS_UNUSED, char *argv[] 
> OVS_UNUSED)
>         match_len = nx_match_from_string(ds_cstr(&in), &nx_match);
>
>         /* Convert nx_match to cls_rule. */
> -        error = nx_pull_match(&nx_match, match_len, 0, &rule,
> -                              &cookie, &cookie_mask);
> +        if (strict) {
> +            error = nx_pull_match(&nx_match, match_len, 0, &rule,
> +                                  &cookie, &cookie_mask);
> +        } else {
> +            error = nx_pull_match_loose(&nx_match, match_len, 0, &rule,
> +                                        &cookie, &cookie_mask);
> +        }
> +
>         if (!error) {
>             char *out;
>
> --
> 1.7.7.1
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to