I realized this patch should update the minor version of the
ovsschema.  I've folded that change in.

Ethan

On Mon, Apr 16, 2012 at 14:17, Ethan Jackson <et...@nicira.com> wrote:
> There are two sensible ways to represent the 6 DSCP bits of an IP
> packet.  One could represent them as an integer in the range 0 to
> 63.  Or one could represent them as they would appear in the tos
> field (0 to 63) << 2.  Before this patch, OVS had used the former
> method for the DSCP bits in the Queue Table, and the latter for the
> DSCP in the Controller and Manager tables.  Since the ability to
> set DSCP bits in the Controller and Manager tables is so new that
> it hasn't been released yet, this patch changes it to use the
> existing style employed in the Queue table.  Hopefully this should
> make the code and configuration less confusing.
>
> Signed-off-by: Ethan Jackson <et...@nicira.com>
> ---
>  lib/socket-util.c    |   36 ++++++++++++++++++++++++------------
>  lib/socket-util.h    |    4 ++--
>  ovsdb/ovsdb-server.c |   41 +++++++++++++++--------------------------
>  vswitchd/bridge.c    |   10 +++++++---
>  vswitchd/vswitch.xml |   38 +++++++++++++++++++-------------------
>  5 files changed, 67 insertions(+), 62 deletions(-)
>
> diff --git a/lib/socket-util.c b/lib/socket-util.c
> index aebc147..563f87d 100644
> --- a/lib/socket-util.c
> +++ b/lib/socket-util.c
> @@ -17,6 +17,7 @@
>  #include <config.h>
>  #include "socket-util.h"
>  #include <arpa/inet.h>
> +#include <assert.h>
>  #include <errno.h>
>  #include <fcntl.h>
>  #include <net/if.h>
> @@ -81,6 +82,17 @@ set_nonblocking(int fd)
>     }
>  }
>
> +static int
> +set_dscp(int fd, uint8_t dscp)
> +{
> +    assert(dscp <= 63);
> +    dscp = dscp << 2;
> +    if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
> +        return errno;
> +    }
> +    return 0;
> +}
> +
>  static bool
>  rlim_is_finite(rlim_t limit)
>  {
> @@ -573,12 +585,12 @@ inet_open_active(int style, const char *target, 
> uint16_t default_port,
>         goto exit_close;
>     }
>
> -    /* The socket options set here ensure that the TOS bits are set during
> -     * the connection establishment.  If set after connect(), the handshake
> -     * SYN frames will be sent with a TOS of 0. */
> -    if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
> -        VLOG_ERR("%s: socket: %s", target, strerror(errno));
> -        error = errno;
> +    /* The dscp bits must be configured before connect() to ensure that the 
> TOS
> +     * field is set during the connection establishment.  If set after
> +     * connect(), the handshake SYN frames will be sent with a TOS of 0. */
> +    error = set_dscp(fd, dscp);
> +    if (error) {
> +        VLOG_ERR("%s: socket: %s", target, strerror(error));
>         goto exit_close;
>     }
>
> @@ -714,12 +726,12 @@ inet_open_passive(int style, const char *target, int 
> default_port,
>         goto error;
>     }
>
> -    /* The socket options set here ensure that the TOS bits are set during
> -     * the connection establishment.  If set after connect(), the handshake
> -     * SYN frames will be sent with a TOS of 0. */
> -    if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
> -        VLOG_ERR("%s: socket: %s", target, strerror(errno));
> -        error = errno;
> +    /* The dscp bits must be configured before connect() to ensure that the 
> TOS
> +     * field is set during the connection establishment.  If set after
> +     * connect(), the handshake SYN frames will be sent with a TOS of 0. */
> +    error = set_dscp(fd, dscp);
> +    if (error) {
> +        VLOG_ERR("%s: socket: %s", target, strerror(error));
>         goto error;
>     }
>
> diff --git a/lib/socket-util.h b/lib/socket-util.h
> index 07c9327..a2fa71b 100644
> --- a/lib/socket-util.h
> +++ b/lib/socket-util.h
> @@ -66,7 +66,7 @@ char *describe_fd(int fd);
>
>  /* Default value of dscp bits for connection between controller and manager.
>  * Value of IPTOS_PREC_INTERNETCONTROL = 0xc0 which is defined
> - * in <netinet/ip.h> is used.  */
> -#define DSCP_DEFAULT IPTOS_PREC_INTERNETCONTROL
> + * in <netinet/ip.h> is used. */
> +#define DSCP_DEFAULT IPTOS_PREC_INTERNETCONTROL >> 2
>
>  #endif /* socket-util.h */
> diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
> index 6994018..d8363a2 100644
> --- a/ovsdb/ovsdb-server.c
> +++ b/ovsdb/ovsdb-server.c
> @@ -319,12 +319,11 @@ get_datum(struct ovsdb_row *row, const char 
> *column_name,
>     return &row->fields[column->index];
>  }
>
> -/* This function is used to read the string-string key-values from a map.
> - * Returns the true if the 'key' is found and returns the "value"  associated
> - * with the 'key' in 'stringp', else returns false. */
> -static bool
> +/* Read string-string key-values from a map.  Returns the value associated 
> with
> + * 'key', if found, or NULL */
> +static const char *
>  read_map_string_column(const struct ovsdb_row *row, const char *column_name,
> -                       const char **stringp, const char *key)
> +                       const char *key)
>  {
>     const struct ovsdb_datum *datum;
>     union ovsdb_atom *atom_key = NULL, *atom_value = NULL;
> @@ -334,8 +333,7 @@ read_map_string_column(const struct ovsdb_row *row, const 
> char *column_name,
>                       OVSDB_TYPE_STRING, UINT_MAX);
>
>     if (!datum) {
> -        *stringp = NULL;
> -        return false;
> +        return NULL;
>     }
>
>     for (i = 0; i < datum->n; i++) {
> @@ -346,8 +344,7 @@ read_map_string_column(const struct ovsdb_row *row, const 
> char *column_name,
>         }
>     }
>
> -    *stringp = atom_value ? atom_value->string : NULL;
> -    return atom_value != NULL;
> +    return atom_value ? atom_value->string : NULL;
>  }
>
>  static const union ovsdb_atom *
> @@ -427,21 +424,6 @@ write_string_string_column(struct ovsdb_row *row, const 
> char *column_name,
>     ovsdb_datum_sort_assert(datum, column->type.key.type);
>  }
>
> -/* Get the other config for the manager from the database. */
> -static void
> -manager_get_other_config(const struct ovsdb_row *row,
> -                         struct ovsdb_jsonrpc_options *options)
> -{
> -    const char *temp_string;
> -
> -    /* Retrieve the configs and store in the options. */
> -    if (read_map_string_column(row, "other_config", &temp_string, "dscp")) {
> -        options->dscp = atoi(temp_string);
> -    } else {
> -        options->dscp = DSCP_DEFAULT;
> -    }
> -}
> -
>  /* Adds a remote and options to 'remotes', based on the Manager table row in
>  * 'row'. */
>  static void
> @@ -450,7 +432,7 @@ add_manager_options(struct shash *remotes, const struct 
> ovsdb_row *row)
>     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
>     struct ovsdb_jsonrpc_options *options;
>     long long int max_backoff, probe_interval;
> -    const char *target;
> +    const char *target, *dscp_string;
>
>     if (!read_string_column(row, "target", &target) || !target) {
>         VLOG_INFO_RL(&rl, "Table `%s' has missing or invalid `target' column",
> @@ -466,7 +448,14 @@ add_manager_options(struct shash *remotes, const struct 
> ovsdb_row *row)
>         options->probe_interval = probe_interval;
>     }
>
> -    manager_get_other_config(row, options);
> +    options->dscp = DSCP_DEFAULT;
> +    dscp_string = read_map_string_column(row, "other_config", "dscp");
> +    if (dscp_string) {
> +        int dscp = atoi(dscp_string);
> +        if (dscp >= 0 && dscp <= 63) {
> +            options->dscp = dscp;
> +        }
> +    }
>  }
>
>  static void
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index 22a3706..74cba87 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -2436,10 +2436,14 @@ bridge_ofproto_controller_from_ovsrec(const struct 
> ovsrec_controller *c,
>     oc->enable_async_msgs = (!c->enable_async_messages
>                              || *c->enable_async_messages);
>     config_str = ovsrec_controller_get_other_config_value(c, "dscp", NULL);
> +
> +    oc->dscp = DSCP_DEFAULT;
>     if (config_str) {
> -        oc->dscp = atoi(config_str);
> -    } else {
> -        oc->dscp = DSCP_DEFAULT;
> +        int dscp = atoi(config_str);
> +
> +        if (dscp >= 0 && dscp <= 63) {
> +            oc->dscp = dscp;
> +        }
>     }
>  }
>
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 1128db9..ef01974 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -2698,16 +2698,16 @@
>
>       <column name="other_config" key="dscp"
>                 type='{"type": "integer"}'>
> -        The Differentiated Service Code Point (DSCP) is specified in the IP
> -        header. They are specified using 6 bits in the Type of Service (TOS)
> -        field in the IP header. DSCP provides a mechanism to classify the
> -        network traffic and provide the Quality of Service (QoS) on IP
> -        networks.
> -        The DSCP value passed is used when establishing the connection 
> between
> -        the controller and the Open vSwitch.  The connection must be reset
> -        for the new DSCP values to take effect.  If no value is
> -        specified, a default value of 192 is chosen for connection
> -        establishment.  Valid DSCP values must have their lower 2 bits set 
> to 0.
> +        The Differentiated Service Code Point (DSCP) is specified using 6 
> bits
> +        in the Type of Service (TOS) field in the IP header. DSCP provides a
> +        mechanism to classify the network traffic and provide Quality of
> +        Service (QoS) on IP networks.
> +
> +        The DSCP value specified here is used when establishing the 
> connection
> +        between the controller and the Open vSwitch.  The connection must be
> +        reset for the new DSCP values to take effect.  If no value is
> +        specified, a default value of 48 is chosen.  Valid DSCP values must 
> be
> +        in the range 0 to 63.
>       </column>
>     </group>
>
> @@ -2945,16 +2945,16 @@
>
>       <column name="other_config" key="dscp"
>                 type='{"type": "integer"}'>
> -        The Differentiated Service Code Point (DSCP) is specified in the IP
> -        header. They are specified using 6 bits in the Type of Service (TOS)
> -        field in the IP header. DSCP provides a mechanism to classify the
> -        network traffic and provide the Quality of Service (QoS) on IP
> -        networks.
> -        The DSCP value passed when establishing the connection between
> -        the manager and the Open vSwitch Database.  The connection must be
> +        The Differentiated Service Code Point (DSCP) is specified using 6 
> bits
> +        in the Type of Service (TOS) field in the IP header. DSCP provides a
> +        mechanism to classify the network traffic and provide Quality of
> +        Service (QoS) on IP networks.
> +
> +        The DSCP value specified here is used when establishing the 
> connection
> +        between the manager and the Open vSwitch.  The connection must be
>         reset for the new DSCP values to take effect.  If no value is
> -        specified, a default value of 192 is chosen for connection
> -        establishment.  Valid DSCP values must have their lower 2 bits set 
> to 0.
> +        specified, a default value of 48 is chosen.  Valid DSCP values must 
> be
> +        in the range 0 to 63.
>       </column>
>     </group>
>
> --
> 1.7.9.6
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to