From patchwork Fri Apr 15 07:51:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 610787 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qmVBZ1v91z9sD3 for ; Fri, 15 Apr 2016 17:52:38 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b=TragCgVL; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752831AbcDOHwc (ORCPT ); Fri, 15 Apr 2016 03:52:32 -0400 Received: from mail-wm0-f50.google.com ([74.125.82.50]:37957 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752620AbcDOHwG (ORCPT ); Fri, 15 Apr 2016 03:52:06 -0400 Received: by mail-wm0-f50.google.com with SMTP id u206so20030693wme.1 for ; Fri, 15 Apr 2016 00:52:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=db7ThDG+ws0ujmbWv8OYk/9ZdEt9t7J0KgMrgyHRNrs=; b=TragCgVLfCofXYJjLXVrOeGf9UkKtI4QsxGaPrc55QFzSKxGlSlSNCIZ2+WgxMTdF7 O7n7kvUOBXFpEydzcdKwTN2TYpOjMh2HRh+uTXHjUpK5nAul5ILymjCNb+8FK9+6fMOh 9saiH49rohEsBm5d4IuCxbCrhYieaBP7i3qVVJMm/PY+IzUh4edvFUsZ0jXws8YUYlZX AoNIJxgGXcVaa+GbHn9yMGNjbT8aw5PbXeDUMgpI8OW5fqREj8JGDqbsrBWa6jKdDlYe fzstXIx0THWqUbEO7oF4cMWdpVxvE0G8ySDXMG9uapLnu5CCCpzmq2rABuDb5bESRlDg CRnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=db7ThDG+ws0ujmbWv8OYk/9ZdEt9t7J0KgMrgyHRNrs=; b=GOYkGRgHvNsWqLz8dzx2WZZoqXPy7P/rmLtNihNn6kK4wapKzYIaoZmWpYMjpWeS/F SdpM/hGaN5kSLb06FYfZPhGNKYppFsZ+s9eojpdL/ZrnbvDpOLBC7xwSz16PWcDBUy/D juEKW+wABMhNqHu/uAUwwV4oAdyYzkRF+t2Ix0wcsYjMB+uGaJFQ5DLRunXTpI6k0XB0 bsqSE2/opHxfqiuDsGDAx3szUnGd4NK/tXQLbb3ThGKhketzIMcA9OfAYPyej6hRdros 4jhd3XRo00IhWhUVF+sY5hsPLqtW0IDoqQfke4UQSD/bx4AMotSS0sVFhz0HjvKJ9dGx wUYg== X-Gm-Message-State: AOPr4FVE4Ac2TFOqhPNZUHYTswtsXcGDXzcdUPiC0L1hzTBg2ZfThSZZwhMEOJ/8wFt6Jg== X-Received: by 10.28.228.68 with SMTP id b65mr2757250wmh.47.1460706725056; Fri, 15 Apr 2016 00:52:05 -0700 (PDT) Received: from localhost (jirka.pirko.cz. [84.16.102.26]) by smtp.gmail.com with ESMTPSA id m67sm37038468wma.3.2016.04.15.00.52.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Apr 2016 00:52:04 -0700 (PDT) From: Jiri Pirko To: netdev@vger.kernel.org Cc: stephen@networkplumber.org, davem@davemloft.net, idosch@mellanox.com, eladr@mellanox.com, yotamg@mellanox.com, ogerlitz@mellanox.com, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com, jhs@mojatatu.com, john.fastabend@gmail.com, rami.rosen@intel.com, gospo@cumulusnetworks.com, sfeldma@gmail.com Subject: [patch iproute2 08/11] devlink: allow to parse both devlink and port handle in the same time Date: Fri, 15 Apr 2016 09:51:50 +0200 Message-Id: <1460706713-5942-9-git-send-email-jiri@resnulli.us> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1460706713-5942-1-git-send-email-jiri@resnulli.us> References: <1460706713-5942-1-git-send-email-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko For filtering purposes, it makes sense for used to either specify devlink handle of port handle. Signed-off-by: Jiri Pirko --- devlink/devlink.c | 109 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index d436bbf..e2e0413 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -363,6 +363,12 @@ static int strtouint32_t(const char *str, uint32_t *p_val) return 0; } +static int __dl_argv_handle(char *str, char **p_bus_name, char **p_dev_name) +{ + strslashrsplit(str, p_bus_name, p_dev_name); + return 0; +} + static int dl_argv_handle(struct dl *dl, char **p_bus_name, char **p_dev_name) { char *str = dl_argv_next(dl); @@ -376,8 +382,40 @@ static int dl_argv_handle(struct dl *dl, char **p_bus_name, char **p_dev_name) pr_err("Expected \"bus_name/dev_name\".\n"); return -EINVAL; } + return __dl_argv_handle(str, p_bus_name, p_dev_name); +} - strslashrsplit(str, p_bus_name, p_dev_name); +static int __dl_argv_handle_port(char *str, + char **p_bus_name, char **p_dev_name, + uint32_t *p_port_index) +{ + char *handlestr = handlestr; + char *portstr = portstr; + int err; + + strslashrsplit(str, &handlestr, &portstr); + err = strtouint32_t(portstr, p_port_index); + if (err) { + pr_err("Port index \"%s\" is not a number or not within range\n", + portstr); + return err; + } + strslashrsplit(handlestr, p_bus_name, p_dev_name); + return 0; +} + +static int __dl_argv_handle_port_ifname(struct dl *dl, char *str, + char **p_bus_name, char **p_dev_name, + uint32_t *p_port_index) +{ + int err; + + err = ifname_map_lookup(dl, str, p_bus_name, p_dev_name, + p_port_index); + if (err) { + pr_err("Netdevice \"%s\" not found\n", str); + return err; + } return 0; } @@ -386,7 +424,6 @@ static int dl_argv_handle_port(struct dl *dl, char **p_bus_name, { char *str = dl_argv_next(dl); unsigned int slash_count; - int err; if (!str) { pr_err("Port identification (\"bus_name/dev_name/port_index\" or \"netdev ifname\") expected.\n"); @@ -398,26 +435,52 @@ static int dl_argv_handle_port(struct dl *dl, char **p_bus_name, pr_err("Expected \"bus_name/dev_name/port_index\" or \"netdev_ifname\".\n"); return -EINVAL; } - if (slash_count == 2) { - char *handlestr = handlestr; - char *portstr = portstr; - - err = strslashrsplit(str, &handlestr, &portstr); - err = strtouint32_t(portstr, p_port_index); - if (err) { - pr_err("Port index \"%s\" is not a number or not within range\n", - portstr); + return __dl_argv_handle_port(str, p_bus_name, + p_dev_name, p_port_index); + } else if (slash_count == 0) { + return __dl_argv_handle_port_ifname(dl, str, p_bus_name, + p_dev_name, p_port_index); + } + return 0; +} + +static int dl_argv_handle_both(struct dl *dl, char **p_bus_name, + char **p_dev_name, uint32_t *p_port_index, + uint32_t *p_handle_bit) +{ + char *str = dl_argv_next(dl); + unsigned int slash_count; + int err; + + if (!str) { + pr_err("One of following identifications expected:\n" + "Devlink identification (\"bus_name/dev_name\")\n" + "Port identification (\"bus_name/dev_name/port_index\" or \"netdev ifname\")\n"); + return -EINVAL; + } + slash_count = strslashcount(str); + if (slash_count == 1) { + err = __dl_argv_handle(str, p_bus_name, p_dev_name); + if (err) return err; - } - strslashrsplit(handlestr, p_bus_name, p_dev_name); + *p_handle_bit = DL_OPT_HANDLE; + } else if (slash_count == 2) { + err = __dl_argv_handle_port(str, p_bus_name, + p_dev_name, p_port_index); + if (err) + return err; + *p_handle_bit = DL_OPT_HANDLEP; } else if (slash_count == 0) { - err = ifname_map_lookup(dl, str, p_bus_name, p_dev_name, - p_port_index); - if (err) { - pr_err("Netdevice \"%s\" not found\n", str); + err = __dl_argv_handle_port_ifname(dl, str, p_bus_name, + p_dev_name, p_port_index); + if (err) return err; - } + *p_handle_bit = DL_OPT_HANDLEP; + } else { + pr_err("Wrong port identification string format.\n"); + pr_err("Expected \"bus_name/dev_name\" or \"bus_name/dev_name/port_index\" or \"netdev_ifname\".\n"); + return -EINVAL; } return 0; } @@ -475,7 +538,15 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, uint32_t o_found = 0; int err; - if (o_required & DL_OPT_HANDLE) { + if (o_required & DL_OPT_HANDLE && o_required & DL_OPT_HANDLEP) { + uint32_t handle_bit = handle_bit; + + err = dl_argv_handle_both(dl, &opts->bus_name, &opts->dev_name, + &opts->port_index, &handle_bit); + if (err) + return err; + o_found |= handle_bit; + } else if (o_required & DL_OPT_HANDLE) { err = dl_argv_handle(dl, &opts->bus_name, &opts->dev_name); if (err) return err;