All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alexandra Sandulescu <alecsandra.sandulescu@gmail.com>
Cc: xen-devel@lists.xenproject.org, wei.liu2@citrix.com, konrad@darnok.org
Subject: Re: [OPW PATCH V4] tools: xl: refactor code to parse network device options
Date: Wed, 22 Oct 2014 12:35:58 +0100	[thread overview]
Message-ID: <1413977758.19198.12.camel@citrix.com> (raw)
In-Reply-To: <1413927381-21549-1-git-send-email-alecsandra.sandulescu@gmail.com>

On Wed, 2014-10-22 at 00:36 +0300, Alexandra Sandulescu wrote:
> This patch removes duplicate code in /tools/libxl/xl_cmdimpl.c by
> adding parse_nic_config function. This function parses configuration
> data and adds the information into libxl_device_nic struct. It is
> called in both main_networkattach and parse_config_data functions
> to replace duplicate code.
> 
> Signed-off-by: Alexandra Sandulescu <alecsandra.sandulescu@gmail.com>
> Acked-by: Wei Liu <wei.liu2@citrix.com>

This looks good to me, thanks. In reply to the first posting I asked:
Did you test both code paths? (wrt cfg file vs xl network-attach usage).
Did you?

Konrad, any reply to Wei's pros/cons on this patch for 4.5?
(<20141021152420.GI10234@zion.uk.xensource.com>)

Ian.

> ---
>  tools/libxl/xl_cmdimpl.c | 187 ++++++++++++++++++-----------------------------
>  1 file changed, 70 insertions(+), 117 deletions(-)
> 
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index ea43761..70de387 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -903,6 +903,73 @@ static void replace_string(char **str, const char *val)
>      *str = xstrdup(val);
>  }
>  
> +static int match_option_size(const char *prefix, size_t len,
> +        char *arg, char **argopt)
> +{
> +    int rc = strncmp(prefix, arg, len);
> +    if (!rc) *argopt = arg+len;
> +    return !rc;
> +}
> +#define MATCH_OPTION(prefix, arg, oparg) \
> +    match_option_size((prefix "="), sizeof((prefix)), (arg), &(oparg))
> +
> +/* Parses network data and adds info into nic
> + * Returns 1 if the input token does not match one of the keys
> + * or parsed values are not correct. Successful parse returns 0 */
> +static int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
> +{
> +    char *endptr, *oparg;
> +    int i;
> +    unsigned int val;
> +
> +    if (MATCH_OPTION("type", token, oparg)) {
> +        if (!strcmp("vif", oparg)) {
> +            nic->nictype = LIBXL_NIC_TYPE_VIF;
> +        } else if (!strcmp("ioemu", oparg)) {
> +            nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
> +        } else {
> +            fprintf(stderr, "Invalid parameter `type'.\n");
> +            return 1;
> +        }
> +    } else if (MATCH_OPTION("mac", token, oparg)) {
> +        for (i = 0; i < 6; i++) {
> +            val = strtoul(oparg, &endptr, 16);
> +            if ((oparg == endptr) || (val > 255)) {
> +                fprintf(stderr, "Invalid parameter `mac'.\n");
> +                return 1;
> +            }
> +            nic->mac[i] = val;
> +            oparg = endptr + 1;
> +        }
> +    } else if (MATCH_OPTION("bridge", token, oparg)) {
> +        replace_string(&nic->bridge, oparg);
> +    } else if (MATCH_OPTION("netdev", token, oparg)) {
> +        fprintf(stderr, "the netdev parameter is deprecated, "
> +                        "please use gatewaydev instead\n");
> +        replace_string(&nic->gatewaydev, oparg);
> +    } else if (MATCH_OPTION("gatewaydev", token, oparg)) {
> +        replace_string(&nic->gatewaydev, oparg);
> +    } else if (MATCH_OPTION("ip", token, oparg)) {
> +        replace_string(&nic->ip, oparg);
> +    } else if (MATCH_OPTION("script", token, oparg)) {
> +        replace_string(&nic->script, oparg);
> +    } else if (MATCH_OPTION("backend", token, oparg)) {
> +        replace_string(&nic->backend_domname, oparg);
> +    } else if (MATCH_OPTION("vifname", token, oparg)) {
> +        replace_string(&nic->ifname, oparg);
> +    } else if (MATCH_OPTION("model", token, oparg)) {
> +        replace_string(&nic->model, oparg);
> +    } else if (MATCH_OPTION("rate", token, oparg)) {
> +        parse_vif_rate(config, oparg, nic);
> +    } else if (MATCH_OPTION("accel", token, oparg)) {
> +        fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
> +    } else {
> +        fprintf(stderr, "unrecognized argument `%s'\n", token);
> +        return 1;
> +    }
> +    return 0;
> +}
> +
>  static void parse_config_data(const char *config_source,
>                                const char *config_data,
>                                int config_len,
> @@ -1530,7 +1597,7 @@ static void parse_config_data(const char *config_source,
>          while ((buf = xlu_cfg_get_listitem (nics, d_config->num_nics)) != NULL) {
>              libxl_device_nic *nic;
>              char *buf2 = strdup(buf);
> -            char *p, *p2;
> +            char *p;
>  
>              d_config->nics = (libxl_device_nic *) realloc(d_config->nics, sizeof (libxl_device_nic) * (d_config->num_nics+1));
>              nic = d_config->nics + d_config->num_nics;
> @@ -1544,64 +1611,7 @@ static void parse_config_data(const char *config_source,
>              do {
>                  while (*p == ' ')
>                      p++;
> -                if ((p2 = strchr(p, '=')) == NULL)
> -                    break;
> -                *p2 = '\0';
> -                if (!strcmp(p, "model")) {
> -                    free(nic->model);
> -                    nic->model = strdup(p2 + 1);
> -                } else if (!strcmp(p, "mac")) {
> -                    char *p3 = p2 + 1;
> -                    *(p3 + 2) = '\0';
> -                    nic->mac[0] = strtol(p3, NULL, 16);
> -                    p3 = p3 + 3;
> -                    *(p3 + 2) = '\0';
> -                    nic->mac[1] = strtol(p3, NULL, 16);
> -                    p3 = p3 + 3;
> -                    *(p3 + 2) = '\0';
> -                    nic->mac[2] = strtol(p3, NULL, 16);
> -                    p3 = p3 + 3;
> -                    *(p3 + 2) = '\0';
> -                    nic->mac[3] = strtol(p3, NULL, 16);
> -                    p3 = p3 + 3;
> -                    *(p3 + 2) = '\0';
> -                    nic->mac[4] = strtol(p3, NULL, 16);
> -                    p3 = p3 + 3;
> -                    *(p3 + 2) = '\0';
> -                    nic->mac[5] = strtol(p3, NULL, 16);
> -                } else if (!strcmp(p, "bridge")) {
> -                    free(nic->bridge);
> -                    nic->bridge = strdup(p2 + 1);
> -                } else if (!strcmp(p, "type")) {
> -                    if (!strcmp(p2 + 1, "ioemu"))
> -                        nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
> -                    else
> -                        nic->nictype = LIBXL_NIC_TYPE_VIF;
> -                } else if (!strcmp(p, "ip")) {
> -                    free(nic->ip);
> -                    nic->ip = strdup(p2 + 1);
> -                } else if (!strcmp(p, "script")) {
> -                    free(nic->script);
> -                    nic->script = strdup(p2 + 1);
> -                } else if (!strcmp(p, "vifname")) {
> -                    free(nic->ifname);
> -                    nic->ifname = strdup(p2 + 1);
> -                } else if (!strcmp(p, "backend")) {
> -                    free(nic->backend_domname);
> -                    nic->backend_domname = strdup(p2 + 1);
> -                } else if (!strcmp(p, "rate")) {
> -                    parse_vif_rate(&config, (p2 + 1), nic);
> -                } else if (!strcmp(p, "accel")) {
> -                    fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
> -                } else if (!strcmp(p, "netdev")) {
> -                    fprintf(stderr, "the netdev parameter is deprecated, "
> -                                    "please use gatewaydev instead\n");
> -                    free(nic->gatewaydev);
> -                    nic->gatewaydev = strdup(p2 + 1);
> -                } else if (!strcmp(p, "gatewaydev")) {
> -                    free(nic->gatewaydev);
> -                    nic->gatewaydev = strdup(p2 + 1);
> -                }
> +                parse_nic_config(nic, &config, p);
>              } while ((p = strtok(NULL, ",")) != NULL);
>  skip_nic:
>              free(buf2);
> @@ -2115,17 +2125,6 @@ static int handle_domain_death(uint32_t *r_domid,
>      return restart;
>  }
>  
> -/* for now used only by main_networkattach, but can be reused elsewhere */
> -static int match_option_size(const char *prefix, size_t len,
> -        char *arg, char **argopt)
> -{
> -    int rc = strncmp(prefix, arg, len);
> -    if (!rc) *argopt = arg+len;
> -    return !rc;
> -}
> -#define MATCH_OPTION(prefix, arg, oparg) \
> -    match_option_size((prefix "="), sizeof((prefix)), (arg), &(oparg))
> -
>  /* Preserve a copy of a domain under a new name. Updates *r_domid */
>  static int preserve_domain(uint32_t *r_domid, libxl_event *event,
>                             libxl_domain_config *d_config)
> @@ -6138,10 +6137,6 @@ int main_networkattach(int argc, char **argv)
>      int opt;
>      libxl_device_nic nic;
>      XLU_Config *config = 0;
> -    char *endptr, *oparg;
> -    const char *tok;
> -    int i;
> -    unsigned int val;
>  
>      SWITCH_FOREACH_OPT(opt, "", NULL, "network-attach", 1) {
>          /* No options */
> @@ -6164,50 +6159,8 @@ int main_networkattach(int argc, char **argv)
>      set_default_nic_values(&nic);
>  
>      for (argv += optind+1, argc -= optind+1; argc > 0; ++argv, --argc) {
> -        if (MATCH_OPTION("type", *argv, oparg)) {
> -            if (!strcmp("vif", oparg)) {
> -                nic.nictype = LIBXL_NIC_TYPE_VIF;
> -            } else if (!strcmp("ioemu", oparg)) {
> -                nic.nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
> -            } else {
> -                fprintf(stderr, "Invalid parameter `type'.\n");
> -                return 1;
> -            }
> -        } else if (MATCH_OPTION("mac", *argv, oparg)) {
> -            tok = strtok(oparg, ":");
> -            for (i = 0; tok && i < 6; tok = strtok(NULL, ":"), ++i) {
> -                val = strtoul(tok, &endptr, 16);
> -                if ((tok == endptr) || (val > 255)) {
> -                    fprintf(stderr, "Invalid parameter `mac'.\n");
> -                    return 1;
> -                }
> -                nic.mac[i] = val;
> -            }
> -        } else if (MATCH_OPTION("bridge", *argv, oparg)) {
> -            replace_string(&nic.bridge, oparg);
> -        } else if (MATCH_OPTION("netdev", *argv, oparg)) {
> -            fprintf(stderr, "the netdev parameter is deprecated, "
> -                            "please use gatewaydev instead\n");
> -            replace_string(&nic.gatewaydev, oparg);
> -        } else if (MATCH_OPTION("gatewaydev", *argv, oparg)) {
> -            replace_string(&nic.gatewaydev, oparg);
> -        } else if (MATCH_OPTION("ip", *argv, oparg)) {
> -            replace_string(&nic.ip, oparg);
> -        } else if (MATCH_OPTION("script", *argv, oparg)) {
> -            replace_string(&nic.script, oparg);
> -        } else if (MATCH_OPTION("backend", *argv, oparg)) {
> -            replace_string(&nic.backend_domname, oparg);
> -        } else if (MATCH_OPTION("vifname", *argv, oparg)) {
> -            replace_string(&nic.ifname, oparg);
> -        } else if (MATCH_OPTION("model", *argv, oparg)) {
> -            replace_string(&nic.model, oparg);
> -        } else if (MATCH_OPTION("rate", *argv, oparg)) {
> -            parse_vif_rate(&config, oparg, &nic);
> -        } else if (MATCH_OPTION("accel", *argv, oparg)) {
> -        } else {
> -            fprintf(stderr, "unrecognized argument `%s'\n", *argv);
> +        if (parse_nic_config(&nic, &config, *argv))
>              return 1;
> -        }
>      }
>  
>      if (dryrun_only) {

  reply	other threads:[~2014-10-22 11:36 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-21 21:36 [OPW PATCH V4] tools: xl: refactor code to parse network device options Alexandra Sandulescu
2014-10-22 11:35 ` Ian Campbell [this message]
2014-10-22 20:21   ` Konrad Rzeszutek Wilk
2014-10-23  7:56     ` Ian Campbell
2014-10-23 20:08       ` Konrad Rzeszutek Wilk
2014-10-23 21:20         ` Ian Campbell
2014-10-23 23:08           ` Konrad Rzeszutek Wilk
2014-10-24  8:01             ` Ian Campbell
2014-10-24  8:58               ` Alexandra Sandulescu
2014-10-24  9:02                 ` Ian Campbell
2014-10-24  9:12                   ` Alexandra Sandulescu
2014-10-24  9:14                     ` Ian Campbell
2014-10-24  9:17                       ` Alexandra Sandulescu
2014-10-24 17:16                 ` Konrad Rzeszutek Wilk
2014-10-24 17:17               ` Konrad Rzeszutek Wilk
2014-10-28  8:54                 ` Alexandra Sandulescu
2014-10-24  9:32         ` Wei Liu
2015-01-12 17:58   ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1413977758.19198.12.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=alecsandra.sandulescu@gmail.com \
    --cc=konrad@darnok.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.