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 write_lock(&act_mod_lock); 274 for (ap = &act_base; (a = *ap) != NULL; ap = &a->next) { 275 if (act->type == a->type || (strcmp(act->kind, a->kind) == 0)) { 276 write_unlock(&act_mod_lock); 277 return -EEXIST; 278 } 279 } 280 act->next = NULL; 281 *ap = act; 282 write_unlock(&act_mod_lock); 283 return 0; 284 } 285 EXPORT_SYMBOL(tcf_register_action); 286 287 int tcf_unregister_action(struct tc_action_ops *act) 288 { 289 struct tc_action_ops *a, **ap; 290 int err = -ENOENT; 291 292 write_lock(&act_mod_lock); 293 for (ap = &act_base; (a = *ap) != NULL; ap = &a->next) 294 if (a == act) 295 break; 296 if (a) { 297 *ap = a->next; 298 a->next = NULL; 299 err = 0; 300 } 301 write_unlock(&act_mod_lock); 302 return err; 303 } 304 EXPORT_SYMBOL(tcf_unregister_action); 305 306 /* lookup by name */ 307 static struct tc_action_ops *tc_lookup_action_n(char *kind) 308 { 309 struct tc_action_ops *a = NULL; 310 311 if (kind) { 312 read_lock(&act_mod_lock); 313 for (a = act_base; a; a = a->next) { 314 if (strcmp(kind, a->kind) == 0) { 315 if (!try_module_get(a->owner)) { 316 read_unlock(&act_mod_lock); 317 return NULL; 318 } 319 break; 320 } 321 } 322 read_unlock(&act_mod_lock); 323 } 324 return a; 325 } 326 327 /* lookup by nlattr */ 328 static struct tc_action_ops *tc_lookup_action(struct nlattr *kind) 329 { 330 struct tc_action_ops *a = NULL; 331 332 if (kind) { 333 read_lock(&act_mod_lock); 334 for (a = act_base; a; a = a->next) { 335 if (nla_strcmp(kind, a->kind) == 0) { 336 if (!try_module_get(a->owner)) { 337 read_unlock(&act_mod_lock); 338 return NULL; 339 } 340 break; 341 } 342 } 343 read_unlock(&act_mod_lock); 344 } 345 return a; 346 } 347 348 #if 0 349 /* lookup by id */ 350 static struct tc_action_ops *tc_lookup_action_id(u32 type) 351 { 352 struct tc_action_ops *a = NULL; 353 354 if (type) { 355 read_lock(&act_mod_lock); 356 for (a = act_base; a; a = a->next) { 357 if (a->type == type) { 358 if (!try_module_get(a->owner)) { 359 read_unlock(&act_mod_lock); 360 return NULL; 361 } 362 break; 363 } 364 } 365 read_unlock(&act_mod_lock); 366 } 367 return a; 368 } 369 #endif 370 371 int tcf_action_exec(struct sk_buff *skb, const struct tc_action *act, 372 struct tcf_result *res) 373 { 374 const struct tc_action *a; 375 int ret = -1; 376 377 if (skb->tc_verd & TC_NCLS) { 378 skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); 379 ret = TC_ACT_OK; 380 goto exec_done; 381 } 382 while ((a = act) != NULL) { 383 repeat: 384 if (a->ops && a->ops->act) { 385 ret = a->ops->act(skb, a, res); 386 if (TC_MUNGED & skb->tc_verd) { 387 /* copied already, allow trampling */ 388 skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd); 389 skb->tc_verd = CLR_TC_MUNGED(skb->tc_verd); 390 } 391 if (ret == TC_ACT_REPEAT) 392 goto repeat; /* we need a ttl - JHS */ 393 if (ret != TC_ACT_PIPE) 394 goto exec_done; 395 } 396 act = a->next; 397 } 398 exec_done: 399 return ret; 400 } 401 EXPORT_SYMBOL(tcf_action_exec); 402 403 void tcf_action_destroy(struct tc_action *act, int bind) 404 { 405 struct tc_action *a; 406 407 for (a = act; a; a = act) { 408 if (a->ops && a->ops->cleanup) { 409 if (a->ops->cleanup(a, bind) == ACT_P_DELETED) 410 module_put(a->ops->owner); 411 act = act->next; 412 kfree(a); 413 } else { 414 /*FIXME: Remove later - catch insertion bugs*/ 415 WARN(1, "tcf_action_destroy: BUG? destroying NULL ops\n"); 416 act = act->next; 417 kfree(a); 418 } 419 } 420 } 421 422 int 423 tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int bind, int ref) 424 { 425 int err = -EINVAL; 426 427 if (a->ops == NULL || a->ops->dump == NULL) 428 return err; 429 return a->ops->dump(skb, a, bind, ref); 430 } 431 432 int 433 tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref) 434 { 435 int err = -EINVAL; 436 unsigned char *b = skb_tail_pointer(skb); 437 struct nlattr *nest; 438 439 if (a->ops == NULL || a->ops->dump == NULL) 440 return err; 441 442 if (nla_put_string(skb, TCA_KIND, a->ops->kind)) 443 goto nla_put_failure; 444 if (tcf_action_copy_stats(skb, a, 0)) 445 goto nla_put_failure; 446 nest = nla_nest_start(skb, TCA_OPTIONS); 447 if (nest == NULL) 448 goto nla_put_failure; 449 err = tcf_action_dump_old(skb, a, bind, ref); 450 if (err > 0) { 451 nla_nest_end(skb, nest); 452 return err; 453 } 454 455 nla_put_failure: 456 nlmsg_trim(skb, b); 457 return -1; 458 } 459 EXPORT_SYMBOL(tcf_action_dump_1); 460 461 int 462 tcf_action_dump(struct sk_buff *skb, struct tc_action *act, int bind, int ref) 463 { 464 struct tc_action *a; 465 int err = -EINVAL; 466 struct nlattr *nest; 467 468 while ((a = act) != NULL) { 469 act = a->next; 470 nest = nla_nest_start(skb, a->order); 471 if (nest == NULL) 472 goto nla_put_failure; 473 err = tcf_action_dump_1(skb, a, bind, ref); 474 if (err < 0) 475 goto errout; 476 nla_nest_end(skb, nest); 477 } 478 479 return 0; 480 481 nla_put_failure: 482 err = -EINVAL; 483 errout: 484 nla_nest_cancel(skb, nest); 485 return err; 486 } 487 488 struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, 489 char *name, int ovr, int bind) 490 { 491 struct tc_action *a; 492 struct tc_action_ops *a_o; 493 char act_name[IFNAMSIZ]; 494 struct nlattr *tb[TCA_ACT_MAX + 1]; 495 struct nlattr *kind; 496 int err; 497 498 if (name == NULL) { 499 err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL); 500 if (err < 0) 501 goto err_out; 502 err = -EINVAL; 503 kind = tb[TCA_ACT_KIND]; 504 if (kind == NULL) 505 goto err_out; 506 if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ) 507 goto err_out; 508 } else { 509 err = -EINVAL; 510 if (strlcpy(act_name, name, IFNAMSIZ) >= IFNAMSIZ) 511 goto err_out; 512 } 513 514 a_o = tc_lookup_action_n(act_name); 515 if (a_o == NULL) { 516 #ifdef CONFIG_MODULES 517 rtnl_unlock(); 518 request_module("act_%s", act_name); 519 rtnl_lock(); 520 521 a_o = tc_lookup_action_n(act_name); 522 523 /* We dropped the RTNL semaphore in order to 524 * perform the module load. So, even if we 525 * succeeded in loading the module we have to 526 * tell the caller to replay the request. We 527 * indicate this using -EAGAIN. 528 */ 529 if (a_o != NULL) { 530 err = -EAGAIN; 531 goto err_mod; 532 } 533 #endif 534 err = -ENOENT; 535 goto err_out; 536 } 537 538 err = -ENOMEM; 539 a = kzalloc(sizeof(*a), GFP_KERNEL); 540 if (a == NULL) 541 goto err_mod; 542 543 /* backward compatibility for policer */ 544 if (name == NULL) 545 err = a_o->init(tb[TCA_ACT_OPTIONS], est, a, ovr, bind); 546 else 547 err = a_o->init(nla, est, a, ovr, bind); 548 if (err < 0) 549 goto err_free; 550 551 /* module count goes up only when brand new policy is created 552 * if it exists and is only bound to in a_o->init() then 553 * ACT_P_CREATED is not returned (a zero is). 554 */ 555 if (err != ACT_P_CREATED) 556 module_put(a_o->owner); 557 a->ops = a_o; 558 559 return a; 560 561 err_free: 562 kfree(a); 563 err_mod: 564 module_put(a_o->owner); 565 err_out: 566 return ERR_PTR(err); 567 } 568 569 struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, 570 char *name, int ovr, int bind) 571 { 572 struct nlattr *tb[TCA_ACT_MAX_PRIO + 1]; 573 struct tc_action *head = NULL, *act, *act_prev = NULL; 574 int err; 575 int i; 576 577 err = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL); 578 if (err < 0) 579 return ERR_PTR(err); 580 581 for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) { 582 act = tcf_action_init_1(tb[i], est, name, ovr, bind); 583 if (IS_ERR(act)) 584 goto err; 585 act->order = i; 586 587 if (head == NULL) 588 head = act; 589 else 590 act_prev->next = act; 591 act_prev = act; 592 } 593 return head; 594 595 err: 596 if (head != NULL) 597 tcf_action_destroy(head, bind); 598 return act; 599 } 600 601 int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *a, 602 int compat_mode) 603 { 604 int err = 0; 605 struct gnet_dump d; 606 struct tcf_act_hdr *h = a->priv; 607 608 if (h == NULL) 609 goto errout; 610 611 /* compat_mode being true specifies a call that is supposed 612 * to add additional backward compatibility statistic TLVs. 613 */ 614 if (compat_mode) { 615 if (a->type == TCA_OLD_COMPAT) 616 err = gnet_stats_start_copy_compat(skb, 0, 617 TCA_STATS, TCA_XSTATS, &h->tcf_lock, &d); 618 else 619 return 0; 620 } else 621 err = gnet_stats_start_copy(skb, TCA_ACT_STATS, 622 &h->tcf_lock, &d); 623 624 if (err < 0) 625 goto errout; 626 627 if (a->ops != NULL && a->ops->get_stats != NULL) 628 if (a->ops->get_stats(skb, a) < 0) 629 goto errout; 630 631 if (gnet_stats_copy_basic(&d, &h->tcf_bstats) < 0 || 632 gnet_stats_copy_rate_est(&d, &h->tcf_bstats, 633 &h->tcf_rate_est) < 0 || 634 gnet_stats_copy_queue(&d, &h->tcf_qstats) < 0) 635 goto errout; 636 637 if (gnet_stats_finish_copy(&d) < 0) 638 goto errout; 639 640 return 0; 641 642 errout: 643 return -1; 644 } 645 646 static int 647 tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq, 648 u16 flags, int event, int bind, int ref) 649 { 650 struct tcamsg *t; 651 struct nlmsghdr *nlh; 652 unsigned char *b = skb_tail_pointer(skb); 653 struct nlattr *nest; 654 655 nlh = nlmsg_put(skb, pid, seq, event, sizeof(*t), flags); 656 if (!nlh) 657 goto out_nlmsg_trim; 658 t = nlmsg_data(nlh); 659 t->tca_family = AF_UNSPEC; 660 t->tca__pad1 = 0; 661 t->tca__pad2 = 0; 662 663 nest = nla_nest_start(skb, TCA_ACT_TAB); 664 if (nest == NULL) 665 goto out_nlmsg_trim; 666 667 if (tcf_action_dump(skb, a, bind, ref) < 0) 668 goto out_nlmsg_trim; 669 670 nla_nest_end(skb, nest); 671 672 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 673 return skb->len; 674 675 out_nlmsg_trim: 676 nlmsg_trim(skb, b); 677 return -1; 678 } 679 680 static int 681 act_get_notify(struct net *net, u32 pid, struct nlmsghdr *n, 682 struct tc_action *a, int event) 683 { 684 struct sk_buff *skb; 685 686 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); 687 if (!skb) 688 return -ENOBUFS; 689 if (tca_get_fill(skb, a, pid, n->nlmsg_seq, 0, event, 0, 0) <= 0) { 690 kfree_skb(skb); 691 return -EINVAL; 692 } 693 694 return rtnl_unicast(skb, net, pid); 695 } 696 697 static struct tc_action * 698 tcf_action_get_1(struct nlattr *nla, struct nlmsghdr *n, u32 pid) 699 { 700 struct nlattr *tb[TCA_ACT_MAX + 1]; 701 struct tc_action *a; 702 int index; 703 int err; 704 705 err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL); 706 if (err < 0) 707 goto err_out; 708 709 err = -EINVAL; 710 if (tb[TCA_ACT_INDEX] == NULL || 711 nla_len(tb[TCA_ACT_INDEX]) < sizeof(index)) 712 goto err_out; 713 index = nla_get_u32(tb[TCA_ACT_INDEX]); 714 715 err = -ENOMEM; 716 a = kzalloc(sizeof(struct tc_action), GFP_KERNEL); 717 if (a == NULL) 718 goto err_out; 719 720 err = -EINVAL; 721 a->ops = tc_lookup_action(tb[TCA_ACT_KIND]); 722 if (a->ops == NULL) 723 goto err_free; 724 if (a->ops->lookup == NULL) 725 goto err_mod; 726 err = -ENOENT; 727 if (a->ops->lookup(a, index) == 0) 728 goto err_mod; 729 730 module_put(a->ops->owner); 731 return a; 732 733 err_mod: 734 module_put(a->ops->owner); 735 err_free: 736 kfree(a); 737 err_out: 738 return ERR_PTR(err); 739 } 740 741 static void cleanup_a(struct tc_action *act) 742 { 743 struct tc_action *a; 744 745 for (a = act; a; a = act) { 746 act = a->next; 747 kfree(a); 748 } 749 } 750 751 static struct tc_action *create_a(int i) 752 { 753 struct tc_action *act; 754 755 act = kzalloc(sizeof(*act), GFP_KERNEL); 756 if (act == NULL) { 757 pr_debug("create_a: failed to alloc!\n"); 758 return NULL; 759 } 760 act->order = i; 761 return act; 762 } 763 764 static int tca_action_flush(struct net *net, struct nlattr *nla, 765 struct nlmsghdr *n, u32 pid) 766 { 767 struct sk_buff *skb; 768 unsigned char *b; 769 struct nlmsghdr *nlh; 770 struct tcamsg *t; 771 struct netlink_callback dcb; 772 struct nlattr *nest; 773 struct nlattr *tb[TCA_ACT_MAX + 1]; 774 struct nlattr *kind; 775 struct tc_action *a = create_a(0); 776 int err = -ENOMEM; 777 778 if (a == NULL) { 779 pr_debug("tca_action_flush: couldnt create tc_action\n"); 780 return err; 781 } 782 783 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); 784 if (!skb) { 785 pr_debug("tca_action_flush: failed skb alloc\n"); 786 kfree(a); 787 return err; 788 } 789 790 b = skb_tail_pointer(skb); 791 792 err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL); 793 if (err < 0) 794 goto err_out; 795 796 err = -EINVAL; 797 kind = tb[TCA_ACT_KIND]; 798 a->ops = tc_lookup_action(kind); 799 if (a->ops == NULL) 800 goto err_out; 801 802 nlh = nlmsg_put(skb, pid, n->nlmsg_seq, RTM_DELACTION, sizeof(*t), 0); 803 if (!nlh) 804 goto out_module_put; 805 t = nlmsg_data(nlh); 806 t->tca_family = AF_UNSPEC; 807 t->tca__pad1 = 0; 808 t->tca__pad2 = 0; 809 810 nest = nla_nest_start(skb, TCA_ACT_TAB); 811 if (nest == NULL) 812 goto out_module_put; 813 814 err = a->ops->walk(skb, &dcb, RTM_DELACTION, a); 815 if (err < 0) 816 goto out_module_put; 817 if (err == 0) 818 goto noflush_out; 819 820 nla_nest_end(skb, nest); 821 822 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 823 nlh->nlmsg_flags |= NLM_F_ROOT; 824 module_put(a->ops->owner); 825 kfree(a); 826 err = rtnetlink_send(skb, net, pid, RTNLGRP_TC, 827 n->nlmsg_flags & NLM_F_ECHO); 828 if (err > 0) 829 return 0; 830 831 return err; 832 833 out_module_put: 834 module_put(a->ops->owner); 835 err_out: 836 noflush_out: 837 kfree_skb(skb); 838 kfree(a); 839 return err; 840 } 841 842 static int 843 tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n, 844 u32 pid, int event) 845 { 846 int i, ret; 847 struct nlattr *tb[TCA_ACT_MAX_PRIO + 1]; 848 struct tc_action *head = NULL, *act, *act_prev = NULL; 849 850 ret = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL); 851 if (ret < 0) 852 return ret; 853 854 if (event == RTM_DELACTION && n->nlmsg_flags & NLM_F_ROOT) { 855 if (tb[1] != NULL) 856 return tca_action_flush(net, tb[1], n, pid); 857 else 858 return -EINVAL; 859 } 860 861 for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) { 862 act = tcf_action_get_1(tb[i], n, pid); 863 if (IS_ERR(act)) { 864 ret = PTR_ERR(act); 865 goto err; 866 } 867 act->order = i; 868 869 if (head == NULL) 870 head = act; 871 else 872 act_prev->next = act; 873 act_prev = act; 874 } 875 876 if (event == RTM_GETACTION) 877 ret = act_get_notify(net, pid, n, head, event); 878 else { /* delete */ 879 struct sk_buff *skb; 880 881 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); 882 if (!skb) { 883 ret = -ENOBUFS; 884 goto err; 885 } 886 887 if (tca_get_fill(skb, head, pid, n->nlmsg_seq, 0, event, 888 0, 1) <= 0) { 889 kfree_skb(skb); 890 ret = -EINVAL; 891 goto err; 892 } 893 894 /* now do the delete */ 895 tcf_action_destroy(head, 0); 896 ret = rtnetlink_send(skb, net, pid, RTNLGRP_TC, 897 n->nlmsg_flags & NLM_F_ECHO); 898 if (ret > 0) 899 return 0; 900 return ret; 901 } 902 err: 903 cleanup_a(head); 904 return ret; 905 } 906 907 static int tcf_add_notify(struct net *net, struct tc_action *a, 908 u32 pid, u32 seq, int event, u16 flags) 909 { 910 struct tcamsg *t; 911 struct nlmsghdr *nlh; 912 struct sk_buff *skb; 913 struct nlattr *nest; 914 unsigned char *b; 915 int err = 0; 916 917 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); 918 if (!skb) 919 return -ENOBUFS; 920 921 b = skb_tail_pointer(skb); 922 923 nlh = nlmsg_put(skb, pid, seq, event, sizeof(*t), flags); 924 if (!nlh) 925 goto out_kfree_skb; 926 t = nlmsg_data(nlh); 927 t->tca_family = AF_UNSPEC; 928 t->tca__pad1 = 0; 929 t->tca__pad2 = 0; 930 931 nest = nla_nest_start(skb, TCA_ACT_TAB); 932 if (nest == NULL) 933 goto out_kfree_skb; 934 935 if (tcf_action_dump(skb, a, 0, 0) < 0) 936 goto out_kfree_skb; 937 938 nla_nest_end(skb, nest); 939 940 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 941 NETLINK_CB(skb).dst_group = RTNLGRP_TC; 942 943 err = rtnetlink_send(skb, net, pid, RTNLGRP_TC, flags & NLM_F_ECHO); 944 if (err > 0) 945 err = 0; 946 return err; 947 948 out_kfree_skb: 949 kfree_skb(skb); 950 return -1; 951 } 952 953 954 static int 955 tcf_action_add(struct net *net, struct nlattr *nla, struct nlmsghdr *n, 956 u32 pid, int ovr) 957 { 958 int ret = 0; 959 struct tc_action *act; 960 struct tc_action *a; 961 u32 seq = n->nlmsg_seq; 962 963 act = tcf_action_init(nla, NULL, NULL, ovr, 0); 964 if (act == NULL) 965 goto done; 966 if (IS_ERR(act)) { 967 ret = PTR_ERR(act); 968 goto done; 969 } 970 971 /* dump then free all the actions after update; inserted policy 972 * stays intact 973 */ 974 ret = tcf_add_notify(net, act, pid, seq, RTM_NEWACTION, n->nlmsg_flags); 975 for (a = act; a; a = act) { 976 act = a->next; 977 kfree(a); 978 } 979 done: 980 return ret; 981 } 982 983 static int tc_ctl_action(struct sk_buff *skb, struct nlmsghdr *n, void *arg) 984 { 985 struct net *net = sock_net(skb->sk); 986 struct nlattr *tca[TCA_ACT_MAX + 1]; 987 u32 pid = skb ? NETLINK_CB(skb).pid : 0; 988 int ret = 0, ovr = 0; 989 990 ret = nlmsg_parse(n, sizeof(struct tcamsg), tca, TCA_ACT_MAX, NULL); 991 if (ret < 0) 992 return ret; 993 994 if (tca[TCA_ACT_TAB] == NULL) { 995 pr_notice("tc_ctl_action: received NO action attribs\n"); 996 return -EINVAL; 997 } 998 999 /* n->nlmsg_flags & NLM_F_CREATE */ 1000 switch (n->nlmsg_type) { 1001 case RTM_NEWACTION: 1002 /* we are going to assume all other flags 1003 * imply create only if it doesn't exist 1004 * Note that CREATE | EXCL implies that 1005 * but since we want avoid ambiguity (eg when flags 1006 * is zero) then just set this 1007 */ 1008 if (n->nlmsg_flags & NLM_F_REPLACE) 1009 ovr = 1; 1010 replay: 1011 ret = tcf_action_add(net, tca[TCA_ACT_TAB], n, pid, ovr); 1012 if (ret == -EAGAIN) 1013 goto replay; 1014 break; 1015 case RTM_DELACTION: 1016 ret = tca_action_gd(net, tca[TCA_ACT_TAB], n, 1017 pid, RTM_DELACTION); 1018 break; 1019 case RTM_GETACTION: 1020 ret = tca_action_gd(net, tca[TCA_ACT_TAB], n, 1021 pid, RTM_GETACTION); 1022 break; 1023 default: 1024 BUG(); 1025 } 1026 1027 return ret; 1028 } 1029 1030 static struct nlattr * 1031 find_dump_kind(const struct nlmsghdr *n) 1032 { 1033 struct nlattr *tb1, *tb2[TCA_ACT_MAX + 1]; 1034 struct nlattr *tb[TCA_ACT_MAX_PRIO + 1]; 1035 struct nlattr *nla[TCAA_MAX + 1]; 1036 struct nlattr *kind; 1037 1038 if (nlmsg_parse(n, sizeof(struct tcamsg), nla, TCAA_MAX, NULL) < 0) 1039 return NULL; 1040 tb1 = nla[TCA_ACT_TAB]; 1041 if (tb1 == NULL) 1042 return NULL; 1043 1044 if (nla_parse(tb, TCA_ACT_MAX_PRIO, nla_data(tb1), 1045 NLMSG_ALIGN(nla_len(tb1)), NULL) < 0) 1046 return NULL; 1047 1048 if (tb[1] == NULL) 1049 return NULL; 1050 if (nla_parse(tb2, TCA_ACT_MAX, nla_data(tb[1]), 1051 nla_len(tb[1]), NULL) < 0) 1052 return NULL; 1053 kind = tb2[TCA_ACT_KIND]; 1054 1055 return kind; 1056 } 1057 1058 static int 1059 tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb) 1060 { 1061 struct nlmsghdr *nlh; 1062 unsigned char *b = skb_tail_pointer(skb); 1063 struct nlattr *nest; 1064 struct tc_action_ops *a_o; 1065 struct tc_action a; 1066 int ret = 0; 1067 struct tcamsg *t = (struct tcamsg *) nlmsg_data(cb->nlh); 1068 struct nlattr *kind = find_dump_kind(cb->nlh); 1069 1070 if (kind == NULL) { 1071 pr_info("tc_dump_action: action bad kind\n"); 1072 return 0; 1073 } 1074 1075 a_o = tc_lookup_action(kind); 1076 if (a_o == NULL) 1077 return 0; 1078 1079 memset(&a, 0, sizeof(struct tc_action)); 1080 a.ops = a_o; 1081 1082 if (a_o->walk == NULL) { 1083 WARN(1, "tc_dump_action: %s !capable of dumping table\n", 1084 a_o->kind); 1085 goto out_module_put; 1086 } 1087 1088 nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, 1089 cb->nlh->nlmsg_type, sizeof(*t), 0); 1090 if (!nlh) 1091 goto out_module_put; 1092 t = nlmsg_data(nlh); 1093 t->tca_family = AF_UNSPEC; 1094 t->tca__pad1 = 0; 1095 t->tca__pad2 = 0; 1096 1097 nest = nla_nest_start(skb, TCA_ACT_TAB); 1098 if (nest == NULL) 1099 goto out_module_put; 1100 1101 ret = a_o->walk(skb, cb, RTM_GETACTION, &a); 1102 if (ret < 0) 1103 goto out_module_put; 1104 1105 if (ret > 0) { 1106 nla_nest_end(skb, nest); 1107 ret = skb->len; 1108 } else 1109 nla_nest_cancel(skb, nest); 1110 1111 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 1112 if (NETLINK_CB(cb->skb).pid && ret) 1113 nlh->nlmsg_flags |= NLM_F_MULTI; 1114 module_put(a_o->owner); 1115 return skb->len; 1116 1117 out_module_put: 1118 module_put(a_o->owner); 1119 nlmsg_trim(skb, b); 1120 return skb->len; 1121 } 1122 1123 static int __init tc_action_init(void) 1124 { 1125 rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, NULL); 1126 rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, NULL); 1127 rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action, 1128 NULL); 1129 1130 return 0; 1131 } 1132 1133 subsys_initcall(tc_action_init); 1134