On Mon, Nov 12, 2012 at 5:15 PM, Pravin B Shelar <pshe...@nicira.com> wrote:

> diff --git a/lib/odp-util.c b/lib/odp-util.c
> index 08823e2..b86de0a 100644
> --- a/lib/odp-util.c
> +++ b/lib/odp-util.c
> +static const char *
> +tun_flag_to_string(uint32_t flags)
> +{
> +    switch (flags) {
> +    case OVS_TNL_F_DONT_FRAGMENT:
> +        return "dont_fragment";
> +    case OVS_TNL_F_CSUM:
> +        return "csum";
> +    case OVS_TNL_F_KEY:
> +        return "key_present";
>
> Since these can get printed a lot it might be useful to shorten them
for readability.  I would probably go with "df", "csum", and "key" (which
are also more similar to the arguments that we use for configuring the
tunnel ports).


> +static void
> +format_tun_flags(struct ds *ds, uint32_t flags)
> +{
>

It seems like it should be possible to merge together formatting and
parsing functions for both the tunnel flags and the slow path reason by
passing in the values as an argument.  I see a couple issues in both of
them so this might help.


> +    uint32_t bad = 0;
> +
> +    ds_put_format(ds, "flags=");
> +
> +    if (!flags) {
> +        ds_put_format(ds, "0");
>

Can you use 0x0 here to make it consistent with the case where we can't
decode the flags?


> @@ -926,25 +976,61 @@ parse_odp_key_attr(const char *s, const struct simap
> *port_names,
>
>      {
>          char tun_id_s[32];
> -        unsigned long long int flags;
>          int tos, ttl;
>          struct ovs_key_ipv4_tunnel tun_key;
> -        int n = -1;
> +        int n0 = -1;
>
>          if (sscanf(s, "ipv4_tunnel(tun_id=%31[x0123456789abcdefABCDEF],"
> -                   "flags=%lli,src="IP_SCAN_FMT",dst="IP_SCAN_FMT
> -                   ",tos=%i,ttl=%i)%n", tun_id_s, &flags,
> +                   "src="IP_SCAN_FMT",dst="IP_SCAN_FMT
> +                   ",tos=%i,ttl=%i,%n", tun_id_s,
>                      IP_SCAN_ARGS(&tun_key.ipv4_src),
>                      IP_SCAN_ARGS(&tun_key.ipv4_dst), &tos, &ttl,
> -                    &n) > 0 && n > 0) {
> +                    &n0) > 0 && n0 > 0) {
> +            int n = -1;
> +
>              tun_key.tun_id = htonll(strtoull(tun_id_s, NULL, 0));
> -            tun_key.tun_flags = flags;
>              tun_key.ipv4_tos = tos;
>              tun_key.ipv4_ttl = ttl;
>              memset(&tun_key.pad, 0, sizeof tun_key.pad);
> -            nl_msg_put_unspec(key, OVS_KEY_ATTR_IPV4_TUNNEL, &tun_key,
> -                              sizeof tun_key);
> -            return n;
> +
> +            s += n0;
> +            if (sscanf(s, "flags=%n", &n) == 0 && n > 0) {
>

"flags" should always be present so can't we just include it as part of the
previous sscanf call?


> +
> +                tun_key.tun_flags = 0;
> +
> +                while (s[n] != ')') {
> +                    uint32_t bit;
> +
> +                    for (bit = 1; bit; bit <<= 1) {
> +                        const char *flag = tun_flag_to_string(bit);
> +                        size_t len = strlen(flag);
> +
> +                        if (flag
> +                            && !strncmp(s + n, flag, len)
> +                            && (s[n + len] == ',' || s[n + len] == ')'))
> +                        {
> +                            tun_key.tun_flags |= bit;
> +                            n += len + (s[n + len] == ',');
> +                            break;
> +                        }
> +                    }
> +
> +                    if (!bit) {
> +                        if (s[n] == '0' && s[n + 1] == ')') {
> +                            n++;
> +                            break;
> +                        }
> +                        return -EINVAL;
> +                    }
>

This won't be able to read back any values in hex that couldn't be decoded
even though the information is present.  The slow path function has the
same issue but I think both should be able to handle it.


> +                }
> +                if (s[n + 1] != ')') {
> +                    return -EINVAL;
> +                }


I think this is looking at the closing parenthesis of set in the case of
actions, which isn't part of what we're trying to decode here.  It works
because we don't actually advance past it but I don't think it will work in
the case of flow keys.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to