Skip to content

Commit

Permalink
net: sched: sch_red: Split init and change callbacks
Browse files Browse the repository at this point in the history
In the following patches, RED will get two qevents. The implementation will
be clearer if the callback for change is not a pure subset of the callback
for init. Split the two and promote attribute parsing to the callbacks
themselves from the common code, because it will be handy there.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Petr Machata authored and David S. Miller committed Jun 30, 2020
1 parent 3625750 commit 65545ea
Showing 1 changed file with 30 additions and 12 deletions.
42 changes: 30 additions & 12 deletions net/sched/sch_red.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,27 +215,18 @@ static const struct nla_policy red_policy[TCA_RED_MAX + 1] = {
[TCA_RED_FLAGS] = NLA_POLICY_BITFIELD32(TC_RED_SUPPORTED_FLAGS),
};

static int red_change(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
static int __red_change(struct Qdisc *sch, struct nlattr **tb,
struct netlink_ext_ack *extack)
{
struct Qdisc *old_child = NULL, *child = NULL;
struct red_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_RED_MAX + 1];
struct nla_bitfield32 flags_bf;
struct tc_red_qopt *ctl;
unsigned char userbits;
unsigned char flags;
int err;
u32 max_P;

if (opt == NULL)
return -EINVAL;

err = nla_parse_nested_deprecated(tb, TCA_RED_MAX, opt, red_policy,
NULL);
if (err < 0)
return err;

if (tb[TCA_RED_PARMS] == NULL ||
tb[TCA_RED_STAB] == NULL)
return -EINVAL;
Expand Down Expand Up @@ -323,11 +314,38 @@ static int red_init(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
{
struct red_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_RED_MAX + 1];
int err;

if (!opt)
return -EINVAL;

err = nla_parse_nested_deprecated(tb, TCA_RED_MAX, opt, red_policy,
extack);
if (err < 0)
return err;

q->qdisc = &noop_qdisc;
q->sch = sch;
timer_setup(&q->adapt_timer, red_adaptative_timer, 0);
return red_change(sch, opt, extack);
return __red_change(sch, tb, extack);
}

static int red_change(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
{
struct nlattr *tb[TCA_RED_MAX + 1];
int err;

if (!opt)
return -EINVAL;

err = nla_parse_nested_deprecated(tb, TCA_RED_MAX, opt, red_policy,
extack);
if (err < 0)
return err;

return __red_change(sch, tb, extack);
}

static int red_dump_offload_stats(struct Qdisc *sch)
Expand Down

0 comments on commit 65545ea

Please sign in to comment.