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