Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25-rc7 /net/sched/sch_gred.c

Filename:/net/sched/sch_gred.c
Lines Added:48
Lines Deleted:29
Also changed in: (Previous) 2.6.25-rc6  2.6.25-rc5  2.6.25-rc4  2.6.25-rc3  2.6.25-rc2  2.6.25-rc1 
(Following) 2.6.25-rc8  2.6.25-rc9  2.6.25  2.6.26-rc5  2.6.26-rc6  2.6.26-rc7 

Location
[  2.6.25-rc7
  [  net
    [  sched
       o  sch_gred.c

Patch

diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
index 3cc6dda..3a9d226 100644
--- a/net/sched/sch_gred.c
+++ b/net/sched/sch_gred.c
@@ -350,16 +350,16 @@ static inline void gred_destroy_vq(struct gred_sched_data *q)
    kfree(q);
 }
 
-static inline int gred_change_table_def(struct Qdisc *sch, struct rtattr *dps)
+static inline int gred_change_table_def(struct Qdisc *sch, struct nlattr *dps)
 {
    struct gred_sched *table = qdisc_priv(sch);
    struct tc_gred_sopt *sopt;
    int i;
 
-   if (dps == NULL || RTA_PAYLOAD(dps) < sizeof(*sopt))
+   if (dps == NULL)
       return -EINVAL;
 
-   sopt = RTA_DATA(dps);
+   sopt = nla_data(dps);
 
    if (sopt->DPs > MAX_DPs || sopt->DPs == 0 || sopt->def_DP >= sopt->DPs)
       return -EINVAL;
@@ -425,28 +425,37 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp,
    return 0;
 }
 
-static int gred_change(struct Qdisc *sch, struct rtattr *opt)
+static const struct nla_policy gred_policy[TCA_GRED_MAX + 1] = {
+   [TCA_GRED_PARMS]   = { .len = sizeof(struct tc_gred_qopt) },
+   [TCA_GRED_STAB]      = { .len = 256 },
+   [TCA_GRED_DPS]      = { .len = sizeof(struct tc_gred_sopt) },
+};
+
+static int gred_change(struct Qdisc *sch, struct nlattr *opt)
 {
    struct gred_sched *table = qdisc_priv(sch);
    struct tc_gred_qopt *ctl;
-   struct rtattr *tb[TCA_GRED_MAX];
-   int err = -EINVAL, prio = GRED_DEF_PRIO;
+   struct nlattr *tb[TCA_GRED_MAX + 1];
+   int err, prio = GRED_DEF_PRIO;
    u8 *stab;
 
-   if (opt == NULL || rtattr_parse_nested(tb, TCA_GRED_MAX, opt))
+   if (opt == NULL)
       return -EINVAL;
 
-   if (tb[TCA_GRED_PARMS-1] == NULL && tb[TCA_GRED_STAB-1] == NULL)
+   err = nla_parse_nested(tb, TCA_GRED_MAX, opt, gred_policy);
+   if (err < 0)
+      return err;
+
+   if (tb[TCA_GRED_PARMS] == NULL && tb[TCA_GRED_STAB] == NULL)
       return gred_change_table_def(sch, opt);
 
-   if (tb[TCA_GRED_PARMS-1] == NULL ||
-       RTA_PAYLOAD(tb[TCA_GRED_PARMS-1]) < sizeof(*ctl) ||
-       tb[TCA_GRED_STAB-1] == NULL ||
-       RTA_PAYLOAD(tb[TCA_GRED_STAB-1]) < 256)
+   if (tb[TCA_GRED_PARMS] == NULL ||
+       tb[TCA_GRED_STAB] == NULL)
       return -EINVAL;
 
-   ctl = RTA_DATA(tb[TCA_GRED_PARMS-1]);
-   stab = RTA_DATA(tb[TCA_GRED_STAB-1]);
+   err = -EINVAL;
+   ctl = nla_data(tb[TCA_GRED_PARMS]);
+   stab = nla_data(tb[TCA_GRED_STAB]);
 
    if (ctl->DP >= table->DPs)
       goto errout;
@@ -486,23 +495,28 @@ errout:
    return err;
 }
 
-static int gred_init(struct Qdisc *sch, struct rtattr *opt)
+static int gred_init(struct Qdisc *sch, struct nlattr *opt)
 {
-   struct rtattr *tb[TCA_GRED_MAX];
+   struct nlattr *tb[TCA_GRED_MAX + 1];
+   int err;
 
-   if (opt == NULL || rtattr_parse_nested(tb, TCA_GRED_MAX, opt))
+   if (opt == NULL)
       return -EINVAL;
 
-   if (tb[TCA_GRED_PARMS-1] || tb[TCA_GRED_STAB-1])
+   err = nla_parse_nested(tb, TCA_GRED_MAX, opt, gred_policy);
+   if (err < 0)
+      return err;
+
+   if (tb[TCA_GRED_PARMS] || tb[TCA_GRED_STAB])
       return -EINVAL;
 
-   return gred_change_table_def(sch, tb[TCA_GRED_DPS-1]);
+   return gred_change_table_def(sch, tb[TCA_GRED_DPS]);
 }
 
 static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
    struct gred_sched *table = qdisc_priv(sch);
-   struct rtattr *parms, *opts = NULL;
+   struct nlattr *parms, *opts = NULL;
    int i;
    struct tc_gred_sopt sopt = {
       .DPs   = table->DPs,
@@ -511,9 +525,13 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
       .flags   = table->red_flags,
    };
 
-   opts = RTA_NEST(skb, TCA_OPTIONS);
-   RTA_PUT(skb, TCA_GRED_DPS, sizeof(sopt), &sopt);
-   parms = RTA_NEST(skb, TCA_GRED_PARMS);
+   opts = nla_nest_start(skb, TCA_OPTIONS);
+   if (opts == NULL)
+      goto nla_put_failure;
+   NLA_PUT(skb, TCA_GRED_DPS, sizeof(sopt), &sopt);
+   parms = nla_nest_start(skb, TCA_GRED_PARMS);
+   if (parms == NULL)
+      goto nla_put_failure;
 
    for (i = 0; i < MAX_DPs; i++) {
       struct gred_sched_data *q = table->tab[i];
@@ -555,15 +573,16 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
       opt.qave = red_calc_qavg(&q->parms, q->parms.qavg);
 
 append_opt:
-      RTA_APPEND(skb, sizeof(opt), &opt);
+      if (nla_append(skb, sizeof(opt), &opt) < 0)
+         goto nla_put_failure;
    }
 
-   RTA_NEST_END(skb, parms);
+   nla_nest_end(skb, parms);
 
-   return RTA_NEST_END(skb, opts);
+   return nla_nest_end(skb, opts);
 
-rtattr_failure:
-   return RTA_NEST_CANCEL(skb, opts);
+nla_put_failure:
+   return nla_nest_cancel(skb, opts);
 }
 
 static void gred_destroy(struct Qdisc *sch)
@@ -577,7 +596,7 @@ static void gred_destroy(struct Qdisc *sch)
    }
 }
 
-static struct Qdisc_ops gred_qdisc_ops = {
+static struct Qdisc_ops gred_qdisc_ops __read_mostly = {
    .id      =   "gred",
    .priv_size   =   sizeof(struct gred_sched),
    .enqueue   =   gred_enqueue,


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.