linux/include/net/pkt_cls.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __NET_PKT_CLS_H
   3#define __NET_PKT_CLS_H
   4
   5#include <linux/pkt_cls.h>
   6#include <linux/workqueue.h>
   7#include <net/sch_generic.h>
   8#include <net/act_api.h>
   9#include <net/net_namespace.h>
  10
  11/* TC action not accessible from user space */
  12#define TC_ACT_CONSUMED         (TC_ACT_VALUE_MAX + 1)
  13
  14/* Basic packet classifier frontend definitions. */
  15
  16struct tcf_walker {
  17        int     stop;
  18        int     skip;
  19        int     count;
  20        bool    nonempty;
  21        unsigned long cookie;
  22        int     (*fn)(struct tcf_proto *, void *node, struct tcf_walker *);
  23};
  24
  25int register_tcf_proto_ops(struct tcf_proto_ops *ops);
  26int unregister_tcf_proto_ops(struct tcf_proto_ops *ops);
  27
  28struct tcf_block_ext_info {
  29        enum flow_block_binder_type binder_type;
  30        tcf_chain_head_change_t *chain_head_change;
  31        void *chain_head_change_priv;
  32        u32 block_index;
  33};
  34
  35struct tcf_qevent {
  36        struct tcf_block        *block;
  37        struct tcf_block_ext_info info;
  38        struct tcf_proto __rcu *filter_chain;
  39};
  40
  41struct tcf_block_cb;
  42bool tcf_queue_work(struct rcu_work *rwork, work_func_t func);
  43
  44#ifdef CONFIG_NET_CLS
  45struct tcf_chain *tcf_chain_get_by_act(struct tcf_block *block,
  46                                       u32 chain_index);
  47void tcf_chain_put_by_act(struct tcf_chain *chain);
  48struct tcf_chain *tcf_get_next_chain(struct tcf_block *block,
  49                                     struct tcf_chain *chain);
  50struct tcf_proto *tcf_get_next_proto(struct tcf_chain *chain,
  51                                     struct tcf_proto *tp);
  52void tcf_block_netif_keep_dst(struct tcf_block *block);
  53int tcf_block_get(struct tcf_block **p_block,
  54                  struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
  55                  struct netlink_ext_ack *extack);
  56int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
  57                      struct tcf_block_ext_info *ei,
  58                      struct netlink_ext_ack *extack);
  59void tcf_block_put(struct tcf_block *block);
  60void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q,
  61                       struct tcf_block_ext_info *ei);
  62
  63static inline bool tcf_block_shared(struct tcf_block *block)
  64{
  65        return block->index;
  66}
  67
  68static inline bool tcf_block_non_null_shared(struct tcf_block *block)
  69{
  70        return block && block->index;
  71}
  72
  73static inline struct Qdisc *tcf_block_q(struct tcf_block *block)
  74{
  75        WARN_ON(tcf_block_shared(block));
  76        return block->q;
  77}
  78
  79int tcf_classify(struct sk_buff *skb,
  80                 const struct tcf_block *block,
  81                 const struct tcf_proto *tp, struct tcf_result *res,
  82                 bool compat_mode);
  83
  84#else
  85static inline bool tcf_block_shared(struct tcf_block *block)
  86{
  87        return false;
  88}
  89
  90static inline bool tcf_block_non_null_shared(struct tcf_block *block)
  91{
  92        return false;
  93}
  94
  95static inline
  96int tcf_block_get(struct tcf_block **p_block,
  97                  struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
  98                  struct netlink_ext_ack *extack)
  99{
 100        return 0;
 101}
 102
 103static inline
 104int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
 105                      struct tcf_block_ext_info *ei,
 106                      struct netlink_ext_ack *extack)
 107{
 108        return 0;
 109}
 110
 111static inline void tcf_block_put(struct tcf_block *block)
 112{
 113}
 114
 115static inline
 116void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q,
 117                       struct tcf_block_ext_info *ei)
 118{
 119}
 120
 121static inline struct Qdisc *tcf_block_q(struct tcf_block *block)
 122{
 123        return NULL;
 124}
 125
 126static inline
 127int tc_setup_cb_block_register(struct tcf_block *block, flow_setup_cb_t *cb,
 128                               void *cb_priv)
 129{
 130        return 0;
 131}
 132
 133static inline
 134void tc_setup_cb_block_unregister(struct tcf_block *block, flow_setup_cb_t *cb,
 135                                  void *cb_priv)
 136{
 137}
 138
 139static inline int tcf_classify(struct sk_buff *skb,
 140                               const struct tcf_block *block,
 141                               const struct tcf_proto *tp,
 142                               struct tcf_result *res, bool compat_mode)
 143{
 144        return TC_ACT_UNSPEC;
 145}
 146
 147#endif
 148
 149static inline unsigned long
 150__cls_set_class(unsigned long *clp, unsigned long cl)
 151{
 152        return xchg(clp, cl);
 153}
 154
 155static inline void
 156__tcf_bind_filter(struct Qdisc *q, struct tcf_result *r, unsigned long base)
 157{
 158        unsigned long cl;
 159
 160        cl = q->ops->cl_ops->bind_tcf(q, base, r->classid);
 161        cl = __cls_set_class(&r->class, cl);
 162        if (cl)
 163                q->ops->cl_ops->unbind_tcf(q, cl);
 164}
 165
 166static inline void
 167tcf_bind_filter(struct tcf_proto *tp, struct tcf_result *r, unsigned long base)
 168{
 169        struct Qdisc *q = tp->chain->block->q;
 170
 171        /* Check q as it is not set for shared blocks. In that case,
 172         * setting class is not supported.
 173         */
 174        if (!q)
 175                return;
 176        sch_tree_lock(q);
 177        __tcf_bind_filter(q, r, base);
 178        sch_tree_unlock(q);
 179}
 180
 181static inline void
 182__tcf_unbind_filter(struct Qdisc *q, struct tcf_result *r)
 183{
 184        unsigned long cl;
 185
 186        if ((cl = __cls_set_class(&r->class, 0)) != 0)
 187                q->ops->cl_ops->unbind_tcf(q, cl);
 188}
 189
 190static inline void
 191tcf_unbind_filter(struct tcf_proto *tp, struct tcf_result *r)
 192{
 193        struct Qdisc *q = tp->chain->block->q;
 194
 195        if (!q)
 196                return;
 197        __tcf_unbind_filter(q, r);
 198}
 199
 200struct tcf_exts {
 201#ifdef CONFIG_NET_CLS_ACT
 202        __u32   type; /* for backward compat(TCA_OLD_COMPAT) */
 203        int nr_actions;
 204        struct tc_action **actions;
 205        struct net *net;
 206#endif
 207        /* Map to export classifier specific extension TLV types to the
 208         * generic extensions API. Unsupported extensions must be set to 0.
 209         */
 210        int action;
 211        int police;
 212};
 213
 214static inline int tcf_exts_init(struct tcf_exts *exts, struct net *net,
 215                                int action, int police)
 216{
 217#ifdef CONFIG_NET_CLS_ACT
 218        exts->type = 0;
 219        exts->nr_actions = 0;
 220        exts->net = net;
 221        exts->actions = kcalloc(TCA_ACT_MAX_PRIO, sizeof(struct tc_action *),
 222                                GFP_KERNEL);
 223        if (!exts->actions)
 224                return -ENOMEM;
 225#endif
 226        exts->action = action;
 227        exts->police = police;
 228        return 0;
 229}
 230
 231/* Return false if the netns is being destroyed in cleanup_net(). Callers
 232 * need to do cleanup synchronously in this case, otherwise may race with
 233 * tc_action_net_exit(). Return true for other cases.
 234 */
 235static inline bool tcf_exts_get_net(struct tcf_exts *exts)
 236{
 237#ifdef CONFIG_NET_CLS_ACT
 238        exts->net = maybe_get_net(exts->net);
 239        return exts->net != NULL;
 240#else
 241        return true;
 242#endif
 243}
 244
 245static inline void tcf_exts_put_net(struct tcf_exts *exts)
 246{
 247#ifdef CONFIG_NET_CLS_ACT
 248        if (exts->net)
 249                put_net(exts->net);
 250#endif
 251}
 252
 253#ifdef CONFIG_NET_CLS_ACT
 254#define tcf_exts_for_each_action(i, a, exts) \
 255        for (i = 0; i < TCA_ACT_MAX_PRIO && ((a) = (exts)->actions[i]); i++)
 256#else
 257#define tcf_exts_for_each_action(i, a, exts) \
 258        for (; 0; (void)(i), (void)(a), (void)(exts))
 259#endif
 260
 261static inline void
 262tcf_exts_stats_update(const struct tcf_exts *exts,
 263                      u64 bytes, u64 packets, u64 drops, u64 lastuse,
 264                      u8 used_hw_stats, bool used_hw_stats_valid)
 265{
 266#ifdef CONFIG_NET_CLS_ACT
 267        int i;
 268
 269        preempt_disable();
 270
 271        for (i = 0; i < exts->nr_actions; i++) {
 272                struct tc_action *a = exts->actions[i];
 273
 274                tcf_action_stats_update(a, bytes, packets, drops,
 275                                        lastuse, true);
 276                a->used_hw_stats = used_hw_stats;
 277                a->used_hw_stats_valid = used_hw_stats_valid;
 278        }
 279
 280        preempt_enable();
 281#endif
 282}
 283
 284/**
 285 * tcf_exts_has_actions - check if at least one action is present
 286 * @exts: tc filter extensions handle
 287 *
 288 * Returns true if at least one action is present.
 289 */
 290static inline bool tcf_exts_has_actions(struct tcf_exts *exts)
 291{
 292#ifdef CONFIG_NET_CLS_ACT
 293        return exts->nr_actions;
 294#else
 295        return false;
 296#endif
 297}
 298
 299/**
 300 * tcf_exts_exec - execute tc filter extensions
 301 * @skb: socket buffer
 302 * @exts: tc filter extensions handle
 303 * @res: desired result
 304 *
 305 * Executes all configured extensions. Returns TC_ACT_OK on a normal execution,
 306 * a negative number if the filter must be considered unmatched or
 307 * a positive action code (TC_ACT_*) which must be returned to the
 308 * underlying layer.
 309 */
 310static inline int
 311tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,
 312              struct tcf_result *res)
 313{
 314#ifdef CONFIG_NET_CLS_ACT
 315        return tcf_action_exec(skb, exts->actions, exts->nr_actions, res);
 316#endif
 317        return TC_ACT_OK;
 318}
 319
 320int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
 321                      struct nlattr **tb, struct nlattr *rate_tlv,
 322                      struct tcf_exts *exts, u32 flags,
 323                      struct netlink_ext_ack *extack);
 324void tcf_exts_destroy(struct tcf_exts *exts);
 325void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
 326int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts);
 327int tcf_exts_terse_dump(struct sk_buff *skb, struct tcf_exts *exts);
 328int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts);
 329
 330/**
 331 * struct tcf_pkt_info - packet information
 332 *
 333 * @ptr: start of the pkt data
 334 * @nexthdr: offset of the next header
 335 */
 336struct tcf_pkt_info {
 337        unsigned char *         ptr;
 338        int                     nexthdr;
 339};
 340
 341#ifdef CONFIG_NET_EMATCH
 342
 343struct tcf_ematch_ops;
 344
 345/**
 346 * struct tcf_ematch - extended match (ematch)
 347 * 
 348 * @matchid: identifier to allow userspace to reidentify a match
 349 * @flags: flags specifying attributes and the relation to other matches
 350 * @ops: the operations lookup table of the corresponding ematch module
 351 * @datalen: length of the ematch specific configuration data
 352 * @data: ematch specific data
 353 * @net: the network namespace
 354 */
 355struct tcf_ematch {
 356        struct tcf_ematch_ops * ops;
 357        unsigned long           data;
 358        unsigned int            datalen;
 359        u16                     matchid;
 360        u16                     flags;
 361        struct net              *net;
 362};
 363
 364static inline int tcf_em_is_container(struct tcf_ematch *em)
 365{
 366        return !em->ops;
 367}
 368
 369static inline int tcf_em_is_simple(struct tcf_ematch *em)
 370{
 371        return em->flags & TCF_EM_SIMPLE;
 372}
 373
 374static inline int tcf_em_is_inverted(struct tcf_ematch *em)
 375{
 376        return em->flags & TCF_EM_INVERT;
 377}
 378
 379static inline int tcf_em_last_match(struct tcf_ematch *em)
 380{
 381        return (em->flags & TCF_EM_REL_MASK) == TCF_EM_REL_END;
 382}
 383
 384static inline int tcf_em_early_end(struct tcf_ematch *em, int result)
 385{
 386        if (tcf_em_last_match(em))
 387                return 1;
 388
 389        if (result == 0 && em->flags & TCF_EM_REL_AND)
 390                return 1;
 391
 392        if (result != 0 && em->flags & TCF_EM_REL_OR)
 393                return 1;
 394
 395        return 0;
 396}
 397        
 398/**
 399 * struct tcf_ematch_tree - ematch tree handle
 400 *
 401 * @hdr: ematch tree header supplied by userspace
 402 * @matches: array of ematches
 403 */
 404struct tcf_ematch_tree {
 405        struct tcf_ematch_tree_hdr hdr;
 406        struct tcf_ematch *     matches;
 407        
 408};
 409
 410/**
 411 * struct tcf_ematch_ops - ematch module operations
 412 * 
 413 * @kind: identifier (kind) of this ematch module
 414 * @datalen: length of expected configuration data (optional)
 415 * @change: called during validation (optional)
 416 * @match: called during ematch tree evaluation, must return 1/0
 417 * @destroy: called during destroyage (optional)
 418 * @dump: called during dumping process (optional)
 419 * @owner: owner, must be set to THIS_MODULE
 420 * @link: link to previous/next ematch module (internal use)
 421 */
 422struct tcf_ematch_ops {
 423        int                     kind;
 424        int                     datalen;
 425        int                     (*change)(struct net *net, void *,
 426                                          int, struct tcf_ematch *);
 427        int                     (*match)(struct sk_buff *, struct tcf_ematch *,
 428                                         struct tcf_pkt_info *);
 429        void                    (*destroy)(struct tcf_ematch *);
 430        int                     (*dump)(struct sk_buff *, struct tcf_ematch *);
 431        struct module           *owner;
 432        struct list_head        link;
 433};
 434
 435int tcf_em_register(struct tcf_ematch_ops *);
 436void tcf_em_unregister(struct tcf_ematch_ops *);
 437int tcf_em_tree_validate(struct tcf_proto *, struct nlattr *,
 438                         struct tcf_ematch_tree *);
 439void tcf_em_tree_destroy(struct tcf_ematch_tree *);
 440int tcf_em_tree_dump(struct sk_buff *, struct tcf_ematch_tree *, int);
 441int __tcf_em_tree_match(struct sk_buff *, struct tcf_ematch_tree *,
 442                        struct tcf_pkt_info *);
 443
 444/**
 445 * tcf_em_tree_match - evaulate an ematch tree
 446 *
 447 * @skb: socket buffer of the packet in question
 448 * @tree: ematch tree to be used for evaluation
 449 * @info: packet information examined by classifier
 450 *
 451 * This function matches @skb against the ematch tree in @tree by going
 452 * through all ematches respecting their logic relations returning
 453 * as soon as the result is obvious.
 454 *
 455 * Returns 1 if the ematch tree as-one matches, no ematches are configured
 456 * or ematch is not enabled in the kernel, otherwise 0 is returned.
 457 */
 458static inline int tcf_em_tree_match(struct sk_buff *skb,
 459                                    struct tcf_ematch_tree *tree,
 460                                    struct tcf_pkt_info *info)
 461{
 462        if (tree->hdr.nmatches)
 463                return __tcf_em_tree_match(skb, tree, info);
 464        else
 465                return 1;
 466}
 467
 468#define MODULE_ALIAS_TCF_EMATCH(kind)   MODULE_ALIAS("ematch-kind-" __stringify(kind))
 469
 470#else /* CONFIG_NET_EMATCH */
 471
 472struct tcf_ematch_tree {
 473};
 474
 475#define tcf_em_tree_validate(tp, tb, t) ((void)(t), 0)
 476#define tcf_em_tree_destroy(t) do { (void)(t); } while(0)
 477#define tcf_em_tree_dump(skb, t, tlv) (0)
 478#define tcf_em_tree_match(skb, t, info) ((void)(info), 1)
 479
 480#endif /* CONFIG_NET_EMATCH */
 481
 482static inline unsigned char * tcf_get_base_ptr(struct sk_buff *skb, int layer)
 483{
 484        switch (layer) {
 485                case TCF_LAYER_LINK:
 486                        return skb_mac_header(skb);
 487                case TCF_LAYER_NETWORK:
 488                        return skb_network_header(skb);
 489                case TCF_LAYER_TRANSPORT:
 490                        return skb_transport_header(skb);
 491        }
 492
 493        return NULL;
 494}
 495
 496static inline int tcf_valid_offset(const struct sk_buff *skb,
 497                                   const unsigned char *ptr, const int len)
 498{
 499        return likely((ptr + len) <= skb_tail_pointer(skb) &&
 500                      ptr >= skb->head &&
 501                      (ptr <= (ptr + len)));
 502}
 503
 504static inline int
 505tcf_change_indev(struct net *net, struct nlattr *indev_tlv,
 506                 struct netlink_ext_ack *extack)
 507{
 508        char indev[IFNAMSIZ];
 509        struct net_device *dev;
 510
 511        if (nla_strscpy(indev, indev_tlv, IFNAMSIZ) < 0) {
 512                NL_SET_ERR_MSG_ATTR(extack, indev_tlv,
 513                                    "Interface name too long");
 514                return -EINVAL;
 515        }
 516        dev = __dev_get_by_name(net, indev);
 517        if (!dev) {
 518                NL_SET_ERR_MSG_ATTR(extack, indev_tlv,
 519                                    "Network device not found");
 520                return -ENODEV;
 521        }
 522        return dev->ifindex;
 523}
 524
 525static inline bool
 526tcf_match_indev(struct sk_buff *skb, int ifindex)
 527{
 528        if (!ifindex)
 529                return true;
 530        if  (!skb->skb_iif)
 531                return false;
 532        return ifindex == skb->skb_iif;
 533}
 534
 535int tc_setup_flow_action(struct flow_action *flow_action,
 536                         const struct tcf_exts *exts);
 537void tc_cleanup_flow_action(struct flow_action *flow_action);
 538
 539int tc_setup_cb_call(struct tcf_block *block, enum tc_setup_type type,
 540                     void *type_data, bool err_stop, bool rtnl_held);
 541int tc_setup_cb_add(struct tcf_block *block, struct tcf_proto *tp,
 542                    enum tc_setup_type type, void *type_data, bool err_stop,
 543                    u32 *flags, unsigned int *in_hw_count, bool rtnl_held);
 544int tc_setup_cb_replace(struct tcf_block *block, struct tcf_proto *tp,
 545                        enum tc_setup_type type, void *type_data, bool err_stop,
 546                        u32 *old_flags, unsigned int *old_in_hw_count,
 547                        u32 *new_flags, unsigned int *new_in_hw_count,
 548                        bool rtnl_held);
 549int tc_setup_cb_destroy(struct tcf_block *block, struct tcf_proto *tp,
 550                        enum tc_setup_type type, void *type_data, bool err_stop,
 551                        u32 *flags, unsigned int *in_hw_count, bool rtnl_held);
 552int tc_setup_cb_reoffload(struct tcf_block *block, struct tcf_proto *tp,
 553                          bool add, flow_setup_cb_t *cb,
 554                          enum tc_setup_type type, void *type_data,
 555                          void *cb_priv, u32 *flags, unsigned int *in_hw_count);
 556unsigned int tcf_exts_num_actions(struct tcf_exts *exts);
 557
 558#ifdef CONFIG_NET_CLS_ACT
 559int tcf_qevent_init(struct tcf_qevent *qe, struct Qdisc *sch,
 560                    enum flow_block_binder_type binder_type,
 561                    struct nlattr *block_index_attr,
 562                    struct netlink_ext_ack *extack);
 563void tcf_qevent_destroy(struct tcf_qevent *qe, struct Qdisc *sch);
 564int tcf_qevent_validate_change(struct tcf_qevent *qe, struct nlattr *block_index_attr,
 565                               struct netlink_ext_ack *extack);
 566struct sk_buff *tcf_qevent_handle(struct tcf_qevent *qe, struct Qdisc *sch, struct sk_buff *skb,
 567                                  struct sk_buff **to_free, int *ret);
 568int tcf_qevent_dump(struct sk_buff *skb, int attr_name, struct tcf_qevent *qe);
 569#else
 570static inline int tcf_qevent_init(struct tcf_qevent *qe, struct Qdisc *sch,
 571                                  enum flow_block_binder_type binder_type,
 572                                  struct nlattr *block_index_attr,
 573                                  struct netlink_ext_ack *extack)
 574{
 575        return 0;
 576}
 577
 578static inline void tcf_qevent_destroy(struct tcf_qevent *qe, struct Qdisc *sch)
 579{
 580}
 581
 582static inline int tcf_qevent_validate_change(struct tcf_qevent *qe, struct nlattr *block_index_attr,
 583                                             struct netlink_ext_ack *extack)
 584{
 585        return 0;
 586}
 587
 588static inline struct sk_buff *
 589tcf_qevent_handle(struct tcf_qevent *qe, struct Qdisc *sch, struct sk_buff *skb,
 590                  struct sk_buff **to_free, int *ret)
 591{
 592        return skb;
 593}
 594
 595static inline int tcf_qevent_dump(struct sk_buff *skb, int attr_name, struct tcf_qevent *qe)
 596{
 597        return 0;
 598}
 599#endif
 600
 601struct tc_cls_u32_knode {
 602        struct tcf_exts *exts;
 603        struct tcf_result *res;
 604        struct tc_u32_sel *sel;
 605        u32 handle;
 606        u32 val;
 607        u32 mask;
 608        u32 link_handle;
 609        u8 fshift;
 610};
 611
 612struct tc_cls_u32_hnode {
 613        u32 handle;
 614        u32 prio;
 615        unsigned int divisor;
 616};
 617
 618enum tc_clsu32_command {
 619        TC_CLSU32_NEW_KNODE,
 620        TC_CLSU32_REPLACE_KNODE,
 621        TC_CLSU32_DELETE_KNODE,
 622        TC_CLSU32_NEW_HNODE,
 623        TC_CLSU32_REPLACE_HNODE,
 624        TC_CLSU32_DELETE_HNODE,
 625};
 626
 627struct tc_cls_u32_offload {
 628        struct flow_cls_common_offload common;
 629        /* knode values */
 630        enum tc_clsu32_command command;
 631        union {
 632                struct tc_cls_u32_knode knode;
 633                struct tc_cls_u32_hnode hnode;
 634        };
 635};
 636
 637static inline bool tc_can_offload(const struct net_device *dev)
 638{
 639        return dev->features & NETIF_F_HW_TC;
 640}
 641
 642static inline bool tc_can_offload_extack(const struct net_device *dev,
 643                                         struct netlink_ext_ack *extack)
 644{
 645        bool can = tc_can_offload(dev);
 646
 647        if (!can)
 648                NL_SET_ERR_MSG(extack, "TC offload is disabled on net device");
 649
 650        return can;
 651}
 652
 653static inline bool
 654tc_cls_can_offload_and_chain0(const struct net_device *dev,
 655                              struct flow_cls_common_offload *common)
 656{
 657        if (!tc_can_offload_extack(dev, common->extack))
 658                return false;
 659        if (common->chain_index) {
 660                NL_SET_ERR_MSG(common->extack,
 661                               "Driver supports only offload of chain 0");
 662                return false;
 663        }
 664        return true;
 665}
 666
 667static inline bool tc_skip_hw(u32 flags)
 668{
 669        return (flags & TCA_CLS_FLAGS_SKIP_HW) ? true : false;
 670}
 671
 672static inline bool tc_skip_sw(u32 flags)
 673{
 674        return (flags & TCA_CLS_FLAGS_SKIP_SW) ? true : false;
 675}
 676
 677/* SKIP_HW and SKIP_SW are mutually exclusive flags. */
 678static inline bool tc_flags_valid(u32 flags)
 679{
 680        if (flags & ~(TCA_CLS_FLAGS_SKIP_HW | TCA_CLS_FLAGS_SKIP_SW |
 681                      TCA_CLS_FLAGS_VERBOSE))
 682                return false;
 683
 684        flags &= TCA_CLS_FLAGS_SKIP_HW | TCA_CLS_FLAGS_SKIP_SW;
 685        if (!(flags ^ (TCA_CLS_FLAGS_SKIP_HW | TCA_CLS_FLAGS_SKIP_SW)))
 686                return false;
 687
 688        return true;
 689}
 690
 691static inline bool tc_in_hw(u32 flags)
 692{
 693        return (flags & TCA_CLS_FLAGS_IN_HW) ? true : false;
 694}
 695
 696static inline void
 697tc_cls_common_offload_init(struct flow_cls_common_offload *cls_common,
 698                           const struct tcf_proto *tp, u32 flags,
 699                           struct netlink_ext_ack *extack)
 700{
 701        cls_common->chain_index = tp->chain->index;
 702        cls_common->protocol = tp->protocol;
 703        cls_common->prio = tp->prio >> 16;
 704        if (tc_skip_sw(flags) || flags & TCA_CLS_FLAGS_VERBOSE)
 705                cls_common->extack = extack;
 706}
 707
 708#if IS_ENABLED(CONFIG_NET_TC_SKB_EXT)
 709static inline struct tc_skb_ext *tc_skb_ext_alloc(struct sk_buff *skb)
 710{
 711        struct tc_skb_ext *tc_skb_ext = skb_ext_add(skb, TC_SKB_EXT);
 712
 713        if (tc_skb_ext)
 714                memset(tc_skb_ext, 0, sizeof(*tc_skb_ext));
 715        return tc_skb_ext;
 716}
 717#endif
 718
 719enum tc_matchall_command {
 720        TC_CLSMATCHALL_REPLACE,
 721        TC_CLSMATCHALL_DESTROY,
 722        TC_CLSMATCHALL_STATS,
 723};
 724
 725struct tc_cls_matchall_offload {
 726        struct flow_cls_common_offload common;
 727        enum tc_matchall_command command;
 728        struct flow_rule *rule;
 729        struct flow_stats stats;
 730        unsigned long cookie;
 731};
 732
 733enum tc_clsbpf_command {
 734        TC_CLSBPF_OFFLOAD,
 735        TC_CLSBPF_STATS,
 736};
 737
 738struct tc_cls_bpf_offload {
 739        struct flow_cls_common_offload common;
 740        enum tc_clsbpf_command command;
 741        struct tcf_exts *exts;
 742        struct bpf_prog *prog;
 743        struct bpf_prog *oldprog;
 744        const char *name;
 745        bool exts_integrated;
 746};
 747
 748struct tc_mqprio_qopt_offload {
 749        /* struct tc_mqprio_qopt must always be the first element */
 750        struct tc_mqprio_qopt qopt;
 751        u16 mode;
 752        u16 shaper;
 753        u32 flags;
 754        u64 min_rate[TC_QOPT_MAX_QUEUE];
 755        u64 max_rate[TC_QOPT_MAX_QUEUE];
 756};
 757
 758/* This structure holds cookie structure that is passed from user
 759 * to the kernel for actions and classifiers
 760 */
 761struct tc_cookie {
 762        u8  *data;
 763        u32 len;
 764        struct rcu_head rcu;
 765};
 766
 767struct tc_qopt_offload_stats {
 768        struct gnet_stats_basic_packed *bstats;
 769        struct gnet_stats_queue *qstats;
 770};
 771
 772enum tc_mq_command {
 773        TC_MQ_CREATE,
 774        TC_MQ_DESTROY,
 775        TC_MQ_STATS,
 776        TC_MQ_GRAFT,
 777};
 778
 779struct tc_mq_opt_offload_graft_params {
 780        unsigned long queue;
 781        u32 child_handle;
 782};
 783
 784struct tc_mq_qopt_offload {
 785        enum tc_mq_command command;
 786        u32 handle;
 787        union {
 788                struct tc_qopt_offload_stats stats;
 789                struct tc_mq_opt_offload_graft_params graft_params;
 790        };
 791};
 792
 793enum tc_htb_command {
 794        /* Root */
 795        TC_HTB_CREATE, /* Initialize HTB offload. */
 796        TC_HTB_DESTROY, /* Destroy HTB offload. */
 797
 798        /* Classes */
 799        /* Allocate qid and create leaf. */
 800        TC_HTB_LEAF_ALLOC_QUEUE,
 801        /* Convert leaf to inner, preserve and return qid, create new leaf. */
 802        TC_HTB_LEAF_TO_INNER,
 803        /* Delete leaf, while siblings remain. */
 804        TC_HTB_LEAF_DEL,
 805        /* Delete leaf, convert parent to leaf, preserving qid. */
 806        TC_HTB_LEAF_DEL_LAST,
 807        /* TC_HTB_LEAF_DEL_LAST, but delete driver data on hardware errors. */
 808        TC_HTB_LEAF_DEL_LAST_FORCE,
 809        /* Modify parameters of a node. */
 810        TC_HTB_NODE_MODIFY,
 811
 812        /* Class qdisc */
 813        TC_HTB_LEAF_QUERY_QUEUE, /* Query qid by classid. */
 814};
 815
 816struct tc_htb_qopt_offload {
 817        struct netlink_ext_ack *extack;
 818        enum tc_htb_command command;
 819        u32 parent_classid;
 820        u16 classid;
 821        u16 qid;
 822        u64 rate;
 823        u64 ceil;
 824};
 825
 826#define TC_HTB_CLASSID_ROOT U32_MAX
 827
 828enum tc_red_command {
 829        TC_RED_REPLACE,
 830        TC_RED_DESTROY,
 831        TC_RED_STATS,
 832        TC_RED_XSTATS,
 833        TC_RED_GRAFT,
 834};
 835
 836struct tc_red_qopt_offload_params {
 837        u32 min;
 838        u32 max;
 839        u32 probability;
 840        u32 limit;
 841        bool is_ecn;
 842        bool is_harddrop;
 843        bool is_nodrop;
 844        struct gnet_stats_queue *qstats;
 845};
 846
 847struct tc_red_qopt_offload {
 848        enum tc_red_command command;
 849        u32 handle;
 850        u32 parent;
 851        union {
 852                struct tc_red_qopt_offload_params set;
 853                struct tc_qopt_offload_stats stats;
 854                struct red_stats *xstats;
 855                u32 child_handle;
 856        };
 857};
 858
 859enum tc_gred_command {
 860        TC_GRED_REPLACE,
 861        TC_GRED_DESTROY,
 862        TC_GRED_STATS,
 863};
 864
 865struct tc_gred_vq_qopt_offload_params {
 866        bool present;
 867        u32 limit;
 868        u32 prio;
 869        u32 min;
 870        u32 max;
 871        bool is_ecn;
 872        bool is_harddrop;
 873        u32 probability;
 874        /* Only need backlog, see struct tc_prio_qopt_offload_params */
 875        u32 *backlog;
 876};
 877
 878struct tc_gred_qopt_offload_params {
 879        bool grio_on;
 880        bool wred_on;
 881        unsigned int dp_cnt;
 882        unsigned int dp_def;
 883        struct gnet_stats_queue *qstats;
 884        struct tc_gred_vq_qopt_offload_params tab[MAX_DPs];
 885};
 886
 887struct tc_gred_qopt_offload_stats {
 888        struct gnet_stats_basic_packed bstats[MAX_DPs];
 889        struct gnet_stats_queue qstats[MAX_DPs];
 890        struct red_stats *xstats[MAX_DPs];
 891};
 892
 893struct tc_gred_qopt_offload {
 894        enum tc_gred_command command;
 895        u32 handle;
 896        u32 parent;
 897        union {
 898                struct tc_gred_qopt_offload_params set;
 899                struct tc_gred_qopt_offload_stats stats;
 900        };
 901};
 902
 903enum tc_prio_command {
 904        TC_PRIO_REPLACE,
 905        TC_PRIO_DESTROY,
 906        TC_PRIO_STATS,
 907        TC_PRIO_GRAFT,
 908};
 909
 910struct tc_prio_qopt_offload_params {
 911        int bands;
 912        u8 priomap[TC_PRIO_MAX + 1];
 913        /* At the point of un-offloading the Qdisc, the reported backlog and
 914         * qlen need to be reduced by the portion that is in HW.
 915         */
 916        struct gnet_stats_queue *qstats;
 917};
 918
 919struct tc_prio_qopt_offload_graft_params {
 920        u8 band;
 921        u32 child_handle;
 922};
 923
 924struct tc_prio_qopt_offload {
 925        enum tc_prio_command command;
 926        u32 handle;
 927        u32 parent;
 928        union {
 929                struct tc_prio_qopt_offload_params replace_params;
 930                struct tc_qopt_offload_stats stats;
 931                struct tc_prio_qopt_offload_graft_params graft_params;
 932        };
 933};
 934
 935enum tc_root_command {
 936        TC_ROOT_GRAFT,
 937};
 938
 939struct tc_root_qopt_offload {
 940        enum tc_root_command command;
 941        u32 handle;
 942        bool ingress;
 943};
 944
 945enum tc_ets_command {
 946        TC_ETS_REPLACE,
 947        TC_ETS_DESTROY,
 948        TC_ETS_STATS,
 949        TC_ETS_GRAFT,
 950};
 951
 952struct tc_ets_qopt_offload_replace_params {
 953        unsigned int bands;
 954        u8 priomap[TC_PRIO_MAX + 1];
 955        unsigned int quanta[TCQ_ETS_MAX_BANDS]; /* 0 for strict bands. */
 956        unsigned int weights[TCQ_ETS_MAX_BANDS];
 957        struct gnet_stats_queue *qstats;
 958};
 959
 960struct tc_ets_qopt_offload_graft_params {
 961        u8 band;
 962        u32 child_handle;
 963};
 964
 965struct tc_ets_qopt_offload {
 966        enum tc_ets_command command;
 967        u32 handle;
 968        u32 parent;
 969        union {
 970                struct tc_ets_qopt_offload_replace_params replace_params;
 971                struct tc_qopt_offload_stats stats;
 972                struct tc_ets_qopt_offload_graft_params graft_params;
 973        };
 974};
 975
 976enum tc_tbf_command {
 977        TC_TBF_REPLACE,
 978        TC_TBF_DESTROY,
 979        TC_TBF_STATS,
 980};
 981
 982struct tc_tbf_qopt_offload_replace_params {
 983        struct psched_ratecfg rate;
 984        u32 max_size;
 985        struct gnet_stats_queue *qstats;
 986};
 987
 988struct tc_tbf_qopt_offload {
 989        enum tc_tbf_command command;
 990        u32 handle;
 991        u32 parent;
 992        union {
 993                struct tc_tbf_qopt_offload_replace_params replace_params;
 994                struct tc_qopt_offload_stats stats;
 995        };
 996};
 997
 998enum tc_fifo_command {
 999        TC_FIFO_REPLACE,
1000        TC_FIFO_DESTROY,
1001        TC_FIFO_STATS,
1002};
1003
1004struct tc_fifo_qopt_offload {
1005        enum tc_fifo_command command;
1006        u32 handle;
1007        u32 parent;
1008        union {
1009                struct tc_qopt_offload_stats stats;
1010        };
1011};
1012
1013#endif
1014