]> asedeno.scripts.mit.edu Git - linux.git/blob - net/sched/act_api.c
618695e841901296c58284c84b8210a5f867e8b1
[linux.git] / net / sched / act_api.c
1 /*
2  * net/sched/act_api.c  Packet action API.
3  *
4  *              This program is free software; you can redistribute it and/or
5  *              modify it under the terms of the GNU General Public License
6  *              as published by the Free Software Foundation; either version
7  *              2 of the License, or (at your option) any later version.
8  *
9  * Author:      Jamal Hadi Salim
10  *
11  *
12  */
13
14 #include <linux/types.h>
15 #include <linux/kernel.h>
16 #include <linux/string.h>
17 #include <linux/errno.h>
18 #include <linux/slab.h>
19 #include <linux/skbuff.h>
20 #include <linux/init.h>
21 #include <linux/kmod.h>
22 #include <linux/err.h>
23 #include <linux/module.h>
24 #include <net/net_namespace.h>
25 #include <net/sock.h>
26 #include <net/sch_generic.h>
27 #include <net/act_api.h>
28 #include <net/netlink.h>
29
30 void tcf_hash_destroy(struct tcf_common *p, struct tcf_hashinfo *hinfo)
31 {
32         unsigned int h = tcf_hash(p->tcfc_index, hinfo->hmask);
33         struct tcf_common **p1p;
34
35         for (p1p = &hinfo->htab[h]; *p1p; p1p = &(*p1p)->tcfc_next) {
36                 if (*p1p == p) {
37                         write_lock_bh(hinfo->lock);
38                         *p1p = p->tcfc_next;
39                         write_unlock_bh(hinfo->lock);
40                         gen_kill_estimator(&p->tcfc_bstats,
41                                            &p->tcfc_rate_est);
42                         /*
43                          * gen_estimator est_timer() might access p->tcfc_lock
44                          * or bstats, wait a RCU grace period before freeing p
45                          */
46                         kfree_rcu(p, tcfc_rcu);
47                         return;
48                 }
49         }
50         WARN_ON(1);
51 }
52 EXPORT_SYMBOL(tcf_hash_destroy);
53
54 int tcf_hash_release(struct tcf_common *p, int bind,
55                      struct tcf_hashinfo *hinfo)
56 {
57         int ret = 0;
58
59         if (p) {
60                 if (bind)
61                         p->tcfc_bindcnt--;
62
63                 p->tcfc_refcnt--;
64                 if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) {
65                         tcf_hash_destroy(p, hinfo);
66                         ret = 1;
67                 }
68         }
69         return ret;
70 }
71 EXPORT_SYMBOL(tcf_hash_release);
72
73 static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb,
74                            struct tc_action *a, struct tcf_hashinfo *hinfo)
75 {
76         struct tcf_common *p;
77         int err = 0, index = -1, i = 0, s_i = 0, n_i = 0;
78         struct nlattr *nest;
79
80         read_lock_bh(hinfo->lock);
81
82         s_i = cb->args[0];
83
84         for (i = 0; i < (hinfo->hmask + 1); i++) {
85                 p = hinfo->htab[tcf_hash(i, hinfo->hmask)];
86
87                 for (; p; p = p->tcfc_next) {
88                         index++;
89                         if (index < s_i)
90                                 continue;
91                         a->priv = p;
92                         a->order = n_i;
93
94                         nest = nla_nest_start(skb, a->order);
95                         if (nest == NULL)
96                                 goto nla_put_failure;
97                         err = tcf_action_dump_1(skb, a, 0, 0);
98                         if (err < 0) {
99                                 index--;
100                                 nlmsg_trim(skb, nest);
101                                 goto done;
102                         }
103                         nla_nest_end(skb, nest);
104                         n_i++;
105                         if (n_i >= TCA_ACT_MAX_PRIO)
106                                 goto done;
107                 }
108         }
109 done:
110         read_unlock_bh(hinfo->lock);
111         if (n_i)
112                 cb->args[0] += n_i;
113         return n_i;
114
115 nla_put_failure:
116         nla_nest_cancel(skb, nest);
117         goto done;
118 }
119
120 static int tcf_del_walker(struct sk_buff *skb, struct tc_action *a,
121                           struct tcf_hashinfo *hinfo)
122 {
123         struct tcf_common *p, *s_p;
124         struct nlattr *nest;
125         int i = 0, n_i = 0;
126
127         nest = nla_nest_start(skb, a->order);
128         if (nest == NULL)
129                 goto nla_put_failure;
130         if (nla_put_string(skb, TCA_KIND, a->ops->kind))
131                 goto nla_put_failure;
132         for (i = 0; i < (hinfo->hmask + 1); i++) {
133                 p = hinfo->htab[tcf_hash(i, hinfo->hmask)];
134
135                 while (p != NULL) {
136                         s_p = p->tcfc_next;
137                         if (ACT_P_DELETED == tcf_hash_release(p, 0, hinfo))
138                                 module_put(a->ops->owner);
139                         n_i++;
140                         p = s_p;
141                 }
142         }
143         if (nla_put_u32(skb, TCA_FCNT, n_i))
144                 goto nla_put_failure;
145         nla_nest_end(skb, nest);
146
147         return n_i;
148 nla_put_failure:
149         nla_nest_cancel(skb, nest);
150         return -EINVAL;
151 }
152
153 int tcf_generic_walker(struct sk_buff *skb, struct netlink_callback *cb,
154                        int type, struct tc_action *a)
155 {
156         struct tcf_hashinfo *hinfo = a->ops->hinfo;
157
158         if (type == RTM_DELACTION) {
159                 return tcf_del_walker(skb, a, hinfo);
160         } else if (type == RTM_GETACTION) {
161                 return tcf_dump_walker(skb, cb, a, hinfo);
162         } else {
163                 WARN(1, "tcf_generic_walker: unknown action %d\n", type);
164                 return -EINVAL;
165         }
166 }
167 EXPORT_SYMBOL(tcf_generic_walker);
168
169 struct tcf_common *tcf_hash_lookup(u32 index, struct tcf_hashinfo *hinfo)
170 {
171         struct tcf_common *p;
172
173         read_lock_bh(hinfo->lock);
174         for (p = hinfo->htab[tcf_hash(index, hinfo->hmask)]; p;
175              p = p->tcfc_next) {
176                 if (p->tcfc_index == index)
177                         break;
178         }
179         read_unlock_bh(hinfo->lock);
180
181         return p;
182 }
183 EXPORT_SYMBOL(tcf_hash_lookup);
184
185 u32 tcf_hash_new_index(u32 *idx_gen, struct tcf_hashinfo *hinfo)
186 {
187         u32 val = *idx_gen;
188
189         do {
190                 if (++val == 0)
191                         val = 1;
192         } while (tcf_hash_lookup(val, hinfo));
193
194         return (*idx_gen = val);
195 }
196 EXPORT_SYMBOL(tcf_hash_new_index);
197
198 int tcf_hash_search(struct tc_action *a, u32 index)
199 {
200         struct tcf_hashinfo *hinfo = a->ops->hinfo;
201         struct tcf_common *p = tcf_hash_lookup(index, hinfo);
202
203         if (p) {
204                 a->priv = p;
205                 return 1;
206         }
207         return 0;
208 }
209 EXPORT_SYMBOL(tcf_hash_search);
210
211 struct tcf_common *tcf_hash_check(u32 index, struct tc_action *a, int bind,
212                                   struct tcf_hashinfo *hinfo)
213 {
214         struct tcf_common *p = NULL;
215         if (index && (p = tcf_hash_lookup(index, hinfo)) != NULL) {
216                 if (bind)
217                         p->tcfc_bindcnt++;
218                 p->tcfc_refcnt++;
219                 a->priv = p;
220         }
221         return p;
222 }
223 EXPORT_SYMBOL(tcf_hash_check);
224
225 struct tcf_common *tcf_hash_create(u32 index, struct nlattr *est,
226                                    struct tc_action *a, int size, int bind,
227                                    u32 *idx_gen, struct tcf_hashinfo *hinfo)
228 {
229         struct tcf_common *p = kzalloc(size, GFP_KERNEL);
230
231         if (unlikely(!p))
232                 return ERR_PTR(-ENOMEM);
233         p->tcfc_refcnt = 1;
234         if (bind)
235                 p->tcfc_bindcnt = 1;
236
237         spin_lock_init(&p->tcfc_lock);
238         p->tcfc_index = index ? index : tcf_hash_new_index(idx_gen, hinfo);
239         p->tcfc_tm.install = jiffies;
240         p->tcfc_tm.lastuse = jiffies;
241         if (est) {
242                 int err = gen_new_estimator(&p->tcfc_bstats, &p->tcfc_rate_est,
243                                             &p->tcfc_lock, est);
244                 if (err) {
245                         kfree(p);
246                         return ERR_PTR(err);
247                 }
248         }
249
250         a->priv = (void *) p;
251         return p;
252 }
253 EXPORT_SYMBOL(tcf_hash_create);
254
255 void tcf_hash_insert(struct tcf_common *p, struct tcf_hashinfo *hinfo)
256 {
257         unsigned int h = tcf_hash(p->tcfc_index, hinfo->hmask);
258
259         write_lock_bh(hinfo->lock);
260         p->tcfc_next = hinfo->htab[h];
261         hinfo->htab[h] = p;
262         write_unlock_bh(hinfo->lock);
263 }
264 EXPORT_SYMBOL(tcf_hash_insert);
265
266 static struct tc_action_ops *act_base = NULL;
267 static DEFINE_RWLOCK(act_mod_lock);
268
269 int tcf_register_action(struct tc_action_ops *act)
270 {
271         struct tc_action_ops *a, **ap;
272
273         /* Must supply act, dump, cleanup and init */
274         if (!act->act || !act->dump || !act->cleanup || !act->init)
275                 return -EINVAL;
276
277         write_lock(&act_mod_lock);
278         for (ap = &act_base; (a = *ap) != NULL; ap = &a->next) {
279                 if (act->type == a->type || (strcmp(act->kind, a->kind) == 0)) {
280                         write_unlock(&act_mod_lock);
281                         return -EEXIST;
282                 }
283         }
284         act->next = NULL;
285         *ap = act;
286         write_unlock(&act_mod_lock);
287         return 0;
288 }
289 EXPORT_SYMBOL(tcf_register_action);
290
291 int tcf_unregister_action(struct tc_action_ops *act)
292 {
293         struct tc_action_ops *a, **ap;
294         int err = -ENOENT;
295
296         write_lock(&act_mod_lock);
297         for (ap = &act_base; (a = *ap) != NULL; ap = &a->next)
298                 if (a == act)
299                         break;
300         if (a) {
301                 *ap = a->next;
302                 a->next = NULL;
303                 err = 0;
304         }
305         write_unlock(&act_mod_lock);
306         return err;
307 }
308 EXPORT_SYMBOL(tcf_unregister_action);
309
310 /* lookup by name */
311 static struct tc_action_ops *tc_lookup_action_n(char *kind)
312 {
313         struct tc_action_ops *a = NULL;
314
315         if (kind) {
316                 read_lock(&act_mod_lock);
317                 for (a = act_base; a; a = a->next) {
318                         if (strcmp(kind, a->kind) == 0) {
319                                 if (!try_module_get(a->owner)) {
320                                         read_unlock(&act_mod_lock);
321                                         return NULL;
322                                 }
323                                 break;
324                         }
325                 }
326                 read_unlock(&act_mod_lock);
327         }
328         return a;
329 }
330
331 /* lookup by nlattr */
332 static struct tc_action_ops *tc_lookup_action(struct nlattr *kind)
333 {
334         struct tc_action_ops *a = NULL;
335
336         if (kind) {
337                 read_lock(&act_mod_lock);
338                 for (a = act_base; a; a = a->next) {
339                         if (nla_strcmp(kind, a->kind) == 0) {
340                                 if (!try_module_get(a->owner)) {
341                                         read_unlock(&act_mod_lock);
342                                         return NULL;
343                                 }
344                                 break;
345                         }
346                 }
347                 read_unlock(&act_mod_lock);
348         }
349         return a;
350 }
351
352 #if 0
353 /* lookup by id */
354 static struct tc_action_ops *tc_lookup_action_id(u32 type)
355 {
356         struct tc_action_ops *a = NULL;
357
358         if (type) {
359                 read_lock(&act_mod_lock);
360                 for (a = act_base; a; a = a->next) {
361                         if (a->type == type) {
362                                 if (!try_module_get(a->owner)) {
363                                         read_unlock(&act_mod_lock);
364                                         return NULL;
365                                 }
366                                 break;
367                         }
368                 }
369                 read_unlock(&act_mod_lock);
370         }
371         return a;
372 }
373 #endif
374
375 int tcf_action_exec(struct sk_buff *skb, const struct tc_action *act,
376                     struct tcf_result *res)
377 {
378         const struct tc_action *a;
379         int ret = -1;
380
381         if (skb->tc_verd & TC_NCLS) {
382                 skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
383                 ret = TC_ACT_OK;
384                 goto exec_done;
385         }
386         while ((a = act) != NULL) {
387 repeat:
388                 if (a->ops) {
389                         ret = a->ops->act(skb, a, res);
390                         if (TC_MUNGED & skb->tc_verd) {
391                                 /* copied already, allow trampling */
392                                 skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd);
393                                 skb->tc_verd = CLR_TC_MUNGED(skb->tc_verd);
394                         }
395                         if (ret == TC_ACT_REPEAT)
396                                 goto repeat;    /* we need a ttl - JHS */
397                         if (ret != TC_ACT_PIPE)
398                                 goto exec_done;
399                 }
400                 act = a->next;
401         }
402 exec_done:
403         return ret;
404 }
405 EXPORT_SYMBOL(tcf_action_exec);
406
407 void tcf_action_destroy(struct tc_action *act, int bind)
408 {
409         struct tc_action *a;
410
411         for (a = act; a; a = act) {
412                 if (a->ops) {
413                         if (a->ops->cleanup(a, bind) == ACT_P_DELETED)
414                                 module_put(a->ops->owner);
415                         act = act->next;
416                         kfree(a);
417                 } else {
418                         /*FIXME: Remove later - catch insertion bugs*/
419                         WARN(1, "tcf_action_destroy: BUG? destroying NULL ops\n");
420                         act = act->next;
421                         kfree(a);
422                 }
423         }
424 }
425
426 int
427 tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
428 {
429         int err = -EINVAL;
430
431         if (a->ops == NULL)
432                 return err;
433         return a->ops->dump(skb, a, bind, ref);
434 }
435
436 int
437 tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
438 {
439         int err = -EINVAL;
440         unsigned char *b = skb_tail_pointer(skb);
441         struct nlattr *nest;
442
443         if (a->ops == NULL)
444                 return err;
445
446         if (nla_put_string(skb, TCA_KIND, a->ops->kind))
447                 goto nla_put_failure;
448         if (tcf_action_copy_stats(skb, a, 0))
449                 goto nla_put_failure;
450         nest = nla_nest_start(skb, TCA_OPTIONS);
451         if (nest == NULL)
452                 goto nla_put_failure;
453         err = tcf_action_dump_old(skb, a, bind, ref);
454         if (err > 0) {
455                 nla_nest_end(skb, nest);
456                 return err;
457         }
458
459 nla_put_failure:
460         nlmsg_trim(skb, b);
461         return -1;
462 }
463 EXPORT_SYMBOL(tcf_action_dump_1);
464
465 int
466 tcf_action_dump(struct sk_buff *skb, struct tc_action *act, int bind, int ref)
467 {
468         struct tc_action *a;
469         int err = -EINVAL;
470         struct nlattr *nest;
471
472         while ((a = act) != NULL) {
473                 act = a->next;
474                 nest = nla_nest_start(skb, a->order);
475                 if (nest == NULL)
476                         goto nla_put_failure;
477                 err = tcf_action_dump_1(skb, a, bind, ref);
478                 if (err < 0)
479                         goto errout;
480                 nla_nest_end(skb, nest);
481         }
482
483         return 0;
484
485 nla_put_failure:
486         err = -EINVAL;
487 errout:
488         nla_nest_cancel(skb, nest);
489         return err;
490 }
491
492 struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla,
493                                     struct nlattr *est, char *name, int ovr,
494                                     int bind)
495 {
496         struct tc_action *a;
497         struct tc_action_ops *a_o;
498         char act_name[IFNAMSIZ];
499         struct nlattr *tb[TCA_ACT_MAX + 1];
500         struct nlattr *kind;
501         int err;
502
503         if (name == NULL) {
504                 err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL);
505                 if (err < 0)
506                         goto err_out;
507                 err = -EINVAL;
508                 kind = tb[TCA_ACT_KIND];
509                 if (kind == NULL)
510                         goto err_out;
511                 if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ)
512                         goto err_out;
513         } else {
514                 err = -EINVAL;
515                 if (strlcpy(act_name, name, IFNAMSIZ) >= IFNAMSIZ)
516                         goto err_out;
517         }
518
519         a_o = tc_lookup_action_n(act_name);
520         if (a_o == NULL) {
521 #ifdef CONFIG_MODULES
522                 rtnl_unlock();
523                 request_module("act_%s", act_name);
524                 rtnl_lock();
525
526                 a_o = tc_lookup_action_n(act_name);
527
528                 /* We dropped the RTNL semaphore in order to
529                  * perform the module load.  So, even if we
530                  * succeeded in loading the module we have to
531                  * tell the caller to replay the request.  We
532                  * indicate this using -EAGAIN.
533                  */
534                 if (a_o != NULL) {
535                         err = -EAGAIN;
536                         goto err_mod;
537                 }
538 #endif
539                 err = -ENOENT;
540                 goto err_out;
541         }
542
543         err = -ENOMEM;
544         a = kzalloc(sizeof(*a), GFP_KERNEL);
545         if (a == NULL)
546                 goto err_mod;
547
548         /* backward compatibility for policer */
549         if (name == NULL)
550                 err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, a, ovr, bind);
551         else
552                 err = a_o->init(net, nla, est, a, ovr, bind);
553         if (err < 0)
554                 goto err_free;
555
556         /* module count goes up only when brand new policy is created
557          * if it exists and is only bound to in a_o->init() then
558          * ACT_P_CREATED is not returned (a zero is).
559          */
560         if (err != ACT_P_CREATED)
561                 module_put(a_o->owner);
562         a->ops = a_o;
563
564         return a;
565
566 err_free:
567         kfree(a);
568 err_mod:
569         module_put(a_o->owner);
570 err_out:
571         return ERR_PTR(err);
572 }
573
574 struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla,
575                                   struct nlattr *est, char *name, int ovr,
576                                   int bind)
577 {
578         struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
579         struct tc_action *head = NULL, *act, *act_prev = NULL;
580         int err;
581         int i;
582
583         err = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL);
584         if (err < 0)
585                 return ERR_PTR(err);
586
587         for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
588                 act = tcf_action_init_1(net, tb[i], est, name, ovr, bind);
589                 if (IS_ERR(act))
590                         goto err;
591                 act->order = i;
592
593                 if (head == NULL)
594                         head = act;
595                 else
596                         act_prev->next = act;
597                 act_prev = act;
598         }
599         return head;
600
601 err:
602         if (head != NULL)
603                 tcf_action_destroy(head, bind);
604         return act;
605 }
606
607 int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *a,
608                           int compat_mode)
609 {
610         int err = 0;
611         struct gnet_dump d;
612         struct tcf_act_hdr *h = a->priv;
613
614         if (h == NULL)
615                 goto errout;
616
617         /* compat_mode being true specifies a call that is supposed
618          * to add additional backward compatibility statistic TLVs.
619          */
620         if (compat_mode) {
621                 if (a->type == TCA_OLD_COMPAT)
622                         err = gnet_stats_start_copy_compat(skb, 0,
623                                 TCA_STATS, TCA_XSTATS, &h->tcf_lock, &d);
624                 else
625                         return 0;
626         } else
627                 err = gnet_stats_start_copy(skb, TCA_ACT_STATS,
628                                             &h->tcf_lock, &d);
629
630         if (err < 0)
631                 goto errout;
632
633         if (a->ops != NULL && a->ops->get_stats != NULL)
634                 if (a->ops->get_stats(skb, a) < 0)
635                         goto errout;
636
637         if (gnet_stats_copy_basic(&d, &h->tcf_bstats) < 0 ||
638             gnet_stats_copy_rate_est(&d, &h->tcf_bstats,
639                                      &h->tcf_rate_est) < 0 ||
640             gnet_stats_copy_queue(&d, &h->tcf_qstats) < 0)
641                 goto errout;
642
643         if (gnet_stats_finish_copy(&d) < 0)
644                 goto errout;
645
646         return 0;
647
648 errout:
649         return -1;
650 }
651
652 static int
653 tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 portid, u32 seq,
654              u16 flags, int event, int bind, int ref)
655 {
656         struct tcamsg *t;
657         struct nlmsghdr *nlh;
658         unsigned char *b = skb_tail_pointer(skb);
659         struct nlattr *nest;
660
661         nlh = nlmsg_put(skb, portid, seq, event, sizeof(*t), flags);
662         if (!nlh)
663                 goto out_nlmsg_trim;
664         t = nlmsg_data(nlh);
665         t->tca_family = AF_UNSPEC;
666         t->tca__pad1 = 0;
667         t->tca__pad2 = 0;
668
669         nest = nla_nest_start(skb, TCA_ACT_TAB);
670         if (nest == NULL)
671                 goto out_nlmsg_trim;
672
673         if (tcf_action_dump(skb, a, bind, ref) < 0)
674                 goto out_nlmsg_trim;
675
676         nla_nest_end(skb, nest);
677
678         nlh->nlmsg_len = skb_tail_pointer(skb) - b;
679         return skb->len;
680
681 out_nlmsg_trim:
682         nlmsg_trim(skb, b);
683         return -1;
684 }
685
686 static int
687 act_get_notify(struct net *net, u32 portid, struct nlmsghdr *n,
688                struct tc_action *a, int event)
689 {
690         struct sk_buff *skb;
691
692         skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
693         if (!skb)
694                 return -ENOBUFS;
695         if (tca_get_fill(skb, a, portid, n->nlmsg_seq, 0, event, 0, 0) <= 0) {
696                 kfree_skb(skb);
697                 return -EINVAL;
698         }
699
700         return rtnl_unicast(skb, net, portid);
701 }
702
703 static struct tc_action *
704 tcf_action_get_1(struct nlattr *nla, struct nlmsghdr *n, u32 portid)
705 {
706         struct nlattr *tb[TCA_ACT_MAX + 1];
707         struct tc_action *a;
708         int index;
709         int err;
710
711         err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL);
712         if (err < 0)
713                 goto err_out;
714
715         err = -EINVAL;
716         if (tb[TCA_ACT_INDEX] == NULL ||
717             nla_len(tb[TCA_ACT_INDEX]) < sizeof(index))
718                 goto err_out;
719         index = nla_get_u32(tb[TCA_ACT_INDEX]);
720
721         err = -ENOMEM;
722         a = kzalloc(sizeof(struct tc_action), GFP_KERNEL);
723         if (a == NULL)
724                 goto err_out;
725
726         err = -EINVAL;
727         a->ops = tc_lookup_action(tb[TCA_ACT_KIND]);
728         if (a->ops == NULL)
729                 goto err_free;
730         if (a->ops->lookup == NULL)
731                 goto err_mod;
732         err = -ENOENT;
733         if (a->ops->lookup(a, index) == 0)
734                 goto err_mod;
735
736         module_put(a->ops->owner);
737         return a;
738
739 err_mod:
740         module_put(a->ops->owner);
741 err_free:
742         kfree(a);
743 err_out:
744         return ERR_PTR(err);
745 }
746
747 static void cleanup_a(struct tc_action *act)
748 {
749         struct tc_action *a;
750
751         for (a = act; a; a = act) {
752                 act = a->next;
753                 kfree(a);
754         }
755 }
756
757 static struct tc_action *create_a(int i)
758 {
759         struct tc_action *act;
760
761         act = kzalloc(sizeof(*act), GFP_KERNEL);
762         if (act == NULL) {
763                 pr_debug("create_a: failed to alloc!\n");
764                 return NULL;
765         }
766         act->order = i;
767         return act;
768 }
769
770 static int tca_action_flush(struct net *net, struct nlattr *nla,
771                             struct nlmsghdr *n, u32 portid)
772 {
773         struct sk_buff *skb;
774         unsigned char *b;
775         struct nlmsghdr *nlh;
776         struct tcamsg *t;
777         struct netlink_callback dcb;
778         struct nlattr *nest;
779         struct nlattr *tb[TCA_ACT_MAX + 1];
780         struct nlattr *kind;
781         struct tc_action *a = create_a(0);
782         int err = -ENOMEM;
783
784         if (a == NULL) {
785                 pr_debug("tca_action_flush: couldnt create tc_action\n");
786                 return err;
787         }
788
789         skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
790         if (!skb) {
791                 pr_debug("tca_action_flush: failed skb alloc\n");
792                 kfree(a);
793                 return err;
794         }
795
796         b = skb_tail_pointer(skb);
797
798         err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL);
799         if (err < 0)
800                 goto err_out;
801
802         err = -EINVAL;
803         kind = tb[TCA_ACT_KIND];
804         a->ops = tc_lookup_action(kind);
805         if (a->ops == NULL)
806                 goto err_out;
807
808         nlh = nlmsg_put(skb, portid, n->nlmsg_seq, RTM_DELACTION, sizeof(*t), 0);
809         if (!nlh)
810                 goto out_module_put;
811         t = nlmsg_data(nlh);
812         t->tca_family = AF_UNSPEC;
813         t->tca__pad1 = 0;
814         t->tca__pad2 = 0;
815
816         nest = nla_nest_start(skb, TCA_ACT_TAB);
817         if (nest == NULL)
818                 goto out_module_put;
819
820         err = a->ops->walk(skb, &dcb, RTM_DELACTION, a);
821         if (err < 0)
822                 goto out_module_put;
823         if (err == 0)
824                 goto noflush_out;
825
826         nla_nest_end(skb, nest);
827
828         nlh->nlmsg_len = skb_tail_pointer(skb) - b;
829         nlh->nlmsg_flags |= NLM_F_ROOT;
830         module_put(a->ops->owner);
831         kfree(a);
832         err = rtnetlink_send(skb, net, portid, RTNLGRP_TC,
833                              n->nlmsg_flags & NLM_F_ECHO);
834         if (err > 0)
835                 return 0;
836
837         return err;
838
839 out_module_put:
840         module_put(a->ops->owner);
841 err_out:
842 noflush_out:
843         kfree_skb(skb);
844         kfree(a);
845         return err;
846 }
847
848 static int
849 tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
850               u32 portid, int event)
851 {
852         int i, ret;
853         struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
854         struct tc_action *head = NULL, *act, *act_prev = NULL;
855
856         ret = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL);
857         if (ret < 0)
858                 return ret;
859
860         if (event == RTM_DELACTION && n->nlmsg_flags & NLM_F_ROOT) {
861                 if (tb[1] != NULL)
862                         return tca_action_flush(net, tb[1], n, portid);
863                 else
864                         return -EINVAL;
865         }
866
867         for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
868                 act = tcf_action_get_1(tb[i], n, portid);
869                 if (IS_ERR(act)) {
870                         ret = PTR_ERR(act);
871                         goto err;
872                 }
873                 act->order = i;
874
875                 if (head == NULL)
876                         head = act;
877                 else
878                         act_prev->next = act;
879                 act_prev = act;
880         }
881
882         if (event == RTM_GETACTION)
883                 ret = act_get_notify(net, portid, n, head, event);
884         else { /* delete */
885                 struct sk_buff *skb;
886
887                 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
888                 if (!skb) {
889                         ret = -ENOBUFS;
890                         goto err;
891                 }
892
893                 if (tca_get_fill(skb, head, portid, n->nlmsg_seq, 0, event,
894                                  0, 1) <= 0) {
895                         kfree_skb(skb);
896                         ret = -EINVAL;
897                         goto err;
898                 }
899
900                 /* now do the delete */
901                 tcf_action_destroy(head, 0);
902                 ret = rtnetlink_send(skb, net, portid, RTNLGRP_TC,
903                                      n->nlmsg_flags & NLM_F_ECHO);
904                 if (ret > 0)
905                         return 0;
906                 return ret;
907         }
908 err:
909         cleanup_a(head);
910         return ret;
911 }
912
913 static int tcf_add_notify(struct net *net, struct tc_action *a,
914                           u32 portid, u32 seq, int event, u16 flags)
915 {
916         struct tcamsg *t;
917         struct nlmsghdr *nlh;
918         struct sk_buff *skb;
919         struct nlattr *nest;
920         unsigned char *b;
921         int err = 0;
922
923         skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
924         if (!skb)
925                 return -ENOBUFS;
926
927         b = skb_tail_pointer(skb);
928
929         nlh = nlmsg_put(skb, portid, seq, event, sizeof(*t), flags);
930         if (!nlh)
931                 goto out_kfree_skb;
932         t = nlmsg_data(nlh);
933         t->tca_family = AF_UNSPEC;
934         t->tca__pad1 = 0;
935         t->tca__pad2 = 0;
936
937         nest = nla_nest_start(skb, TCA_ACT_TAB);
938         if (nest == NULL)
939                 goto out_kfree_skb;
940
941         if (tcf_action_dump(skb, a, 0, 0) < 0)
942                 goto out_kfree_skb;
943
944         nla_nest_end(skb, nest);
945
946         nlh->nlmsg_len = skb_tail_pointer(skb) - b;
947         NETLINK_CB(skb).dst_group = RTNLGRP_TC;
948
949         err = rtnetlink_send(skb, net, portid, RTNLGRP_TC, flags & NLM_F_ECHO);
950         if (err > 0)
951                 err = 0;
952         return err;
953
954 out_kfree_skb:
955         kfree_skb(skb);
956         return -1;
957 }
958
959
960 static int
961 tcf_action_add(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
962                u32 portid, int ovr)
963 {
964         int ret = 0;
965         struct tc_action *act;
966         struct tc_action *a;
967         u32 seq = n->nlmsg_seq;
968
969         act = tcf_action_init(net, nla, NULL, NULL, ovr, 0);
970         if (act == NULL)
971                 goto done;
972         if (IS_ERR(act)) {
973                 ret = PTR_ERR(act);
974                 goto done;
975         }
976
977         /* dump then free all the actions after update; inserted policy
978          * stays intact
979          */
980         ret = tcf_add_notify(net, act, portid, seq, RTM_NEWACTION, n->nlmsg_flags);
981         for (a = act; a; a = act) {
982                 act = a->next;
983                 kfree(a);
984         }
985 done:
986         return ret;
987 }
988
989 static int tc_ctl_action(struct sk_buff *skb, struct nlmsghdr *n)
990 {
991         struct net *net = sock_net(skb->sk);
992         struct nlattr *tca[TCA_ACT_MAX + 1];
993         u32 portid = skb ? NETLINK_CB(skb).portid : 0;
994         int ret = 0, ovr = 0;
995
996         if ((n->nlmsg_type != RTM_GETACTION) && !capable(CAP_NET_ADMIN))
997                 return -EPERM;
998
999         ret = nlmsg_parse(n, sizeof(struct tcamsg), tca, TCA_ACT_MAX, NULL);
1000         if (ret < 0)
1001                 return ret;
1002
1003         if (tca[TCA_ACT_TAB] == NULL) {
1004                 pr_notice("tc_ctl_action: received NO action attribs\n");
1005                 return -EINVAL;
1006         }
1007
1008         /* n->nlmsg_flags & NLM_F_CREATE */
1009         switch (n->nlmsg_type) {
1010         case RTM_NEWACTION:
1011                 /* we are going to assume all other flags
1012                  * imply create only if it doesn't exist
1013                  * Note that CREATE | EXCL implies that
1014                  * but since we want avoid ambiguity (eg when flags
1015                  * is zero) then just set this
1016                  */
1017                 if (n->nlmsg_flags & NLM_F_REPLACE)
1018                         ovr = 1;
1019 replay:
1020                 ret = tcf_action_add(net, tca[TCA_ACT_TAB], n, portid, ovr);
1021                 if (ret == -EAGAIN)
1022                         goto replay;
1023                 break;
1024         case RTM_DELACTION:
1025                 ret = tca_action_gd(net, tca[TCA_ACT_TAB], n,
1026                                     portid, RTM_DELACTION);
1027                 break;
1028         case RTM_GETACTION:
1029                 ret = tca_action_gd(net, tca[TCA_ACT_TAB], n,
1030                                     portid, RTM_GETACTION);
1031                 break;
1032         default:
1033                 BUG();
1034         }
1035
1036         return ret;
1037 }
1038
1039 static struct nlattr *
1040 find_dump_kind(const struct nlmsghdr *n)
1041 {
1042         struct nlattr *tb1, *tb2[TCA_ACT_MAX + 1];
1043         struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
1044         struct nlattr *nla[TCAA_MAX + 1];
1045         struct nlattr *kind;
1046
1047         if (nlmsg_parse(n, sizeof(struct tcamsg), nla, TCAA_MAX, NULL) < 0)
1048                 return NULL;
1049         tb1 = nla[TCA_ACT_TAB];
1050         if (tb1 == NULL)
1051                 return NULL;
1052
1053         if (nla_parse(tb, TCA_ACT_MAX_PRIO, nla_data(tb1),
1054                       NLMSG_ALIGN(nla_len(tb1)), NULL) < 0)
1055                 return NULL;
1056
1057         if (tb[1] == NULL)
1058                 return NULL;
1059         if (nla_parse(tb2, TCA_ACT_MAX, nla_data(tb[1]),
1060                       nla_len(tb[1]), NULL) < 0)
1061                 return NULL;
1062         kind = tb2[TCA_ACT_KIND];
1063
1064         return kind;
1065 }
1066
1067 static int
1068 tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
1069 {
1070         struct nlmsghdr *nlh;
1071         unsigned char *b = skb_tail_pointer(skb);
1072         struct nlattr *nest;
1073         struct tc_action_ops *a_o;
1074         struct tc_action a;
1075         int ret = 0;
1076         struct tcamsg *t = (struct tcamsg *) nlmsg_data(cb->nlh);
1077         struct nlattr *kind = find_dump_kind(cb->nlh);
1078
1079         if (kind == NULL) {
1080                 pr_info("tc_dump_action: action bad kind\n");
1081                 return 0;
1082         }
1083
1084         a_o = tc_lookup_action(kind);
1085         if (a_o == NULL)
1086                 return 0;
1087
1088         memset(&a, 0, sizeof(struct tc_action));
1089         a.ops = a_o;
1090
1091         if (a_o->walk == NULL) {
1092                 WARN(1, "tc_dump_action: %s !capable of dumping table\n",
1093                      a_o->kind);
1094                 goto out_module_put;
1095         }
1096
1097         nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
1098                         cb->nlh->nlmsg_type, sizeof(*t), 0);
1099         if (!nlh)
1100                 goto out_module_put;
1101         t = nlmsg_data(nlh);
1102         t->tca_family = AF_UNSPEC;
1103         t->tca__pad1 = 0;
1104         t->tca__pad2 = 0;
1105
1106         nest = nla_nest_start(skb, TCA_ACT_TAB);
1107         if (nest == NULL)
1108                 goto out_module_put;
1109
1110         ret = a_o->walk(skb, cb, RTM_GETACTION, &a);
1111         if (ret < 0)
1112                 goto out_module_put;
1113
1114         if (ret > 0) {
1115                 nla_nest_end(skb, nest);
1116                 ret = skb->len;
1117         } else
1118                 nla_nest_cancel(skb, nest);
1119
1120         nlh->nlmsg_len = skb_tail_pointer(skb) - b;
1121         if (NETLINK_CB(cb->skb).portid && ret)
1122                 nlh->nlmsg_flags |= NLM_F_MULTI;
1123         module_put(a_o->owner);
1124         return skb->len;
1125
1126 out_module_put:
1127         module_put(a_o->owner);
1128         nlmsg_trim(skb, b);
1129         return skb->len;
1130 }
1131
1132 static int __init tc_action_init(void)
1133 {
1134         rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, NULL);
1135         rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, NULL);
1136         rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action,
1137                       NULL);
1138
1139         return 0;
1140 }
1141
1142 subsys_initcall(tc_action_init);