1/* 2 * net/sched/cls_u32.c Ugly (or Universal) 32bit key Packet Classifier. 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 * The filters are packed to hash tables of key nodes 12 * with a set of 32bit key/mask pairs at every node. 13 * Nodes reference next level hash tables etc. 14 * 15 * This scheme is the best universal classifier I managed to 16 * invent; it is not super-fast, but it is not slow (provided you 17 * program it correctly), and general enough. And its relative 18 * speed grows as the number of rules becomes larger. 19 * 20 * It seems that it represents the best middle point between 21 * speed and manageability both by human and by machine. 22 * 23 * It is especially useful for link sharing combined with QoS; 24 * pure RSVP doesn't need such a general approach and can use 25 * much simpler (and faster) schemes, sort of cls_rsvp.c. 26 * 27 * JHS: We should remove the CONFIG_NET_CLS_IND from here 28 * eventually when the meta match extension is made available 29 * 30 * nfmark match added by Catalin(ux aka Dino) BOIE <catab at umbrella.ro> 31 */ 32 33#include <linux/module.h> 34#include <linux/slab.h> 35#include <linux/types.h> 36#include <linux/kernel.h> 37#include <linux/string.h> 38#include <linux/errno.h> 39#include <linux/percpu.h> 40#include <linux/rtnetlink.h> 41#include <linux/skbuff.h> 42#include <linux/bitmap.h> 43#include <net/netlink.h> 44#include <net/act_api.h> 45#include <net/pkt_cls.h> 46 47struct tc_u_knode { 48 struct tc_u_knode __rcu *next; 49 u32 handle; 50 struct tc_u_hnode __rcu *ht_up; 51 struct tcf_exts exts; 52#ifdef CONFIG_NET_CLS_IND 53 int ifindex; 54#endif 55 u8 fshift; 56 struct tcf_result res; 57 struct tc_u_hnode __rcu *ht_down; 58#ifdef CONFIG_CLS_U32_PERF 59 struct tc_u32_pcnt __percpu *pf; 60#endif 61#ifdef CONFIG_CLS_U32_MARK 62 u32 val; 63 u32 mask; 64 u32 __percpu *pcpu_success; 65#endif 66 struct tcf_proto *tp; 67 struct rcu_head rcu; 68 /* The 'sel' field MUST be the last field in structure to allow for 69 * tc_u32_keys allocated at end of structure. 70 */ 71 struct tc_u32_sel sel; 72}; 73 74struct tc_u_hnode { 75 struct tc_u_hnode __rcu *next; 76 u32 handle; 77 u32 prio; 78 struct tc_u_common *tp_c; 79 int refcnt; 80 unsigned int divisor; 81 struct rcu_head rcu; 82 /* The 'ht' field MUST be the last field in structure to allow for 83 * more entries allocated at end of structure. 84 */ 85 struct tc_u_knode __rcu *ht[1]; 86}; 87 88struct tc_u_common { 89 struct tc_u_hnode __rcu *hlist; 90 struct Qdisc *q; 91 int refcnt; 92 u32 hgenerator; 93 struct rcu_head rcu; 94}; 95 96static inline unsigned int u32_hash_fold(__be32 key, 97 const struct tc_u32_sel *sel, 98 u8 fshift) 99{ 100 unsigned int h = ntohl(key & sel->hmask) >> fshift; 101 102 return h; 103} 104 105static int u32_classify(struct sk_buff *skb, const struct tcf_proto *tp, struct tcf_result *res) 106{ 107 struct { 108 struct tc_u_knode *knode; 109 unsigned int off; 110 } stack[TC_U32_MAXDEPTH]; 111 112 struct tc_u_hnode *ht = rcu_dereference_bh(tp->root); 113 unsigned int off = skb_network_offset(skb); 114 struct tc_u_knode *n; 115 int sdepth = 0; 116 int off2 = 0; 117 int sel = 0; 118#ifdef CONFIG_CLS_U32_PERF 119 int j; 120#endif 121 int i, r; 122 123next_ht: 124 n = rcu_dereference_bh(ht->ht[sel]); 125 126next_knode: 127 if (n) { 128 struct tc_u32_key *key = n->sel.keys; 129 130#ifdef CONFIG_CLS_U32_PERF 131 __this_cpu_inc(n->pf->rcnt); 132 j = 0; 133#endif 134 135#ifdef CONFIG_CLS_U32_MARK 136 if ((skb->mark & n->mask) != n->val) { 137 n = rcu_dereference_bh(n->next); 138 goto next_knode; 139 } else { 140 __this_cpu_inc(*n->pcpu_success); 141 } 142#endif 143 144 for (i = n->sel.nkeys; i > 0; i--, key++) { 145 int toff = off + key->off + (off2 & key->offmask); 146 __be32 *data, hdata; 147 148 if (skb_headroom(skb) + toff > INT_MAX) 149 goto out; 150 151 data = skb_header_pointer(skb, toff, 4, &hdata); 152 if (!data) 153 goto out; 154 if ((*data ^ key->val) & key->mask) { 155 n = rcu_dereference_bh(n->next); 156 goto next_knode; 157 } 158#ifdef CONFIG_CLS_U32_PERF 159 __this_cpu_inc(n->pf->kcnts[j]); 160 j++; 161#endif 162 } 163 164 ht = rcu_dereference_bh(n->ht_down); 165 if (!ht) { 166check_terminal: 167 if (n->sel.flags & TC_U32_TERMINAL) { 168 169 *res = n->res; 170#ifdef CONFIG_NET_CLS_IND 171 if (!tcf_match_indev(skb, n->ifindex)) { 172 n = rcu_dereference_bh(n->next); 173 goto next_knode; 174 } 175#endif 176#ifdef CONFIG_CLS_U32_PERF 177 __this_cpu_inc(n->pf->rhit); 178#endif 179 r = tcf_exts_exec(skb, &n->exts, res); 180 if (r < 0) { 181 n = rcu_dereference_bh(n->next); 182 goto next_knode; 183 } 184 185 return r; 186 } 187 n = rcu_dereference_bh(n->next); 188 goto next_knode; 189 } 190 191 /* PUSH */ 192 if (sdepth >= TC_U32_MAXDEPTH) 193 goto deadloop; 194 stack[sdepth].knode = n; 195 stack[sdepth].off = off; 196 sdepth++; 197 198 ht = rcu_dereference_bh(n->ht_down); 199 sel = 0; 200 if (ht->divisor) { 201 __be32 *data, hdata; 202 203 data = skb_header_pointer(skb, off + n->sel.hoff, 4, 204 &hdata); 205 if (!data) 206 goto out; 207 sel = ht->divisor & u32_hash_fold(*data, &n->sel, 208 n->fshift); 209 } 210 if (!(n->sel.flags & (TC_U32_VAROFFSET | TC_U32_OFFSET | TC_U32_EAT))) 211 goto next_ht; 212 213 if (n->sel.flags & (TC_U32_OFFSET | TC_U32_VAROFFSET)) { 214 off2 = n->sel.off + 3; 215 if (n->sel.flags & TC_U32_VAROFFSET) { 216 __be16 *data, hdata; 217 218 data = skb_header_pointer(skb, 219 off + n->sel.offoff, 220 2, &hdata); 221 if (!data) 222 goto out; 223 off2 += ntohs(n->sel.offmask & *data) >> 224 n->sel.offshift; 225 } 226 off2 &= ~3; 227 } 228 if (n->sel.flags & TC_U32_EAT) { 229 off += off2; 230 off2 = 0; 231 } 232 233 if (off < skb->len) 234 goto next_ht; 235 } 236 237 /* POP */ 238 if (sdepth--) { 239 n = stack[sdepth].knode; 240 ht = rcu_dereference_bh(n->ht_up); 241 off = stack[sdepth].off; 242 goto check_terminal; 243 } 244out: 245 return -1; 246 247deadloop: 248 net_warn_ratelimited("cls_u32: dead loop\n"); 249 return -1; 250} 251 252static struct tc_u_hnode * 253u32_lookup_ht(struct tc_u_common *tp_c, u32 handle) 254{ 255 struct tc_u_hnode *ht; 256 257 for (ht = rtnl_dereference(tp_c->hlist); 258 ht; 259 ht = rtnl_dereference(ht->next)) 260 if (ht->handle == handle) 261 break; 262 263 return ht; 264} 265 266static struct tc_u_knode * 267u32_lookup_key(struct tc_u_hnode *ht, u32 handle) 268{ 269 unsigned int sel; 270 struct tc_u_knode *n = NULL; 271 272 sel = TC_U32_HASH(handle); 273 if (sel > ht->divisor) 274 goto out; 275 276 for (n = rtnl_dereference(ht->ht[sel]); 277 n; 278 n = rtnl_dereference(n->next)) 279 if (n->handle == handle) 280 break; 281out: 282 return n; 283} 284 285 286static unsigned long u32_get(struct tcf_proto *tp, u32 handle) 287{ 288 struct tc_u_hnode *ht; 289 struct tc_u_common *tp_c = tp->data; 290 291 if (TC_U32_HTID(handle) == TC_U32_ROOT) 292 ht = rtnl_dereference(tp->root); 293 else 294 ht = u32_lookup_ht(tp_c, TC_U32_HTID(handle)); 295 296 if (!ht) 297 return 0; 298 299 if (TC_U32_KEY(handle) == 0) 300 return (unsigned long)ht; 301 302 return (unsigned long)u32_lookup_key(ht, handle); 303} 304 305static u32 gen_new_htid(struct tc_u_common *tp_c) 306{ 307 int i = 0x800; 308 309 /* hgenerator only used inside rtnl lock it is safe to increment 310 * without read _copy_ update semantics 311 */ 312 do { 313 if (++tp_c->hgenerator == 0x7FF) 314 tp_c->hgenerator = 1; 315 } while (--i > 0 && u32_lookup_ht(tp_c, (tp_c->hgenerator|0x800)<<20)); 316 317 return i > 0 ? (tp_c->hgenerator|0x800)<<20 : 0; 318} 319 320static int u32_init(struct tcf_proto *tp) 321{ 322 struct tc_u_hnode *root_ht; 323 struct tc_u_common *tp_c; 324 325 tp_c = tp->q->u32_node; 326 327 root_ht = kzalloc(sizeof(*root_ht), GFP_KERNEL); 328 if (root_ht == NULL) 329 return -ENOBUFS; 330 331 root_ht->divisor = 0; 332 root_ht->refcnt++; 333 root_ht->handle = tp_c ? gen_new_htid(tp_c) : 0x80000000; 334 root_ht->prio = tp->prio; 335 336 if (tp_c == NULL) { 337 tp_c = kzalloc(sizeof(*tp_c), GFP_KERNEL); 338 if (tp_c == NULL) { 339 kfree(root_ht); 340 return -ENOBUFS; 341 } 342 tp_c->q = tp->q; 343 tp->q->u32_node = tp_c; 344 } 345 346 tp_c->refcnt++; 347 RCU_INIT_POINTER(root_ht->next, tp_c->hlist); 348 rcu_assign_pointer(tp_c->hlist, root_ht); 349 root_ht->tp_c = tp_c; 350 351 rcu_assign_pointer(tp->root, root_ht); 352 tp->data = tp_c; 353 return 0; 354} 355 356static int u32_destroy_key(struct tcf_proto *tp, 357 struct tc_u_knode *n, 358 bool free_pf) 359{ 360 tcf_exts_destroy(&n->exts); 361 if (n->ht_down) 362 n->ht_down->refcnt--; 363#ifdef CONFIG_CLS_U32_PERF 364 if (free_pf) 365 free_percpu(n->pf); 366#endif 367#ifdef CONFIG_CLS_U32_MARK 368 if (free_pf) 369 free_percpu(n->pcpu_success); 370#endif 371 kfree(n); 372 return 0; 373} 374 375/* u32_delete_key_rcu should be called when free'ing a copied 376 * version of a tc_u_knode obtained from u32_init_knode(). When 377 * copies are obtained from u32_init_knode() the statistics are 378 * shared between the old and new copies to allow readers to 379 * continue to update the statistics during the copy. To support 380 * this the u32_delete_key_rcu variant does not free the percpu 381 * statistics. 382 */ 383static void u32_delete_key_rcu(struct rcu_head *rcu) 384{ 385 struct tc_u_knode *key = container_of(rcu, struct tc_u_knode, rcu); 386 387 u32_destroy_key(key->tp, key, false); 388} 389 390/* u32_delete_key_freepf_rcu is the rcu callback variant 391 * that free's the entire structure including the statistics 392 * percpu variables. Only use this if the key is not a copy 393 * returned by u32_init_knode(). See u32_delete_key_rcu() 394 * for the variant that should be used with keys return from 395 * u32_init_knode() 396 */ 397static void u32_delete_key_freepf_rcu(struct rcu_head *rcu) 398{ 399 struct tc_u_knode *key = container_of(rcu, struct tc_u_knode, rcu); 400 401 u32_destroy_key(key->tp, key, true); 402} 403 404static int u32_delete_key(struct tcf_proto *tp, struct tc_u_knode *key) 405{ 406 struct tc_u_knode __rcu **kp; 407 struct tc_u_knode *pkp; 408 struct tc_u_hnode *ht = rtnl_dereference(key->ht_up); 409 410 if (ht) { 411 kp = &ht->ht[TC_U32_HASH(key->handle)]; 412 for (pkp = rtnl_dereference(*kp); pkp; 413 kp = &pkp->next, pkp = rtnl_dereference(*kp)) { 414 if (pkp == key) { 415 RCU_INIT_POINTER(*kp, key->next); 416 417 tcf_unbind_filter(tp, &key->res); 418 call_rcu(&key->rcu, u32_delete_key_freepf_rcu); 419 return 0; 420 } 421 } 422 } 423 WARN_ON(1); 424 return 0; 425} 426 427static void u32_clear_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht) 428{ 429 struct tc_u_knode *n; 430 unsigned int h; 431 432 for (h = 0; h <= ht->divisor; h++) { 433 while ((n = rtnl_dereference(ht->ht[h])) != NULL) { 434 RCU_INIT_POINTER(ht->ht[h], 435 rtnl_dereference(n->next)); 436 tcf_unbind_filter(tp, &n->res); 437 call_rcu(&n->rcu, u32_delete_key_freepf_rcu); 438 } 439 } 440} 441 442static int u32_destroy_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht) 443{ 444 struct tc_u_common *tp_c = tp->data; 445 struct tc_u_hnode __rcu **hn; 446 struct tc_u_hnode *phn; 447 448 WARN_ON(ht->refcnt); 449 450 u32_clear_hnode(tp, ht); 451 452 hn = &tp_c->hlist; 453 for (phn = rtnl_dereference(*hn); 454 phn; 455 hn = &phn->next, phn = rtnl_dereference(*hn)) { 456 if (phn == ht) { 457 RCU_INIT_POINTER(*hn, ht->next); 458 kfree_rcu(ht, rcu); 459 return 0; 460 } 461 } 462 463 return -ENOENT; 464} 465 466static bool ht_empty(struct tc_u_hnode *ht) 467{ 468 unsigned int h; 469 470 for (h = 0; h <= ht->divisor; h++) 471 if (rcu_access_pointer(ht->ht[h])) 472 return false; 473 474 return true; 475} 476 477static bool u32_destroy(struct tcf_proto *tp, bool force) 478{ 479 struct tc_u_common *tp_c = tp->data; 480 struct tc_u_hnode *root_ht = rtnl_dereference(tp->root); 481 482 WARN_ON(root_ht == NULL); 483 484 if (!force) { 485 if (root_ht) { 486 if (root_ht->refcnt > 1) 487 return false; 488 if (root_ht->refcnt == 1) { 489 if (!ht_empty(root_ht)) 490 return false; 491 } 492 } 493 494 if (tp_c->refcnt > 1) 495 return false; 496 497 if (tp_c->refcnt == 1) { 498 struct tc_u_hnode *ht; 499 500 for (ht = rtnl_dereference(tp_c->hlist); 501 ht; 502 ht = rtnl_dereference(ht->next)) 503 if (!ht_empty(ht)) 504 return false; 505 } 506 } 507 508 if (root_ht && --root_ht->refcnt == 0) 509 u32_destroy_hnode(tp, root_ht); 510 511 if (--tp_c->refcnt == 0) { 512 struct tc_u_hnode *ht; 513 514 tp->q->u32_node = NULL; 515 516 for (ht = rtnl_dereference(tp_c->hlist); 517 ht; 518 ht = rtnl_dereference(ht->next)) { 519 ht->refcnt--; 520 u32_clear_hnode(tp, ht); 521 } 522 523 while ((ht = rtnl_dereference(tp_c->hlist)) != NULL) { 524 RCU_INIT_POINTER(tp_c->hlist, ht->next); 525 kfree_rcu(ht, rcu); 526 } 527 528 kfree(tp_c); 529 } 530 531 tp->data = NULL; 532 return true; 533} 534 535static int u32_delete(struct tcf_proto *tp, unsigned long arg) 536{ 537 struct tc_u_hnode *ht = (struct tc_u_hnode *)arg; 538 struct tc_u_hnode *root_ht = rtnl_dereference(tp->root); 539 540 if (ht == NULL) 541 return 0; 542 543 if (TC_U32_KEY(ht->handle)) 544 return u32_delete_key(tp, (struct tc_u_knode *)ht); 545 546 if (root_ht == ht) 547 return -EINVAL; 548 549 if (ht->refcnt == 1) { 550 ht->refcnt--; 551 u32_destroy_hnode(tp, ht); 552 } else { 553 return -EBUSY; 554 } 555 556 return 0; 557} 558 559#define NR_U32_NODE (1<<12) 560static u32 gen_new_kid(struct tc_u_hnode *ht, u32 handle) 561{ 562 struct tc_u_knode *n; 563 unsigned long i; 564 unsigned long *bitmap = kzalloc(BITS_TO_LONGS(NR_U32_NODE) * sizeof(unsigned long), 565 GFP_KERNEL); 566 if (!bitmap) 567 return handle | 0xFFF; 568 569 for (n = rtnl_dereference(ht->ht[TC_U32_HASH(handle)]); 570 n; 571 n = rtnl_dereference(n->next)) 572 set_bit(TC_U32_NODE(n->handle), bitmap); 573 574 i = find_next_zero_bit(bitmap, NR_U32_NODE, 0x800); 575 if (i >= NR_U32_NODE) 576 i = find_next_zero_bit(bitmap, NR_U32_NODE, 1); 577 578 kfree(bitmap); 579 return handle | (i >= NR_U32_NODE ? 0xFFF : i); 580} 581 582static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = { 583 [TCA_U32_CLASSID] = { .type = NLA_U32 }, 584 [TCA_U32_HASH] = { .type = NLA_U32 }, 585 [TCA_U32_LINK] = { .type = NLA_U32 }, 586 [TCA_U32_DIVISOR] = { .type = NLA_U32 }, 587 [TCA_U32_SEL] = { .len = sizeof(struct tc_u32_sel) }, 588 [TCA_U32_INDEV] = { .type = NLA_STRING, .len = IFNAMSIZ }, 589 [TCA_U32_MARK] = { .len = sizeof(struct tc_u32_mark) }, 590}; 591 592static int u32_set_parms(struct net *net, struct tcf_proto *tp, 593 unsigned long base, struct tc_u_hnode *ht, 594 struct tc_u_knode *n, struct nlattr **tb, 595 struct nlattr *est, bool ovr) 596{ 597 int err; 598 struct tcf_exts e; 599 600 tcf_exts_init(&e, TCA_U32_ACT, TCA_U32_POLICE); 601 err = tcf_exts_validate(net, tp, tb, est, &e, ovr); 602 if (err < 0) 603 return err; 604 605 err = -EINVAL; 606 if (tb[TCA_U32_LINK]) { 607 u32 handle = nla_get_u32(tb[TCA_U32_LINK]); 608 struct tc_u_hnode *ht_down = NULL, *ht_old; 609 610 if (TC_U32_KEY(handle)) 611 goto errout; 612 613 if (handle) { 614 ht_down = u32_lookup_ht(ht->tp_c, handle); 615 616 if (ht_down == NULL) 617 goto errout; 618 ht_down->refcnt++; 619 } 620 621 ht_old = rtnl_dereference(n->ht_down); 622 rcu_assign_pointer(n->ht_down, ht_down); 623 624 if (ht_old) 625 ht_old->refcnt--; 626 } 627 if (tb[TCA_U32_CLASSID]) { 628 n->res.classid = nla_get_u32(tb[TCA_U32_CLASSID]); 629 tcf_bind_filter(tp, &n->res, base); 630 } 631 632#ifdef CONFIG_NET_CLS_IND 633 if (tb[TCA_U32_INDEV]) { 634 int ret; 635 ret = tcf_change_indev(net, tb[TCA_U32_INDEV]); 636 if (ret < 0) 637 goto errout; 638 n->ifindex = ret; 639 } 640#endif 641 tcf_exts_change(tp, &n->exts, &e); 642 643 return 0; 644errout: 645 tcf_exts_destroy(&e); 646 return err; 647} 648 649static void u32_replace_knode(struct tcf_proto *tp, 650 struct tc_u_common *tp_c, 651 struct tc_u_knode *n) 652{ 653 struct tc_u_knode __rcu **ins; 654 struct tc_u_knode *pins; 655 struct tc_u_hnode *ht; 656 657 if (TC_U32_HTID(n->handle) == TC_U32_ROOT) 658 ht = rtnl_dereference(tp->root); 659 else 660 ht = u32_lookup_ht(tp_c, TC_U32_HTID(n->handle)); 661 662 ins = &ht->ht[TC_U32_HASH(n->handle)]; 663 664 /* The node must always exist for it to be replaced if this is not the 665 * case then something went very wrong elsewhere. 666 */ 667 for (pins = rtnl_dereference(*ins); ; 668 ins = &pins->next, pins = rtnl_dereference(*ins)) 669 if (pins->handle == n->handle) 670 break; 671 672 RCU_INIT_POINTER(n->next, pins->next); 673 rcu_assign_pointer(*ins, n); 674} 675 676static struct tc_u_knode *u32_init_knode(struct tcf_proto *tp, 677 struct tc_u_knode *n) 678{ 679 struct tc_u_knode *new; 680 struct tc_u32_sel *s = &n->sel; 681 682 new = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), 683 GFP_KERNEL); 684 685 if (!new) 686 return NULL; 687 688 RCU_INIT_POINTER(new->next, n->next); 689 new->handle = n->handle; 690 RCU_INIT_POINTER(new->ht_up, n->ht_up); 691 692#ifdef CONFIG_NET_CLS_IND 693 new->ifindex = n->ifindex; 694#endif 695 new->fshift = n->fshift; 696 new->res = n->res; 697 RCU_INIT_POINTER(new->ht_down, n->ht_down); 698 699 /* bump reference count as long as we hold pointer to structure */ 700 if (new->ht_down) 701 new->ht_down->refcnt++; 702 703#ifdef CONFIG_CLS_U32_PERF 704 /* Statistics may be incremented by readers during update 705 * so we must keep them in tact. When the node is later destroyed 706 * a special destroy call must be made to not free the pf memory. 707 */ 708 new->pf = n->pf; 709#endif 710 711#ifdef CONFIG_CLS_U32_MARK 712 new->val = n->val; 713 new->mask = n->mask; 714 /* Similarly success statistics must be moved as pointers */ 715 new->pcpu_success = n->pcpu_success; 716#endif 717 new->tp = tp; 718 memcpy(&new->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key)); 719 720 tcf_exts_init(&new->exts, TCA_U32_ACT, TCA_U32_POLICE); 721 722 return new; 723} 724 725static int u32_change(struct net *net, struct sk_buff *in_skb, 726 struct tcf_proto *tp, unsigned long base, u32 handle, 727 struct nlattr **tca, 728 unsigned long *arg, bool ovr) 729{ 730 struct tc_u_common *tp_c = tp->data; 731 struct tc_u_hnode *ht; 732 struct tc_u_knode *n; 733 struct tc_u32_sel *s; 734 struct nlattr *opt = tca[TCA_OPTIONS]; 735 struct nlattr *tb[TCA_U32_MAX + 1]; 736 u32 htid; 737 int err; 738#ifdef CONFIG_CLS_U32_PERF 739 size_t size; 740#endif 741 742 if (opt == NULL) 743 return handle ? -EINVAL : 0; 744 745 err = nla_parse_nested(tb, TCA_U32_MAX, opt, u32_policy); 746 if (err < 0) 747 return err; 748 749 n = (struct tc_u_knode *)*arg; 750 if (n) { 751 struct tc_u_knode *new; 752 753 if (TC_U32_KEY(n->handle) == 0) 754 return -EINVAL; 755 756 new = u32_init_knode(tp, n); 757 if (!new) 758 return -ENOMEM; 759 760 err = u32_set_parms(net, tp, base, 761 rtnl_dereference(n->ht_up), new, tb, 762 tca[TCA_RATE], ovr); 763 764 if (err) { 765 u32_destroy_key(tp, new, false); 766 return err; 767 } 768 769 u32_replace_knode(tp, tp_c, new); 770 tcf_unbind_filter(tp, &n->res); 771 call_rcu(&n->rcu, u32_delete_key_rcu); 772 return 0; 773 } 774 775 if (tb[TCA_U32_DIVISOR]) { 776 unsigned int divisor = nla_get_u32(tb[TCA_U32_DIVISOR]); 777 778 if (--divisor > 0x100) 779 return -EINVAL; 780 if (TC_U32_KEY(handle)) 781 return -EINVAL; 782 if (handle == 0) { 783 handle = gen_new_htid(tp->data); 784 if (handle == 0) 785 return -ENOMEM; 786 } 787 ht = kzalloc(sizeof(*ht) + divisor*sizeof(void *), GFP_KERNEL); 788 if (ht == NULL) 789 return -ENOBUFS; 790 ht->tp_c = tp_c; 791 ht->refcnt = 1; 792 ht->divisor = divisor; 793 ht->handle = handle; 794 ht->prio = tp->prio; 795 RCU_INIT_POINTER(ht->next, tp_c->hlist); 796 rcu_assign_pointer(tp_c->hlist, ht); 797 *arg = (unsigned long)ht; 798 return 0; 799 } 800 801 if (tb[TCA_U32_HASH]) { 802 htid = nla_get_u32(tb[TCA_U32_HASH]); 803 if (TC_U32_HTID(htid) == TC_U32_ROOT) { 804 ht = rtnl_dereference(tp->root); 805 htid = ht->handle; 806 } else { 807 ht = u32_lookup_ht(tp->data, TC_U32_HTID(htid)); 808 if (ht == NULL) 809 return -EINVAL; 810 } 811 } else { 812 ht = rtnl_dereference(tp->root); 813 htid = ht->handle; 814 } 815 816 if (ht->divisor < TC_U32_HASH(htid)) 817 return -EINVAL; 818 819 if (handle) { 820 if (TC_U32_HTID(handle) && TC_U32_HTID(handle^htid)) 821 return -EINVAL; 822 handle = htid | TC_U32_NODE(handle); 823 } else 824 handle = gen_new_kid(ht, htid); 825 826 if (tb[TCA_U32_SEL] == NULL) 827 return -EINVAL; 828 829 s = nla_data(tb[TCA_U32_SEL]); 830 831 n = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL); 832 if (n == NULL) 833 return -ENOBUFS; 834 835#ifdef CONFIG_CLS_U32_PERF 836 size = sizeof(struct tc_u32_pcnt) + s->nkeys * sizeof(u64); 837 n->pf = __alloc_percpu(size, __alignof__(struct tc_u32_pcnt)); 838 if (!n->pf) { 839 kfree(n); 840 return -ENOBUFS; 841 } 842#endif 843 844 memcpy(&n->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key)); 845 RCU_INIT_POINTER(n->ht_up, ht); 846 n->handle = handle; 847 n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0; 848 tcf_exts_init(&n->exts, TCA_U32_ACT, TCA_U32_POLICE); 849 n->tp = tp; 850 851#ifdef CONFIG_CLS_U32_MARK 852 n->pcpu_success = alloc_percpu(u32); 853 if (!n->pcpu_success) { 854 err = -ENOMEM; 855 goto errout; 856 } 857 858 if (tb[TCA_U32_MARK]) { 859 struct tc_u32_mark *mark; 860 861 mark = nla_data(tb[TCA_U32_MARK]); 862 n->val = mark->val; 863 n->mask = mark->mask; 864 } 865#endif 866 867 err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE], ovr); 868 if (err == 0) { 869 struct tc_u_knode __rcu **ins; 870 struct tc_u_knode *pins; 871 872 ins = &ht->ht[TC_U32_HASH(handle)]; 873 for (pins = rtnl_dereference(*ins); pins; 874 ins = &pins->next, pins = rtnl_dereference(*ins)) 875 if (TC_U32_NODE(handle) < TC_U32_NODE(pins->handle)) 876 break; 877 878 RCU_INIT_POINTER(n->next, pins); 879 rcu_assign_pointer(*ins, n); 880 881 *arg = (unsigned long)n; 882 return 0; 883 } 884 885#ifdef CONFIG_CLS_U32_MARK 886 free_percpu(n->pcpu_success); 887errout: 888#endif 889 890#ifdef CONFIG_CLS_U32_PERF 891 free_percpu(n->pf); 892#endif 893 kfree(n); 894 return err; 895} 896 897static void u32_walk(struct tcf_proto *tp, struct tcf_walker *arg) 898{ 899 struct tc_u_common *tp_c = tp->data; 900 struct tc_u_hnode *ht; 901 struct tc_u_knode *n; 902 unsigned int h; 903 904 if (arg->stop) 905 return; 906 907 for (ht = rtnl_dereference(tp_c->hlist); 908 ht; 909 ht = rtnl_dereference(ht->next)) { 910 if (ht->prio != tp->prio) 911 continue; 912 if (arg->count >= arg->skip) { 913 if (arg->fn(tp, (unsigned long)ht, arg) < 0) { 914 arg->stop = 1; 915 return; 916 } 917 } 918 arg->count++; 919 for (h = 0; h <= ht->divisor; h++) { 920 for (n = rtnl_dereference(ht->ht[h]); 921 n; 922 n = rtnl_dereference(n->next)) { 923 if (arg->count < arg->skip) { 924 arg->count++; 925 continue; 926 } 927 if (arg->fn(tp, (unsigned long)n, arg) < 0) { 928 arg->stop = 1; 929 return; 930 } 931 arg->count++; 932 } 933 } 934 } 935} 936 937static int u32_dump(struct net *net, struct tcf_proto *tp, unsigned long fh, 938 struct sk_buff *skb, struct tcmsg *t) 939{ 940 struct tc_u_knode *n = (struct tc_u_knode *)fh; 941 struct tc_u_hnode *ht_up, *ht_down; 942 struct nlattr *nest; 943 944 if (n == NULL) 945 return skb->len; 946 947 t->tcm_handle = n->handle; 948 949 nest = nla_nest_start(skb, TCA_OPTIONS); 950 if (nest == NULL) 951 goto nla_put_failure; 952 953 if (TC_U32_KEY(n->handle) == 0) { 954 struct tc_u_hnode *ht = (struct tc_u_hnode *)fh; 955 u32 divisor = ht->divisor + 1; 956 957 if (nla_put_u32(skb, TCA_U32_DIVISOR, divisor)) 958 goto nla_put_failure; 959 } else { 960#ifdef CONFIG_CLS_U32_PERF 961 struct tc_u32_pcnt *gpf; 962 int cpu; 963#endif 964 965 if (nla_put(skb, TCA_U32_SEL, 966 sizeof(n->sel) + n->sel.nkeys*sizeof(struct tc_u32_key), 967 &n->sel)) 968 goto nla_put_failure; 969 970 ht_up = rtnl_dereference(n->ht_up); 971 if (ht_up) { 972 u32 htid = n->handle & 0xFFFFF000; 973 if (nla_put_u32(skb, TCA_U32_HASH, htid)) 974 goto nla_put_failure; 975 } 976 if (n->res.classid && 977 nla_put_u32(skb, TCA_U32_CLASSID, n->res.classid)) 978 goto nla_put_failure; 979 980 ht_down = rtnl_dereference(n->ht_down); 981 if (ht_down && 982 nla_put_u32(skb, TCA_U32_LINK, ht_down->handle)) 983 goto nla_put_failure; 984 985#ifdef CONFIG_CLS_U32_MARK 986 if ((n->val || n->mask)) { 987 struct tc_u32_mark mark = {.val = n->val, 988 .mask = n->mask, 989 .success = 0}; 990 int cpum; 991 992 for_each_possible_cpu(cpum) { 993 __u32 cnt = *per_cpu_ptr(n->pcpu_success, cpum); 994 995 mark.success += cnt; 996 } 997 998 if (nla_put(skb, TCA_U32_MARK, sizeof(mark), &mark)) 999 goto nla_put_failure; 1000 } 1001#endif 1002 1003 if (tcf_exts_dump(skb, &n->exts) < 0) 1004 goto nla_put_failure; 1005 1006#ifdef CONFIG_NET_CLS_IND 1007 if (n->ifindex) { 1008 struct net_device *dev; 1009 dev = __dev_get_by_index(net, n->ifindex); 1010 if (dev && nla_put_string(skb, TCA_U32_INDEV, dev->name)) 1011 goto nla_put_failure; 1012 } 1013#endif 1014#ifdef CONFIG_CLS_U32_PERF 1015 gpf = kzalloc(sizeof(struct tc_u32_pcnt) + 1016 n->sel.nkeys * sizeof(u64), 1017 GFP_KERNEL); 1018 if (!gpf) 1019 goto nla_put_failure; 1020 1021 for_each_possible_cpu(cpu) { 1022 int i; 1023 struct tc_u32_pcnt *pf = per_cpu_ptr(n->pf, cpu); 1024 1025 gpf->rcnt += pf->rcnt; 1026 gpf->rhit += pf->rhit; 1027 for (i = 0; i < n->sel.nkeys; i++) 1028 gpf->kcnts[i] += pf->kcnts[i]; 1029 } 1030 1031 if (nla_put(skb, TCA_U32_PCNT, 1032 sizeof(struct tc_u32_pcnt) + n->sel.nkeys*sizeof(u64), 1033 gpf)) { 1034 kfree(gpf); 1035 goto nla_put_failure; 1036 } 1037 kfree(gpf); 1038#endif 1039 } 1040 1041 nla_nest_end(skb, nest); 1042 1043 if (TC_U32_KEY(n->handle)) 1044 if (tcf_exts_dump_stats(skb, &n->exts) < 0) 1045 goto nla_put_failure; 1046 return skb->len; 1047 1048nla_put_failure: 1049 nla_nest_cancel(skb, nest); 1050 return -1; 1051} 1052 1053static struct tcf_proto_ops cls_u32_ops __read_mostly = { 1054 .kind = "u32", 1055 .classify = u32_classify, 1056 .init = u32_init, 1057 .destroy = u32_destroy, 1058 .get = u32_get, 1059 .change = u32_change, 1060 .delete = u32_delete, 1061 .walk = u32_walk, 1062 .dump = u32_dump, 1063 .owner = THIS_MODULE, 1064}; 1065 1066static int __init init_u32(void) 1067{ 1068 pr_info("u32 classifier\n"); 1069#ifdef CONFIG_CLS_U32_PERF 1070 pr_info(" Performance counters on\n"); 1071#endif 1072#ifdef CONFIG_NET_CLS_IND 1073 pr_info(" input device check on\n"); 1074#endif 1075#ifdef CONFIG_NET_CLS_ACT 1076 pr_info(" Actions configured\n"); 1077#endif 1078 return register_tcf_proto_ops(&cls_u32_ops); 1079} 1080 1081static void __exit exit_u32(void) 1082{ 1083 unregister_tcf_proto_ops(&cls_u32_ops); 1084} 1085 1086module_init(init_u32) 1087module_exit(exit_u32) 1088MODULE_LICENSE("GPL"); 1089