1 /* 2 * net/sched/cls_api.c Packet classifier 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 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 10 * 11 * Changes: 12 * 13 * Eduardo J. Blanco <ejbs@netlabs.com.uy> :990222: kmod support 14 * 15 */ 16 17 #include <linux/module.h> 18 #include <linux/types.h> 19 #include <linux/kernel.h> 20 #include <linux/string.h> 21 #include <linux/errno.h> 22 #include <linux/err.h> 23 #include <linux/skbuff.h> 24 #include <linux/init.h> 25 #include <linux/kmod.h> 26 #include <linux/slab.h> 27 #include <linux/idr.h> 28 #include <net/net_namespace.h> 29 #include <net/sock.h> 30 #include <net/netlink.h> 31 #include <net/pkt_sched.h> 32 #include <net/pkt_cls.h> 33 34 /* The list of all installed classifier types */ 35 static LIST_HEAD(tcf_proto_base); 36 37 /* Protects list of registered TC modules. It is pure SMP lock. */ 38 static DEFINE_RWLOCK(cls_mod_lock); 39 40 /* Find classifier type by string name */ 41 42 static const struct tcf_proto_ops *tcf_proto_lookup_ops(const char *kind) 43 { 44 const struct tcf_proto_ops *t, *res = NULL; 45 46 if (kind) { 47 read_lock(&cls_mod_lock); 48 list_for_each_entry(t, &tcf_proto_base, head) { 49 if (strcmp(kind, t->kind) == 0) { 50 if (try_module_get(t->owner)) 51 res = t; 52 break; 53 } 54 } 55 read_unlock(&cls_mod_lock); 56 } 57 return res; 58 } 59 60 /* Register(unregister) new classifier type */ 61 62 int register_tcf_proto_ops(struct tcf_proto_ops *ops) 63 { 64 struct tcf_proto_ops *t; 65 int rc = -EEXIST; 66 67 write_lock(&cls_mod_lock); 68 list_for_each_entry(t, &tcf_proto_base, head) 69 if (!strcmp(ops->kind, t->kind)) 70 goto out; 71 72 list_add_tail(&ops->head, &tcf_proto_base); 73 rc = 0; 74 out: 75 write_unlock(&cls_mod_lock); 76 return rc; 77 } 78 EXPORT_SYMBOL(register_tcf_proto_ops); 79 80 static struct workqueue_struct *tc_filter_wq; 81 82 int unregister_tcf_proto_ops(struct tcf_proto_ops *ops) 83 { 84 struct tcf_proto_ops *t; 85 int rc = -ENOENT; 86 87 /* Wait for outstanding call_rcu()s, if any, from a 88 * tcf_proto_ops's destroy() handler. 89 */ 90 rcu_barrier(); 91 flush_workqueue(tc_filter_wq); 92 93 write_lock(&cls_mod_lock); 94 list_for_each_entry(t, &tcf_proto_base, head) { 95 if (t == ops) { 96 list_del(&t->head); 97 rc = 0; 98 break; 99 } 100 } 101 write_unlock(&cls_mod_lock); 102 return rc; 103 } 104 EXPORT_SYMBOL(unregister_tcf_proto_ops); 105 106 bool tcf_queue_work(struct work_struct *work) 107 { 108 return queue_work(tc_filter_wq, work); 109 } 110 EXPORT_SYMBOL(tcf_queue_work); 111 112 /* Select new prio value from the range, managed by kernel. */ 113 114 static inline u32 tcf_auto_prio(struct tcf_proto *tp) 115 { 116 u32 first = TC_H_MAKE(0xC0000000U, 0U); 117 118 if (tp) 119 first = tp->prio - 1; 120 121 return TC_H_MAJ(first); 122 } 123 124 static struct tcf_proto *tcf_proto_create(const char *kind, u32 protocol, 125 u32 prio, struct tcf_chain *chain, 126 struct netlink_ext_ack *extack) 127 { 128 struct tcf_proto *tp; 129 int err; 130 131 tp = kzalloc(sizeof(*tp), GFP_KERNEL); 132 if (!tp) 133 return ERR_PTR(-ENOBUFS); 134 135 err = -ENOENT; 136 tp->ops = tcf_proto_lookup_ops(kind); 137 if (!tp->ops) { 138 #ifdef CONFIG_MODULES 139 rtnl_unlock(); 140 request_module("cls_%s", kind); 141 rtnl_lock(); 142 tp->ops = tcf_proto_lookup_ops(kind); 143 /* We dropped the RTNL semaphore in order to perform 144 * the module load. So, even if we succeeded in loading 145 * the module we have to replay the request. We indicate 146 * this using -EAGAIN. 147 */ 148 if (tp->ops) { 149 module_put(tp->ops->owner); 150 err = -EAGAIN; 151 } else { 152 NL_SET_ERR_MSG(extack, "TC classifier not found"); 153 err = -ENOENT; 154 } 155 #endif 156 goto errout; 157 } 158 tp->classify = tp->ops->classify; 159 tp->protocol = protocol; 160 tp->prio = prio; 161 tp->chain = chain; 162 163 err = tp->ops->init(tp); 164 if (err) { 165 module_put(tp->ops->owner); 166 goto errout; 167 } 168 return tp; 169 170 errout: 171 kfree(tp); 172 return ERR_PTR(err); 173 } 174 175 static void tcf_proto_destroy(struct tcf_proto *tp, 176 struct netlink_ext_ack *extack) 177 { 178 tp->ops->destroy(tp, extack); 179 module_put(tp->ops->owner); 180 kfree_rcu(tp, rcu); 181 } 182 183 struct tcf_filter_chain_list_item { 184 struct list_head list; 185 tcf_chain_head_change_t *chain_head_change; 186 void *chain_head_change_priv; 187 }; 188 189 static struct tcf_chain *tcf_chain_create(struct tcf_block *block, 190 u32 chain_index) 191 { 192 struct tcf_chain *chain; 193 194 chain = kzalloc(sizeof(*chain), GFP_KERNEL); 195 if (!chain) 196 return NULL; 197 INIT_LIST_HEAD(&chain->filter_chain_list); 198 list_add_tail(&chain->list, &block->chain_list); 199 chain->block = block; 200 chain->index = chain_index; 201 chain->refcnt = 1; 202 return chain; 203 } 204 205 static void tcf_chain_head_change_item(struct tcf_filter_chain_list_item *item, 206 struct tcf_proto *tp_head) 207 { 208 if (item->chain_head_change) 209 item->chain_head_change(tp_head, item->chain_head_change_priv); 210 } 211 static void tcf_chain_head_change(struct tcf_chain *chain, 212 struct tcf_proto *tp_head) 213 { 214 struct tcf_filter_chain_list_item *item; 215 216 list_for_each_entry(item, &chain->filter_chain_list, list) 217 tcf_chain_head_change_item(item, tp_head); 218 } 219 220 static void tcf_chain_flush(struct tcf_chain *chain) 221 { 222 struct tcf_proto *tp = rtnl_dereference(chain->filter_chain); 223 224 tcf_chain_head_change(chain, NULL); 225 while (tp) { 226 RCU_INIT_POINTER(chain->filter_chain, tp->next); 227 tcf_proto_destroy(tp, NULL); 228 tp = rtnl_dereference(chain->filter_chain); 229 tcf_chain_put(chain); 230 } 231 } 232 233 static void tcf_chain_destroy(struct tcf_chain *chain) 234 { 235 struct tcf_block *block = chain->block; 236 237 list_del(&chain->list); 238 kfree(chain); 239 if (list_empty(&block->chain_list)) 240 kfree(block); 241 } 242 243 static void tcf_chain_hold(struct tcf_chain *chain) 244 { 245 ++chain->refcnt; 246 } 247 248 struct tcf_chain *tcf_chain_get(struct tcf_block *block, u32 chain_index, 249 bool create) 250 { 251 struct tcf_chain *chain; 252 253 list_for_each_entry(chain, &block->chain_list, list) { 254 if (chain->index == chain_index) { 255 tcf_chain_hold(chain); 256 return chain; 257 } 258 } 259 260 return create ? tcf_chain_create(block, chain_index) : NULL; 261 } 262 EXPORT_SYMBOL(tcf_chain_get); 263 264 void tcf_chain_put(struct tcf_chain *chain) 265 { 266 if (--chain->refcnt == 0) 267 tcf_chain_destroy(chain); 268 } 269 EXPORT_SYMBOL(tcf_chain_put); 270 271 static bool tcf_block_offload_in_use(struct tcf_block *block) 272 { 273 return block->offloadcnt; 274 } 275 276 static int tcf_block_offload_cmd(struct tcf_block *block, 277 struct net_device *dev, 278 struct tcf_block_ext_info *ei, 279 enum tc_block_command command) 280 { 281 struct tc_block_offload bo = {}; 282 283 bo.command = command; 284 bo.binder_type = ei->binder_type; 285 bo.block = block; 286 return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_BLOCK, &bo); 287 } 288 289 static int tcf_block_offload_bind(struct tcf_block *block, struct Qdisc *q, 290 struct tcf_block_ext_info *ei) 291 { 292 struct net_device *dev = q->dev_queue->dev; 293 int err; 294 295 if (!dev->netdev_ops->ndo_setup_tc) 296 goto no_offload_dev_inc; 297 298 /* If tc offload feature is disabled and the block we try to bind 299 * to already has some offloaded filters, forbid to bind. 300 */ 301 if (!tc_can_offload(dev) && tcf_block_offload_in_use(block)) 302 return -EOPNOTSUPP; 303 304 err = tcf_block_offload_cmd(block, dev, ei, TC_BLOCK_BIND); 305 if (err == -EOPNOTSUPP) 306 goto no_offload_dev_inc; 307 return err; 308 309 no_offload_dev_inc: 310 if (tcf_block_offload_in_use(block)) 311 return -EOPNOTSUPP; 312 block->nooffloaddevcnt++; 313 return 0; 314 } 315 316 static void tcf_block_offload_unbind(struct tcf_block *block, struct Qdisc *q, 317 struct tcf_block_ext_info *ei) 318 { 319 struct net_device *dev = q->dev_queue->dev; 320 int err; 321 322 if (!dev->netdev_ops->ndo_setup_tc) 323 goto no_offload_dev_dec; 324 err = tcf_block_offload_cmd(block, dev, ei, TC_BLOCK_UNBIND); 325 if (err == -EOPNOTSUPP) 326 goto no_offload_dev_dec; 327 return; 328 329 no_offload_dev_dec: 330 WARN_ON(block->nooffloaddevcnt-- == 0); 331 } 332 333 static int 334 tcf_chain_head_change_cb_add(struct tcf_chain *chain, 335 struct tcf_block_ext_info *ei, 336 struct netlink_ext_ack *extack) 337 { 338 struct tcf_filter_chain_list_item *item; 339 340 item = kmalloc(sizeof(*item), GFP_KERNEL); 341 if (!item) { 342 NL_SET_ERR_MSG(extack, "Memory allocation for head change callback item failed"); 343 return -ENOMEM; 344 } 345 item->chain_head_change = ei->chain_head_change; 346 item->chain_head_change_priv = ei->chain_head_change_priv; 347 if (chain->filter_chain) 348 tcf_chain_head_change_item(item, chain->filter_chain); 349 list_add(&item->list, &chain->filter_chain_list); 350 return 0; 351 } 352 353 static void 354 tcf_chain_head_change_cb_del(struct tcf_chain *chain, 355 struct tcf_block_ext_info *ei) 356 { 357 struct tcf_filter_chain_list_item *item; 358 359 list_for_each_entry(item, &chain->filter_chain_list, list) { 360 if ((!ei->chain_head_change && !ei->chain_head_change_priv) || 361 (item->chain_head_change == ei->chain_head_change && 362 item->chain_head_change_priv == ei->chain_head_change_priv)) { 363 tcf_chain_head_change_item(item, NULL); 364 list_del(&item->list); 365 kfree(item); 366 return; 367 } 368 } 369 WARN_ON(1); 370 } 371 372 struct tcf_net { 373 struct idr idr; 374 }; 375 376 static unsigned int tcf_net_id; 377 378 static int tcf_block_insert(struct tcf_block *block, struct net *net, 379 struct netlink_ext_ack *extack) 380 { 381 struct tcf_net *tn = net_generic(net, tcf_net_id); 382 383 return idr_alloc_u32(&tn->idr, block, &block->index, block->index, 384 GFP_KERNEL); 385 } 386 387 static void tcf_block_remove(struct tcf_block *block, struct net *net) 388 { 389 struct tcf_net *tn = net_generic(net, tcf_net_id); 390 391 idr_remove(&tn->idr, block->index); 392 } 393 394 static struct tcf_block *tcf_block_create(struct net *net, struct Qdisc *q, 395 u32 block_index, 396 struct netlink_ext_ack *extack) 397 { 398 struct tcf_block *block; 399 struct tcf_chain *chain; 400 int err; 401 402 block = kzalloc(sizeof(*block), GFP_KERNEL); 403 if (!block) { 404 NL_SET_ERR_MSG(extack, "Memory allocation for block failed"); 405 return ERR_PTR(-ENOMEM); 406 } 407 INIT_LIST_HEAD(&block->chain_list); 408 INIT_LIST_HEAD(&block->cb_list); 409 INIT_LIST_HEAD(&block->owner_list); 410 411 /* Create chain 0 by default, it has to be always present. */ 412 chain = tcf_chain_create(block, 0); 413 if (!chain) { 414 NL_SET_ERR_MSG(extack, "Failed to create new tcf chain"); 415 err = -ENOMEM; 416 goto err_chain_create; 417 } 418 block->refcnt = 1; 419 block->net = net; 420 block->index = block_index; 421 422 /* Don't store q pointer for blocks which are shared */ 423 if (!tcf_block_shared(block)) 424 block->q = q; 425 return block; 426 427 err_chain_create: 428 kfree(block); 429 return ERR_PTR(err); 430 } 431 432 static struct tcf_block *tcf_block_lookup(struct net *net, u32 block_index) 433 { 434 struct tcf_net *tn = net_generic(net, tcf_net_id); 435 436 return idr_find(&tn->idr, block_index); 437 } 438 439 static struct tcf_chain *tcf_block_chain_zero(struct tcf_block *block) 440 { 441 return list_first_entry(&block->chain_list, struct tcf_chain, list); 442 } 443 444 struct tcf_block_owner_item { 445 struct list_head list; 446 struct Qdisc *q; 447 enum tcf_block_binder_type binder_type; 448 }; 449 450 static void 451 tcf_block_owner_netif_keep_dst(struct tcf_block *block, 452 struct Qdisc *q, 453 enum tcf_block_binder_type binder_type) 454 { 455 if (block->keep_dst && 456 binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS && 457 binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_EGRESS) 458 netif_keep_dst(qdisc_dev(q)); 459 } 460 461 void tcf_block_netif_keep_dst(struct tcf_block *block) 462 { 463 struct tcf_block_owner_item *item; 464 465 block->keep_dst = true; 466 list_for_each_entry(item, &block->owner_list, list) 467 tcf_block_owner_netif_keep_dst(block, item->q, 468 item->binder_type); 469 } 470 EXPORT_SYMBOL(tcf_block_netif_keep_dst); 471 472 static int tcf_block_owner_add(struct tcf_block *block, 473 struct Qdisc *q, 474 enum tcf_block_binder_type binder_type) 475 { 476 struct tcf_block_owner_item *item; 477 478 item = kmalloc(sizeof(*item), GFP_KERNEL); 479 if (!item) 480 return -ENOMEM; 481 item->q = q; 482 item->binder_type = binder_type; 483 list_add(&item->list, &block->owner_list); 484 return 0; 485 } 486 487 static void tcf_block_owner_del(struct tcf_block *block, 488 struct Qdisc *q, 489 enum tcf_block_binder_type binder_type) 490 { 491 struct tcf_block_owner_item *item; 492 493 list_for_each_entry(item, &block->owner_list, list) { 494 if (item->q == q && item->binder_type == binder_type) { 495 list_del(&item->list); 496 kfree(item); 497 return; 498 } 499 } 500 WARN_ON(1); 501 } 502 503 int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q, 504 struct tcf_block_ext_info *ei, 505 struct netlink_ext_ack *extack) 506 { 507 struct net *net = qdisc_net(q); 508 struct tcf_block *block = NULL; 509 bool created = false; 510 int err; 511 512 if (ei->block_index) { 513 /* block_index not 0 means the shared block is requested */ 514 block = tcf_block_lookup(net, ei->block_index); 515 if (block) 516 block->refcnt++; 517 } 518 519 if (!block) { 520 block = tcf_block_create(net, q, ei->block_index, extack); 521 if (IS_ERR(block)) 522 return PTR_ERR(block); 523 created = true; 524 if (tcf_block_shared(block)) { 525 err = tcf_block_insert(block, net, extack); 526 if (err) 527 goto err_block_insert; 528 } 529 } 530 531 err = tcf_block_owner_add(block, q, ei->binder_type); 532 if (err) 533 goto err_block_owner_add; 534 535 tcf_block_owner_netif_keep_dst(block, q, ei->binder_type); 536 537 err = tcf_chain_head_change_cb_add(tcf_block_chain_zero(block), 538 ei, extack); 539 if (err) 540 goto err_chain_head_change_cb_add; 541 542 err = tcf_block_offload_bind(block, q, ei); 543 if (err) 544 goto err_block_offload_bind; 545 546 *p_block = block; 547 return 0; 548 549 err_block_offload_bind: 550 tcf_chain_head_change_cb_del(tcf_block_chain_zero(block), ei); 551 err_chain_head_change_cb_add: 552 tcf_block_owner_del(block, q, ei->binder_type); 553 err_block_owner_add: 554 if (created) { 555 if (tcf_block_shared(block)) 556 tcf_block_remove(block, net); 557 err_block_insert: 558 kfree(tcf_block_chain_zero(block)); 559 kfree(block); 560 } else { 561 block->refcnt--; 562 } 563 return err; 564 } 565 EXPORT_SYMBOL(tcf_block_get_ext); 566 567 static void tcf_chain_head_change_dflt(struct tcf_proto *tp_head, void *priv) 568 { 569 struct tcf_proto __rcu **p_filter_chain = priv; 570 571 rcu_assign_pointer(*p_filter_chain, tp_head); 572 } 573 574 int tcf_block_get(struct tcf_block **p_block, 575 struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q, 576 struct netlink_ext_ack *extack) 577 { 578 struct tcf_block_ext_info ei = { 579 .chain_head_change = tcf_chain_head_change_dflt, 580 .chain_head_change_priv = p_filter_chain, 581 }; 582 583 WARN_ON(!p_filter_chain); 584 return tcf_block_get_ext(p_block, q, &ei, extack); 585 } 586 EXPORT_SYMBOL(tcf_block_get); 587 588 /* XXX: Standalone actions are not allowed to jump to any chain, and bound 589 * actions should be all removed after flushing. 590 */ 591 void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q, 592 struct tcf_block_ext_info *ei) 593 { 594 struct tcf_chain *chain, *tmp; 595 596 if (!block) 597 return; 598 tcf_chain_head_change_cb_del(tcf_block_chain_zero(block), ei); 599 tcf_block_owner_del(block, q, ei->binder_type); 600 601 if (--block->refcnt == 0) { 602 if (tcf_block_shared(block)) 603 tcf_block_remove(block, block->net); 604 605 /* Hold a refcnt for all chains, so that they don't disappear 606 * while we are iterating. 607 */ 608 list_for_each_entry(chain, &block->chain_list, list) 609 tcf_chain_hold(chain); 610 611 list_for_each_entry(chain, &block->chain_list, list) 612 tcf_chain_flush(chain); 613 } 614 615 tcf_block_offload_unbind(block, q, ei); 616 617 if (block->refcnt == 0) { 618 /* At this point, all the chains should have refcnt >= 1. */ 619 list_for_each_entry_safe(chain, tmp, &block->chain_list, list) 620 tcf_chain_put(chain); 621 622 /* Finally, put chain 0 and allow block to be freed. */ 623 tcf_chain_put(tcf_block_chain_zero(block)); 624 } 625 } 626 EXPORT_SYMBOL(tcf_block_put_ext); 627 628 void tcf_block_put(struct tcf_block *block) 629 { 630 struct tcf_block_ext_info ei = {0, }; 631 632 if (!block) 633 return; 634 tcf_block_put_ext(block, block->q, &ei); 635 } 636 637 EXPORT_SYMBOL(tcf_block_put); 638 639 struct tcf_block_cb { 640 struct list_head list; 641 tc_setup_cb_t *cb; 642 void *cb_ident; 643 void *cb_priv; 644 unsigned int refcnt; 645 }; 646 647 void *tcf_block_cb_priv(struct tcf_block_cb *block_cb) 648 { 649 return block_cb->cb_priv; 650 } 651 EXPORT_SYMBOL(tcf_block_cb_priv); 652 653 struct tcf_block_cb *tcf_block_cb_lookup(struct tcf_block *block, 654 tc_setup_cb_t *cb, void *cb_ident) 655 { struct tcf_block_cb *block_cb; 656 657 list_for_each_entry(block_cb, &block->cb_list, list) 658 if (block_cb->cb == cb && block_cb->cb_ident == cb_ident) 659 return block_cb; 660 return NULL; 661 } 662 EXPORT_SYMBOL(tcf_block_cb_lookup); 663 664 void tcf_block_cb_incref(struct tcf_block_cb *block_cb) 665 { 666 block_cb->refcnt++; 667 } 668 EXPORT_SYMBOL(tcf_block_cb_incref); 669 670 unsigned int tcf_block_cb_decref(struct tcf_block_cb *block_cb) 671 { 672 return --block_cb->refcnt; 673 } 674 EXPORT_SYMBOL(tcf_block_cb_decref); 675 676 struct tcf_block_cb *__tcf_block_cb_register(struct tcf_block *block, 677 tc_setup_cb_t *cb, void *cb_ident, 678 void *cb_priv) 679 { 680 struct tcf_block_cb *block_cb; 681 682 /* At this point, playback of previous block cb calls is not supported, 683 * so forbid to register to block which already has some offloaded 684 * filters present. 685 */ 686 if (tcf_block_offload_in_use(block)) 687 return ERR_PTR(-EOPNOTSUPP); 688 689 block_cb = kzalloc(sizeof(*block_cb), GFP_KERNEL); 690 if (!block_cb) 691 return ERR_PTR(-ENOMEM); 692 block_cb->cb = cb; 693 block_cb->cb_ident = cb_ident; 694 block_cb->cb_priv = cb_priv; 695 list_add(&block_cb->list, &block->cb_list); 696 return block_cb; 697 } 698 EXPORT_SYMBOL(__tcf_block_cb_register); 699 700 int tcf_block_cb_register(struct tcf_block *block, 701 tc_setup_cb_t *cb, void *cb_ident, 702 void *cb_priv) 703 { 704 struct tcf_block_cb *block_cb; 705 706 block_cb = __tcf_block_cb_register(block, cb, cb_ident, cb_priv); 707 return IS_ERR(block_cb) ? PTR_ERR(block_cb) : 0; 708 } 709 EXPORT_SYMBOL(tcf_block_cb_register); 710 711 void __tcf_block_cb_unregister(struct tcf_block_cb *block_cb) 712 { 713 list_del(&block_cb->list); 714 kfree(block_cb); 715 } 716 EXPORT_SYMBOL(__tcf_block_cb_unregister); 717 718 void tcf_block_cb_unregister(struct tcf_block *block, 719 tc_setup_cb_t *cb, void *cb_ident) 720 { 721 struct tcf_block_cb *block_cb; 722 723 block_cb = tcf_block_cb_lookup(block, cb, cb_ident); 724 if (!block_cb) 725 return; 726 __tcf_block_cb_unregister(block_cb); 727 } 728 EXPORT_SYMBOL(tcf_block_cb_unregister); 729 730 static int tcf_block_cb_call(struct tcf_block *block, enum tc_setup_type type, 731 void *type_data, bool err_stop) 732 { 733 struct tcf_block_cb *block_cb; 734 int ok_count = 0; 735 int err; 736 737 /* Make sure all netdevs sharing this block are offload-capable. */ 738 if (block->nooffloaddevcnt && err_stop) 739 return -EOPNOTSUPP; 740 741 list_for_each_entry(block_cb, &block->cb_list, list) { 742 err = block_cb->cb(type, type_data, block_cb->cb_priv); 743 if (err) { 744 if (err_stop) 745 return err; 746 } else { 747 ok_count++; 748 } 749 } 750 return ok_count; 751 } 752 753 /* Main classifier routine: scans classifier chain attached 754 * to this qdisc, (optionally) tests for protocol and asks 755 * specific classifiers. 756 */ 757 int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp, 758 struct tcf_result *res, bool compat_mode) 759 { 760 __be16 protocol = tc_skb_protocol(skb); 761 #ifdef CONFIG_NET_CLS_ACT 762 const int max_reclassify_loop = 4; 763 const struct tcf_proto *orig_tp = tp; 764 const struct tcf_proto *first_tp; 765 int limit = 0; 766 767 reclassify: 768 #endif 769 for (; tp; tp = rcu_dereference_bh(tp->next)) { 770 int err; 771 772 if (tp->protocol != protocol && 773 tp->protocol != htons(ETH_P_ALL)) 774 continue; 775 776 err = tp->classify(skb, tp, res); 777 #ifdef CONFIG_NET_CLS_ACT 778 if (unlikely(err == TC_ACT_RECLASSIFY && !compat_mode)) { 779 first_tp = orig_tp; 780 goto reset; 781 } else if (unlikely(TC_ACT_EXT_CMP(err, TC_ACT_GOTO_CHAIN))) { 782 first_tp = res->goto_tp; 783 goto reset; 784 } 785 #endif 786 if (err >= 0) 787 return err; 788 } 789 790 return TC_ACT_UNSPEC; /* signal: continue lookup */ 791 #ifdef CONFIG_NET_CLS_ACT 792 reset: 793 if (unlikely(limit++ >= max_reclassify_loop)) { 794 net_notice_ratelimited("%u: reclassify loop, rule prio %u, protocol %02x\n", 795 tp->chain->block->index, 796 tp->prio & 0xffff, 797 ntohs(tp->protocol)); 798 return TC_ACT_SHOT; 799 } 800 801 tp = first_tp; 802 protocol = tc_skb_protocol(skb); 803 goto reclassify; 804 #endif 805 } 806 EXPORT_SYMBOL(tcf_classify); 807 808 struct tcf_chain_info { 809 struct tcf_proto __rcu **pprev; 810 struct tcf_proto __rcu *next; 811 }; 812 813 static struct tcf_proto *tcf_chain_tp_prev(struct tcf_chain_info *chain_info) 814 { 815 return rtnl_dereference(*chain_info->pprev); 816 } 817 818 static void tcf_chain_tp_insert(struct tcf_chain *chain, 819 struct tcf_chain_info *chain_info, 820 struct tcf_proto *tp) 821 { 822 if (*chain_info->pprev == chain->filter_chain) 823 tcf_chain_head_change(chain, tp); 824 RCU_INIT_POINTER(tp->next, tcf_chain_tp_prev(chain_info)); 825 rcu_assign_pointer(*chain_info->pprev, tp); 826 tcf_chain_hold(chain); 827 } 828 829 static void tcf_chain_tp_remove(struct tcf_chain *chain, 830 struct tcf_chain_info *chain_info, 831 struct tcf_proto *tp) 832 { 833 struct tcf_proto *next = rtnl_dereference(chain_info->next); 834 835 if (tp == chain->filter_chain) 836 tcf_chain_head_change(chain, next); 837 RCU_INIT_POINTER(*chain_info->pprev, next); 838 tcf_chain_put(chain); 839 } 840 841 static struct tcf_proto *tcf_chain_tp_find(struct tcf_chain *chain, 842 struct tcf_chain_info *chain_info, 843 u32 protocol, u32 prio, 844 bool prio_allocate) 845 { 846 struct tcf_proto **pprev; 847 struct tcf_proto *tp; 848 849 /* Check the chain for existence of proto-tcf with this priority */ 850 for (pprev = &chain->filter_chain; 851 (tp = rtnl_dereference(*pprev)); pprev = &tp->next) { 852 if (tp->prio >= prio) { 853 if (tp->prio == prio) { 854 if (prio_allocate || 855 (tp->protocol != protocol && protocol)) 856 return ERR_PTR(-EINVAL); 857 } else { 858 tp = NULL; 859 } 860 break; 861 } 862 } 863 chain_info->pprev = pprev; 864 chain_info->next = tp ? tp->next : NULL; 865 return tp; 866 } 867 868 static int tcf_fill_node(struct net *net, struct sk_buff *skb, 869 struct tcf_proto *tp, struct tcf_block *block, 870 struct Qdisc *q, u32 parent, void *fh, 871 u32 portid, u32 seq, u16 flags, int event) 872 { 873 struct tcmsg *tcm; 874 struct nlmsghdr *nlh; 875 unsigned char *b = skb_tail_pointer(skb); 876 877 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*tcm), flags); 878 if (!nlh) 879 goto out_nlmsg_trim; 880 tcm = nlmsg_data(nlh); 881 tcm->tcm_family = AF_UNSPEC; 882 tcm->tcm__pad1 = 0; 883 tcm->tcm__pad2 = 0; 884 if (q) { 885 tcm->tcm_ifindex = qdisc_dev(q)->ifindex; 886 tcm->tcm_parent = parent; 887 } else { 888 tcm->tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; 889 tcm->tcm_block_index = block->index; 890 } 891 tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); 892 if (nla_put_string(skb, TCA_KIND, tp->ops->kind)) 893 goto nla_put_failure; 894 if (nla_put_u32(skb, TCA_CHAIN, tp->chain->index)) 895 goto nla_put_failure; 896 if (!fh) { 897 tcm->tcm_handle = 0; 898 } else { 899 if (tp->ops->dump && tp->ops->dump(net, tp, fh, skb, tcm) < 0) 900 goto nla_put_failure; 901 } 902 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 903 return skb->len; 904 905 out_nlmsg_trim: 906 nla_put_failure: 907 nlmsg_trim(skb, b); 908 return -1; 909 } 910 911 static int tfilter_notify(struct net *net, struct sk_buff *oskb, 912 struct nlmsghdr *n, struct tcf_proto *tp, 913 struct tcf_block *block, struct Qdisc *q, 914 u32 parent, void *fh, int event, bool unicast) 915 { 916 struct sk_buff *skb; 917 u32 portid = oskb ? NETLINK_CB(oskb).portid : 0; 918 919 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); 920 if (!skb) 921 return -ENOBUFS; 922 923 if (tcf_fill_node(net, skb, tp, block, q, parent, fh, portid, 924 n->nlmsg_seq, n->nlmsg_flags, event) <= 0) { 925 kfree_skb(skb); 926 return -EINVAL; 927 } 928 929 if (unicast) 930 return netlink_unicast(net->rtnl, skb, portid, MSG_DONTWAIT); 931 932 return rtnetlink_send(skb, net, portid, RTNLGRP_TC, 933 n->nlmsg_flags & NLM_F_ECHO); 934 } 935 936 static int tfilter_del_notify(struct net *net, struct sk_buff *oskb, 937 struct nlmsghdr *n, struct tcf_proto *tp, 938 struct tcf_block *block, struct Qdisc *q, 939 u32 parent, void *fh, bool unicast, bool *last, 940 struct netlink_ext_ack *extack) 941 { 942 struct sk_buff *skb; 943 u32 portid = oskb ? NETLINK_CB(oskb).portid : 0; 944 int err; 945 946 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); 947 if (!skb) 948 return -ENOBUFS; 949 950 if (tcf_fill_node(net, skb, tp, block, q, parent, fh, portid, 951 n->nlmsg_seq, n->nlmsg_flags, RTM_DELTFILTER) <= 0) { 952 NL_SET_ERR_MSG(extack, "Failed to build del event notification"); 953 kfree_skb(skb); 954 return -EINVAL; 955 } 956 957 err = tp->ops->delete(tp, fh, last, extack); 958 if (err) { 959 kfree_skb(skb); 960 return err; 961 } 962 963 if (unicast) 964 return netlink_unicast(net->rtnl, skb, portid, MSG_DONTWAIT); 965 966 err = rtnetlink_send(skb, net, portid, RTNLGRP_TC, 967 n->nlmsg_flags & NLM_F_ECHO); 968 if (err < 0) 969 NL_SET_ERR_MSG(extack, "Failed to send filter delete notification"); 970 return err; 971 } 972 973 static void tfilter_notify_chain(struct net *net, struct sk_buff *oskb, 974 struct tcf_block *block, struct Qdisc *q, 975 u32 parent, struct nlmsghdr *n, 976 struct tcf_chain *chain, int event) 977 { 978 struct tcf_proto *tp; 979 980 for (tp = rtnl_dereference(chain->filter_chain); 981 tp; tp = rtnl_dereference(tp->next)) 982 tfilter_notify(net, oskb, n, tp, block, 983 q, parent, 0, event, false); 984 } 985 986 /* Add/change/delete/get a filter node */ 987 988 static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, 989 struct netlink_ext_ack *extack) 990 { 991 struct net *net = sock_net(skb->sk); 992 struct nlattr *tca[TCA_MAX + 1]; 993 struct tcmsg *t; 994 u32 protocol; 995 u32 prio; 996 bool prio_allocate; 997 u32 parent; 998 u32 chain_index; 999 struct Qdisc *q = NULL; 1000 struct tcf_chain_info chain_info; 1001 struct tcf_chain *chain = NULL; 1002 struct tcf_block *block; 1003 struct tcf_proto *tp; 1004 unsigned long cl; 1005 void *fh; 1006 int err; 1007 int tp_created; 1008 1009 if ((n->nlmsg_type != RTM_GETTFILTER) && 1010 !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) 1011 return -EPERM; 1012 1013 replay: 1014 tp_created = 0; 1015 1016 err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL, extack); 1017 if (err < 0) 1018 return err; 1019 1020 t = nlmsg_data(n); 1021 protocol = TC_H_MIN(t->tcm_info); 1022 prio = TC_H_MAJ(t->tcm_info); 1023 prio_allocate = false; 1024 parent = t->tcm_parent; 1025 cl = 0; 1026 1027 if (prio == 0) { 1028 switch (n->nlmsg_type) { 1029 case RTM_DELTFILTER: 1030 if (protocol || t->tcm_handle || tca[TCA_KIND]) { 1031 NL_SET_ERR_MSG(extack, "Cannot flush filters with protocol, handle or kind set"); 1032 return -ENOENT; 1033 } 1034 break; 1035 case RTM_NEWTFILTER: 1036 /* If no priority is provided by the user, 1037 * we allocate one. 1038 */ 1039 if (n->nlmsg_flags & NLM_F_CREATE) { 1040 prio = TC_H_MAKE(0x80000000U, 0U); 1041 prio_allocate = true; 1042 break; 1043 } 1044 /* fall-through */ 1045 default: 1046 NL_SET_ERR_MSG(extack, "Invalid filter command with priority of zero"); 1047 return -ENOENT; 1048 } 1049 } 1050 1051 /* Find head of filter chain. */ 1052 1053 if (t->tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK) { 1054 block = tcf_block_lookup(net, t->tcm_block_index); 1055 if (!block) { 1056 NL_SET_ERR_MSG(extack, "Block of given index was not found"); 1057 err = -EINVAL; 1058 goto errout; 1059 } 1060 } else { 1061 const struct Qdisc_class_ops *cops; 1062 struct net_device *dev; 1063 1064 /* Find link */ 1065 dev = __dev_get_by_index(net, t->tcm_ifindex); 1066 if (!dev) 1067 return -ENODEV; 1068 1069 /* Find qdisc */ 1070 if (!parent) { 1071 q = dev->qdisc; 1072 parent = q->handle; 1073 } else { 1074 q = qdisc_lookup(dev, TC_H_MAJ(t->tcm_parent)); 1075 if (!q) { 1076 NL_SET_ERR_MSG(extack, "Parent Qdisc doesn't exists"); 1077 return -EINVAL; 1078 } 1079 } 1080 1081 /* Is it classful? */ 1082 cops = q->ops->cl_ops; 1083 if (!cops) { 1084 NL_SET_ERR_MSG(extack, "Qdisc not classful"); 1085 return -EINVAL; 1086 } 1087 1088 if (!cops->tcf_block) { 1089 NL_SET_ERR_MSG(extack, "Class doesn't support blocks"); 1090 return -EOPNOTSUPP; 1091 } 1092 1093 /* Do we search for filter, attached to class? */ 1094 if (TC_H_MIN(parent)) { 1095 cl = cops->find(q, parent); 1096 if (cl == 0) { 1097 NL_SET_ERR_MSG(extack, "Specified class doesn't exist"); 1098 return -ENOENT; 1099 } 1100 } 1101 1102 /* And the last stroke */ 1103 block = cops->tcf_block(q, cl, extack); 1104 if (!block) { 1105 err = -EINVAL; 1106 goto errout; 1107 } 1108 if (tcf_block_shared(block)) { 1109 NL_SET_ERR_MSG(extack, "This filter block is shared. Please use the block index to manipulate the filters"); 1110 err = -EOPNOTSUPP; 1111 goto errout; 1112 } 1113 } 1114 1115 chain_index = tca[TCA_CHAIN] ? nla_get_u32(tca[TCA_CHAIN]) : 0; 1116 if (chain_index > TC_ACT_EXT_VAL_MASK) { 1117 NL_SET_ERR_MSG(extack, "Specified chain index exceeds upper limit"); 1118 err = -EINVAL; 1119 goto errout; 1120 } 1121 chain = tcf_chain_get(block, chain_index, 1122 n->nlmsg_type == RTM_NEWTFILTER); 1123 if (!chain) { 1124 NL_SET_ERR_MSG(extack, "Cannot find specified filter chain"); 1125 err = n->nlmsg_type == RTM_NEWTFILTER ? -ENOMEM : -EINVAL; 1126 goto errout; 1127 } 1128 1129 if (n->nlmsg_type == RTM_DELTFILTER && prio == 0) { 1130 tfilter_notify_chain(net, skb, block, q, parent, n, 1131 chain, RTM_DELTFILTER); 1132 tcf_chain_flush(chain); 1133 err = 0; 1134 goto errout; 1135 } 1136 1137 tp = tcf_chain_tp_find(chain, &chain_info, protocol, 1138 prio, prio_allocate); 1139 if (IS_ERR(tp)) { 1140 NL_SET_ERR_MSG(extack, "Filter with specified priority/protocol not found"); 1141 err = PTR_ERR(tp); 1142 goto errout; 1143 } 1144 1145 if (tp == NULL) { 1146 /* Proto-tcf does not exist, create new one */ 1147 1148 if (tca[TCA_KIND] == NULL || !protocol) { 1149 NL_SET_ERR_MSG(extack, "Filter kind and protocol must be specified"); 1150 err = -EINVAL; 1151 goto errout; 1152 } 1153 1154 if (n->nlmsg_type != RTM_NEWTFILTER || 1155 !(n->nlmsg_flags & NLM_F_CREATE)) { 1156 NL_SET_ERR_MSG(extack, "Need both RTM_NEWTFILTER and NLM_F_CREATE to create a new filter"); 1157 err = -ENOENT; 1158 goto errout; 1159 } 1160 1161 if (prio_allocate) 1162 prio = tcf_auto_prio(tcf_chain_tp_prev(&chain_info)); 1163 1164 tp = tcf_proto_create(nla_data(tca[TCA_KIND]), 1165 protocol, prio, chain, extack); 1166 if (IS_ERR(tp)) { 1167 err = PTR_ERR(tp); 1168 goto errout; 1169 } 1170 tp_created = 1; 1171 } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind)) { 1172 NL_SET_ERR_MSG(extack, "Specified filter kind does not match existing one"); 1173 err = -EINVAL; 1174 goto errout; 1175 } 1176 1177 fh = tp->ops->get(tp, t->tcm_handle); 1178 1179 if (!fh) { 1180 if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) { 1181 tcf_chain_tp_remove(chain, &chain_info, tp); 1182 tfilter_notify(net, skb, n, tp, block, q, parent, fh, 1183 RTM_DELTFILTER, false); 1184 tcf_proto_destroy(tp, extack); 1185 err = 0; 1186 goto errout; 1187 } 1188 1189 if (n->nlmsg_type != RTM_NEWTFILTER || 1190 !(n->nlmsg_flags & NLM_F_CREATE)) { 1191 NL_SET_ERR_MSG(extack, "Need both RTM_NEWTFILTER and NLM_F_CREATE to create a new filter"); 1192 err = -ENOENT; 1193 goto errout; 1194 } 1195 } else { 1196 bool last; 1197 1198 switch (n->nlmsg_type) { 1199 case RTM_NEWTFILTER: 1200 if (n->nlmsg_flags & NLM_F_EXCL) { 1201 if (tp_created) 1202 tcf_proto_destroy(tp, NULL); 1203 NL_SET_ERR_MSG(extack, "Filter already exists"); 1204 err = -EEXIST; 1205 goto errout; 1206 } 1207 break; 1208 case RTM_DELTFILTER: 1209 err = tfilter_del_notify(net, skb, n, tp, block, 1210 q, parent, fh, false, &last, 1211 extack); 1212 if (err) 1213 goto errout; 1214 if (last) { 1215 tcf_chain_tp_remove(chain, &chain_info, tp); 1216 tcf_proto_destroy(tp, extack); 1217 } 1218 goto errout; 1219 case RTM_GETTFILTER: 1220 err = tfilter_notify(net, skb, n, tp, block, q, parent, 1221 fh, RTM_NEWTFILTER, true); 1222 if (err < 0) 1223 NL_SET_ERR_MSG(extack, "Failed to send filter notify message"); 1224 goto errout; 1225 default: 1226 NL_SET_ERR_MSG(extack, "Invalid netlink message type"); 1227 err = -EINVAL; 1228 goto errout; 1229 } 1230 } 1231 1232 err = tp->ops->change(net, skb, tp, cl, t->tcm_handle, tca, &fh, 1233 n->nlmsg_flags & NLM_F_CREATE ? TCA_ACT_NOREPLACE : TCA_ACT_REPLACE, 1234 extack); 1235 if (err == 0) { 1236 if (tp_created) 1237 tcf_chain_tp_insert(chain, &chain_info, tp); 1238 tfilter_notify(net, skb, n, tp, block, q, parent, fh, 1239 RTM_NEWTFILTER, false); 1240 } else { 1241 if (tp_created) 1242 tcf_proto_destroy(tp, NULL); 1243 } 1244 1245 errout: 1246 if (chain) 1247 tcf_chain_put(chain); 1248 if (err == -EAGAIN) 1249 /* Replay the request. */ 1250 goto replay; 1251 return err; 1252 } 1253 1254 struct tcf_dump_args { 1255 struct tcf_walker w; 1256 struct sk_buff *skb; 1257 struct netlink_callback *cb; 1258 struct tcf_block *block; 1259 struct Qdisc *q; 1260 u32 parent; 1261 }; 1262 1263 static int tcf_node_dump(struct tcf_proto *tp, void *n, struct tcf_walker *arg) 1264 { 1265 struct tcf_dump_args *a = (void *)arg; 1266 struct net *net = sock_net(a->skb->sk); 1267 1268 return tcf_fill_node(net, a->skb, tp, a->block, a->q, a->parent, 1269 n, NETLINK_CB(a->cb->skb).portid, 1270 a->cb->nlh->nlmsg_seq, NLM_F_MULTI, 1271 RTM_NEWTFILTER); 1272 } 1273 1274 static bool tcf_chain_dump(struct tcf_chain *chain, struct Qdisc *q, u32 parent, 1275 struct sk_buff *skb, struct netlink_callback *cb, 1276 long index_start, long *p_index) 1277 { 1278 struct net *net = sock_net(skb->sk); 1279 struct tcf_block *block = chain->block; 1280 struct tcmsg *tcm = nlmsg_data(cb->nlh); 1281 struct tcf_dump_args arg; 1282 struct tcf_proto *tp; 1283 1284 for (tp = rtnl_dereference(chain->filter_chain); 1285 tp; tp = rtnl_dereference(tp->next), (*p_index)++) { 1286 if (*p_index < index_start) 1287 continue; 1288 if (TC_H_MAJ(tcm->tcm_info) && 1289 TC_H_MAJ(tcm->tcm_info) != tp->prio) 1290 continue; 1291 if (TC_H_MIN(tcm->tcm_info) && 1292 TC_H_MIN(tcm->tcm_info) != tp->protocol) 1293 continue; 1294 if (*p_index > index_start) 1295 memset(&cb->args[1], 0, 1296 sizeof(cb->args) - sizeof(cb->args[0])); 1297 if (cb->args[1] == 0) { 1298 if (tcf_fill_node(net, skb, tp, block, q, parent, 0, 1299 NETLINK_CB(cb->skb).portid, 1300 cb->nlh->nlmsg_seq, NLM_F_MULTI, 1301 RTM_NEWTFILTER) <= 0) 1302 return false; 1303 1304 cb->args[1] = 1; 1305 } 1306 if (!tp->ops->walk) 1307 continue; 1308 arg.w.fn = tcf_node_dump; 1309 arg.skb = skb; 1310 arg.cb = cb; 1311 arg.block = block; 1312 arg.q = q; 1313 arg.parent = parent; 1314 arg.w.stop = 0; 1315 arg.w.skip = cb->args[1] - 1; 1316 arg.w.count = 0; 1317 tp->ops->walk(tp, &arg.w); 1318 cb->args[1] = arg.w.count + 1; 1319 if (arg.w.stop) 1320 return false; 1321 } 1322 return true; 1323 } 1324 1325 /* called with RTNL */ 1326 static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb) 1327 { 1328 struct net *net = sock_net(skb->sk); 1329 struct nlattr *tca[TCA_MAX + 1]; 1330 struct Qdisc *q = NULL; 1331 struct tcf_block *block; 1332 struct tcf_chain *chain; 1333 struct tcmsg *tcm = nlmsg_data(cb->nlh); 1334 long index_start; 1335 long index; 1336 u32 parent; 1337 int err; 1338 1339 if (nlmsg_len(cb->nlh) < sizeof(*tcm)) 1340 return skb->len; 1341 1342 err = nlmsg_parse(cb->nlh, sizeof(*tcm), tca, TCA_MAX, NULL, NULL); 1343 if (err) 1344 return err; 1345 1346 if (tcm->tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK) { 1347 block = tcf_block_lookup(net, tcm->tcm_block_index); 1348 if (!block) 1349 goto out; 1350 /* If we work with block index, q is NULL and parent value 1351 * will never be used in the following code. The check 1352 * in tcf_fill_node prevents it. However, compiler does not 1353 * see that far, so set parent to zero to silence the warning 1354 * about parent being uninitialized. 1355 */ 1356 parent = 0; 1357 } else { 1358 const struct Qdisc_class_ops *cops; 1359 struct net_device *dev; 1360 unsigned long cl = 0; 1361 1362 dev = __dev_get_by_index(net, tcm->tcm_ifindex); 1363 if (!dev) 1364 return skb->len; 1365 1366 parent = tcm->tcm_parent; 1367 if (!parent) { 1368 q = dev->qdisc; 1369 parent = q->handle; 1370 } else { 1371 q = qdisc_lookup(dev, TC_H_MAJ(tcm->tcm_parent)); 1372 } 1373 if (!q) 1374 goto out; 1375 cops = q->ops->cl_ops; 1376 if (!cops) 1377 goto out; 1378 if (!cops->tcf_block) 1379 goto out; 1380 if (TC_H_MIN(tcm->tcm_parent)) { 1381 cl = cops->find(q, tcm->tcm_parent); 1382 if (cl == 0) 1383 goto out; 1384 } 1385 block = cops->tcf_block(q, cl, NULL); 1386 if (!block) 1387 goto out; 1388 if (tcf_block_shared(block)) 1389 q = NULL; 1390 } 1391 1392 index_start = cb->args[0]; 1393 index = 0; 1394 1395 list_for_each_entry(chain, &block->chain_list, list) { 1396 if (tca[TCA_CHAIN] && 1397 nla_get_u32(tca[TCA_CHAIN]) != chain->index) 1398 continue; 1399 if (!tcf_chain_dump(chain, q, parent, skb, cb, 1400 index_start, &index)) { 1401 err = -EMSGSIZE; 1402 break; 1403 } 1404 } 1405 1406 cb->args[0] = index; 1407 1408 out: 1409 /* If we did no progress, the error (EMSGSIZE) is real */ 1410 if (skb->len == 0 && err) 1411 return err; 1412 return skb->len; 1413 } 1414 1415 void tcf_exts_destroy(struct tcf_exts *exts) 1416 { 1417 #ifdef CONFIG_NET_CLS_ACT 1418 LIST_HEAD(actions); 1419 1420 ASSERT_RTNL(); 1421 tcf_exts_to_list(exts, &actions); 1422 tcf_action_destroy(&actions, TCA_ACT_UNBIND); 1423 kfree(exts->actions); 1424 exts->nr_actions = 0; 1425 #endif 1426 } 1427 EXPORT_SYMBOL(tcf_exts_destroy); 1428 1429 int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb, 1430 struct nlattr *rate_tlv, struct tcf_exts *exts, bool ovr, 1431 struct netlink_ext_ack *extack) 1432 { 1433 #ifdef CONFIG_NET_CLS_ACT 1434 { 1435 struct tc_action *act; 1436 size_t attr_size = 0; 1437 1438 if (exts->police && tb[exts->police]) { 1439 act = tcf_action_init_1(net, tp, tb[exts->police], 1440 rate_tlv, "police", ovr, 1441 TCA_ACT_BIND, extack); 1442 if (IS_ERR(act)) 1443 return PTR_ERR(act); 1444 1445 act->type = exts->type = TCA_OLD_COMPAT; 1446 exts->actions[0] = act; 1447 exts->nr_actions = 1; 1448 } else if (exts->action && tb[exts->action]) { 1449 LIST_HEAD(actions); 1450 int err, i = 0; 1451 1452 err = tcf_action_init(net, tp, tb[exts->action], 1453 rate_tlv, NULL, ovr, TCA_ACT_BIND, 1454 &actions, &attr_size, extack); 1455 if (err) 1456 return err; 1457 list_for_each_entry(act, &actions, list) 1458 exts->actions[i++] = act; 1459 exts->nr_actions = i; 1460 } 1461 exts->net = net; 1462 } 1463 #else 1464 if ((exts->action && tb[exts->action]) || 1465 (exts->police && tb[exts->police])) { 1466 NL_SET_ERR_MSG(extack, "Classifier actions are not supported per compile options (CONFIG_NET_CLS_ACT)"); 1467 return -EOPNOTSUPP; 1468 } 1469 #endif 1470 1471 return 0; 1472 } 1473 EXPORT_SYMBOL(tcf_exts_validate); 1474 1475 void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src) 1476 { 1477 #ifdef CONFIG_NET_CLS_ACT 1478 struct tcf_exts old = *dst; 1479 1480 *dst = *src; 1481 tcf_exts_destroy(&old); 1482 #endif 1483 } 1484 EXPORT_SYMBOL(tcf_exts_change); 1485 1486 #ifdef CONFIG_NET_CLS_ACT 1487 static struct tc_action *tcf_exts_first_act(struct tcf_exts *exts) 1488 { 1489 if (exts->nr_actions == 0) 1490 return NULL; 1491 else 1492 return exts->actions[0]; 1493 } 1494 #endif 1495 1496 int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts) 1497 { 1498 #ifdef CONFIG_NET_CLS_ACT 1499 struct nlattr *nest; 1500 1501 if (exts->action && tcf_exts_has_actions(exts)) { 1502 /* 1503 * again for backward compatible mode - we want 1504 * to work with both old and new modes of entering 1505 * tc data even if iproute2 was newer - jhs 1506 */ 1507 if (exts->type != TCA_OLD_COMPAT) { 1508 LIST_HEAD(actions); 1509 1510 nest = nla_nest_start(skb, exts->action); 1511 if (nest == NULL) 1512 goto nla_put_failure; 1513 1514 tcf_exts_to_list(exts, &actions); 1515 if (tcf_action_dump(skb, &actions, 0, 0) < 0) 1516 goto nla_put_failure; 1517 nla_nest_end(skb, nest); 1518 } else if (exts->police) { 1519 struct tc_action *act = tcf_exts_first_act(exts); 1520 nest = nla_nest_start(skb, exts->police); 1521 if (nest == NULL || !act) 1522 goto nla_put_failure; 1523 if (tcf_action_dump_old(skb, act, 0, 0) < 0) 1524 goto nla_put_failure; 1525 nla_nest_end(skb, nest); 1526 } 1527 } 1528 return 0; 1529 1530 nla_put_failure: 1531 nla_nest_cancel(skb, nest); 1532 return -1; 1533 #else 1534 return 0; 1535 #endif 1536 } 1537 EXPORT_SYMBOL(tcf_exts_dump); 1538 1539 1540 int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts) 1541 { 1542 #ifdef CONFIG_NET_CLS_ACT 1543 struct tc_action *a = tcf_exts_first_act(exts); 1544 if (a != NULL && tcf_action_copy_stats(skb, a, 1) < 0) 1545 return -1; 1546 #endif 1547 return 0; 1548 } 1549 EXPORT_SYMBOL(tcf_exts_dump_stats); 1550 1551 static int tc_exts_setup_cb_egdev_call(struct tcf_exts *exts, 1552 enum tc_setup_type type, 1553 void *type_data, bool err_stop) 1554 { 1555 int ok_count = 0; 1556 #ifdef CONFIG_NET_CLS_ACT 1557 const struct tc_action *a; 1558 struct net_device *dev; 1559 int i, ret; 1560 1561 if (!tcf_exts_has_actions(exts)) 1562 return 0; 1563 1564 for (i = 0; i < exts->nr_actions; i++) { 1565 a = exts->actions[i]; 1566 if (!a->ops->get_dev) 1567 continue; 1568 dev = a->ops->get_dev(a); 1569 if (!dev) 1570 continue; 1571 ret = tc_setup_cb_egdev_call(dev, type, type_data, err_stop); 1572 if (ret < 0) 1573 return ret; 1574 ok_count += ret; 1575 } 1576 #endif 1577 return ok_count; 1578 } 1579 1580 int tc_setup_cb_call(struct tcf_block *block, struct tcf_exts *exts, 1581 enum tc_setup_type type, void *type_data, bool err_stop) 1582 { 1583 int ok_count; 1584 int ret; 1585 1586 ret = tcf_block_cb_call(block, type, type_data, err_stop); 1587 if (ret < 0) 1588 return ret; 1589 ok_count = ret; 1590 1591 if (!exts) 1592 return ok_count; 1593 ret = tc_exts_setup_cb_egdev_call(exts, type, type_data, err_stop); 1594 if (ret < 0) 1595 return ret; 1596 ok_count += ret; 1597 1598 return ok_count; 1599 } 1600 EXPORT_SYMBOL(tc_setup_cb_call); 1601 1602 static __net_init int tcf_net_init(struct net *net) 1603 { 1604 struct tcf_net *tn = net_generic(net, tcf_net_id); 1605 1606 idr_init(&tn->idr); 1607 return 0; 1608 } 1609 1610 static void __net_exit tcf_net_exit(struct net *net) 1611 { 1612 struct tcf_net *tn = net_generic(net, tcf_net_id); 1613 1614 idr_destroy(&tn->idr); 1615 } 1616 1617 static struct pernet_operations tcf_net_ops = { 1618 .init = tcf_net_init, 1619 .exit = tcf_net_exit, 1620 .id = &tcf_net_id, 1621 .size = sizeof(struct tcf_net), 1622 }; 1623 1624 static int __init tc_filter_init(void) 1625 { 1626 int err; 1627 1628 tc_filter_wq = alloc_ordered_workqueue("tc_filter_workqueue", 0); 1629 if (!tc_filter_wq) 1630 return -ENOMEM; 1631 1632 err = register_pernet_subsys(&tcf_net_ops); 1633 if (err) 1634 goto err_register_pernet_subsys; 1635 1636 rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL, 0); 1637 rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL, 0); 1638 rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter, 1639 tc_dump_tfilter, 0); 1640 1641 return 0; 1642 1643 err_register_pernet_subsys: 1644 destroy_workqueue(tc_filter_wq); 1645 return err; 1646 } 1647 1648 subsys_initcall(tc_filter_init); 1649