[ovs-dev] [of1.2 6/9] ovs-ofctl: Reject impossible protocols configurations at startup.

Simon Horman horms at verge.net.au
Thu Nov 29 08:09:00 UTC 2012


On Wed, Nov 28, 2012 at 11:06:53PM -0800, Ben Pfaff wrote:
> The -O and -F options interact, so that it's possible to select only
> flow formats that are not supported on a given OpenFlow version.  It seems
> best to report these problems up front rather than failing in a more
> mysterious way later.
> 
> Signed-off-by: Ben Pfaff <blp at nicira.com>

Wow, that rather tedious.

Acked-by: Simon Horman <horms at verge.net.au>

> ---
>  lib/ofp-version-opt.c |    6 ++++++
>  lib/ofp-version-opt.h |    1 +
>  tests/ovs-ofctl.at    |   21 +++++++++++++++++++++
>  utilities/ovs-ofctl.c |   18 ++++++++++++++++++
>  4 files changed, 46 insertions(+)
> 
> diff --git a/lib/ofp-version-opt.c b/lib/ofp-version-opt.c
> index 0aa2930..35d79e6 100644
> --- a/lib/ofp-version-opt.c
> +++ b/lib/ofp-version-opt.c
> @@ -21,6 +21,12 @@ set_allowed_ofp_versions(const char *string)
>  }
>  
>  void
> +mask_allowed_ofp_versions(uint32_t bitmap)
> +{
> +    allowed_versions &= bitmap;
> +}
> +
> +void
>  ofp_version_usage(void)
>  {
>      struct ds msg = DS_EMPTY_INITIALIZER;
> diff --git a/lib/ofp-version-opt.h b/lib/ofp-version-opt.h
> index 78e3135..6bf5eed 100644
> --- a/lib/ofp-version-opt.h
> +++ b/lib/ofp-version-opt.h
> @@ -20,6 +20,7 @@
>  
>  uint32_t get_allowed_ofp_versions(void);
>  void set_allowed_ofp_versions(const char *string);
> +void mask_allowed_ofp_versions(uint32_t);
>  void ofp_version_usage(void);
>  
>  #endif
> diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
> index d94d75c..2ad165c 100644
> --- a/tests/ovs-ofctl.at
> +++ b/tests/ovs-ofctl.at
> @@ -2068,3 +2068,24 @@ AT_CHECK([ovs-ofctl diff-flows flows.txt br0], [2], [dnl
>  ])
>  OVS_VSWITCHD_STOP
>  AT_CLEANUP
> +
> +AT_SETUP([ovs-ofctl -F and -O interaction])
> +AT_CHECK([ovs-ofctl -F oxm -O openflow10], [1], [],
> +  [ovs-ofctl: None of the enabled OpenFlow versions (OpenFlow10) supports any of the enabled flow formats (OXM).  (Use -O to enable additional OpenFlow versions or -F to enable additional flow formats.)
> +])
> +AT_CHECK([ovs-ofctl -F oxm -O openflow11], [1], [],
> +  [ovs-ofctl: None of the enabled OpenFlow versions (OpenFlow11) supports any of the enabled flow formats (OXM).  (Use -O to enable additional OpenFlow versions or -F to enable additional flow formats.)
> +])
> +AT_CHECK([ovs-ofctl -F oxm -O openflow10,openflow11], [1], [],
> +  [ovs-ofctl: None of the enabled OpenFlow versions (OpenFlow10, OpenFlow11) supports any of the enabled flow formats (OXM).  (Use -O to enable additional OpenFlow versions or -F to enable additional flow formats.)
> +])
> +AT_CHECK([ovs-ofctl -F oxm -O openflow10,openflow12], [1], [],
> + [ovs-ofctl: missing command name; use --help for help
> +])
> +AT_CHECK([ovs-ofctl -F oxm -O openflow12], [1], [],
> +  [ovs-ofctl: missing command name; use --help for help
> +])
> +AT_CHECK([ovs-ofctl -F oxm -O openflow13], [1], [],
> +  [ovs-ofctl: missing command name; use --help for help
> +])
> +AT_CLEANUP
> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
> index 101ce80..80a202f 100644
> --- a/utilities/ovs-ofctl.c
> +++ b/utilities/ovs-ofctl.c
> @@ -169,6 +169,8 @@ parse_options(int argc, char *argv[])
>          {NULL, 0, NULL, 0},
>      };
>      char *short_options = long_options_to_short_options(long_options);
> +    uint32_t versions;
> +    enum ofputil_protocol version_protocols;
>  
>      for (;;) {
>          unsigned long int timeout;
> @@ -251,6 +253,22 @@ parse_options(int argc, char *argv[])
>      }
>  
>      free(short_options);
> +
> +    versions = get_allowed_ofp_versions();
> +    version_protocols = ofputil_protocols_from_version_bitmap(versions);
> +    if (!(allowed_protocols & version_protocols)) {
> +        char *protocols = ofputil_protocols_to_string(allowed_protocols);
> +        struct ds version_s = DS_EMPTY_INITIALIZER;
> +
> +        ofputil_format_version_bitmap_names(&version_s, versions);
> +        ovs_fatal(0, "None of the enabled OpenFlow versions (%s) supports "
> +                  "any of the enabled flow formats (%s).  (Use -O to enable "
> +                  "additional OpenFlow versions or -F to enable additional "
> +                  "flow formats.)", ds_cstr(&version_s), protocols);
> +    }
> +    allowed_protocols &= version_protocols;
> +    mask_allowed_ofp_versions(ofputil_protocols_to_version_bitmap(
> +                                  allowed_protocols));
>  }
>  
>  static void
> -- 
> 1.7.10.4
> 



More information about the dev mailing list