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

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

Advertisement

Kernel v2.6.25-rc7 /net/sched/cls_rsvp.h

Filename:/net/sched/cls_rsvp.h
Lines Added:33
Lines Deleted:36
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 

Location
[  2.6.25-rc7
  [  net
    [  sched
       o  cls_rsvp.h

Patch

diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
index 22f9ede..7034ea4 100644
--- a/net/sched/cls_rsvp.h
+++ b/net/sched/cls_rsvp.h
@@ -397,17 +397,26 @@ static u32 gen_tunnel(struct rsvp_head *data)
    return 0;
 }
 
+static const struct nla_policy rsvp_policy[TCA_RSVP_MAX + 1] = {
+   [TCA_RSVP_CLASSID]   = { .type = NLA_U32 },
+   [TCA_RSVP_DST]      = { .type = NLA_BINARY,
+                .len = RSVP_DST_LEN * sizeof(u32) },
+   [TCA_RSVP_SRC]      = { .type = NLA_BINARY,
+                .len = RSVP_DST_LEN * sizeof(u32) },
+   [TCA_RSVP_PINFO]   = { .len = sizeof(struct tc_rsvp_pinfo) },
+};
+
 static int rsvp_change(struct tcf_proto *tp, unsigned long base,
              u32 handle,
-             struct rtattr **tca,
+             struct nlattr **tca,
              unsigned long *arg)
 {
    struct rsvp_head *data = tp->root;
    struct rsvp_filter *f, **fp;
    struct rsvp_session *s, **sp;
    struct tc_rsvp_pinfo *pinfo = NULL;
-   struct rtattr *opt = tca[TCA_OPTIONS-1];
-   struct rtattr *tb[TCA_RSVP_MAX];
+   struct nlattr *opt = tca[TCA_OPTIONS-1];
+   struct nlattr *tb[TCA_RSVP_MAX + 1];
    struct tcf_exts e;
    unsigned h1, h2;
    __be32 *dst;
@@ -416,8 +425,9 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
    if (opt == NULL)
       return handle ? -EINVAL : 0;
 
-   if (rtattr_parse_nested(tb, TCA_RSVP_MAX, opt) < 0)
-      return -EINVAL;
+   err = nla_parse_nested(tb, TCA_RSVP_MAX, opt, rsvp_policy);
+   if (err < 0)
+      return err;
 
    err = tcf_exts_validate(tp, tb, tca[TCA_RATE-1], &e, &rsvp_ext_map);
    if (err < 0)
@@ -429,7 +439,7 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
       if (f->handle != handle && handle)
          goto errout2;
       if (tb[TCA_RSVP_CLASSID-1]) {
-         f->res.classid = *(u32*)RTA_DATA(tb[TCA_RSVP_CLASSID-1]);
+         f->res.classid = nla_get_u32(tb[TCA_RSVP_CLASSID-1]);
          tcf_bind_filter(tp, &f->res, base);
       }
 
@@ -451,31 +461,18 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
 
    h2 = 16;
    if (tb[TCA_RSVP_SRC-1]) {
-      err = -EINVAL;
-      if (RTA_PAYLOAD(tb[TCA_RSVP_SRC-1]) != sizeof(f->src))
-         goto errout;
-      memcpy(f->src, RTA_DATA(tb[TCA_RSVP_SRC-1]), sizeof(f->src));
+      memcpy(f->src, nla_data(tb[TCA_RSVP_SRC-1]), sizeof(f->src));
       h2 = hash_src(f->src);
    }
    if (tb[TCA_RSVP_PINFO-1]) {
-      err = -EINVAL;
-      if (RTA_PAYLOAD(tb[TCA_RSVP_PINFO-1]) < sizeof(struct tc_rsvp_pinfo))
-         goto errout;
-      pinfo = RTA_DATA(tb[TCA_RSVP_PINFO-1]);
+      pinfo = nla_data(tb[TCA_RSVP_PINFO-1]);
       f->spi = pinfo->spi;
       f->tunnelhdr = pinfo->tunnelhdr;
    }
-   if (tb[TCA_RSVP_CLASSID-1]) {
-      err = -EINVAL;
-      if (RTA_PAYLOAD(tb[TCA_RSVP_CLASSID-1]) != 4)
-         goto errout;
-      f->res.classid = *(u32*)RTA_DATA(tb[TCA_RSVP_CLASSID-1]);
-   }
+   if (tb[TCA_RSVP_CLASSID-1])
+      f->res.classid = nla_get_u32(tb[TCA_RSVP_CLASSID-1]);
 
-   err = -EINVAL;
-   if (RTA_PAYLOAD(tb[TCA_RSVP_DST-1]) != sizeof(f->src))
-      goto errout;
-   dst = RTA_DATA(tb[TCA_RSVP_DST-1]);
+   dst = nla_data(tb[TCA_RSVP_DST-1]);
    h1 = hash_dst(dst, pinfo ? pinfo->protocol : 0, pinfo ? pinfo->tunnelid : 0);
 
    err = -ENOMEM;
@@ -594,7 +591,7 @@ static int rsvp_dump(struct tcf_proto *tp, unsigned long fh,
    struct rsvp_filter *f = (struct rsvp_filter*)fh;
    struct rsvp_session *s;
    unsigned char *b = skb_tail_pointer(skb);
-   struct rtattr *rta;
+   struct nlattr *nest;
    struct tc_rsvp_pinfo pinfo;
 
    if (f == NULL)
@@ -603,33 +600,33 @@ static int rsvp_dump(struct tcf_proto *tp, unsigned long fh,
 
    t->tcm_handle = f->handle;
 
+   nest = nla_nest_start(skb, TCA_OPTIONS);
+   if (nest == NULL)
+      goto nla_put_failure;
 
-   rta = (struct rtattr*)b;
-   RTA_PUT(skb, TCA_OPTIONS, 0, NULL);
-
-   RTA_PUT(skb, TCA_RSVP_DST, sizeof(s->dst), &s->dst);
+   NLA_PUT(skb, TCA_RSVP_DST, sizeof(s->dst), &s->dst);
    pinfo.dpi = s->dpi;
    pinfo.spi = f->spi;
    pinfo.protocol = s->protocol;
    pinfo.tunnelid = s->tunnelid;
    pinfo.tunnelhdr = f->tunnelhdr;
    pinfo.pad = 0;
-   RTA_PUT(skb, TCA_RSVP_PINFO, sizeof(pinfo), &pinfo);
+   NLA_PUT(skb, TCA_RSVP_PINFO, sizeof(pinfo), &pinfo);
    if (f->res.classid)
-      RTA_PUT(skb, TCA_RSVP_CLASSID, 4, &f->res.classid);
+      NLA_PUT_U32(skb, TCA_RSVP_CLASSID, f->res.classid);
    if (((f->handle>>8)&0xFF) != 16)
-      RTA_PUT(skb, TCA_RSVP_SRC, sizeof(f->src), f->src);
+      NLA_PUT(skb, TCA_RSVP_SRC, sizeof(f->src), f->src);
 
    if (tcf_exts_dump(skb, &f->exts, &rsvp_ext_map) < 0)
-      goto rtattr_failure;
+      goto nla_put_failure;
 
-   rta->rta_len = skb_tail_pointer(skb) - b;
+   nla_nest_end(skb, nest);
 
    if (tcf_exts_dump_stats(skb, &f->exts, &rsvp_ext_map) < 0)
-      goto rtattr_failure;
+      goto nla_put_failure;
    return skb->len;
 
-rtattr_failure:
+nla_put_failure:
    nlmsg_trim(skb, b);
    return -1;
 }


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