aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-01-23 01:11:33 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:11:11 -0500
commitadd93b610a4e66d36d0cf0b2596c3d3bcfdaee39 (patch)
tree073873879eb3b87981ee015f0f1ca48da8f1c696 /net/sched
parent1e90474c377e92db7262a8968a45c1dd980ca9e5 (diff)
[NET_SCHED]: Convert classifiers from rtnetlink to new netlink API
Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r--net/sched/cls_api.c65
-rw-r--r--net/sched/cls_basic.c40
-rw-r--r--net/sched/cls_fw.c54
-rw-r--r--net/sched/cls_route.c70
-rw-r--r--net/sched/cls_rsvp.h48
-rw-r--r--net/sched/cls_tcindex.c66
-rw-r--r--net/sched/cls_u32.c78
-rw-r--r--net/sched/em_meta.c56
-rw-r--r--net/sched/em_text.c9
-rw-r--r--net/sched/ematch.c74
10 files changed, 284 insertions, 276 deletions
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 9eeb3c6c82f4..87be2b2fc29a 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -38,14 +38,14 @@ static DEFINE_RWLOCK(cls_mod_lock);
38 38
39/* Find classifier type by string name */ 39/* Find classifier type by string name */
40 40
41static struct tcf_proto_ops *tcf_proto_lookup_ops(struct rtattr *kind) 41static struct tcf_proto_ops *tcf_proto_lookup_ops(struct nlattr *kind)
42{ 42{
43 struct tcf_proto_ops *t = NULL; 43 struct tcf_proto_ops *t = NULL;
44 44
45 if (kind) { 45 if (kind) {
46 read_lock(&cls_mod_lock); 46 read_lock(&cls_mod_lock);
47 for (t = tcf_proto_base; t; t = t->next) { 47 for (t = tcf_proto_base; t; t = t->next) {
48 if (rtattr_strcmp(kind, t->kind) == 0) { 48 if (nla_strcmp(kind, t->kind) == 0) {
49 if (!try_module_get(t->owner)) 49 if (!try_module_get(t->owner))
50 t = NULL; 50 t = NULL;
51 break; 51 break;
@@ -118,7 +118,7 @@ static inline u32 tcf_auto_prio(struct tcf_proto *tp)
118static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg) 118static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
119{ 119{
120 struct net *net = skb->sk->sk_net; 120 struct net *net = skb->sk->sk_net;
121 struct rtattr **tca; 121 struct nlattr *tca[TCA_MAX + 1];
122 struct tcmsg *t; 122 struct tcmsg *t;
123 u32 protocol; 123 u32 protocol;
124 u32 prio; 124 u32 prio;
@@ -138,7 +138,6 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
138 return -EINVAL; 138 return -EINVAL;
139 139
140replay: 140replay:
141 tca = arg;
142 t = NLMSG_DATA(n); 141 t = NLMSG_DATA(n);
143 protocol = TC_H_MIN(t->tcm_info); 142 protocol = TC_H_MIN(t->tcm_info);
144 prio = TC_H_MAJ(t->tcm_info); 143 prio = TC_H_MAJ(t->tcm_info);
@@ -160,6 +159,10 @@ replay:
160 if (dev == NULL) 159 if (dev == NULL)
161 return -ENODEV; 160 return -ENODEV;
162 161
162 err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL);
163 if (err < 0)
164 return err;
165
163 /* Find qdisc */ 166 /* Find qdisc */
164 if (!parent) { 167 if (!parent) {
165 q = dev->qdisc_sleeping; 168 q = dev->qdisc_sleeping;
@@ -202,7 +205,7 @@ replay:
202 if (tp == NULL) { 205 if (tp == NULL) {
203 /* Proto-tcf does not exist, create new one */ 206 /* Proto-tcf does not exist, create new one */
204 207
205 if (tca[TCA_KIND-1] == NULL || !protocol) 208 if (tca[TCA_KIND] == NULL || !protocol)
206 goto errout; 209 goto errout;
207 210
208 err = -ENOENT; 211 err = -ENOENT;
@@ -217,14 +220,14 @@ replay:
217 if (tp == NULL) 220 if (tp == NULL)
218 goto errout; 221 goto errout;
219 err = -EINVAL; 222 err = -EINVAL;
220 tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND-1]); 223 tp_ops = tcf_proto_lookup_ops(tca[TCA_KIND]);
221 if (tp_ops == NULL) { 224 if (tp_ops == NULL) {
222#ifdef CONFIG_KMOD 225#ifdef CONFIG_KMOD
223 struct rtattr *kind = tca[TCA_KIND-1]; 226 struct nlattr *kind = tca[TCA_KIND];
224 char name[IFNAMSIZ]; 227 char name[IFNAMSIZ];
225 228
226 if (kind != NULL && 229 if (kind != NULL &&
227 rtattr_strlcpy(name, kind, IFNAMSIZ) < IFNAMSIZ) { 230 nla_strlcpy(name, kind, IFNAMSIZ) < IFNAMSIZ) {
228 rtnl_unlock(); 231 rtnl_unlock();
229 request_module("cls_%s", name); 232 request_module("cls_%s", name);
230 rtnl_lock(); 233 rtnl_lock();
@@ -263,7 +266,7 @@ replay:
263 *back = tp; 266 *back = tp;
264 qdisc_unlock_tree(dev); 267 qdisc_unlock_tree(dev);
265 268
266 } else if (tca[TCA_KIND-1] && rtattr_strcmp(tca[TCA_KIND-1], tp->ops->kind)) 269 } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind))
267 goto errout; 270 goto errout;
268 271
269 fh = tp->ops->get(tp, t->tcm_handle); 272 fh = tp->ops->get(tp, t->tcm_handle);
@@ -333,18 +336,18 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp,
333 tcm->tcm_ifindex = tp->q->dev->ifindex; 336 tcm->tcm_ifindex = tp->q->dev->ifindex;
334 tcm->tcm_parent = tp->classid; 337 tcm->tcm_parent = tp->classid;
335 tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); 338 tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol);
336 RTA_PUT(skb, TCA_KIND, IFNAMSIZ, tp->ops->kind); 339 NLA_PUT(skb, TCA_KIND, IFNAMSIZ, tp->ops->kind);
337 tcm->tcm_handle = fh; 340 tcm->tcm_handle = fh;
338 if (RTM_DELTFILTER != event) { 341 if (RTM_DELTFILTER != event) {
339 tcm->tcm_handle = 0; 342 tcm->tcm_handle = 0;
340 if (tp->ops->dump && tp->ops->dump(tp, fh, skb, tcm) < 0) 343 if (tp->ops->dump && tp->ops->dump(tp, fh, skb, tcm) < 0)
341 goto rtattr_failure; 344 goto nla_put_failure;
342 } 345 }
343 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 346 nlh->nlmsg_len = skb_tail_pointer(skb) - b;
344 return skb->len; 347 return skb->len;
345 348
346nlmsg_failure: 349nlmsg_failure:
347rtattr_failure: 350nla_put_failure:
348 nlmsg_trim(skb, b); 351 nlmsg_trim(skb, b);
349 return -1; 352 return -1;
350} 353}
@@ -476,8 +479,8 @@ void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts)
476} 479}
477EXPORT_SYMBOL(tcf_exts_destroy); 480EXPORT_SYMBOL(tcf_exts_destroy);
478 481
479int tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb, 482int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
480 struct rtattr *rate_tlv, struct tcf_exts *exts, 483 struct nlattr *rate_tlv, struct tcf_exts *exts,
481 struct tcf_ext_map *map) 484 struct tcf_ext_map *map)
482{ 485{
483 memset(exts, 0, sizeof(*exts)); 486 memset(exts, 0, sizeof(*exts));
@@ -487,8 +490,9 @@ int tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
487 int err; 490 int err;
488 struct tc_action *act; 491 struct tc_action *act;
489 492
490 if (map->police && tb[map->police-1]) { 493 if (map->police && tb[map->police]) {
491 act = tcf_action_init_1(tb[map->police-1], rate_tlv, 494 act = tcf_action_init_1((struct rtattr *)tb[map->police],
495 (struct rtattr *)rate_tlv,
492 "police", TCA_ACT_NOREPLACE, 496 "police", TCA_ACT_NOREPLACE,
493 TCA_ACT_BIND, &err); 497 TCA_ACT_BIND, &err);
494 if (act == NULL) 498 if (act == NULL)
@@ -496,8 +500,9 @@ int tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
496 500
497 act->type = TCA_OLD_COMPAT; 501 act->type = TCA_OLD_COMPAT;
498 exts->action = act; 502 exts->action = act;
499 } else if (map->action && tb[map->action-1]) { 503 } else if (map->action && tb[map->action]) {
500 act = tcf_action_init(tb[map->action-1], rate_tlv, NULL, 504 act = tcf_action_init((struct rtattr *)tb[map->action],
505 (struct rtattr *)rate_tlv, NULL,
501 TCA_ACT_NOREPLACE, TCA_ACT_BIND, &err); 506 TCA_ACT_NOREPLACE, TCA_ACT_BIND, &err);
502 if (act == NULL) 507 if (act == NULL)
503 return err; 508 return err;
@@ -506,8 +511,8 @@ int tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
506 } 511 }
507 } 512 }
508#else 513#else
509 if ((map->action && tb[map->action-1]) || 514 if ((map->action && tb[map->action]) ||
510 (map->police && tb[map->police-1])) 515 (map->police && tb[map->police]))
511 return -EOPNOTSUPP; 516 return -EOPNOTSUPP;
512#endif 517#endif
513 518
@@ -541,23 +546,23 @@ int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts,
541 * to work with both old and new modes of entering 546 * to work with both old and new modes of entering
542 * tc data even if iproute2 was newer - jhs 547 * tc data even if iproute2 was newer - jhs
543 */ 548 */
544 struct rtattr *p_rta = (struct rtattr *)skb_tail_pointer(skb); 549 struct nlattr *p_rta = (struct nlattr *)skb_tail_pointer(skb);
545 550
546 if (exts->action->type != TCA_OLD_COMPAT) { 551 if (exts->action->type != TCA_OLD_COMPAT) {
547 RTA_PUT(skb, map->action, 0, NULL); 552 NLA_PUT(skb, map->action, 0, NULL);
548 if (tcf_action_dump(skb, exts->action, 0, 0) < 0) 553 if (tcf_action_dump(skb, exts->action, 0, 0) < 0)
549 goto rtattr_failure; 554 goto nla_put_failure;
550 p_rta->rta_len = skb_tail_pointer(skb) - (u8 *)p_rta; 555 p_rta->nla_len = skb_tail_pointer(skb) - (u8 *)p_rta;
551 } else if (map->police) { 556 } else if (map->police) {
552 RTA_PUT(skb, map->police, 0, NULL); 557 NLA_PUT(skb, map->police, 0, NULL);
553 if (tcf_action_dump_old(skb, exts->action, 0, 0) < 0) 558 if (tcf_action_dump_old(skb, exts->action, 0, 0) < 0)
554 goto rtattr_failure; 559 goto nla_put_failure;
555 p_rta->rta_len = skb_tail_pointer(skb) - (u8 *)p_rta; 560 p_rta->nla_len = skb_tail_pointer(skb) - (u8 *)p_rta;
556 } 561 }
557 } 562 }
558#endif 563#endif
559 return 0; 564 return 0;
560rtattr_failure: __attribute__ ((unused)) 565nla_put_failure: __attribute__ ((unused))
561 return -1; 566 return -1;
562} 567}
563EXPORT_SYMBOL(tcf_exts_dump); 568EXPORT_SYMBOL(tcf_exts_dump);
@@ -569,10 +574,10 @@ int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts,
569#ifdef CONFIG_NET_CLS_ACT 574#ifdef CONFIG_NET_CLS_ACT
570 if (exts->action) 575 if (exts->action)
571 if (tcf_action_copy_stats(skb, exts->action, 1) < 0) 576 if (tcf_action_copy_stats(skb, exts->action, 1) < 0)
572 goto rtattr_failure; 577 goto nla_put_failure;
573#endif 578#endif
574 return 0; 579 return 0;
575rtattr_failure: __attribute__ ((unused)) 580nla_put_failure: __attribute__ ((unused))
576 return -1; 581 return -1;
577} 582}
578EXPORT_SYMBOL(tcf_exts_dump_stats); 583EXPORT_SYMBOL(tcf_exts_dump_stats);
diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c
index b31f9f971987..3953da33956f 100644
--- a/net/sched/cls_basic.c
+++ b/net/sched/cls_basic.c
@@ -130,27 +130,27 @@ static int basic_delete(struct tcf_proto *tp, unsigned long arg)
130} 130}
131 131
132static inline int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f, 132static inline int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f,
133 unsigned long base, struct rtattr **tb, 133 unsigned long base, struct nlattr **tb,
134 struct rtattr *est) 134 struct nlattr *est)
135{ 135{
136 int err = -EINVAL; 136 int err = -EINVAL;
137 struct tcf_exts e; 137 struct tcf_exts e;
138 struct tcf_ematch_tree t; 138 struct tcf_ematch_tree t;
139 139
140 if (tb[TCA_BASIC_CLASSID-1]) 140 if (tb[TCA_BASIC_CLASSID])
141 if (RTA_PAYLOAD(tb[TCA_BASIC_CLASSID-1]) < sizeof(u32)) 141 if (nla_len(tb[TCA_BASIC_CLASSID]) < sizeof(u32))
142 return err; 142 return err;
143 143
144 err = tcf_exts_validate(tp, tb, est, &e, &basic_ext_map); 144 err = tcf_exts_validate(tp, tb, est, &e, &basic_ext_map);
145 if (err < 0) 145 if (err < 0)
146 return err; 146 return err;
147 147
148 err = tcf_em_tree_validate(tp, tb[TCA_BASIC_EMATCHES-1], &t); 148 err = tcf_em_tree_validate(tp, tb[TCA_BASIC_EMATCHES], &t);
149 if (err < 0) 149 if (err < 0)
150 goto errout; 150 goto errout;
151 151
152 if (tb[TCA_BASIC_CLASSID-1]) { 152 if (tb[TCA_BASIC_CLASSID]) {
153 f->res.classid = *(u32*)RTA_DATA(tb[TCA_BASIC_CLASSID-1]); 153 f->res.classid = *(u32*)nla_data(tb[TCA_BASIC_CLASSID]);
154 tcf_bind_filter(tp, &f->res, base); 154 tcf_bind_filter(tp, &f->res, base);
155 } 155 }
156 156
@@ -164,23 +164,23 @@ errout:
164} 164}
165 165
166static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle, 166static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle,
167 struct rtattr **tca, unsigned long *arg) 167 struct nlattr **tca, unsigned long *arg)
168{ 168{
169 int err = -EINVAL; 169 int err = -EINVAL;
170 struct basic_head *head = (struct basic_head *) tp->root; 170 struct basic_head *head = (struct basic_head *) tp->root;
171 struct rtattr *tb[TCA_BASIC_MAX]; 171 struct nlattr *tb[TCA_BASIC_MAX + 1];
172 struct basic_filter *f = (struct basic_filter *) *arg; 172 struct basic_filter *f = (struct basic_filter *) *arg;
173 173
174 if (tca[TCA_OPTIONS-1] == NULL) 174 if (tca[TCA_OPTIONS] == NULL)
175 return -EINVAL; 175 return -EINVAL;
176 176
177 if (rtattr_parse_nested(tb, TCA_BASIC_MAX, tca[TCA_OPTIONS-1]) < 0) 177 if (nla_parse_nested(tb, TCA_BASIC_MAX, tca[TCA_OPTIONS], NULL) < 0)
178 return -EINVAL; 178 return -EINVAL;
179 179
180 if (f != NULL) { 180 if (f != NULL) {
181 if (handle && f->handle != handle) 181 if (handle && f->handle != handle)
182 return -EINVAL; 182 return -EINVAL;
183 return basic_set_parms(tp, f, base, tb, tca[TCA_RATE-1]); 183 return basic_set_parms(tp, f, base, tb, tca[TCA_RATE]);
184 } 184 }
185 185
186 err = -ENOBUFS; 186 err = -ENOBUFS;
@@ -206,7 +206,7 @@ static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle,
206 f->handle = head->hgenerator; 206 f->handle = head->hgenerator;
207 } 207 }
208 208
209 err = basic_set_parms(tp, f, base, tb, tca[TCA_RATE-1]); 209 err = basic_set_parms(tp, f, base, tb, tca[TCA_RATE]);
210 if (err < 0) 210 if (err < 0)
211 goto errout; 211 goto errout;
212 212
@@ -246,27 +246,27 @@ static int basic_dump(struct tcf_proto *tp, unsigned long fh,
246{ 246{
247 struct basic_filter *f = (struct basic_filter *) fh; 247 struct basic_filter *f = (struct basic_filter *) fh;
248 unsigned char *b = skb_tail_pointer(skb); 248 unsigned char *b = skb_tail_pointer(skb);
249 struct rtattr *rta; 249 struct nlattr *nla;
250 250
251 if (f == NULL) 251 if (f == NULL)
252 return skb->len; 252 return skb->len;
253 253
254 t->tcm_handle = f->handle; 254 t->tcm_handle = f->handle;
255 255
256 rta = (struct rtattr *) b; 256 nla = (struct nlattr *) b;
257 RTA_PUT(skb, TCA_OPTIONS, 0, NULL); 257 NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
258 258
259 if (f->res.classid) 259 if (f->res.classid)
260 RTA_PUT(skb, TCA_BASIC_CLASSID, sizeof(u32), &f->res.classid); 260 NLA_PUT(skb, TCA_BASIC_CLASSID, sizeof(u32), &f->res.classid);
261 261
262 if (tcf_exts_dump(skb, &f->exts, &basic_ext_map) < 0 || 262 if (tcf_exts_dump(skb, &f->exts, &basic_ext_map) < 0 ||
263 tcf_em_tree_dump(skb, &f->ematches, TCA_BASIC_EMATCHES) < 0) 263 tcf_em_tree_dump(skb, &f->ematches, TCA_BASIC_EMATCHES) < 0)
264 goto rtattr_failure; 264 goto nla_put_failure;
265 265
266 rta->rta_len = skb_tail_pointer(skb) - b; 266 nla->nla_len = skb_tail_pointer(skb) - b;
267 return skb->len; 267 return skb->len;
268 268
269rtattr_failure: 269nla_put_failure:
270 nlmsg_trim(skb, b); 270 nlmsg_trim(skb, b);
271 return -1; 271 return -1;
272} 272}
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c
index b45038770e79..db6e90a37846 100644
--- a/net/sched/cls_fw.c
+++ b/net/sched/cls_fw.c
@@ -188,37 +188,37 @@ out:
188 188
189static int 189static int
190fw_change_attrs(struct tcf_proto *tp, struct fw_filter *f, 190fw_change_attrs(struct tcf_proto *tp, struct fw_filter *f,
191 struct rtattr **tb, struct rtattr **tca, unsigned long base) 191 struct nlattr **tb, struct nlattr **tca, unsigned long base)
192{ 192{
193 struct fw_head *head = (struct fw_head *)tp->root; 193 struct fw_head *head = (struct fw_head *)tp->root;
194 struct tcf_exts e; 194 struct tcf_exts e;
195 u32 mask; 195 u32 mask;
196 int err; 196 int err;
197 197
198 err = tcf_exts_validate(tp, tb, tca[TCA_RATE-1], &e, &fw_ext_map); 198 err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &fw_ext_map);
199 if (err < 0) 199 if (err < 0)
200 return err; 200 return err;
201 201
202 err = -EINVAL; 202 err = -EINVAL;
203 if (tb[TCA_FW_CLASSID-1]) { 203 if (tb[TCA_FW_CLASSID]) {
204 if (RTA_PAYLOAD(tb[TCA_FW_CLASSID-1]) != sizeof(u32)) 204 if (nla_len(tb[TCA_FW_CLASSID]) != sizeof(u32))
205 goto errout; 205 goto errout;
206 f->res.classid = *(u32*)RTA_DATA(tb[TCA_FW_CLASSID-1]); 206 f->res.classid = *(u32*)nla_data(tb[TCA_FW_CLASSID]);
207 tcf_bind_filter(tp, &f->res, base); 207 tcf_bind_filter(tp, &f->res, base);
208 } 208 }
209 209
210#ifdef CONFIG_NET_CLS_IND 210#ifdef CONFIG_NET_CLS_IND
211 if (tb[TCA_FW_INDEV-1]) { 211 if (tb[TCA_FW_INDEV]) {
212 err = tcf_change_indev(tp, f->indev, tb[TCA_FW_INDEV-1]); 212 err = tcf_change_indev(tp, f->indev, tb[TCA_FW_INDEV]);
213 if (err < 0) 213 if (err < 0)
214 goto errout; 214 goto errout;
215 } 215 }
216#endif /* CONFIG_NET_CLS_IND */ 216#endif /* CONFIG_NET_CLS_IND */
217 217
218 if (tb[TCA_FW_MASK-1]) { 218 if (tb[TCA_FW_MASK]) {
219 if (RTA_PAYLOAD(tb[TCA_FW_MASK-1]) != sizeof(u32)) 219 if (nla_len(tb[TCA_FW_MASK]) != sizeof(u32))
220 goto errout; 220 goto errout;
221 mask = *(u32*)RTA_DATA(tb[TCA_FW_MASK-1]); 221 mask = *(u32*)nla_data(tb[TCA_FW_MASK]);
222 if (mask != head->mask) 222 if (mask != head->mask)
223 goto errout; 223 goto errout;
224 } else if (head->mask != 0xFFFFFFFF) 224 } else if (head->mask != 0xFFFFFFFF)
@@ -234,19 +234,19 @@ errout:
234 234
235static int fw_change(struct tcf_proto *tp, unsigned long base, 235static int fw_change(struct tcf_proto *tp, unsigned long base,
236 u32 handle, 236 u32 handle,
237 struct rtattr **tca, 237 struct nlattr **tca,
238 unsigned long *arg) 238 unsigned long *arg)
239{ 239{
240 struct fw_head *head = (struct fw_head*)tp->root; 240 struct fw_head *head = (struct fw_head*)tp->root;
241 struct fw_filter *f = (struct fw_filter *) *arg; 241 struct fw_filter *f = (struct fw_filter *) *arg;
242 struct rtattr *opt = tca[TCA_OPTIONS-1]; 242 struct nlattr *opt = tca[TCA_OPTIONS];
243 struct rtattr *tb[TCA_FW_MAX]; 243 struct nlattr *tb[TCA_FW_MAX + 1];
244 int err; 244 int err;
245 245
246 if (!opt) 246 if (!opt)
247 return handle ? -EINVAL : 0; 247 return handle ? -EINVAL : 0;
248 248
249 if (rtattr_parse_nested(tb, TCA_FW_MAX, opt) < 0) 249 if (nla_parse_nested(tb, TCA_FW_MAX, opt, NULL) < 0)
250 return -EINVAL; 250 return -EINVAL;
251 251
252 if (f != NULL) { 252 if (f != NULL) {
@@ -260,10 +260,10 @@ static int fw_change(struct tcf_proto *tp, unsigned long base,
260 260
261 if (head == NULL) { 261 if (head == NULL) {
262 u32 mask = 0xFFFFFFFF; 262 u32 mask = 0xFFFFFFFF;
263 if (tb[TCA_FW_MASK-1]) { 263 if (tb[TCA_FW_MASK]) {
264 if (RTA_PAYLOAD(tb[TCA_FW_MASK-1]) != sizeof(u32)) 264 if (nla_len(tb[TCA_FW_MASK]) != sizeof(u32))
265 return -EINVAL; 265 return -EINVAL;
266 mask = *(u32*)RTA_DATA(tb[TCA_FW_MASK-1]); 266 mask = *(u32*)nla_data(tb[TCA_FW_MASK]);
267 } 267 }
268 268
269 head = kzalloc(sizeof(struct fw_head), GFP_KERNEL); 269 head = kzalloc(sizeof(struct fw_head), GFP_KERNEL);
@@ -333,7 +333,7 @@ static int fw_dump(struct tcf_proto *tp, unsigned long fh,
333 struct fw_head *head = (struct fw_head *)tp->root; 333 struct fw_head *head = (struct fw_head *)tp->root;
334 struct fw_filter *f = (struct fw_filter*)fh; 334 struct fw_filter *f = (struct fw_filter*)fh;
335 unsigned char *b = skb_tail_pointer(skb); 335 unsigned char *b = skb_tail_pointer(skb);
336 struct rtattr *rta; 336 struct nlattr *nla;
337 337
338 if (f == NULL) 338 if (f == NULL)
339 return skb->len; 339 return skb->len;
@@ -343,29 +343,29 @@ static int fw_dump(struct tcf_proto *tp, unsigned long fh,
343 if (!f->res.classid && !tcf_exts_is_available(&f->exts)) 343 if (!f->res.classid && !tcf_exts_is_available(&f->exts))
344 return skb->len; 344 return skb->len;
345 345
346 rta = (struct rtattr*)b; 346 nla = (struct nlattr*)b;
347 RTA_PUT(skb, TCA_OPTIONS, 0, NULL); 347 NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
348 348
349 if (f->res.classid) 349 if (f->res.classid)
350 RTA_PUT(skb, TCA_FW_CLASSID, 4, &f->res.classid); 350 NLA_PUT(skb, TCA_FW_CLASSID, 4, &f->res.classid);
351#ifdef CONFIG_NET_CLS_IND 351#ifdef CONFIG_NET_CLS_IND
352 if (strlen(f->indev)) 352 if (strlen(f->indev))
353 RTA_PUT(skb, TCA_FW_INDEV, IFNAMSIZ, f->indev); 353 NLA_PUT(skb, TCA_FW_INDEV, IFNAMSIZ, f->indev);
354#endif /* CONFIG_NET_CLS_IND */ 354#endif /* CONFIG_NET_CLS_IND */
355 if (head->mask != 0xFFFFFFFF) 355 if (head->mask != 0xFFFFFFFF)
356 RTA_PUT(skb, TCA_FW_MASK, 4, &head->mask); 356 NLA_PUT(skb, TCA_FW_MASK, 4, &head->mask);
357 357
358 if (tcf_exts_dump(skb, &f->exts, &fw_ext_map) < 0) 358 if (tcf_exts_dump(skb, &f->exts, &fw_ext_map) < 0)
359 goto rtattr_failure; 359 goto nla_put_failure;
360 360
361 rta->rta_len = skb_tail_pointer(skb) - b; 361 nla->nla_len = skb_tail_pointer(skb) - b;
362 362
363 if (tcf_exts_dump_stats(skb, &f->exts, &fw_ext_map) < 0) 363 if (tcf_exts_dump_stats(skb, &f->exts, &fw_ext_map) < 0)
364 goto rtattr_failure; 364 goto nla_put_failure;
365 365
366 return skb->len; 366 return skb->len;
367 367
368rtattr_failure: 368nla_put_failure:
369 nlmsg_trim(skb, b); 369 nlmsg_trim(skb, b);
370 return -1; 370 return -1;
371} 371}
diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c
index e70edd0f7bc8..b1aae84cbadc 100644
--- a/net/sched/cls_route.c
+++ b/net/sched/cls_route.c
@@ -325,7 +325,7 @@ static int route4_delete(struct tcf_proto *tp, unsigned long arg)
325 325
326static int route4_set_parms(struct tcf_proto *tp, unsigned long base, 326static int route4_set_parms(struct tcf_proto *tp, unsigned long base,
327 struct route4_filter *f, u32 handle, struct route4_head *head, 327 struct route4_filter *f, u32 handle, struct route4_head *head,
328 struct rtattr **tb, struct rtattr *est, int new) 328 struct nlattr **tb, struct nlattr *est, int new)
329{ 329{
330 int err; 330 int err;
331 u32 id = 0, to = 0, nhandle = 0x8000; 331 u32 id = 0, to = 0, nhandle = 0x8000;
@@ -339,34 +339,34 @@ static int route4_set_parms(struct tcf_proto *tp, unsigned long base,
339 return err; 339 return err;
340 340
341 err = -EINVAL; 341 err = -EINVAL;
342 if (tb[TCA_ROUTE4_CLASSID-1]) 342 if (tb[TCA_ROUTE4_CLASSID])
343 if (RTA_PAYLOAD(tb[TCA_ROUTE4_CLASSID-1]) < sizeof(u32)) 343 if (nla_len(tb[TCA_ROUTE4_CLASSID]) < sizeof(u32))
344 goto errout; 344 goto errout;
345 345
346 if (tb[TCA_ROUTE4_TO-1]) { 346 if (tb[TCA_ROUTE4_TO]) {
347 if (new && handle & 0x8000) 347 if (new && handle & 0x8000)
348 goto errout; 348 goto errout;
349 if (RTA_PAYLOAD(tb[TCA_ROUTE4_TO-1]) < sizeof(u32)) 349 if (nla_len(tb[TCA_ROUTE4_TO]) < sizeof(u32))
350 goto errout; 350 goto errout;
351 to = *(u32*)RTA_DATA(tb[TCA_ROUTE4_TO-1]); 351 to = *(u32*)nla_data(tb[TCA_ROUTE4_TO]);
352 if (to > 0xFF) 352 if (to > 0xFF)
353 goto errout; 353 goto errout;
354 nhandle = to; 354 nhandle = to;
355 } 355 }
356 356
357 if (tb[TCA_ROUTE4_FROM-1]) { 357 if (tb[TCA_ROUTE4_FROM]) {
358 if (tb[TCA_ROUTE4_IIF-1]) 358 if (tb[TCA_ROUTE4_IIF])
359 goto errout; 359 goto errout;
360 if (RTA_PAYLOAD(tb[TCA_ROUTE4_FROM-1]) < sizeof(u32)) 360 if (nla_len(tb[TCA_ROUTE4_FROM]) < sizeof(u32))
361 goto errout; 361 goto errout;
362 id = *(u32*)RTA_DATA(tb[TCA_ROUTE4_FROM-1]); 362 id = *(u32*)nla_data(tb[TCA_ROUTE4_FROM]);
363 if (id > 0xFF) 363 if (id > 0xFF)
364 goto errout; 364 goto errout;
365 nhandle |= id << 16; 365 nhandle |= id << 16;
366 } else if (tb[TCA_ROUTE4_IIF-1]) { 366 } else if (tb[TCA_ROUTE4_IIF]) {
367 if (RTA_PAYLOAD(tb[TCA_ROUTE4_IIF-1]) < sizeof(u32)) 367 if (nla_len(tb[TCA_ROUTE4_IIF]) < sizeof(u32))
368 goto errout; 368 goto errout;
369 id = *(u32*)RTA_DATA(tb[TCA_ROUTE4_IIF-1]); 369 id = *(u32*)nla_data(tb[TCA_ROUTE4_IIF]);
370 if (id > 0x7FFF) 370 if (id > 0x7FFF)
371 goto errout; 371 goto errout;
372 nhandle |= (id | 0x8000) << 16; 372 nhandle |= (id | 0x8000) << 16;
@@ -398,20 +398,20 @@ static int route4_set_parms(struct tcf_proto *tp, unsigned long base,
398 } 398 }
399 399
400 tcf_tree_lock(tp); 400 tcf_tree_lock(tp);
401 if (tb[TCA_ROUTE4_TO-1]) 401 if (tb[TCA_ROUTE4_TO])
402 f->id = to; 402 f->id = to;
403 403
404 if (tb[TCA_ROUTE4_FROM-1]) 404 if (tb[TCA_ROUTE4_FROM])
405 f->id = to | id<<16; 405 f->id = to | id<<16;
406 else if (tb[TCA_ROUTE4_IIF-1]) 406 else if (tb[TCA_ROUTE4_IIF])
407 f->iif = id; 407 f->iif = id;
408 408
409 f->handle = nhandle; 409 f->handle = nhandle;
410 f->bkt = b; 410 f->bkt = b;
411 tcf_tree_unlock(tp); 411 tcf_tree_unlock(tp);
412 412
413 if (tb[TCA_ROUTE4_CLASSID-1]) { 413 if (tb[TCA_ROUTE4_CLASSID]) {
414 f->res.classid = *(u32*)RTA_DATA(tb[TCA_ROUTE4_CLASSID-1]); 414 f->res.classid = *(u32*)nla_data(tb[TCA_ROUTE4_CLASSID]);
415 tcf_bind_filter(tp, &f->res, base); 415 tcf_bind_filter(tp, &f->res, base);
416 } 416 }
417 417
@@ -425,14 +425,14 @@ errout:
425 425
426static int route4_change(struct tcf_proto *tp, unsigned long base, 426static int route4_change(struct tcf_proto *tp, unsigned long base,
427 u32 handle, 427 u32 handle,
428 struct rtattr **tca, 428 struct nlattr **tca,
429 unsigned long *arg) 429 unsigned long *arg)
430{ 430{
431 struct route4_head *head = tp->root; 431 struct route4_head *head = tp->root;
432 struct route4_filter *f, *f1, **fp; 432 struct route4_filter *f, *f1, **fp;
433 struct route4_bucket *b; 433 struct route4_bucket *b;
434 struct rtattr *opt = tca[TCA_OPTIONS-1]; 434 struct nlattr *opt = tca[TCA_OPTIONS];
435 struct rtattr *tb[TCA_ROUTE4_MAX]; 435 struct nlattr *tb[TCA_ROUTE4_MAX + 1];
436 unsigned int h, th; 436 unsigned int h, th;
437 u32 old_handle = 0; 437 u32 old_handle = 0;
438 int err; 438 int err;
@@ -440,7 +440,7 @@ static int route4_change(struct tcf_proto *tp, unsigned long base,
440 if (opt == NULL) 440 if (opt == NULL)
441 return handle ? -EINVAL : 0; 441 return handle ? -EINVAL : 0;
442 442
443 if (rtattr_parse_nested(tb, TCA_ROUTE4_MAX, opt) < 0) 443 if (nla_parse_nested(tb, TCA_ROUTE4_MAX, opt, NULL) < 0)
444 return -EINVAL; 444 return -EINVAL;
445 445
446 if ((f = (struct route4_filter*)*arg) != NULL) { 446 if ((f = (struct route4_filter*)*arg) != NULL) {
@@ -451,7 +451,7 @@ static int route4_change(struct tcf_proto *tp, unsigned long base,
451 old_handle = f->handle; 451 old_handle = f->handle;
452 452
453 err = route4_set_parms(tp, base, f, handle, head, tb, 453 err = route4_set_parms(tp, base, f, handle, head, tb,
454 tca[TCA_RATE-1], 0); 454 tca[TCA_RATE], 0);
455 if (err < 0) 455 if (err < 0)
456 return err; 456 return err;
457 457
@@ -474,7 +474,7 @@ static int route4_change(struct tcf_proto *tp, unsigned long base,
474 goto errout; 474 goto errout;
475 475
476 err = route4_set_parms(tp, base, f, handle, head, tb, 476 err = route4_set_parms(tp, base, f, handle, head, tb,
477 tca[TCA_RATE-1], 1); 477 tca[TCA_RATE], 1);
478 if (err < 0) 478 if (err < 0)
479 goto errout; 479 goto errout;
480 480
@@ -550,7 +550,7 @@ static int route4_dump(struct tcf_proto *tp, unsigned long fh,
550{ 550{
551 struct route4_filter *f = (struct route4_filter*)fh; 551 struct route4_filter *f = (struct route4_filter*)fh;
552 unsigned char *b = skb_tail_pointer(skb); 552 unsigned char *b = skb_tail_pointer(skb);
553 struct rtattr *rta; 553 struct nlattr *nla;
554 u32 id; 554 u32 id;
555 555
556 if (f == NULL) 556 if (f == NULL)
@@ -558,34 +558,34 @@ static int route4_dump(struct tcf_proto *tp, unsigned long fh,
558 558
559 t->tcm_handle = f->handle; 559 t->tcm_handle = f->handle;
560 560
561 rta = (struct rtattr*)b; 561 nla = (struct nlattr*)b;
562 RTA_PUT(skb, TCA_OPTIONS, 0, NULL); 562 NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
563 563
564 if (!(f->handle&0x8000)) { 564 if (!(f->handle&0x8000)) {
565 id = f->id&0xFF; 565 id = f->id&0xFF;
566 RTA_PUT(skb, TCA_ROUTE4_TO, sizeof(id), &id); 566 NLA_PUT(skb, TCA_ROUTE4_TO, sizeof(id), &id);
567 } 567 }
568 if (f->handle&0x80000000) { 568 if (f->handle&0x80000000) {
569 if ((f->handle>>16) != 0xFFFF) 569 if ((f->handle>>16) != 0xFFFF)
570 RTA_PUT(skb, TCA_ROUTE4_IIF, sizeof(f->iif), &f->iif); 570 NLA_PUT(skb, TCA_ROUTE4_IIF, sizeof(f->iif), &f->iif);
571 } else { 571 } else {
572 id = f->id>>16; 572 id = f->id>>16;
573 RTA_PUT(skb, TCA_ROUTE4_FROM, sizeof(id), &id); 573 NLA_PUT(skb, TCA_ROUTE4_FROM, sizeof(id), &id);
574 } 574 }
575 if (f->res.classid) 575 if (f->res.classid)
576 RTA_PUT(skb, TCA_ROUTE4_CLASSID, 4, &f->res.classid); 576 NLA_PUT(skb, TCA_ROUTE4_CLASSID, 4, &f->res.classid);
577 577
578 if (tcf_exts_dump(skb, &f->exts, &route_ext_map) < 0) 578 if (tcf_exts_dump(skb, &f->exts, &route_ext_map) < 0)
579 goto rtattr_failure; 579 goto nla_put_failure;
580 580
581 rta->rta_len = skb_tail_pointer(skb) - b; 581 nla->nla_len = skb_tail_pointer(skb) - b;
582 582
583 if (tcf_exts_dump_stats(skb, &f->exts, &route_ext_map) < 0) 583 if (tcf_exts_dump_stats(skb, &f->exts, &route_ext_map) < 0)
584 goto rtattr_failure; 584 goto nla_put_failure;
585 585
586 return skb->len; 586 return skb->len;
587 587
588rtattr_failure: 588nla_put_failure:
589 nlmsg_trim(skb, b); 589 nlmsg_trim(skb, b);
590 return -1; 590 return -1;
591} 591}
diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
index 22f9ede70e8f..2364c79d0837 100644
--- a/net/sched/cls_rsvp.h
+++ b/net/sched/cls_rsvp.h
@@ -399,15 +399,15 @@ static u32 gen_tunnel(struct rsvp_head *data)
399 399
400static int rsvp_change(struct tcf_proto *tp, unsigned long base, 400static int rsvp_change(struct tcf_proto *tp, unsigned long base,
401 u32 handle, 401 u32 handle,
402 struct rtattr **tca, 402 struct nlattr **tca,
403 unsigned long *arg) 403 unsigned long *arg)
404{ 404{
405 struct rsvp_head *data = tp->root; 405 struct rsvp_head *data = tp->root;
406 struct rsvp_filter *f, **fp; 406 struct rsvp_filter *f, **fp;
407 struct rsvp_session *s, **sp; 407 struct rsvp_session *s, **sp;
408 struct tc_rsvp_pinfo *pinfo = NULL; 408 struct tc_rsvp_pinfo *pinfo = NULL;
409 struct rtattr *opt = tca[TCA_OPTIONS-1]; 409 struct nlattr *opt = tca[TCA_OPTIONS-1];
410 struct rtattr *tb[TCA_RSVP_MAX]; 410 struct nlattr *tb[TCA_RSVP_MAX + 1];
411 struct tcf_exts e; 411 struct tcf_exts e;
412 unsigned h1, h2; 412 unsigned h1, h2;
413 __be32 *dst; 413 __be32 *dst;
@@ -416,7 +416,7 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
416 if (opt == NULL) 416 if (opt == NULL)
417 return handle ? -EINVAL : 0; 417 return handle ? -EINVAL : 0;
418 418
419 if (rtattr_parse_nested(tb, TCA_RSVP_MAX, opt) < 0) 419 if (nla_parse_nested(tb, TCA_RSVP_MAX, opt, NULL) < 0)
420 return -EINVAL; 420 return -EINVAL;
421 421
422 err = tcf_exts_validate(tp, tb, tca[TCA_RATE-1], &e, &rsvp_ext_map); 422 err = tcf_exts_validate(tp, tb, tca[TCA_RATE-1], &e, &rsvp_ext_map);
@@ -429,7 +429,7 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
429 if (f->handle != handle && handle) 429 if (f->handle != handle && handle)
430 goto errout2; 430 goto errout2;
431 if (tb[TCA_RSVP_CLASSID-1]) { 431 if (tb[TCA_RSVP_CLASSID-1]) {
432 f->res.classid = *(u32*)RTA_DATA(tb[TCA_RSVP_CLASSID-1]); 432 f->res.classid = *(u32*)nla_data(tb[TCA_RSVP_CLASSID-1]);
433 tcf_bind_filter(tp, &f->res, base); 433 tcf_bind_filter(tp, &f->res, base);
434 } 434 }
435 435
@@ -452,30 +452,30 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
452 h2 = 16; 452 h2 = 16;
453 if (tb[TCA_RSVP_SRC-1]) { 453 if (tb[TCA_RSVP_SRC-1]) {
454 err = -EINVAL; 454 err = -EINVAL;
455 if (RTA_PAYLOAD(tb[TCA_RSVP_SRC-1]) != sizeof(f->src)) 455 if (nla_len(tb[TCA_RSVP_SRC-1]) != sizeof(f->src))
456 goto errout; 456 goto errout;
457 memcpy(f->src, RTA_DATA(tb[TCA_RSVP_SRC-1]), sizeof(f->src)); 457 memcpy(f->src, nla_data(tb[TCA_RSVP_SRC-1]), sizeof(f->src));
458 h2 = hash_src(f->src); 458 h2 = hash_src(f->src);
459 } 459 }
460 if (tb[TCA_RSVP_PINFO-1]) { 460 if (tb[TCA_RSVP_PINFO-1]) {
461 err = -EINVAL; 461 err = -EINVAL;
462 if (RTA_PAYLOAD(tb[TCA_RSVP_PINFO-1]) < sizeof(struct tc_rsvp_pinfo)) 462 if (nla_len(tb[TCA_RSVP_PINFO-1]) < sizeof(struct tc_rsvp_pinfo))
463 goto errout; 463 goto errout;
464 pinfo = RTA_DATA(tb[TCA_RSVP_PINFO-1]); 464 pinfo = nla_data(tb[TCA_RSVP_PINFO-1]);
465 f->spi = pinfo->spi; 465 f->spi = pinfo->spi;
466 f->tunnelhdr = pinfo->tunnelhdr; 466 f->tunnelhdr = pinfo->tunnelhdr;
467 } 467 }
468 if (tb[TCA_RSVP_CLASSID-1]) { 468 if (tb[TCA_RSVP_CLASSID-1]) {
469 err = -EINVAL; 469 err = -EINVAL;
470 if (RTA_PAYLOAD(tb[TCA_RSVP_CLASSID-1]) != 4) 470 if (nla_len(tb[TCA_RSVP_CLASSID-1]) != 4)
471 goto errout; 471 goto errout;
472 f->res.classid = *(u32*)RTA_DATA(tb[TCA_RSVP_CLASSID-1]); 472 f->res.classid = *(u32*)nla_data(tb[TCA_RSVP_CLASSID-1]);
473 } 473 }
474 474
475 err = -EINVAL; 475 err = -EINVAL;
476 if (RTA_PAYLOAD(tb[TCA_RSVP_DST-1]) != sizeof(f->src)) 476 if (nla_len(tb[TCA_RSVP_DST-1]) != sizeof(f->src))
477 goto errout; 477 goto errout;
478 dst = RTA_DATA(tb[TCA_RSVP_DST-1]); 478 dst = nla_data(tb[TCA_RSVP_DST-1]);
479 h1 = hash_dst(dst, pinfo ? pinfo->protocol : 0, pinfo ? pinfo->tunnelid : 0); 479 h1 = hash_dst(dst, pinfo ? pinfo->protocol : 0, pinfo ? pinfo->tunnelid : 0);
480 480
481 err = -ENOMEM; 481 err = -ENOMEM;
@@ -594,7 +594,7 @@ static int rsvp_dump(struct tcf_proto *tp, unsigned long fh,
594 struct rsvp_filter *f = (struct rsvp_filter*)fh; 594 struct rsvp_filter *f = (struct rsvp_filter*)fh;
595 struct rsvp_session *s; 595 struct rsvp_session *s;
596 unsigned char *b = skb_tail_pointer(skb); 596 unsigned char *b = skb_tail_pointer(skb);
597 struct rtattr *rta; 597 struct nlattr *nla;
598 struct tc_rsvp_pinfo pinfo; 598 struct tc_rsvp_pinfo pinfo;
599 599
600 if (f == NULL) 600 if (f == NULL)
@@ -604,32 +604,32 @@ static int rsvp_dump(struct tcf_proto *tp, unsigned long fh,
604 t->tcm_handle = f->handle; 604 t->tcm_handle = f->handle;
605 605
606 606
607 rta = (struct rtattr*)b; 607 nla = (struct nlattr*)b;
608 RTA_PUT(skb, TCA_OPTIONS, 0, NULL); 608 NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
609 609
610 RTA_PUT(skb, TCA_RSVP_DST, sizeof(s->dst), &s->dst); 610 NLA_PUT(skb, TCA_RSVP_DST, sizeof(s->dst), &s->dst);
611 pinfo.dpi = s->dpi; 611 pinfo.dpi = s->dpi;
612 pinfo.spi = f->spi; 612 pinfo.spi = f->spi;
613 pinfo.protocol = s->protocol; 613 pinfo.protocol = s->protocol;
614 pinfo.tunnelid = s->tunnelid; 614 pinfo.tunnelid = s->tunnelid;
615 pinfo.tunnelhdr = f->tunnelhdr; 615 pinfo.tunnelhdr = f->tunnelhdr;
616 pinfo.pad = 0; 616 pinfo.pad = 0;
617 RTA_PUT(skb, TCA_RSVP_PINFO, sizeof(pinfo), &pinfo); 617 NLA_PUT(skb, TCA_RSVP_PINFO, sizeof(pinfo), &pinfo);
618 if (f->res.classid) 618 if (f->res.classid)
619 RTA_PUT(skb, TCA_RSVP_CLASSID, 4, &f->res.classid); 619 NLA_PUT(skb, TCA_RSVP_CLASSID, 4, &f->res.classid);
620 if (((f->handle>>8)&0xFF) != 16) 620 if (((f->handle>>8)&0xFF) != 16)
621 RTA_PUT(skb, TCA_RSVP_SRC, sizeof(f->src), f->src); 621 NLA_PUT(skb, TCA_RSVP_SRC, sizeof(f->src), f->src);
622 622
623 if (tcf_exts_dump(skb, &f->exts, &rsvp_ext_map) < 0) 623 if (tcf_exts_dump(skb, &f->exts, &rsvp_ext_map) < 0)
624 goto rtattr_failure; 624 goto nla_put_failure;
625 625
626 rta->rta_len = skb_tail_pointer(skb) - b; 626 nla->nla_len = skb_tail_pointer(skb) - b;
627 627
628 if (tcf_exts_dump_stats(skb, &f->exts, &rsvp_ext_map) < 0) 628 if (tcf_exts_dump_stats(skb, &f->exts, &rsvp_ext_map) < 0)
629 goto rtattr_failure; 629 goto nla_put_failure;
630 return skb->len; 630 return skb->len;
631 631
632rtattr_failure: 632nla_put_failure:
633 nlmsg_trim(skb, b); 633 nlmsg_trim(skb, b);
634 return -1; 634 return -1;
635} 635}
diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
index e36977b17fa6..ed8023944fe5 100644
--- a/net/sched/cls_tcindex.c
+++ b/net/sched/cls_tcindex.c
@@ -196,7 +196,7 @@ valid_perfect_hash(struct tcindex_data *p)
196static int 196static int
197tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle, 197tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
198 struct tcindex_data *p, struct tcindex_filter_result *r, 198 struct tcindex_data *p, struct tcindex_filter_result *r,
199 struct rtattr **tb, struct rtattr *est) 199 struct nlattr **tb, struct nlattr *est)
200{ 200{
201 int err, balloc = 0; 201 int err, balloc = 0;
202 struct tcindex_filter_result new_filter_result, *old_r = r; 202 struct tcindex_filter_result new_filter_result, *old_r = r;
@@ -218,22 +218,22 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
218 memset(&cr, 0, sizeof(cr)); 218 memset(&cr, 0, sizeof(cr));
219 219
220 err = -EINVAL; 220 err = -EINVAL;
221 if (tb[TCA_TCINDEX_HASH-1]) { 221 if (tb[TCA_TCINDEX_HASH]) {
222 if (RTA_PAYLOAD(tb[TCA_TCINDEX_HASH-1]) < sizeof(u32)) 222 if (nla_len(tb[TCA_TCINDEX_HASH]) < sizeof(u32))
223 goto errout; 223 goto errout;
224 cp.hash = *(u32 *) RTA_DATA(tb[TCA_TCINDEX_HASH-1]); 224 cp.hash = *(u32 *) nla_data(tb[TCA_TCINDEX_HASH]);
225 } 225 }
226 226
227 if (tb[TCA_TCINDEX_MASK-1]) { 227 if (tb[TCA_TCINDEX_MASK]) {
228 if (RTA_PAYLOAD(tb[TCA_TCINDEX_MASK-1]) < sizeof(u16)) 228 if (nla_len(tb[TCA_TCINDEX_MASK]) < sizeof(u16))
229 goto errout; 229 goto errout;
230 cp.mask = *(u16 *) RTA_DATA(tb[TCA_TCINDEX_MASK-1]); 230 cp.mask = *(u16 *) nla_data(tb[TCA_TCINDEX_MASK]);
231 } 231 }
232 232
233 if (tb[TCA_TCINDEX_SHIFT-1]) { 233 if (tb[TCA_TCINDEX_SHIFT]) {
234 if (RTA_PAYLOAD(tb[TCA_TCINDEX_SHIFT-1]) < sizeof(int)) 234 if (nla_len(tb[TCA_TCINDEX_SHIFT]) < sizeof(int))
235 goto errout; 235 goto errout;
236 cp.shift = *(int *) RTA_DATA(tb[TCA_TCINDEX_SHIFT-1]); 236 cp.shift = *(int *) nla_data(tb[TCA_TCINDEX_SHIFT]);
237 } 237 }
238 238
239 err = -EBUSY; 239 err = -EBUSY;
@@ -248,11 +248,11 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
248 goto errout; 248 goto errout;
249 249
250 err = -EINVAL; 250 err = -EINVAL;
251 if (tb[TCA_TCINDEX_FALL_THROUGH-1]) { 251 if (tb[TCA_TCINDEX_FALL_THROUGH]) {
252 if (RTA_PAYLOAD(tb[TCA_TCINDEX_FALL_THROUGH-1]) < sizeof(u32)) 252 if (nla_len(tb[TCA_TCINDEX_FALL_THROUGH]) < sizeof(u32))
253 goto errout; 253 goto errout;
254 cp.fall_through = 254 cp.fall_through =
255 *(u32 *) RTA_DATA(tb[TCA_TCINDEX_FALL_THROUGH-1]); 255 *(u32 *) nla_data(tb[TCA_TCINDEX_FALL_THROUGH]);
256 } 256 }
257 257
258 if (!cp.hash) { 258 if (!cp.hash) {
@@ -304,8 +304,8 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
304 goto errout_alloc; 304 goto errout_alloc;
305 } 305 }
306 306
307 if (tb[TCA_TCINDEX_CLASSID-1]) { 307 if (tb[TCA_TCINDEX_CLASSID]) {
308 cr.res.classid = *(u32 *) RTA_DATA(tb[TCA_TCINDEX_CLASSID-1]); 308 cr.res.classid = *(u32 *) nla_data(tb[TCA_TCINDEX_CLASSID]);
309 tcf_bind_filter(tp, &cr.res, base); 309 tcf_bind_filter(tp, &cr.res, base);
310 } 310 }
311 311
@@ -344,10 +344,10 @@ errout:
344 344
345static int 345static int
346tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle, 346tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle,
347 struct rtattr **tca, unsigned long *arg) 347 struct nlattr **tca, unsigned long *arg)
348{ 348{
349 struct rtattr *opt = tca[TCA_OPTIONS-1]; 349 struct nlattr *opt = tca[TCA_OPTIONS];
350 struct rtattr *tb[TCA_TCINDEX_MAX]; 350 struct nlattr *tb[TCA_TCINDEX_MAX + 1];
351 struct tcindex_data *p = PRIV(tp); 351 struct tcindex_data *p = PRIV(tp);
352 struct tcindex_filter_result *r = (struct tcindex_filter_result *) *arg; 352 struct tcindex_filter_result *r = (struct tcindex_filter_result *) *arg;
353 353
@@ -358,10 +358,10 @@ tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle,
358 if (!opt) 358 if (!opt)
359 return 0; 359 return 0;
360 360
361 if (rtattr_parse_nested(tb, TCA_TCINDEX_MAX, opt) < 0) 361 if (nla_parse_nested(tb, TCA_TCINDEX_MAX, opt, NULL) < 0)
362 return -EINVAL; 362 return -EINVAL;
363 363
364 return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE-1]); 364 return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE]);
365} 365}
366 366
367 367
@@ -435,21 +435,21 @@ static int tcindex_dump(struct tcf_proto *tp, unsigned long fh,
435 struct tcindex_data *p = PRIV(tp); 435 struct tcindex_data *p = PRIV(tp);
436 struct tcindex_filter_result *r = (struct tcindex_filter_result *) fh; 436 struct tcindex_filter_result *r = (struct tcindex_filter_result *) fh;
437 unsigned char *b = skb_tail_pointer(skb); 437 unsigned char *b = skb_tail_pointer(skb);
438 struct rtattr *rta; 438 struct nlattr *nla;
439 439
440 pr_debug("tcindex_dump(tp %p,fh 0x%lx,skb %p,t %p),p %p,r %p,b %p\n", 440 pr_debug("tcindex_dump(tp %p,fh 0x%lx,skb %p,t %p),p %p,r %p,b %p\n",
441 tp, fh, skb, t, p, r, b); 441 tp, fh, skb, t, p, r, b);
442 pr_debug("p->perfect %p p->h %p\n", p->perfect, p->h); 442 pr_debug("p->perfect %p p->h %p\n", p->perfect, p->h);
443 rta = (struct rtattr *) b; 443 nla = (struct nlattr *) b;
444 RTA_PUT(skb, TCA_OPTIONS, 0, NULL); 444 NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
445 if (!fh) { 445 if (!fh) {
446 t->tcm_handle = ~0; /* whatever ... */ 446 t->tcm_handle = ~0; /* whatever ... */
447 RTA_PUT(skb, TCA_TCINDEX_HASH, sizeof(p->hash), &p->hash); 447 NLA_PUT(skb, TCA_TCINDEX_HASH, sizeof(p->hash), &p->hash);
448 RTA_PUT(skb, TCA_TCINDEX_MASK, sizeof(p->mask), &p->mask); 448 NLA_PUT(skb, TCA_TCINDEX_MASK, sizeof(p->mask), &p->mask);
449 RTA_PUT(skb, TCA_TCINDEX_SHIFT, sizeof(p->shift), &p->shift); 449 NLA_PUT(skb, TCA_TCINDEX_SHIFT, sizeof(p->shift), &p->shift);
450 RTA_PUT(skb, TCA_TCINDEX_FALL_THROUGH, sizeof(p->fall_through), 450 NLA_PUT(skb, TCA_TCINDEX_FALL_THROUGH, sizeof(p->fall_through),
451 &p->fall_through); 451 &p->fall_through);
452 rta->rta_len = skb_tail_pointer(skb) - b; 452 nla->nla_len = skb_tail_pointer(skb) - b;
453 } else { 453 } else {
454 if (p->perfect) { 454 if (p->perfect) {
455 t->tcm_handle = r-p->perfect; 455 t->tcm_handle = r-p->perfect;
@@ -468,19 +468,19 @@ static int tcindex_dump(struct tcf_proto *tp, unsigned long fh,
468 } 468 }
469 pr_debug("handle = %d\n", t->tcm_handle); 469 pr_debug("handle = %d\n", t->tcm_handle);
470 if (r->res.class) 470 if (r->res.class)
471 RTA_PUT(skb, TCA_TCINDEX_CLASSID, 4, &r->res.classid); 471 NLA_PUT(skb, TCA_TCINDEX_CLASSID, 4, &r->res.classid);
472 472
473 if (tcf_exts_dump(skb, &r->exts, &tcindex_ext_map) < 0) 473 if (tcf_exts_dump(skb, &r->exts, &tcindex_ext_map) < 0)
474 goto rtattr_failure; 474 goto nla_put_failure;
475 rta->rta_len = skb_tail_pointer(skb) - b; 475 nla->nla_len = skb_tail_pointer(skb) - b;
476 476
477 if (tcf_exts_dump_stats(skb, &r->exts, &tcindex_ext_map) < 0) 477 if (tcf_exts_dump_stats(skb, &r->exts, &tcindex_ext_map) < 0)
478 goto rtattr_failure; 478 goto nla_put_failure;
479 } 479 }
480 480
481 return skb->len; 481 return skb->len;
482 482
483rtattr_failure: 483nla_put_failure:
484 nlmsg_trim(skb, b); 484 nlmsg_trim(skb, b);
485 return -1; 485 return -1;
486} 486}
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index 7bf3cd4e7318..aaf5049f951c 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -462,8 +462,8 @@ static u32 gen_new_kid(struct tc_u_hnode *ht, u32 handle)
462 462
463static int u32_set_parms(struct tcf_proto *tp, unsigned long base, 463static int u32_set_parms(struct tcf_proto *tp, unsigned long base,
464 struct tc_u_hnode *ht, 464 struct tc_u_hnode *ht,
465 struct tc_u_knode *n, struct rtattr **tb, 465 struct tc_u_knode *n, struct nlattr **tb,
466 struct rtattr *est) 466 struct nlattr *est)
467{ 467{
468 int err; 468 int err;
469 struct tcf_exts e; 469 struct tcf_exts e;
@@ -473,8 +473,8 @@ static int u32_set_parms(struct tcf_proto *tp, unsigned long base,
473 return err; 473 return err;
474 474
475 err = -EINVAL; 475 err = -EINVAL;
476 if (tb[TCA_U32_LINK-1]) { 476 if (tb[TCA_U32_LINK]) {
477 u32 handle = *(u32*)RTA_DATA(tb[TCA_U32_LINK-1]); 477 u32 handle = *(u32*)nla_data(tb[TCA_U32_LINK]);
478 struct tc_u_hnode *ht_down = NULL; 478 struct tc_u_hnode *ht_down = NULL;
479 479
480 if (TC_U32_KEY(handle)) 480 if (TC_U32_KEY(handle))
@@ -495,14 +495,14 @@ static int u32_set_parms(struct tcf_proto *tp, unsigned long base,
495 if (ht_down) 495 if (ht_down)
496 ht_down->refcnt--; 496 ht_down->refcnt--;
497 } 497 }
498 if (tb[TCA_U32_CLASSID-1]) { 498 if (tb[TCA_U32_CLASSID]) {
499 n->res.classid = *(u32*)RTA_DATA(tb[TCA_U32_CLASSID-1]); 499 n->res.classid = *(u32*)nla_data(tb[TCA_U32_CLASSID]);
500 tcf_bind_filter(tp, &n->res, base); 500 tcf_bind_filter(tp, &n->res, base);
501 } 501 }
502 502
503#ifdef CONFIG_NET_CLS_IND 503#ifdef CONFIG_NET_CLS_IND
504 if (tb[TCA_U32_INDEV-1]) { 504 if (tb[TCA_U32_INDEV]) {
505 err = tcf_change_indev(tp, n->indev, tb[TCA_U32_INDEV-1]); 505 err = tcf_change_indev(tp, n->indev, tb[TCA_U32_INDEV]);
506 if (err < 0) 506 if (err < 0)
507 goto errout; 507 goto errout;
508 } 508 }
@@ -516,33 +516,33 @@ errout:
516} 516}
517 517
518static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, 518static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
519 struct rtattr **tca, 519 struct nlattr **tca,
520 unsigned long *arg) 520 unsigned long *arg)
521{ 521{
522 struct tc_u_common *tp_c = tp->data; 522 struct tc_u_common *tp_c = tp->data;
523 struct tc_u_hnode *ht; 523 struct tc_u_hnode *ht;
524 struct tc_u_knode *n; 524 struct tc_u_knode *n;
525 struct tc_u32_sel *s; 525 struct tc_u32_sel *s;
526 struct rtattr *opt = tca[TCA_OPTIONS-1]; 526 struct nlattr *opt = tca[TCA_OPTIONS];
527 struct rtattr *tb[TCA_U32_MAX]; 527 struct nlattr *tb[TCA_U32_MAX + 1];
528 u32 htid; 528 u32 htid;
529 int err; 529 int err;
530 530
531 if (opt == NULL) 531 if (opt == NULL)
532 return handle ? -EINVAL : 0; 532 return handle ? -EINVAL : 0;
533 533
534 if (rtattr_parse_nested(tb, TCA_U32_MAX, opt) < 0) 534 if (nla_parse_nested(tb, TCA_U32_MAX, opt, NULL) < 0)
535 return -EINVAL; 535 return -EINVAL;
536 536
537 if ((n = (struct tc_u_knode*)*arg) != NULL) { 537 if ((n = (struct tc_u_knode*)*arg) != NULL) {
538 if (TC_U32_KEY(n->handle) == 0) 538 if (TC_U32_KEY(n->handle) == 0)
539 return -EINVAL; 539 return -EINVAL;
540 540
541 return u32_set_parms(tp, base, n->ht_up, n, tb, tca[TCA_RATE-1]); 541 return u32_set_parms(tp, base, n->ht_up, n, tb, tca[TCA_RATE]);
542 } 542 }
543 543
544 if (tb[TCA_U32_DIVISOR-1]) { 544 if (tb[TCA_U32_DIVISOR]) {
545 unsigned divisor = *(unsigned*)RTA_DATA(tb[TCA_U32_DIVISOR-1]); 545 unsigned divisor = *(unsigned*)nla_data(tb[TCA_U32_DIVISOR]);
546 546
547 if (--divisor > 0x100) 547 if (--divisor > 0x100)
548 return -EINVAL; 548 return -EINVAL;
@@ -567,8 +567,8 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
567 return 0; 567 return 0;
568 } 568 }
569 569
570 if (tb[TCA_U32_HASH-1]) { 570 if (tb[TCA_U32_HASH]) {
571 htid = *(unsigned*)RTA_DATA(tb[TCA_U32_HASH-1]); 571 htid = *(unsigned*)nla_data(tb[TCA_U32_HASH]);
572 if (TC_U32_HTID(htid) == TC_U32_ROOT) { 572 if (TC_U32_HTID(htid) == TC_U32_ROOT) {
573 ht = tp->root; 573 ht = tp->root;
574 htid = ht->handle; 574 htid = ht->handle;
@@ -592,11 +592,11 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
592 } else 592 } else
593 handle = gen_new_kid(ht, htid); 593 handle = gen_new_kid(ht, htid);
594 594
595 if (tb[TCA_U32_SEL-1] == NULL || 595 if (tb[TCA_U32_SEL] == NULL ||
596 RTA_PAYLOAD(tb[TCA_U32_SEL-1]) < sizeof(struct tc_u32_sel)) 596 nla_len(tb[TCA_U32_SEL]) < sizeof(struct tc_u32_sel))
597 return -EINVAL; 597 return -EINVAL;
598 598
599 s = RTA_DATA(tb[TCA_U32_SEL-1]); 599 s = nla_data(tb[TCA_U32_SEL]);
600 600
601 n = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL); 601 n = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL);
602 if (n == NULL) 602 if (n == NULL)
@@ -616,23 +616,23 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
616 n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0; 616 n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0;
617 617
618#ifdef CONFIG_CLS_U32_MARK 618#ifdef CONFIG_CLS_U32_MARK
619 if (tb[TCA_U32_MARK-1]) { 619 if (tb[TCA_U32_MARK]) {
620 struct tc_u32_mark *mark; 620 struct tc_u32_mark *mark;
621 621
622 if (RTA_PAYLOAD(tb[TCA_U32_MARK-1]) < sizeof(struct tc_u32_mark)) { 622 if (nla_len(tb[TCA_U32_MARK]) < sizeof(struct tc_u32_mark)) {
623#ifdef CONFIG_CLS_U32_PERF 623#ifdef CONFIG_CLS_U32_PERF
624 kfree(n->pf); 624 kfree(n->pf);
625#endif 625#endif
626 kfree(n); 626 kfree(n);
627 return -EINVAL; 627 return -EINVAL;
628 } 628 }
629 mark = RTA_DATA(tb[TCA_U32_MARK-1]); 629 mark = nla_data(tb[TCA_U32_MARK]);
630 memcpy(&n->mark, mark, sizeof(struct tc_u32_mark)); 630 memcpy(&n->mark, mark, sizeof(struct tc_u32_mark));
631 n->mark.success = 0; 631 n->mark.success = 0;
632 } 632 }
633#endif 633#endif
634 634
635 err = u32_set_parms(tp, base, ht, n, tb, tca[TCA_RATE-1]); 635 err = u32_set_parms(tp, base, ht, n, tb, tca[TCA_RATE]);
636 if (err == 0) { 636 if (err == 0) {
637 struct tc_u_knode **ins; 637 struct tc_u_knode **ins;
638 for (ins = &ht->ht[TC_U32_HASH(handle)]; *ins; ins = &(*ins)->next) 638 for (ins = &ht->ht[TC_U32_HASH(handle)]; *ins; ins = &(*ins)->next)
@@ -694,59 +694,59 @@ static int u32_dump(struct tcf_proto *tp, unsigned long fh,
694{ 694{
695 struct tc_u_knode *n = (struct tc_u_knode*)fh; 695 struct tc_u_knode *n = (struct tc_u_knode*)fh;
696 unsigned char *b = skb_tail_pointer(skb); 696 unsigned char *b = skb_tail_pointer(skb);
697 struct rtattr *rta; 697 struct nlattr *nla;
698 698
699 if (n == NULL) 699 if (n == NULL)
700 return skb->len; 700 return skb->len;
701 701
702 t->tcm_handle = n->handle; 702 t->tcm_handle = n->handle;
703 703
704 rta = (struct rtattr*)b; 704 nla = (struct nlattr*)b;
705 RTA_PUT(skb, TCA_OPTIONS, 0, NULL); 705 NLA_PUT(skb, TCA_OPTIONS, 0, NULL);
706 706
707 if (TC_U32_KEY(n->handle) == 0) { 707 if (TC_U32_KEY(n->handle) == 0) {
708 struct tc_u_hnode *ht = (struct tc_u_hnode*)fh; 708 struct tc_u_hnode *ht = (struct tc_u_hnode*)fh;
709 u32 divisor = ht->divisor+1; 709 u32 divisor = ht->divisor+1;
710 RTA_PUT(skb, TCA_U32_DIVISOR, 4, &divisor); 710 NLA_PUT(skb, TCA_U32_DIVISOR, 4, &divisor);
711 } else { 711 } else {
712 RTA_PUT(skb, TCA_U32_SEL, 712 NLA_PUT(skb, TCA_U32_SEL,
713 sizeof(n->sel) + n->sel.nkeys*sizeof(struct tc_u32_key), 713 sizeof(n->sel) + n->sel.nkeys*sizeof(struct tc_u32_key),
714 &n->sel); 714 &n->sel);
715 if (n->ht_up) { 715 if (n->ht_up) {
716 u32 htid = n->handle & 0xFFFFF000; 716 u32 htid = n->handle & 0xFFFFF000;
717 RTA_PUT(skb, TCA_U32_HASH, 4, &htid); 717 NLA_PUT(skb, TCA_U32_HASH, 4, &htid);
718 } 718 }
719 if (n->res.classid) 719 if (n->res.classid)
720 RTA_PUT(skb, TCA_U32_CLASSID, 4, &n->res.classid); 720 NLA_PUT(skb, TCA_U32_CLASSID, 4, &n->res.classid);
721 if (n->ht_down) 721 if (n->ht_down)
722 RTA_PUT(skb, TCA_U32_LINK, 4, &n->ht_down->handle); 722 NLA_PUT(skb, TCA_U32_LINK, 4, &n->ht_down->handle);
723 723
724#ifdef CONFIG_CLS_U32_MARK 724#ifdef CONFIG_CLS_U32_MARK
725 if (n->mark.val || n->mark.mask) 725 if (n->mark.val || n->mark.mask)
726 RTA_PUT(skb, TCA_U32_MARK, sizeof(n->mark), &n->mark); 726 NLA_PUT(skb, TCA_U32_MARK, sizeof(n->mark), &n->mark);
727#endif 727#endif
728 728
729 if (tcf_exts_dump(skb, &n->exts, &u32_ext_map) < 0) 729 if (tcf_exts_dump(skb, &n->exts, &u32_ext_map) < 0)
730 goto rtattr_failure; 730 goto nla_put_failure;
731 731
732#ifdef CONFIG_NET_CLS_IND 732#ifdef CONFIG_NET_CLS_IND
733 if(strlen(n->indev)) 733 if(strlen(n->indev))
734 RTA_PUT(skb, TCA_U32_INDEV, IFNAMSIZ, n->indev); 734 NLA_PUT(skb, TCA_U32_INDEV, IFNAMSIZ, n->indev);
735#endif 735#endif
736#ifdef CONFIG_CLS_U32_PERF 736#ifdef CONFIG_CLS_U32_PERF
737 RTA_PUT(skb, TCA_U32_PCNT, 737 NLA_PUT(skb, TCA_U32_PCNT,
738 sizeof(struct tc_u32_pcnt) + n->sel.nkeys*sizeof(u64), 738 sizeof(struct tc_u32_pcnt) + n->sel.nkeys*sizeof(u64),
739 n->pf); 739 n->pf);
740#endif 740#endif
741 } 741 }
742 742
743 rta->rta_len = skb_tail_pointer(skb) - b; 743 nla->nla_len = skb_tail_pointer(skb) - b;
744 if (TC_U32_KEY(n->handle)) 744 if (TC_U32_KEY(n->handle))
745 if (tcf_exts_dump_stats(skb, &n->exts, &u32_ext_map) < 0) 745 if (tcf_exts_dump_stats(skb, &n->exts, &u32_ext_map) < 0)
746 goto rtattr_failure; 746 goto nla_put_failure;
747 return skb->len; 747 return skb->len;
748 748
749rtattr_failure: 749nla_put_failure:
750 nlmsg_trim(skb, b); 750 nlmsg_trim(skb, b);
751 return -1; 751 return -1;
752} 752}
diff --git a/net/sched/em_meta.c b/net/sched/em_meta.c
index ceda8890ab0e..92b6863e928d 100644
--- a/net/sched/em_meta.c
+++ b/net/sched/em_meta.c
@@ -542,11 +542,11 @@ static int meta_var_compare(struct meta_obj *a, struct meta_obj *b)
542 return r; 542 return r;
543} 543}
544 544
545static int meta_var_change(struct meta_value *dst, struct rtattr *rta) 545static int meta_var_change(struct meta_value *dst, struct nlattr *nla)
546{ 546{
547 int len = RTA_PAYLOAD(rta); 547 int len = nla_len(nla);
548 548
549 dst->val = (unsigned long)kmemdup(RTA_DATA(rta), len, GFP_KERNEL); 549 dst->val = (unsigned long)kmemdup(nla_data(nla), len, GFP_KERNEL);
550 if (dst->val == 0UL) 550 if (dst->val == 0UL)
551 return -ENOMEM; 551 return -ENOMEM;
552 dst->len = len; 552 dst->len = len;
@@ -570,10 +570,10 @@ static void meta_var_apply_extras(struct meta_value *v,
570static int meta_var_dump(struct sk_buff *skb, struct meta_value *v, int tlv) 570static int meta_var_dump(struct sk_buff *skb, struct meta_value *v, int tlv)
571{ 571{
572 if (v->val && v->len) 572 if (v->val && v->len)
573 RTA_PUT(skb, tlv, v->len, (void *) v->val); 573 NLA_PUT(skb, tlv, v->len, (void *) v->val);
574 return 0; 574 return 0;
575 575
576rtattr_failure: 576nla_put_failure:
577 return -1; 577 return -1;
578} 578}
579 579
@@ -594,13 +594,13 @@ static int meta_int_compare(struct meta_obj *a, struct meta_obj *b)
594 return 1; 594 return 1;
595} 595}
596 596
597static int meta_int_change(struct meta_value *dst, struct rtattr *rta) 597static int meta_int_change(struct meta_value *dst, struct nlattr *nla)
598{ 598{
599 if (RTA_PAYLOAD(rta) >= sizeof(unsigned long)) { 599 if (nla_len(nla) >= sizeof(unsigned long)) {
600 dst->val = *(unsigned long *) RTA_DATA(rta); 600 dst->val = *(unsigned long *) nla_data(nla);
601 dst->len = sizeof(unsigned long); 601 dst->len = sizeof(unsigned long);
602 } else if (RTA_PAYLOAD(rta) == sizeof(u32)) { 602 } else if (nla_len(nla) == sizeof(u32)) {
603 dst->val = *(u32 *) RTA_DATA(rta); 603 dst->val = *(u32 *) nla_data(nla);
604 dst->len = sizeof(u32); 604 dst->len = sizeof(u32);
605 } else 605 } else
606 return -EINVAL; 606 return -EINVAL;
@@ -621,15 +621,15 @@ static void meta_int_apply_extras(struct meta_value *v,
621static int meta_int_dump(struct sk_buff *skb, struct meta_value *v, int tlv) 621static int meta_int_dump(struct sk_buff *skb, struct meta_value *v, int tlv)
622{ 622{
623 if (v->len == sizeof(unsigned long)) 623 if (v->len == sizeof(unsigned long))
624 RTA_PUT(skb, tlv, sizeof(unsigned long), &v->val); 624 NLA_PUT(skb, tlv, sizeof(unsigned long), &v->val);
625 else if (v->len == sizeof(u32)) { 625 else if (v->len == sizeof(u32)) {
626 u32 d = v->val; 626 u32 d = v->val;
627 RTA_PUT(skb, tlv, sizeof(d), &d); 627 NLA_PUT(skb, tlv, sizeof(d), &d);
628 } 628 }
629 629
630 return 0; 630 return 0;
631 631
632rtattr_failure: 632nla_put_failure:
633 return -1; 633 return -1;
634} 634}
635 635
@@ -641,7 +641,7 @@ struct meta_type_ops
641{ 641{
642 void (*destroy)(struct meta_value *); 642 void (*destroy)(struct meta_value *);
643 int (*compare)(struct meta_obj *, struct meta_obj *); 643 int (*compare)(struct meta_obj *, struct meta_obj *);
644 int (*change)(struct meta_value *, struct rtattr *); 644 int (*change)(struct meta_value *, struct nlattr *);
645 void (*apply_extras)(struct meta_value *, struct meta_obj *); 645 void (*apply_extras)(struct meta_value *, struct meta_obj *);
646 int (*dump)(struct sk_buff *, struct meta_value *, int); 646 int (*dump)(struct sk_buff *, struct meta_value *, int);
647}; 647};
@@ -729,13 +729,13 @@ static inline void meta_delete(struct meta_match *meta)
729 kfree(meta); 729 kfree(meta);
730} 730}
731 731
732static inline int meta_change_data(struct meta_value *dst, struct rtattr *rta) 732static inline int meta_change_data(struct meta_value *dst, struct nlattr *nla)
733{ 733{
734 if (rta) { 734 if (nla) {
735 if (RTA_PAYLOAD(rta) == 0) 735 if (nla_len(nla) == 0)
736 return -EINVAL; 736 return -EINVAL;
737 737
738 return meta_type_ops(dst)->change(dst, rta); 738 return meta_type_ops(dst)->change(dst, nla);
739 } 739 }
740 740
741 return 0; 741 return 0;
@@ -750,17 +750,17 @@ static int em_meta_change(struct tcf_proto *tp, void *data, int len,
750 struct tcf_ematch *m) 750 struct tcf_ematch *m)
751{ 751{
752 int err = -EINVAL; 752 int err = -EINVAL;
753 struct rtattr *tb[TCA_EM_META_MAX]; 753 struct nlattr *tb[TCA_EM_META_MAX + 1];
754 struct tcf_meta_hdr *hdr; 754 struct tcf_meta_hdr *hdr;
755 struct meta_match *meta = NULL; 755 struct meta_match *meta = NULL;
756 756
757 if (rtattr_parse(tb, TCA_EM_META_MAX, data, len) < 0) 757 if (nla_parse(tb, TCA_EM_META_MAX, data, len, NULL) < 0)
758 goto errout; 758 goto errout;
759 759
760 if (tb[TCA_EM_META_HDR-1] == NULL || 760 if (tb[TCA_EM_META_HDR] == NULL ||
761 RTA_PAYLOAD(tb[TCA_EM_META_HDR-1]) < sizeof(*hdr)) 761 nla_len(tb[TCA_EM_META_HDR]) < sizeof(*hdr))
762 goto errout; 762 goto errout;
763 hdr = RTA_DATA(tb[TCA_EM_META_HDR-1]); 763 hdr = nla_data(tb[TCA_EM_META_HDR]);
764 764
765 if (TCF_META_TYPE(hdr->left.kind) != TCF_META_TYPE(hdr->right.kind) || 765 if (TCF_META_TYPE(hdr->left.kind) != TCF_META_TYPE(hdr->right.kind) ||
766 TCF_META_TYPE(hdr->left.kind) > TCF_META_TYPE_MAX || 766 TCF_META_TYPE(hdr->left.kind) > TCF_META_TYPE_MAX ||
@@ -781,8 +781,8 @@ static int em_meta_change(struct tcf_proto *tp, void *data, int len,
781 goto errout; 781 goto errout;
782 } 782 }
783 783
784 if (meta_change_data(&meta->lvalue, tb[TCA_EM_META_LVALUE-1]) < 0 || 784 if (meta_change_data(&meta->lvalue, tb[TCA_EM_META_LVALUE]) < 0 ||
785 meta_change_data(&meta->rvalue, tb[TCA_EM_META_RVALUE-1]) < 0) 785 meta_change_data(&meta->rvalue, tb[TCA_EM_META_RVALUE]) < 0)
786 goto errout; 786 goto errout;
787 787
788 m->datalen = sizeof(*meta); 788 m->datalen = sizeof(*meta);
@@ -811,16 +811,16 @@ static int em_meta_dump(struct sk_buff *skb, struct tcf_ematch *em)
811 memcpy(&hdr.left, &meta->lvalue.hdr, sizeof(hdr.left)); 811 memcpy(&hdr.left, &meta->lvalue.hdr, sizeof(hdr.left));
812 memcpy(&hdr.right, &meta->rvalue.hdr, sizeof(hdr.right)); 812 memcpy(&hdr.right, &meta->rvalue.hdr, sizeof(hdr.right));
813 813
814 RTA_PUT(skb, TCA_EM_META_HDR, sizeof(hdr), &hdr); 814 NLA_PUT(skb, TCA_EM_META_HDR, sizeof(hdr), &hdr);
815 815
816 ops = meta_type_ops(&meta->lvalue); 816 ops = meta_type_ops(&meta->lvalue);
817 if (ops->dump(skb, &meta->lvalue, TCA_EM_META_LVALUE) < 0 || 817 if (ops->dump(skb, &meta->lvalue, TCA_EM_META_LVALUE) < 0 ||
818 ops->dump(skb, &meta->rvalue, TCA_EM_META_RVALUE) < 0) 818 ops->dump(skb, &meta->rvalue, TCA_EM_META_RVALUE) < 0)
819 goto rtattr_failure; 819 goto nla_put_failure;
820 820
821 return 0; 821 return 0;
822 822
823rtattr_failure: 823nla_put_failure:
824 return -1; 824 return -1;
825} 825}
826 826
diff --git a/net/sched/em_text.c b/net/sched/em_text.c
index d5cd86efb7d0..853c5ead87fd 100644
--- a/net/sched/em_text.c
+++ b/net/sched/em_text.c
@@ -118,11 +118,14 @@ static int em_text_dump(struct sk_buff *skb, struct tcf_ematch *m)
118 conf.pattern_len = textsearch_get_pattern_len(tm->config); 118 conf.pattern_len = textsearch_get_pattern_len(tm->config);
119 conf.pad = 0; 119 conf.pad = 0;
120 120
121 RTA_PUT_NOHDR(skb, sizeof(conf), &conf); 121 if (nla_put_nohdr(skb, sizeof(conf), &conf) < 0)
122 RTA_APPEND(skb, conf.pattern_len, textsearch_get_pattern(tm->config)); 122 goto nla_put_failure;
123 if (nla_append(skb, conf.pattern_len,
124 textsearch_get_pattern(tm->config)) < 0)
125 goto nla_put_failure;
123 return 0; 126 return 0;
124 127
125rtattr_failure: 128nla_put_failure:
126 return -1; 129 return -1;
127} 130}
128 131
diff --git a/net/sched/ematch.c b/net/sched/ematch.c
index 27941cfc0ab5..72d9b2735245 100644
--- a/net/sched/ematch.c
+++ b/net/sched/ematch.c
@@ -183,11 +183,11 @@ static inline struct tcf_ematch * tcf_em_get_match(struct tcf_ematch_tree *tree,
183 183
184static int tcf_em_validate(struct tcf_proto *tp, 184static int tcf_em_validate(struct tcf_proto *tp,
185 struct tcf_ematch_tree_hdr *tree_hdr, 185 struct tcf_ematch_tree_hdr *tree_hdr,
186 struct tcf_ematch *em, struct rtattr *rta, int idx) 186 struct tcf_ematch *em, struct nlattr *nla, int idx)
187{ 187{
188 int err = -EINVAL; 188 int err = -EINVAL;
189 struct tcf_ematch_hdr *em_hdr = RTA_DATA(rta); 189 struct tcf_ematch_hdr *em_hdr = nla_data(nla);
190 int data_len = RTA_PAYLOAD(rta) - sizeof(*em_hdr); 190 int data_len = nla_len(nla) - sizeof(*em_hdr);
191 void *data = (void *) em_hdr + sizeof(*em_hdr); 191 void *data = (void *) em_hdr + sizeof(*em_hdr);
192 192
193 if (!TCF_EM_REL_VALID(em_hdr->flags)) 193 if (!TCF_EM_REL_VALID(em_hdr->flags))
@@ -286,11 +286,11 @@ errout:
286 * tcf_em_tree_validate - validate ematch config TLV and build ematch tree 286 * tcf_em_tree_validate - validate ematch config TLV and build ematch tree
287 * 287 *
288 * @tp: classifier kind handle 288 * @tp: classifier kind handle
289 * @rta: ematch tree configuration TLV 289 * @nla: ematch tree configuration TLV
290 * @tree: destination ematch tree variable to store the resulting 290 * @tree: destination ematch tree variable to store the resulting
291 * ematch tree. 291 * ematch tree.
292 * 292 *
293 * This function validates the given configuration TLV @rta and builds an 293 * This function validates the given configuration TLV @nla and builds an
294 * ematch tree in @tree. The resulting tree must later be copied into 294 * ematch tree in @tree. The resulting tree must later be copied into
295 * the private classifier data using tcf_em_tree_change(). You MUST NOT 295 * the private classifier data using tcf_em_tree_change(). You MUST NOT
296 * provide the ematch tree variable of the private classifier data directly, 296 * provide the ematch tree variable of the private classifier data directly,
@@ -298,45 +298,45 @@ errout:
298 * 298 *
299 * Returns a negative error code if the configuration TLV contains errors. 299 * Returns a negative error code if the configuration TLV contains errors.
300 */ 300 */
301int tcf_em_tree_validate(struct tcf_proto *tp, struct rtattr *rta, 301int tcf_em_tree_validate(struct tcf_proto *tp, struct nlattr *nla,
302 struct tcf_ematch_tree *tree) 302 struct tcf_ematch_tree *tree)
303{ 303{
304 int idx, list_len, matches_len, err = -EINVAL; 304 int idx, list_len, matches_len, err = -EINVAL;
305 struct rtattr *tb[TCA_EMATCH_TREE_MAX]; 305 struct nlattr *tb[TCA_EMATCH_TREE_MAX + 1];
306 struct rtattr *rt_match, *rt_hdr, *rt_list; 306 struct nlattr *rt_match, *rt_hdr, *rt_list;
307 struct tcf_ematch_tree_hdr *tree_hdr; 307 struct tcf_ematch_tree_hdr *tree_hdr;
308 struct tcf_ematch *em; 308 struct tcf_ematch *em;
309 309
310 if (!rta) { 310 if (!nla) {
311 memset(tree, 0, sizeof(*tree)); 311 memset(tree, 0, sizeof(*tree));
312 return 0; 312 return 0;
313 } 313 }
314 314
315 if (rtattr_parse_nested(tb, TCA_EMATCH_TREE_MAX, rta) < 0) 315 if (nla_parse_nested(tb, TCA_EMATCH_TREE_MAX, nla, NULL) < 0)
316 goto errout; 316 goto errout;
317 317
318 rt_hdr = tb[TCA_EMATCH_TREE_HDR-1]; 318 rt_hdr = tb[TCA_EMATCH_TREE_HDR];
319 rt_list = tb[TCA_EMATCH_TREE_LIST-1]; 319 rt_list = tb[TCA_EMATCH_TREE_LIST];
320 320
321 if (rt_hdr == NULL || rt_list == NULL) 321 if (rt_hdr == NULL || rt_list == NULL)
322 goto errout; 322 goto errout;
323 323
324 if (RTA_PAYLOAD(rt_hdr) < sizeof(*tree_hdr) || 324 if (nla_len(rt_hdr) < sizeof(*tree_hdr) ||
325 RTA_PAYLOAD(rt_list) < sizeof(*rt_match)) 325 nla_len(rt_list) < sizeof(*rt_match))
326 goto errout; 326 goto errout;
327 327
328 tree_hdr = RTA_DATA(rt_hdr); 328 tree_hdr = nla_data(rt_hdr);
329 memcpy(&tree->hdr, tree_hdr, sizeof(*tree_hdr)); 329 memcpy(&tree->hdr, tree_hdr, sizeof(*tree_hdr));
330 330
331 rt_match = RTA_DATA(rt_list); 331 rt_match = nla_data(rt_list);
332 list_len = RTA_PAYLOAD(rt_list); 332 list_len = nla_len(rt_list);
333 matches_len = tree_hdr->nmatches * sizeof(*em); 333 matches_len = tree_hdr->nmatches * sizeof(*em);
334 334
335 tree->matches = kzalloc(matches_len, GFP_KERNEL); 335 tree->matches = kzalloc(matches_len, GFP_KERNEL);
336 if (tree->matches == NULL) 336 if (tree->matches == NULL)
337 goto errout; 337 goto errout;
338 338
339 /* We do not use rtattr_parse_nested here because the maximum 339 /* We do not use nla_parse_nested here because the maximum
340 * number of attributes is unknown. This saves us the allocation 340 * number of attributes is unknown. This saves us the allocation
341 * for a tb buffer which would serve no purpose at all. 341 * for a tb buffer which would serve no purpose at all.
342 * 342 *
@@ -344,16 +344,16 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct rtattr *rta,
344 * provided, their type must be incremental from 1 to n. Even 344 * provided, their type must be incremental from 1 to n. Even
345 * if it does not serve any real purpose, a failure of sticking 345 * if it does not serve any real purpose, a failure of sticking
346 * to this policy will result in parsing failure. */ 346 * to this policy will result in parsing failure. */
347 for (idx = 0; RTA_OK(rt_match, list_len); idx++) { 347 for (idx = 0; nla_ok(rt_match, list_len); idx++) {
348 err = -EINVAL; 348 err = -EINVAL;
349 349
350 if (rt_match->rta_type != (idx + 1)) 350 if (rt_match->nla_type != (idx + 1))
351 goto errout_abort; 351 goto errout_abort;
352 352
353 if (idx >= tree_hdr->nmatches) 353 if (idx >= tree_hdr->nmatches)
354 goto errout_abort; 354 goto errout_abort;
355 355
356 if (RTA_PAYLOAD(rt_match) < sizeof(struct tcf_ematch_hdr)) 356 if (nla_len(rt_match) < sizeof(struct tcf_ematch_hdr))
357 goto errout_abort; 357 goto errout_abort;
358 358
359 em = tcf_em_get_match(tree, idx); 359 em = tcf_em_get_match(tree, idx);
@@ -362,7 +362,7 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct rtattr *rta,
362 if (err < 0) 362 if (err < 0)
363 goto errout_abort; 363 goto errout_abort;
364 364
365 rt_match = RTA_NEXT(rt_match, list_len); 365 rt_match = nla_next(rt_match, &list_len);
366 } 366 }
367 367
368 /* Check if the number of matches provided by userspace actually 368 /* Check if the number of matches provided by userspace actually
@@ -434,18 +434,18 @@ int tcf_em_tree_dump(struct sk_buff *skb, struct tcf_ematch_tree *tree, int tlv)
434{ 434{
435 int i; 435 int i;
436 u8 *tail; 436 u8 *tail;
437 struct rtattr *top_start = (struct rtattr *)skb_tail_pointer(skb); 437 struct nlattr *top_start = (struct nlattr *)skb_tail_pointer(skb);
438 struct rtattr *list_start; 438 struct nlattr *list_start;
439 439
440 RTA_PUT(skb, tlv, 0, NULL); 440 NLA_PUT(skb, tlv, 0, NULL);
441 RTA_PUT(skb, TCA_EMATCH_TREE_HDR, sizeof(tree->hdr), &tree->hdr); 441 NLA_PUT(skb, TCA_EMATCH_TREE_HDR, sizeof(tree->hdr), &tree->hdr);
442 442
443 list_start = (struct rtattr *)skb_tail_pointer(skb); 443 list_start = (struct nlattr *)skb_tail_pointer(skb);
444 RTA_PUT(skb, TCA_EMATCH_TREE_LIST, 0, NULL); 444 NLA_PUT(skb, TCA_EMATCH_TREE_LIST, 0, NULL);
445 445
446 tail = skb_tail_pointer(skb); 446 tail = skb_tail_pointer(skb);
447 for (i = 0; i < tree->hdr.nmatches; i++) { 447 for (i = 0; i < tree->hdr.nmatches; i++) {
448 struct rtattr *match_start = (struct rtattr *)tail; 448 struct nlattr *match_start = (struct nlattr *)tail;
449 struct tcf_ematch *em = tcf_em_get_match(tree, i); 449 struct tcf_ematch *em = tcf_em_get_match(tree, i);
450 struct tcf_ematch_hdr em_hdr = { 450 struct tcf_ematch_hdr em_hdr = {
451 .kind = em->ops ? em->ops->kind : TCF_EM_CONTAINER, 451 .kind = em->ops ? em->ops->kind : TCF_EM_CONTAINER,
@@ -453,27 +453,27 @@ int tcf_em_tree_dump(struct sk_buff *skb, struct tcf_ematch_tree *tree, int tlv)
453 .flags = em->flags 453 .flags = em->flags
454 }; 454 };
455 455
456 RTA_PUT(skb, i+1, sizeof(em_hdr), &em_hdr); 456 NLA_PUT(skb, i+1, sizeof(em_hdr), &em_hdr);
457 457
458 if (em->ops && em->ops->dump) { 458 if (em->ops && em->ops->dump) {
459 if (em->ops->dump(skb, em) < 0) 459 if (em->ops->dump(skb, em) < 0)
460 goto rtattr_failure; 460 goto nla_put_failure;
461 } else if (tcf_em_is_container(em) || tcf_em_is_simple(em)) { 461 } else if (tcf_em_is_container(em) || tcf_em_is_simple(em)) {
462 u32 u = em->data; 462 u32 u = em->data;
463 RTA_PUT_NOHDR(skb, sizeof(u), &u); 463 nla_put_nohdr(skb, sizeof(u), &u);
464 } else if (em->datalen > 0) 464 } else if (em->datalen > 0)
465 RTA_PUT_NOHDR(skb, em->datalen, (void *) em->data); 465 nla_put_nohdr(skb, em->datalen, (void *) em->data);
466 466
467 tail = skb_tail_pointer(skb); 467 tail = skb_tail_pointer(skb);
468 match_start->rta_len = tail - (u8 *)match_start; 468 match_start->nla_len = tail - (u8 *)match_start;
469 } 469 }
470 470
471 list_start->rta_len = tail - (u8 *)list_start; 471 list_start->nla_len = tail - (u8 *)list_start;
472 top_start->rta_len = tail - (u8 *)top_start; 472 top_start->nla_len = tail - (u8 *)top_start;
473 473
474 return 0; 474 return 0;
475 475
476rtattr_failure: 476nla_put_failure:
477 return -1; 477 return -1;
478} 478}
479EXPORT_SYMBOL(tcf_em_tree_dump); 479EXPORT_SYMBOL(tcf_em_tree_dump);