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