From patchwork Wed Dec 20 17:35:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Aring X-Patchwork-Id: 851574 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=mojatatu-com.20150623.gappssmtp.com header.i=@mojatatu-com.20150623.gappssmtp.com header.b="KBesao2h"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z224n1qH1z9s72 for ; Thu, 21 Dec 2017 04:36:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755949AbdLTRgW (ORCPT ); Wed, 20 Dec 2017 12:36:22 -0500 Received: from mail-it0-f68.google.com ([209.85.214.68]:46273 "EHLO mail-it0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755823AbdLTRfv (ORCPT ); Wed, 20 Dec 2017 12:35:51 -0500 Received: by mail-it0-f68.google.com with SMTP id t1so7601797ite.5 for ; Wed, 20 Dec 2017 09:35:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mojatatu-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=feu5lZ0KyDfSn4Qozj9bUMhZ9rE32Gs7CIsUxgi+rdA=; b=KBesao2hOn3zVAkRnPUaTQCpV5GDAlhtL5/1c0PLyJUKntnsrw8TAJfHdNCGbVN6ft VkNpH7iqYc8elk1d+sw9hvDjN4fuUE16bScaIvCfxza3MWXkz0s3IKgb2nP/rD3s0hb2 7bVNP/9XZ7aybRdIed7liYuJOZiFGEW9d5bIpfevKDtBdSzz9lO9Rh3oXbagXcLwKICO c6V5N5/5EZOXFVtxbQwKupWYtLuWhDwUDjv03SuSvwSedoDgXjVc56zRG/GL5DVq7Plq wixZePU8u1rLivtmPGM3+pAC6az1YNATFlO+/U0NCmviKEoOkPFYbb+N9UZh5xJkA6R+ 05Xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=feu5lZ0KyDfSn4Qozj9bUMhZ9rE32Gs7CIsUxgi+rdA=; b=HGF/wWs98wU52ApE41AjV4IdntZBJfuIxQgQPXqh2q88vGdDe3jM/Cv5i3Ama9iAf8 yjN/w2qDhhkuGTrE78xrYR3e5xpeNMYwR3+JNB8lmmLlWkvRxcwCKFTkXcqwiFj98Skx yFhJMJX2GyzNqzW6abG1Q1tIODQKQ1xCSFs2Z2Tw8rk/kuhnd/N1yEfApLRgoiJ4QQyn atHyS3H+kHDuk4FHEBddS4y8B8u08fAIIJX1sv09V4GVjpUz/aWOTR8RIJA235BoKjgf kWtNUJkuGhEoY7tEhqUH4YUrCUahwxV4p4akuB561++oZ7YsUUEnpaFvCT1ykRa87krK hCEA== X-Gm-Message-State: AKGB3mKQulVSKfiHnzsTPUmBwBT8v78gtJeskn0FheJeZHDouex1eUDG pYjsR6fjawlSpEdtKB+gGk8m3A== X-Google-Smtp-Source: ACJfBovJ6iJBC4ve8ucn1EPvD1StJdZPmXAKJJvK7UmRUDyGMgkYXYQJeITDXmbvzYWwbZ8qIFnuvA== X-Received: by 10.36.70.195 with SMTP id j186mr9092124itb.32.1513791351060; Wed, 20 Dec 2017 09:35:51 -0800 (PST) Received: from x220t.lan ([64.26.149.125]) by smtp.gmail.com with ESMTPSA id w75sm9687740iod.66.2017.12.20.09.35.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Dec 2017 09:35:50 -0800 (PST) From: Alexander Aring To: jhs@mojatatu.com Cc: xiyou.wangcong@gmail.com, jiri@resnulli.us, davem@davemloft.net, netdev@vger.kernel.org, kernel@mojatatu.com, Alexander Aring , David Ahern Subject: [PATCHv4 net-next 12/14] net: sch: sch_cbq: add extack support Date: Wed, 20 Dec 2017 12:35:22 -0500 Message-Id: <20171220173524.25874-13-aring@mojatatu.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171220173524.25874-1-aring@mojatatu.com> References: <20171220173524.25874-1-aring@mojatatu.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds extack support for the cbq qdisc implementation by adding NL_SET_ERR_MSG in validation of user input. Also it serves to illustrate a use case of how the infrastructure ops api changes are to be used by individual qdiscs. Cc: David Ahern Acked-by: Jamal Hadi Salim Signed-off-by: Alexander Aring --- net/sched/sch_cbq.c | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index efe5bf15b031..f42025d53cfe 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -1144,15 +1144,19 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt, hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); q->delay_timer.function = cbq_undelay; - if (!opt) + if (!opt) { + NL_SET_ERR_MSG(extack, "CBQ options are required for this operation"); return -EINVAL; + } - err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, NULL); + err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, extack); if (err < 0) return err; - if (!tb[TCA_CBQ_RTAB] || !tb[TCA_CBQ_RATE]) + if (!tb[TCA_CBQ_RTAB] || !tb[TCA_CBQ_RATE]) { + NL_SET_ERR_MSG(extack, "Rate specification missing or incomplete"); return -EINVAL; + } r = nla_data(tb[TCA_CBQ_RATE]); @@ -1462,24 +1466,32 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t struct cbq_class *parent; struct qdisc_rate_table *rtab = NULL; - if (!opt) + if (!opt) { + NL_SET_ERR_MSG(extack, "Mandatory qdisc options missing"); return -EINVAL; + } - err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, NULL); + err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, extack); if (err < 0) return err; - if (tb[TCA_CBQ_OVL_STRATEGY] || tb[TCA_CBQ_POLICE]) + if (tb[TCA_CBQ_OVL_STRATEGY] || tb[TCA_CBQ_POLICE]) { + NL_SET_ERR_MSG(extack, "Neither overlimit strategy nor policing attributes can be used for changing class params"); return -EOPNOTSUPP; + } if (cl) { /* Check parent */ if (parentid) { if (cl->tparent && - cl->tparent->common.classid != parentid) + cl->tparent->common.classid != parentid) { + NL_SET_ERR_MSG(extack, "Invalid parent id"); return -EINVAL; - if (!cl->tparent && parentid != TC_H_ROOT) + } + if (!cl->tparent && parentid != TC_H_ROOT) { + NL_SET_ERR_MSG(extack, "Parent must be root"); return -EINVAL; + } } if (tb[TCA_CBQ_RATE]) { @@ -1496,6 +1508,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t qdisc_root_sleeping_running(sch), tca[TCA_RATE]); if (err) { + NL_SET_ERR_MSG(extack, "Failed to replace specified rate estimator"); qdisc_put_rtab(rtab); return err; } @@ -1534,8 +1547,10 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t if (parentid == TC_H_ROOT) return -EINVAL; - if (!tb[TCA_CBQ_WRROPT] || !tb[TCA_CBQ_RATE] || !tb[TCA_CBQ_LSSOPT]) + if (!tb[TCA_CBQ_WRROPT] || !tb[TCA_CBQ_RATE] || !tb[TCA_CBQ_LSSOPT]) { + NL_SET_ERR_MSG(extack, "One of the following attributes MUST be specified: WRR, rate or link sharing"); return -EINVAL; + } rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB], extack); @@ -1545,8 +1560,10 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t if (classid) { err = -EINVAL; if (TC_H_MAJ(classid ^ sch->handle) || - cbq_class_lookup(q, classid)) + cbq_class_lookup(q, classid)) { + NL_SET_ERR_MSG(extack, "Specified class not found"); goto failure; + } } else { int i; classid = TC_H_MAKE(sch->handle, 0x8000); @@ -1558,8 +1575,10 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t break; } err = -ENOSR; - if (i >= 0x8000) + if (i >= 0x8000) { + NL_SET_ERR_MSG(extack, "Unable to generate classid"); goto failure; + } classid = classid|q->hgenerator; } @@ -1567,8 +1586,10 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t if (parentid) { parent = cbq_class_lookup(q, parentid); err = -EINVAL; - if (!parent) + if (!parent) { + NL_SET_ERR_MSG(extack, "Failed to find parentid"); goto failure; + } } err = -ENOBUFS; @@ -1588,6 +1609,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t qdisc_root_sleeping_running(sch), tca[TCA_RATE]); if (err) { + NL_SET_ERR_MSG(extack, "Couldn't create new estimator"); tcf_block_put(cl->block); kfree(cl); goto failure;