Skip to content

Commit e9bc3fa

Browse files
Alexander Aringdavem330
authored andcommitted
net: sch: api: add extack support in qdisc_get_rtab
This patch adds extack support for the function qdisc_get_rtab which is a common used function in the tc subsystem. Callers which are interested in the receiving error can assign extack to get a more detailed information why qdisc_get_rtab failed. Cc: David Ahern <[email protected]> Acked-by: Jamal Hadi Salim <[email protected]> Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 653d6fd commit e9bc3fa

File tree

6 files changed

+23
-12
lines changed

6 files changed

+23
-12
lines changed

include/net/pkt_sched.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ void qdisc_hash_del(struct Qdisc *q);
101101
struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
102102
struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);
103103
struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
104-
struct nlattr *tab);
104+
struct nlattr *tab,
105+
struct netlink_ext_ack *extack);
105106
void qdisc_put_rtab(struct qdisc_rate_table *tab);
106107
void qdisc_put_stab(struct qdisc_size_table *tab);
107108
void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);

net/sched/act_police.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,13 @@ static int tcf_act_police_init(struct net *net, struct nlattr *nla,
118118
police = to_police(*a);
119119
if (parm->rate.rate) {
120120
err = -ENOMEM;
121-
R_tab = qdisc_get_rtab(&parm->rate, tb[TCA_POLICE_RATE]);
121+
R_tab = qdisc_get_rtab(&parm->rate, tb[TCA_POLICE_RATE], NULL);
122122
if (R_tab == NULL)
123123
goto failure;
124124

125125
if (parm->peakrate.rate) {
126126
P_tab = qdisc_get_rtab(&parm->peakrate,
127-
tb[TCA_POLICE_PEAKRATE]);
127+
tb[TCA_POLICE_PEAKRATE], NULL);
128128
if (P_tab == NULL)
129129
goto failure;
130130
}

net/sched/sch_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,13 +393,16 @@ static __u8 __detect_linklayer(struct tc_ratespec *r, __u32 *rtab)
393393
static struct qdisc_rate_table *qdisc_rtab_list;
394394

395395
struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
396-
struct nlattr *tab)
396+
struct nlattr *tab,
397+
struct netlink_ext_ack *extack)
397398
{
398399
struct qdisc_rate_table *rtab;
399400

400401
if (tab == NULL || r->rate == 0 || r->cell_log == 0 ||
401-
nla_len(tab) != TC_RTAB_SIZE)
402+
nla_len(tab) != TC_RTAB_SIZE) {
403+
NL_SET_ERR_MSG(extack, "Invalid rate table parameters for searching");
402404
return NULL;
405+
}
403406

404407
for (rtab = qdisc_rtab_list; rtab; rtab = rtab->next) {
405408
if (!memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) &&
@@ -418,6 +421,8 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
418421
r->linklayer = __detect_linklayer(r, rtab->data);
419422
rtab->next = qdisc_rtab_list;
420423
qdisc_rtab_list = rtab;
424+
} else {
425+
NL_SET_ERR_MSG(extack, "Failed to allocate new qdisc rate table");
421426
}
422427
return rtab;
423428
}

net/sched/sch_cbq.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,7 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt,
11561156

11571157
r = nla_data(tb[TCA_CBQ_RATE]);
11581158

1159-
q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB]);
1159+
q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB], extack);
11601160
if (!q->link.R_tab)
11611161
return -EINVAL;
11621162

@@ -1484,7 +1484,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t
14841484

14851485
if (tb[TCA_CBQ_RATE]) {
14861486
rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]),
1487-
tb[TCA_CBQ_RTAB]);
1487+
tb[TCA_CBQ_RTAB], extack);
14881488
if (rtab == NULL)
14891489
return -EINVAL;
14901490
}
@@ -1537,7 +1537,8 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t
15371537
if (!tb[TCA_CBQ_WRROPT] || !tb[TCA_CBQ_RATE] || !tb[TCA_CBQ_LSSOPT])
15381538
return -EINVAL;
15391539

1540-
rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]);
1540+
rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB],
1541+
extack);
15411542
if (rtab == NULL)
15421543
return -EINVAL;
15431544

net/sched/sch_htb.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,10 +1357,12 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,
13571357

13581358
/* Keeping backward compatible with rate_table based iproute2 tc */
13591359
if (hopt->rate.linklayer == TC_LINKLAYER_UNAWARE)
1360-
qdisc_put_rtab(qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB]));
1360+
qdisc_put_rtab(qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB],
1361+
NULL));
13611362

13621363
if (hopt->ceil.linklayer == TC_LINKLAYER_UNAWARE)
1363-
qdisc_put_rtab(qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB]));
1364+
qdisc_put_rtab(qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB],
1365+
NULL));
13641366

13651367
if (!cl) { /* new class */
13661368
struct Qdisc *new_q;

net/sched/sch_tbf.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,11 +327,13 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt,
327327
qopt = nla_data(tb[TCA_TBF_PARMS]);
328328
if (qopt->rate.linklayer == TC_LINKLAYER_UNAWARE)
329329
qdisc_put_rtab(qdisc_get_rtab(&qopt->rate,
330-
tb[TCA_TBF_RTAB]));
330+
tb[TCA_TBF_RTAB],
331+
NULL));
331332

332333
if (qopt->peakrate.linklayer == TC_LINKLAYER_UNAWARE)
333334
qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate,
334-
tb[TCA_TBF_PTAB]));
335+
tb[TCA_TBF_PTAB],
336+
NULL));
335337

336338
buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U);
337339
mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U);

0 commit comments

Comments
 (0)