linux/net/sched/cls_u32.c
<<
>>
Prefs
   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 *      nfmark match added by Catalin(ux aka Dino) BOIE <catab at umbrella.ro>
  28 */
  29
  30#include <linux/module.h>
  31#include <linux/slab.h>
  32#include <linux/types.h>
  33#include <linux/kernel.h>
  34#include <linux/string.h>
  35#include <linux/errno.h>
  36#include <linux/percpu.h>
  37#include <linux/rtnetlink.h>
  38#include <linux/skbuff.h>
  39#include <linux/bitmap.h>
  40#include <linux/netdevice.h>
  41#include <linux/hash.h>
  42#include <net/netlink.h>
  43#include <net/act_api.h>
  44#include <net/pkt_cls.h>
  45#include <linux/idr.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        int                     ifindex;
  53        u8                      fshift;
  54        struct tcf_result       res;
  55        struct tc_u_hnode __rcu *ht_down;
  56#ifdef CONFIG_CLS_U32_PERF
  57        struct tc_u32_pcnt __percpu *pf;
  58#endif
  59        u32                     flags;
  60        unsigned int            in_hw_count;
  61#ifdef CONFIG_CLS_U32_MARK
  62        u32                     val;
  63        u32                     mask;
  64        u32 __percpu            *pcpu_success;
  65#endif
  66        struct rcu_work         rwork;
  67        /* The 'sel' field MUST be the last field in structure to allow for
  68         * tc_u32_keys allocated at end of structure.
  69         */
  70        struct tc_u32_sel       sel;
  71};
  72
  73struct tc_u_hnode {
  74        struct tc_u_hnode __rcu *next;
  75        u32                     handle;
  76        u32                     prio;
  77        int                     refcnt;
  78        unsigned int            divisor;
  79        struct idr              handle_idr;
  80        bool                    is_root;
  81        struct rcu_head         rcu;
  82        u32                     flags;
  83        /* The 'ht' field MUST be the last field in structure to allow for
  84         * more entries allocated at end of structure.
  85         */
  86        struct tc_u_knode __rcu *ht[];
  87};
  88
  89struct tc_u_common {
  90        struct tc_u_hnode __rcu *hlist;
  91        void                    *ptr;
  92        int                     refcnt;
  93        struct idr              handle_idr;
  94        struct hlist_node       hnode;
  95        long                    knodes;
  96};
  97
  98static inline unsigned int u32_hash_fold(__be32 key,
  99                                         const struct tc_u32_sel *sel,
 100                                         u8 fshift)
 101{
 102        unsigned int h = ntohl(key & sel->hmask) >> fshift;
 103
 104        return h;
 105}
 106
 107static int u32_classify(struct sk_buff *skb, const struct tcf_proto *tp,
 108                        struct tcf_result *res)
 109{
 110        struct {
 111                struct tc_u_knode *knode;
 112                unsigned int      off;
 113        } stack[TC_U32_MAXDEPTH];
 114
 115        struct tc_u_hnode *ht = rcu_dereference_bh(tp->root);
 116        unsigned int off = skb_network_offset(skb);
 117        struct tc_u_knode *n;
 118        int sdepth = 0;
 119        int off2 = 0;
 120        int sel = 0;
 121#ifdef CONFIG_CLS_U32_PERF
 122        int j;
 123#endif
 124        int i, r;
 125
 126next_ht:
 127        n = rcu_dereference_bh(ht->ht[sel]);
 128
 129next_knode:
 130        if (n) {
 131                struct tc_u32_key *key = n->sel.keys;
 132
 133#ifdef CONFIG_CLS_U32_PERF
 134                __this_cpu_inc(n->pf->rcnt);
 135                j = 0;
 136#endif
 137
 138                if (tc_skip_sw(n->flags)) {
 139                        n = rcu_dereference_bh(n->next);
 140                        goto next_knode;
 141                }
 142
 143#ifdef CONFIG_CLS_U32_MARK
 144                if ((skb->mark & n->mask) != n->val) {
 145                        n = rcu_dereference_bh(n->next);
 146                        goto next_knode;
 147                } else {
 148                        __this_cpu_inc(*n->pcpu_success);
 149                }
 150#endif
 151
 152                for (i = n->sel.nkeys; i > 0; i--, key++) {
 153                        int toff = off + key->off + (off2 & key->offmask);
 154                        __be32 *data, hdata;
 155
 156                        if (skb_headroom(skb) + toff > INT_MAX)
 157                                goto out;
 158
 159                        data = skb_header_pointer(skb, toff, 4, &hdata);
 160                        if (!data)
 161                                goto out;
 162                        if ((*data ^ key->val) & key->mask) {
 163                                n = rcu_dereference_bh(n->next);
 164                                goto next_knode;
 165                        }
 166#ifdef CONFIG_CLS_U32_PERF
 167                        __this_cpu_inc(n->pf->kcnts[j]);
 168                        j++;
 169#endif
 170                }
 171
 172                ht = rcu_dereference_bh(n->ht_down);
 173                if (!ht) {
 174check_terminal:
 175                        if (n->sel.flags & TC_U32_TERMINAL) {
 176
 177                                *res = n->res;
 178                                if (!tcf_match_indev(skb, n->ifindex)) {
 179                                        n = rcu_dereference_bh(n->next);
 180                                        goto next_knode;
 181                                }
 182#ifdef CONFIG_CLS_U32_PERF
 183                                __this_cpu_inc(n->pf->rhit);
 184#endif
 185                                r = tcf_exts_exec(skb, &n->exts, res);
 186                                if (r < 0) {
 187                                        n = rcu_dereference_bh(n->next);
 188                                        goto next_knode;
 189                                }
 190
 191                                return r;
 192                        }
 193                        n = rcu_dereference_bh(n->next);
 194                        goto next_knode;
 195                }
 196
 197                /* PUSH */
 198                if (sdepth >= TC_U32_MAXDEPTH)
 199                        goto deadloop;
 200                stack[sdepth].knode = n;
 201                stack[sdepth].off = off;
 202                sdepth++;
 203
 204                ht = rcu_dereference_bh(n->ht_down);
 205                sel = 0;
 206                if (ht->divisor) {
 207                        __be32 *data, hdata;
 208
 209                        data = skb_header_pointer(skb, off + n->sel.hoff, 4,
 210                                                  &hdata);
 211                        if (!data)
 212                                goto out;
 213                        sel = ht->divisor & u32_hash_fold(*data, &n->sel,
 214                                                          n->fshift);
 215                }
 216                if (!(n->sel.flags & (TC_U32_VAROFFSET | TC_U32_OFFSET | TC_U32_EAT)))
 217                        goto next_ht;
 218
 219                if (n->sel.flags & (TC_U32_OFFSET | TC_U32_VAROFFSET)) {
 220                        off2 = n->sel.off + 3;
 221                        if (n->sel.flags & TC_U32_VAROFFSET) {
 222                                __be16 *data, hdata;
 223
 224                                data = skb_header_pointer(skb,
 225                                                          off + n->sel.offoff,
 226                                                          2, &hdata);
 227                                if (!data)
 228                                        goto out;
 229                                off2 += ntohs(n->sel.offmask & *data) >>
 230                                        n->sel.offshift;
 231                        }
 232                        off2 &= ~3;
 233                }
 234                if (n->sel.flags & TC_U32_EAT) {
 235                        off += off2;
 236                        off2 = 0;
 237                }
 238
 239                if (off < skb->len)
 240                        goto next_ht;
 241        }
 242
 243        /* POP */
 244        if (sdepth--) {
 245                n = stack[sdepth].knode;
 246                ht = rcu_dereference_bh(n->ht_up);
 247                off = stack[sdepth].off;
 248                goto check_terminal;
 249        }
 250out:
 251        return -1;
 252
 253deadloop:
 254        net_warn_ratelimited("cls_u32: dead loop\n");
 255        return -1;
 256}
 257
 258static struct tc_u_hnode *u32_lookup_ht(struct tc_u_common *tp_c, u32 handle)
 259{
 260        struct tc_u_hnode *ht;
 261
 262        for (ht = rtnl_dereference(tp_c->hlist);
 263             ht;
 264             ht = rtnl_dereference(ht->next))
 265                if (ht->handle == handle)
 266                        break;
 267
 268        return ht;
 269}
 270
 271static struct tc_u_knode *u32_lookup_key(struct tc_u_hnode *ht, u32 handle)
 272{
 273        unsigned int sel;
 274        struct tc_u_knode *n = NULL;
 275
 276        sel = TC_U32_HASH(handle);
 277        if (sel > ht->divisor)
 278                goto out;
 279
 280        for (n = rtnl_dereference(ht->ht[sel]);
 281             n;
 282             n = rtnl_dereference(n->next))
 283                if (n->handle == handle)
 284                        break;
 285out:
 286        return n;
 287}
 288
 289
 290static void *u32_get(struct tcf_proto *tp, u32 handle)
 291{
 292        struct tc_u_hnode *ht;
 293        struct tc_u_common *tp_c = tp->data;
 294
 295        if (TC_U32_HTID(handle) == TC_U32_ROOT)
 296                ht = rtnl_dereference(tp->root);
 297        else
 298                ht = u32_lookup_ht(tp_c, TC_U32_HTID(handle));
 299
 300        if (!ht)
 301                return NULL;
 302
 303        if (TC_U32_KEY(handle) == 0)
 304                return ht;
 305
 306        return u32_lookup_key(ht, handle);
 307}
 308
 309/* Protected by rtnl lock */
 310static u32 gen_new_htid(struct tc_u_common *tp_c, struct tc_u_hnode *ptr)
 311{
 312        int id = idr_alloc_cyclic(&tp_c->handle_idr, ptr, 1, 0x7FF, GFP_KERNEL);
 313        if (id < 0)
 314                return 0;
 315        return (id | 0x800U) << 20;
 316}
 317
 318static struct hlist_head *tc_u_common_hash;
 319
 320#define U32_HASH_SHIFT 10
 321#define U32_HASH_SIZE (1 << U32_HASH_SHIFT)
 322
 323static void *tc_u_common_ptr(const struct tcf_proto *tp)
 324{
 325        struct tcf_block *block = tp->chain->block;
 326
 327        /* The block sharing is currently supported only
 328         * for classless qdiscs. In that case we use block
 329         * for tc_u_common identification. In case the
 330         * block is not shared, block->q is a valid pointer
 331         * and we can use that. That works for classful qdiscs.
 332         */
 333        if (tcf_block_shared(block))
 334                return block;
 335        else
 336                return block->q;
 337}
 338
 339static struct hlist_head *tc_u_hash(void *key)
 340{
 341        return tc_u_common_hash + hash_ptr(key, U32_HASH_SHIFT);
 342}
 343
 344static struct tc_u_common *tc_u_common_find(void *key)
 345{
 346        struct tc_u_common *tc;
 347        hlist_for_each_entry(tc, tc_u_hash(key), hnode) {
 348                if (tc->ptr == key)
 349                        return tc;
 350        }
 351        return NULL;
 352}
 353
 354static int u32_init(struct tcf_proto *tp)
 355{
 356        struct tc_u_hnode *root_ht;
 357        void *key = tc_u_common_ptr(tp);
 358        struct tc_u_common *tp_c = tc_u_common_find(key);
 359
 360        root_ht = kzalloc(struct_size(root_ht, ht, 1), GFP_KERNEL);
 361        if (root_ht == NULL)
 362                return -ENOBUFS;
 363
 364        root_ht->refcnt++;
 365        root_ht->handle = tp_c ? gen_new_htid(tp_c, root_ht) : 0x80000000;
 366        root_ht->prio = tp->prio;
 367        root_ht->is_root = true;
 368        idr_init(&root_ht->handle_idr);
 369
 370        if (tp_c == NULL) {
 371                tp_c = kzalloc(struct_size(tp_c, hlist->ht, 1), GFP_KERNEL);
 372                if (tp_c == NULL) {
 373                        kfree(root_ht);
 374                        return -ENOBUFS;
 375                }
 376                tp_c->ptr = key;
 377                INIT_HLIST_NODE(&tp_c->hnode);
 378                idr_init(&tp_c->handle_idr);
 379
 380                hlist_add_head(&tp_c->hnode, tc_u_hash(key));
 381        }
 382
 383        tp_c->refcnt++;
 384        RCU_INIT_POINTER(root_ht->next, tp_c->hlist);
 385        rcu_assign_pointer(tp_c->hlist, root_ht);
 386
 387        root_ht->refcnt++;
 388        rcu_assign_pointer(tp->root, root_ht);
 389        tp->data = tp_c;
 390        return 0;
 391}
 392
 393static int u32_destroy_key(struct tc_u_knode *n, bool free_pf)
 394{
 395        struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
 396
 397        tcf_exts_destroy(&n->exts);
 398        tcf_exts_put_net(&n->exts);
 399        if (ht && --ht->refcnt == 0)
 400                kfree(ht);
 401#ifdef CONFIG_CLS_U32_PERF
 402        if (free_pf)
 403                free_percpu(n->pf);
 404#endif
 405#ifdef CONFIG_CLS_U32_MARK
 406        if (free_pf)
 407                free_percpu(n->pcpu_success);
 408#endif
 409        kfree(n);
 410        return 0;
 411}
 412
 413/* u32_delete_key_rcu should be called when free'ing a copied
 414 * version of a tc_u_knode obtained from u32_init_knode(). When
 415 * copies are obtained from u32_init_knode() the statistics are
 416 * shared between the old and new copies to allow readers to
 417 * continue to update the statistics during the copy. To support
 418 * this the u32_delete_key_rcu variant does not free the percpu
 419 * statistics.
 420 */
 421static void u32_delete_key_work(struct work_struct *work)
 422{
 423        struct tc_u_knode *key = container_of(to_rcu_work(work),
 424                                              struct tc_u_knode,
 425                                              rwork);
 426        rtnl_lock();
 427        u32_destroy_key(key, false);
 428        rtnl_unlock();
 429}
 430
 431/* u32_delete_key_freepf_rcu is the rcu callback variant
 432 * that free's the entire structure including the statistics
 433 * percpu variables. Only use this if the key is not a copy
 434 * returned by u32_init_knode(). See u32_delete_key_rcu()
 435 * for the variant that should be used with keys return from
 436 * u32_init_knode()
 437 */
 438static void u32_delete_key_freepf_work(struct work_struct *work)
 439{
 440        struct tc_u_knode *key = container_of(to_rcu_work(work),
 441                                              struct tc_u_knode,
 442                                              rwork);
 443        rtnl_lock();
 444        u32_destroy_key(key, true);
 445        rtnl_unlock();
 446}
 447
 448static int u32_delete_key(struct tcf_proto *tp, struct tc_u_knode *key)
 449{
 450        struct tc_u_common *tp_c = tp->data;
 451        struct tc_u_knode __rcu **kp;
 452        struct tc_u_knode *pkp;
 453        struct tc_u_hnode *ht = rtnl_dereference(key->ht_up);
 454
 455        if (ht) {
 456                kp = &ht->ht[TC_U32_HASH(key->handle)];
 457                for (pkp = rtnl_dereference(*kp); pkp;
 458                     kp = &pkp->next, pkp = rtnl_dereference(*kp)) {
 459                        if (pkp == key) {
 460                                RCU_INIT_POINTER(*kp, key->next);
 461                                tp_c->knodes--;
 462
 463                                tcf_unbind_filter(tp, &key->res);
 464                                idr_remove(&ht->handle_idr, key->handle);
 465                                tcf_exts_get_net(&key->exts);
 466                                tcf_queue_work(&key->rwork, u32_delete_key_freepf_work);
 467                                return 0;
 468                        }
 469                }
 470        }
 471        WARN_ON(1);
 472        return 0;
 473}
 474
 475static void u32_clear_hw_hnode(struct tcf_proto *tp, struct tc_u_hnode *h,
 476                               struct netlink_ext_ack *extack)
 477{
 478        struct tcf_block *block = tp->chain->block;
 479        struct tc_cls_u32_offload cls_u32 = {};
 480
 481        tc_cls_common_offload_init(&cls_u32.common, tp, h->flags, extack);
 482        cls_u32.command = TC_CLSU32_DELETE_HNODE;
 483        cls_u32.hnode.divisor = h->divisor;
 484        cls_u32.hnode.handle = h->handle;
 485        cls_u32.hnode.prio = h->prio;
 486
 487        tc_setup_cb_call(block, TC_SETUP_CLSU32, &cls_u32, false, true);
 488}
 489
 490static int u32_replace_hw_hnode(struct tcf_proto *tp, struct tc_u_hnode *h,
 491                                u32 flags, struct netlink_ext_ack *extack)
 492{
 493        struct tcf_block *block = tp->chain->block;
 494        struct tc_cls_u32_offload cls_u32 = {};
 495        bool skip_sw = tc_skip_sw(flags);
 496        bool offloaded = false;
 497        int err;
 498
 499        tc_cls_common_offload_init(&cls_u32.common, tp, flags, extack);
 500        cls_u32.command = TC_CLSU32_NEW_HNODE;
 501        cls_u32.hnode.divisor = h->divisor;
 502        cls_u32.hnode.handle = h->handle;
 503        cls_u32.hnode.prio = h->prio;
 504
 505        err = tc_setup_cb_call(block, TC_SETUP_CLSU32, &cls_u32, skip_sw, true);
 506        if (err < 0) {
 507                u32_clear_hw_hnode(tp, h, NULL);
 508                return err;
 509        } else if (err > 0) {
 510                offloaded = true;
 511        }
 512
 513        if (skip_sw && !offloaded)
 514                return -EINVAL;
 515
 516        return 0;
 517}
 518
 519static void u32_remove_hw_knode(struct tcf_proto *tp, struct tc_u_knode *n,
 520                                struct netlink_ext_ack *extack)
 521{
 522        struct tcf_block *block = tp->chain->block;
 523        struct tc_cls_u32_offload cls_u32 = {};
 524
 525        tc_cls_common_offload_init(&cls_u32.common, tp, n->flags, extack);
 526        cls_u32.command = TC_CLSU32_DELETE_KNODE;
 527        cls_u32.knode.handle = n->handle;
 528
 529        tc_setup_cb_destroy(block, tp, TC_SETUP_CLSU32, &cls_u32, false,
 530                            &n->flags, &n->in_hw_count, true);
 531}
 532
 533static int u32_replace_hw_knode(struct tcf_proto *tp, struct tc_u_knode *n,
 534                                u32 flags, struct netlink_ext_ack *extack)
 535{
 536        struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
 537        struct tcf_block *block = tp->chain->block;
 538        struct tc_cls_u32_offload cls_u32 = {};
 539        bool skip_sw = tc_skip_sw(flags);
 540        int err;
 541
 542        tc_cls_common_offload_init(&cls_u32.common, tp, flags, extack);
 543        cls_u32.command = TC_CLSU32_REPLACE_KNODE;
 544        cls_u32.knode.handle = n->handle;
 545        cls_u32.knode.fshift = n->fshift;
 546#ifdef CONFIG_CLS_U32_MARK
 547        cls_u32.knode.val = n->val;
 548        cls_u32.knode.mask = n->mask;
 549#else
 550        cls_u32.knode.val = 0;
 551        cls_u32.knode.mask = 0;
 552#endif
 553        cls_u32.knode.sel = &n->sel;
 554        cls_u32.knode.res = &n->res;
 555        cls_u32.knode.exts = &n->exts;
 556        if (n->ht_down)
 557                cls_u32.knode.link_handle = ht->handle;
 558
 559        err = tc_setup_cb_add(block, tp, TC_SETUP_CLSU32, &cls_u32, skip_sw,
 560                              &n->flags, &n->in_hw_count, true);
 561        if (err) {
 562                u32_remove_hw_knode(tp, n, NULL);
 563                return err;
 564        }
 565
 566        if (skip_sw && !(n->flags & TCA_CLS_FLAGS_IN_HW))
 567                return -EINVAL;
 568
 569        return 0;
 570}
 571
 572static void u32_clear_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht,
 573                            struct netlink_ext_ack *extack)
 574{
 575        struct tc_u_common *tp_c = tp->data;
 576        struct tc_u_knode *n;
 577        unsigned int h;
 578
 579        for (h = 0; h <= ht->divisor; h++) {
 580                while ((n = rtnl_dereference(ht->ht[h])) != NULL) {
 581                        RCU_INIT_POINTER(ht->ht[h],
 582                                         rtnl_dereference(n->next));
 583                        tp_c->knodes--;
 584                        tcf_unbind_filter(tp, &n->res);
 585                        u32_remove_hw_knode(tp, n, extack);
 586                        idr_remove(&ht->handle_idr, n->handle);
 587                        if (tcf_exts_get_net(&n->exts))
 588                                tcf_queue_work(&n->rwork, u32_delete_key_freepf_work);
 589                        else
 590                                u32_destroy_key(n, true);
 591                }
 592        }
 593}
 594
 595static int u32_destroy_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht,
 596                             struct netlink_ext_ack *extack)
 597{
 598        struct tc_u_common *tp_c = tp->data;
 599        struct tc_u_hnode __rcu **hn;
 600        struct tc_u_hnode *phn;
 601
 602        WARN_ON(--ht->refcnt);
 603
 604        u32_clear_hnode(tp, ht, extack);
 605
 606        hn = &tp_c->hlist;
 607        for (phn = rtnl_dereference(*hn);
 608             phn;
 609             hn = &phn->next, phn = rtnl_dereference(*hn)) {
 610                if (phn == ht) {
 611                        u32_clear_hw_hnode(tp, ht, extack);
 612                        idr_destroy(&ht->handle_idr);
 613                        idr_remove(&tp_c->handle_idr, ht->handle);
 614                        RCU_INIT_POINTER(*hn, ht->next);
 615                        kfree_rcu(ht, rcu);
 616                        return 0;
 617                }
 618        }
 619
 620        return -ENOENT;
 621}
 622
 623static void u32_destroy(struct tcf_proto *tp, bool rtnl_held,
 624                        struct netlink_ext_ack *extack)
 625{
 626        struct tc_u_common *tp_c = tp->data;
 627        struct tc_u_hnode *root_ht = rtnl_dereference(tp->root);
 628
 629        WARN_ON(root_ht == NULL);
 630
 631        if (root_ht && --root_ht->refcnt == 1)
 632                u32_destroy_hnode(tp, root_ht, extack);
 633
 634        if (--tp_c->refcnt == 0) {
 635                struct tc_u_hnode *ht;
 636
 637                hlist_del(&tp_c->hnode);
 638
 639                while ((ht = rtnl_dereference(tp_c->hlist)) != NULL) {
 640                        u32_clear_hnode(tp, ht, extack);
 641                        RCU_INIT_POINTER(tp_c->hlist, ht->next);
 642
 643                        /* u32_destroy_key() will later free ht for us, if it's
 644                         * still referenced by some knode
 645                         */
 646                        if (--ht->refcnt == 0)
 647                                kfree_rcu(ht, rcu);
 648                }
 649
 650                idr_destroy(&tp_c->handle_idr);
 651                kfree(tp_c);
 652        }
 653
 654        tp->data = NULL;
 655}
 656
 657static int u32_delete(struct tcf_proto *tp, void *arg, bool *last,
 658                      bool rtnl_held, struct netlink_ext_ack *extack)
 659{
 660        struct tc_u_hnode *ht = arg;
 661        struct tc_u_common *tp_c = tp->data;
 662        int ret = 0;
 663
 664        if (TC_U32_KEY(ht->handle)) {
 665                u32_remove_hw_knode(tp, (struct tc_u_knode *)ht, extack);
 666                ret = u32_delete_key(tp, (struct tc_u_knode *)ht);
 667                goto out;
 668        }
 669
 670        if (ht->is_root) {
 671                NL_SET_ERR_MSG_MOD(extack, "Not allowed to delete root node");
 672                return -EINVAL;
 673        }
 674
 675        if (ht->refcnt == 1) {
 676                u32_destroy_hnode(tp, ht, extack);
 677        } else {
 678                NL_SET_ERR_MSG_MOD(extack, "Can not delete in-use filter");
 679                return -EBUSY;
 680        }
 681
 682out:
 683        *last = tp_c->refcnt == 1 && tp_c->knodes == 0;
 684        return ret;
 685}
 686
 687static u32 gen_new_kid(struct tc_u_hnode *ht, u32 htid)
 688{
 689        u32 index = htid | 0x800;
 690        u32 max = htid | 0xFFF;
 691
 692        if (idr_alloc_u32(&ht->handle_idr, NULL, &index, max, GFP_KERNEL)) {
 693                index = htid + 1;
 694                if (idr_alloc_u32(&ht->handle_idr, NULL, &index, max,
 695                                 GFP_KERNEL))
 696                        index = max;
 697        }
 698
 699        return index;
 700}
 701
 702static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = {
 703        [TCA_U32_CLASSID]       = { .type = NLA_U32 },
 704        [TCA_U32_HASH]          = { .type = NLA_U32 },
 705        [TCA_U32_LINK]          = { .type = NLA_U32 },
 706        [TCA_U32_DIVISOR]       = { .type = NLA_U32 },
 707        [TCA_U32_SEL]           = { .len = sizeof(struct tc_u32_sel) },
 708        [TCA_U32_INDEV]         = { .type = NLA_STRING, .len = IFNAMSIZ },
 709        [TCA_U32_MARK]          = { .len = sizeof(struct tc_u32_mark) },
 710        [TCA_U32_FLAGS]         = { .type = NLA_U32 },
 711};
 712
 713static int u32_set_parms(struct net *net, struct tcf_proto *tp,
 714                         unsigned long base,
 715                         struct tc_u_knode *n, struct nlattr **tb,
 716                         struct nlattr *est, bool ovr,
 717                         struct netlink_ext_ack *extack)
 718{
 719        int err;
 720
 721        err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr, true, extack);
 722        if (err < 0)
 723                return err;
 724
 725        if (tb[TCA_U32_LINK]) {
 726                u32 handle = nla_get_u32(tb[TCA_U32_LINK]);
 727                struct tc_u_hnode *ht_down = NULL, *ht_old;
 728
 729                if (TC_U32_KEY(handle)) {
 730                        NL_SET_ERR_MSG_MOD(extack, "u32 Link handle must be a hash table");
 731                        return -EINVAL;
 732                }
 733
 734                if (handle) {
 735                        ht_down = u32_lookup_ht(tp->data, handle);
 736
 737                        if (!ht_down) {
 738                                NL_SET_ERR_MSG_MOD(extack, "Link hash table not found");
 739                                return -EINVAL;
 740                        }
 741                        if (ht_down->is_root) {
 742                                NL_SET_ERR_MSG_MOD(extack, "Not linking to root node");
 743                                return -EINVAL;
 744                        }
 745                        ht_down->refcnt++;
 746                }
 747
 748                ht_old = rtnl_dereference(n->ht_down);
 749                rcu_assign_pointer(n->ht_down, ht_down);
 750
 751                if (ht_old)
 752                        ht_old->refcnt--;
 753        }
 754        if (tb[TCA_U32_CLASSID]) {
 755                n->res.classid = nla_get_u32(tb[TCA_U32_CLASSID]);
 756                tcf_bind_filter(tp, &n->res, base);
 757        }
 758
 759        if (tb[TCA_U32_INDEV]) {
 760                int ret;
 761                ret = tcf_change_indev(net, tb[TCA_U32_INDEV], extack);
 762                if (ret < 0)
 763                        return -EINVAL;
 764                n->ifindex = ret;
 765        }
 766        return 0;
 767}
 768
 769static void u32_replace_knode(struct tcf_proto *tp, struct tc_u_common *tp_c,
 770                              struct tc_u_knode *n)
 771{
 772        struct tc_u_knode __rcu **ins;
 773        struct tc_u_knode *pins;
 774        struct tc_u_hnode *ht;
 775
 776        if (TC_U32_HTID(n->handle) == TC_U32_ROOT)
 777                ht = rtnl_dereference(tp->root);
 778        else
 779                ht = u32_lookup_ht(tp_c, TC_U32_HTID(n->handle));
 780
 781        ins = &ht->ht[TC_U32_HASH(n->handle)];
 782
 783        /* The node must always exist for it to be replaced if this is not the
 784         * case then something went very wrong elsewhere.
 785         */
 786        for (pins = rtnl_dereference(*ins); ;
 787             ins = &pins->next, pins = rtnl_dereference(*ins))
 788                if (pins->handle == n->handle)
 789                        break;
 790
 791        idr_replace(&ht->handle_idr, n, n->handle);
 792        RCU_INIT_POINTER(n->next, pins->next);
 793        rcu_assign_pointer(*ins, n);
 794}
 795
 796static struct tc_u_knode *u32_init_knode(struct net *net, struct tcf_proto *tp,
 797                                         struct tc_u_knode *n)
 798{
 799        struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
 800        struct tc_u32_sel *s = &n->sel;
 801        struct tc_u_knode *new;
 802
 803        new = kzalloc(struct_size(new, sel.keys, s->nkeys), GFP_KERNEL);
 804        if (!new)
 805                return NULL;
 806
 807        RCU_INIT_POINTER(new->next, n->next);
 808        new->handle = n->handle;
 809        RCU_INIT_POINTER(new->ht_up, n->ht_up);
 810
 811        new->ifindex = n->ifindex;
 812        new->fshift = n->fshift;
 813        new->res = n->res;
 814        new->flags = n->flags;
 815        RCU_INIT_POINTER(new->ht_down, ht);
 816
 817        /* bump reference count as long as we hold pointer to structure */
 818        if (ht)
 819                ht->refcnt++;
 820
 821#ifdef CONFIG_CLS_U32_PERF
 822        /* Statistics may be incremented by readers during update
 823         * so we must keep them in tact. When the node is later destroyed
 824         * a special destroy call must be made to not free the pf memory.
 825         */
 826        new->pf = n->pf;
 827#endif
 828
 829#ifdef CONFIG_CLS_U32_MARK
 830        new->val = n->val;
 831        new->mask = n->mask;
 832        /* Similarly success statistics must be moved as pointers */
 833        new->pcpu_success = n->pcpu_success;
 834#endif
 835        memcpy(&new->sel, s, struct_size(s, keys, s->nkeys));
 836
 837        if (tcf_exts_init(&new->exts, net, TCA_U32_ACT, TCA_U32_POLICE)) {
 838                kfree(new);
 839                return NULL;
 840        }
 841
 842        return new;
 843}
 844
 845static int u32_change(struct net *net, struct sk_buff *in_skb,
 846                      struct tcf_proto *tp, unsigned long base, u32 handle,
 847                      struct nlattr **tca, void **arg, bool ovr, bool rtnl_held,
 848                      struct netlink_ext_ack *extack)
 849{
 850        struct tc_u_common *tp_c = tp->data;
 851        struct tc_u_hnode *ht;
 852        struct tc_u_knode *n;
 853        struct tc_u32_sel *s;
 854        struct nlattr *opt = tca[TCA_OPTIONS];
 855        struct nlattr *tb[TCA_U32_MAX + 1];
 856        u32 htid, flags = 0;
 857        size_t sel_size;
 858        int err;
 859
 860        if (!opt) {
 861                if (handle) {
 862                        NL_SET_ERR_MSG_MOD(extack, "Filter handle requires options");
 863                        return -EINVAL;
 864                } else {
 865                        return 0;
 866                }
 867        }
 868
 869        err = nla_parse_nested_deprecated(tb, TCA_U32_MAX, opt, u32_policy,
 870                                          extack);
 871        if (err < 0)
 872                return err;
 873
 874        if (tb[TCA_U32_FLAGS]) {
 875                flags = nla_get_u32(tb[TCA_U32_FLAGS]);
 876                if (!tc_flags_valid(flags)) {
 877                        NL_SET_ERR_MSG_MOD(extack, "Invalid filter flags");
 878                        return -EINVAL;
 879                }
 880        }
 881
 882        n = *arg;
 883        if (n) {
 884                struct tc_u_knode *new;
 885
 886                if (TC_U32_KEY(n->handle) == 0) {
 887                        NL_SET_ERR_MSG_MOD(extack, "Key node id cannot be zero");
 888                        return -EINVAL;
 889                }
 890
 891                if ((n->flags ^ flags) &
 892                    ~(TCA_CLS_FLAGS_IN_HW | TCA_CLS_FLAGS_NOT_IN_HW)) {
 893                        NL_SET_ERR_MSG_MOD(extack, "Key node flags do not match passed flags");
 894                        return -EINVAL;
 895                }
 896
 897                new = u32_init_knode(net, tp, n);
 898                if (!new)
 899                        return -ENOMEM;
 900
 901                err = u32_set_parms(net, tp, base, new, tb,
 902                                    tca[TCA_RATE], ovr, extack);
 903
 904                if (err) {
 905                        u32_destroy_key(new, false);
 906                        return err;
 907                }
 908
 909                err = u32_replace_hw_knode(tp, new, flags, extack);
 910                if (err) {
 911                        u32_destroy_key(new, false);
 912                        return err;
 913                }
 914
 915                if (!tc_in_hw(new->flags))
 916                        new->flags |= TCA_CLS_FLAGS_NOT_IN_HW;
 917
 918                u32_replace_knode(tp, tp_c, new);
 919                tcf_unbind_filter(tp, &n->res);
 920                tcf_exts_get_net(&n->exts);
 921                tcf_queue_work(&n->rwork, u32_delete_key_work);
 922                return 0;
 923        }
 924
 925        if (tb[TCA_U32_DIVISOR]) {
 926                unsigned int divisor = nla_get_u32(tb[TCA_U32_DIVISOR]);
 927
 928                if (!is_power_of_2(divisor)) {
 929                        NL_SET_ERR_MSG_MOD(extack, "Divisor is not a power of 2");
 930                        return -EINVAL;
 931                }
 932                if (divisor-- > 0x100) {
 933                        NL_SET_ERR_MSG_MOD(extack, "Exceeded maximum 256 hash buckets");
 934                        return -EINVAL;
 935                }
 936                if (TC_U32_KEY(handle)) {
 937                        NL_SET_ERR_MSG_MOD(extack, "Divisor can only be used on a hash table");
 938                        return -EINVAL;
 939                }
 940                ht = kzalloc(struct_size(ht, ht, divisor + 1), GFP_KERNEL);
 941                if (ht == NULL)
 942                        return -ENOBUFS;
 943                if (handle == 0) {
 944                        handle = gen_new_htid(tp->data, ht);
 945                        if (handle == 0) {
 946                                kfree(ht);
 947                                return -ENOMEM;
 948                        }
 949                } else {
 950                        err = idr_alloc_u32(&tp_c->handle_idr, ht, &handle,
 951                                            handle, GFP_KERNEL);
 952                        if (err) {
 953                                kfree(ht);
 954                                return err;
 955                        }
 956                }
 957                ht->refcnt = 1;
 958                ht->divisor = divisor;
 959                ht->handle = handle;
 960                ht->prio = tp->prio;
 961                idr_init(&ht->handle_idr);
 962                ht->flags = flags;
 963
 964                err = u32_replace_hw_hnode(tp, ht, flags, extack);
 965                if (err) {
 966                        idr_remove(&tp_c->handle_idr, handle);
 967                        kfree(ht);
 968                        return err;
 969                }
 970
 971                RCU_INIT_POINTER(ht->next, tp_c->hlist);
 972                rcu_assign_pointer(tp_c->hlist, ht);
 973                *arg = ht;
 974
 975                return 0;
 976        }
 977
 978        if (tb[TCA_U32_HASH]) {
 979                htid = nla_get_u32(tb[TCA_U32_HASH]);
 980                if (TC_U32_HTID(htid) == TC_U32_ROOT) {
 981                        ht = rtnl_dereference(tp->root);
 982                        htid = ht->handle;
 983                } else {
 984                        ht = u32_lookup_ht(tp->data, TC_U32_HTID(htid));
 985                        if (!ht) {
 986                                NL_SET_ERR_MSG_MOD(extack, "Specified hash table not found");
 987                                return -EINVAL;
 988                        }
 989                }
 990        } else {
 991                ht = rtnl_dereference(tp->root);
 992                htid = ht->handle;
 993        }
 994
 995        if (ht->divisor < TC_U32_HASH(htid)) {
 996                NL_SET_ERR_MSG_MOD(extack, "Specified hash table buckets exceed configured value");
 997                return -EINVAL;
 998        }
 999
1000        if (handle) {
1001                if (TC_U32_HTID(handle) && TC_U32_HTID(handle ^ htid)) {
1002                        NL_SET_ERR_MSG_MOD(extack, "Handle specified hash table address mismatch");
1003                        return -EINVAL;
1004                }
1005                handle = htid | TC_U32_NODE(handle);
1006                err = idr_alloc_u32(&ht->handle_idr, NULL, &handle, handle,
1007                                    GFP_KERNEL);
1008                if (err)
1009                        return err;
1010        } else
1011                handle = gen_new_kid(ht, htid);
1012
1013        if (tb[TCA_U32_SEL] == NULL) {
1014                NL_SET_ERR_MSG_MOD(extack, "Selector not specified");
1015                err = -EINVAL;
1016                goto erridr;
1017        }
1018
1019        s = nla_data(tb[TCA_U32_SEL]);
1020        sel_size = struct_size(s, keys, s->nkeys);
1021        if (nla_len(tb[TCA_U32_SEL]) < sel_size) {
1022                err = -EINVAL;
1023                goto erridr;
1024        }
1025
1026        n = kzalloc(struct_size(n, sel.keys, s->nkeys), GFP_KERNEL);
1027        if (n == NULL) {
1028                err = -ENOBUFS;
1029                goto erridr;
1030        }
1031
1032#ifdef CONFIG_CLS_U32_PERF
1033        n->pf = __alloc_percpu(struct_size(n->pf, kcnts, s->nkeys),
1034                               __alignof__(struct tc_u32_pcnt));
1035        if (!n->pf) {
1036                err = -ENOBUFS;
1037                goto errfree;
1038        }
1039#endif
1040
1041        memcpy(&n->sel, s, sel_size);
1042        RCU_INIT_POINTER(n->ht_up, ht);
1043        n->handle = handle;
1044        n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0;
1045        n->flags = flags;
1046
1047        err = tcf_exts_init(&n->exts, net, TCA_U32_ACT, TCA_U32_POLICE);
1048        if (err < 0)
1049                goto errout;
1050
1051#ifdef CONFIG_CLS_U32_MARK
1052        n->pcpu_success = alloc_percpu(u32);
1053        if (!n->pcpu_success) {
1054                err = -ENOMEM;
1055                goto errout;
1056        }
1057
1058        if (tb[TCA_U32_MARK]) {
1059                struct tc_u32_mark *mark;
1060
1061                mark = nla_data(tb[TCA_U32_MARK]);
1062                n->val = mark->val;
1063                n->mask = mark->mask;
1064        }
1065#endif
1066
1067        err = u32_set_parms(net, tp, base, n, tb, tca[TCA_RATE], ovr,
1068                            extack);
1069        if (err == 0) {
1070                struct tc_u_knode __rcu **ins;
1071                struct tc_u_knode *pins;
1072
1073                err = u32_replace_hw_knode(tp, n, flags, extack);
1074                if (err)
1075                        goto errhw;
1076
1077                if (!tc_in_hw(n->flags))
1078                        n->flags |= TCA_CLS_FLAGS_NOT_IN_HW;
1079
1080                ins = &ht->ht[TC_U32_HASH(handle)];
1081                for (pins = rtnl_dereference(*ins); pins;
1082                     ins = &pins->next, pins = rtnl_dereference(*ins))
1083                        if (TC_U32_NODE(handle) < TC_U32_NODE(pins->handle))
1084                                break;
1085
1086                RCU_INIT_POINTER(n->next, pins);
1087                rcu_assign_pointer(*ins, n);
1088                tp_c->knodes++;
1089                *arg = n;
1090                return 0;
1091        }
1092
1093errhw:
1094#ifdef CONFIG_CLS_U32_MARK
1095        free_percpu(n->pcpu_success);
1096#endif
1097
1098errout:
1099        tcf_exts_destroy(&n->exts);
1100#ifdef CONFIG_CLS_U32_PERF
1101errfree:
1102        free_percpu(n->pf);
1103#endif
1104        kfree(n);
1105erridr:
1106        idr_remove(&ht->handle_idr, handle);
1107        return err;
1108}
1109
1110static void u32_walk(struct tcf_proto *tp, struct tcf_walker *arg,
1111                     bool rtnl_held)
1112{
1113        struct tc_u_common *tp_c = tp->data;
1114        struct tc_u_hnode *ht;
1115        struct tc_u_knode *n;
1116        unsigned int h;
1117
1118        if (arg->stop)
1119                return;
1120
1121        for (ht = rtnl_dereference(tp_c->hlist);
1122             ht;
1123             ht = rtnl_dereference(ht->next)) {
1124                if (ht->prio != tp->prio)
1125                        continue;
1126                if (arg->count >= arg->skip) {
1127                        if (arg->fn(tp, ht, arg) < 0) {
1128                                arg->stop = 1;
1129                                return;
1130                        }
1131                }
1132                arg->count++;
1133                for (h = 0; h <= ht->divisor; h++) {
1134                        for (n = rtnl_dereference(ht->ht[h]);
1135                             n;
1136                             n = rtnl_dereference(n->next)) {
1137                                if (arg->count < arg->skip) {
1138                                        arg->count++;
1139                                        continue;
1140                                }
1141                                if (arg->fn(tp, n, arg) < 0) {
1142                                        arg->stop = 1;
1143                                        return;
1144                                }
1145                                arg->count++;
1146                        }
1147                }
1148        }
1149}
1150
1151static int u32_reoffload_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht,
1152                               bool add, flow_setup_cb_t *cb, void *cb_priv,
1153                               struct netlink_ext_ack *extack)
1154{
1155        struct tc_cls_u32_offload cls_u32 = {};
1156        int err;
1157
1158        tc_cls_common_offload_init(&cls_u32.common, tp, ht->flags, extack);
1159        cls_u32.command = add ? TC_CLSU32_NEW_HNODE : TC_CLSU32_DELETE_HNODE;
1160        cls_u32.hnode.divisor = ht->divisor;
1161        cls_u32.hnode.handle = ht->handle;
1162        cls_u32.hnode.prio = ht->prio;
1163
1164        err = cb(TC_SETUP_CLSU32, &cls_u32, cb_priv);
1165        if (err && add && tc_skip_sw(ht->flags))
1166                return err;
1167
1168        return 0;
1169}
1170
1171static int u32_reoffload_knode(struct tcf_proto *tp, struct tc_u_knode *n,
1172                               bool add, flow_setup_cb_t *cb, void *cb_priv,
1173                               struct netlink_ext_ack *extack)
1174{
1175        struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
1176        struct tcf_block *block = tp->chain->block;
1177        struct tc_cls_u32_offload cls_u32 = {};
1178        int err;
1179
1180        tc_cls_common_offload_init(&cls_u32.common, tp, n->flags, extack);
1181        cls_u32.command = add ?
1182                TC_CLSU32_REPLACE_KNODE : TC_CLSU32_DELETE_KNODE;
1183        cls_u32.knode.handle = n->handle;
1184
1185        if (add) {
1186                cls_u32.knode.fshift = n->fshift;
1187#ifdef CONFIG_CLS_U32_MARK
1188                cls_u32.knode.val = n->val;
1189                cls_u32.knode.mask = n->mask;
1190#else
1191                cls_u32.knode.val = 0;
1192                cls_u32.knode.mask = 0;
1193#endif
1194                cls_u32.knode.sel = &n->sel;
1195                cls_u32.knode.res = &n->res;
1196                cls_u32.knode.exts = &n->exts;
1197                if (n->ht_down)
1198                        cls_u32.knode.link_handle = ht->handle;
1199        }
1200
1201        err = tc_setup_cb_reoffload(block, tp, add, cb, TC_SETUP_CLSU32,
1202                                    &cls_u32, cb_priv, &n->flags,
1203                                    &n->in_hw_count);
1204        if (err)
1205                return err;
1206
1207        return 0;
1208}
1209
1210static int u32_reoffload(struct tcf_proto *tp, bool add, flow_setup_cb_t *cb,
1211                         void *cb_priv, struct netlink_ext_ack *extack)
1212{
1213        struct tc_u_common *tp_c = tp->data;
1214        struct tc_u_hnode *ht;
1215        struct tc_u_knode *n;
1216        unsigned int h;
1217        int err;
1218
1219        for (ht = rtnl_dereference(tp_c->hlist);
1220             ht;
1221             ht = rtnl_dereference(ht->next)) {
1222                if (ht->prio != tp->prio)
1223                        continue;
1224
1225                /* When adding filters to a new dev, try to offload the
1226                 * hashtable first. When removing, do the filters before the
1227                 * hashtable.
1228                 */
1229                if (add && !tc_skip_hw(ht->flags)) {
1230                        err = u32_reoffload_hnode(tp, ht, add, cb, cb_priv,
1231                                                  extack);
1232                        if (err)
1233                                return err;
1234                }
1235
1236                for (h = 0; h <= ht->divisor; h++) {
1237                        for (n = rtnl_dereference(ht->ht[h]);
1238                             n;
1239                             n = rtnl_dereference(n->next)) {
1240                                if (tc_skip_hw(n->flags))
1241                                        continue;
1242
1243                                err = u32_reoffload_knode(tp, n, add, cb,
1244                                                          cb_priv, extack);
1245                                if (err)
1246                                        return err;
1247                        }
1248                }
1249
1250                if (!add && !tc_skip_hw(ht->flags))
1251                        u32_reoffload_hnode(tp, ht, add, cb, cb_priv, extack);
1252        }
1253
1254        return 0;
1255}
1256
1257static void u32_bind_class(void *fh, u32 classid, unsigned long cl, void *q,
1258                           unsigned long base)
1259{
1260        struct tc_u_knode *n = fh;
1261
1262        if (n && n->res.classid == classid) {
1263                if (cl)
1264                        __tcf_bind_filter(q, &n->res, base);
1265                else
1266                        __tcf_unbind_filter(q, &n->res);
1267        }
1268}
1269
1270static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh,
1271                    struct sk_buff *skb, struct tcmsg *t, bool rtnl_held)
1272{
1273        struct tc_u_knode *n = fh;
1274        struct tc_u_hnode *ht_up, *ht_down;
1275        struct nlattr *nest;
1276
1277        if (n == NULL)
1278                return skb->len;
1279
1280        t->tcm_handle = n->handle;
1281
1282        nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
1283        if (nest == NULL)
1284                goto nla_put_failure;
1285
1286        if (TC_U32_KEY(n->handle) == 0) {
1287                struct tc_u_hnode *ht = fh;
1288                u32 divisor = ht->divisor + 1;
1289
1290                if (nla_put_u32(skb, TCA_U32_DIVISOR, divisor))
1291                        goto nla_put_failure;
1292        } else {
1293#ifdef CONFIG_CLS_U32_PERF
1294                struct tc_u32_pcnt *gpf;
1295                int cpu;
1296#endif
1297
1298                if (nla_put(skb, TCA_U32_SEL, struct_size(&n->sel, keys, n->sel.nkeys),
1299                            &n->sel))
1300                        goto nla_put_failure;
1301
1302                ht_up = rtnl_dereference(n->ht_up);
1303                if (ht_up) {
1304                        u32 htid = n->handle & 0xFFFFF000;
1305                        if (nla_put_u32(skb, TCA_U32_HASH, htid))
1306                                goto nla_put_failure;
1307                }
1308                if (n->res.classid &&
1309                    nla_put_u32(skb, TCA_U32_CLASSID, n->res.classid))
1310                        goto nla_put_failure;
1311
1312                ht_down = rtnl_dereference(n->ht_down);
1313                if (ht_down &&
1314                    nla_put_u32(skb, TCA_U32_LINK, ht_down->handle))
1315                        goto nla_put_failure;
1316
1317                if (n->flags && nla_put_u32(skb, TCA_U32_FLAGS, n->flags))
1318                        goto nla_put_failure;
1319
1320#ifdef CONFIG_CLS_U32_MARK
1321                if ((n->val || n->mask)) {
1322                        struct tc_u32_mark mark = {.val = n->val,
1323                                                   .mask = n->mask,
1324                                                   .success = 0};
1325                        int cpum;
1326
1327                        for_each_possible_cpu(cpum) {
1328                                __u32 cnt = *per_cpu_ptr(n->pcpu_success, cpum);
1329
1330                                mark.success += cnt;
1331                        }
1332
1333                        if (nla_put(skb, TCA_U32_MARK, sizeof(mark), &mark))
1334                                goto nla_put_failure;
1335                }
1336#endif
1337
1338                if (tcf_exts_dump(skb, &n->exts) < 0)
1339                        goto nla_put_failure;
1340
1341                if (n->ifindex) {
1342                        struct net_device *dev;
1343                        dev = __dev_get_by_index(net, n->ifindex);
1344                        if (dev && nla_put_string(skb, TCA_U32_INDEV, dev->name))
1345                                goto nla_put_failure;
1346                }
1347#ifdef CONFIG_CLS_U32_PERF
1348                gpf = kzalloc(struct_size(gpf, kcnts, n->sel.nkeys), GFP_KERNEL);
1349                if (!gpf)
1350                        goto nla_put_failure;
1351
1352                for_each_possible_cpu(cpu) {
1353                        int i;
1354                        struct tc_u32_pcnt *pf = per_cpu_ptr(n->pf, cpu);
1355
1356                        gpf->rcnt += pf->rcnt;
1357                        gpf->rhit += pf->rhit;
1358                        for (i = 0; i < n->sel.nkeys; i++)
1359                                gpf->kcnts[i] += pf->kcnts[i];
1360                }
1361
1362                if (nla_put_64bit(skb, TCA_U32_PCNT, struct_size(gpf, kcnts, n->sel.nkeys),
1363                                  gpf, TCA_U32_PAD)) {
1364                        kfree(gpf);
1365                        goto nla_put_failure;
1366                }
1367                kfree(gpf);
1368#endif
1369        }
1370
1371        nla_nest_end(skb, nest);
1372
1373        if (TC_U32_KEY(n->handle))
1374                if (tcf_exts_dump_stats(skb, &n->exts) < 0)
1375                        goto nla_put_failure;
1376        return skb->len;
1377
1378nla_put_failure:
1379        nla_nest_cancel(skb, nest);
1380        return -1;
1381}
1382
1383static struct tcf_proto_ops cls_u32_ops __read_mostly = {
1384        .kind           =       "u32",
1385        .classify       =       u32_classify,
1386        .init           =       u32_init,
1387        .destroy        =       u32_destroy,
1388        .get            =       u32_get,
1389        .change         =       u32_change,
1390        .delete         =       u32_delete,
1391        .walk           =       u32_walk,
1392        .reoffload      =       u32_reoffload,
1393        .dump           =       u32_dump,
1394        .bind_class     =       u32_bind_class,
1395        .owner          =       THIS_MODULE,
1396};
1397
1398static int __init init_u32(void)
1399{
1400        int i, ret;
1401
1402        pr_info("u32 classifier\n");
1403#ifdef CONFIG_CLS_U32_PERF
1404        pr_info("    Performance counters on\n");
1405#endif
1406        pr_info("    input device check on\n");
1407#ifdef CONFIG_NET_CLS_ACT
1408        pr_info("    Actions configured\n");
1409#endif
1410        tc_u_common_hash = kvmalloc_array(U32_HASH_SIZE,
1411                                          sizeof(struct hlist_head),
1412                                          GFP_KERNEL);
1413        if (!tc_u_common_hash)
1414                return -ENOMEM;
1415
1416        for (i = 0; i < U32_HASH_SIZE; i++)
1417                INIT_HLIST_HEAD(&tc_u_common_hash[i]);
1418
1419        ret = register_tcf_proto_ops(&cls_u32_ops);
1420        if (ret)
1421                kvfree(tc_u_common_hash);
1422        return ret;
1423}
1424
1425static void __exit exit_u32(void)
1426{
1427        unregister_tcf_proto_ops(&cls_u32_ops);
1428        kvfree(tc_u_common_hash);
1429}
1430
1431module_init(init_u32)
1432module_exit(exit_u32)
1433MODULE_LICENSE("GPL");
1434