linux/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h
<<
>>
Prefs
   1/* Broadcom NetXtreme-C/E network driver.
   2 *
   3 * Copyright (c) 2017 Broadcom Limited
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation.
   8 */
   9
  10#ifndef BNXT_TC_H
  11#define BNXT_TC_H
  12
  13#ifdef CONFIG_BNXT_FLOWER_OFFLOAD
  14
  15#include <net/ip_tunnels.h>
  16
  17/* Structs used for storing the filter/actions of the TC cmd.
  18 */
  19struct bnxt_tc_l2_key {
  20        u8              dmac[ETH_ALEN];
  21        u8              smac[ETH_ALEN];
  22        __be16          inner_vlan_tpid;
  23        __be16          inner_vlan_tci;
  24        __be16          ether_type;
  25        u8              num_vlans;
  26        u8              dir;
  27#define BNXT_DIR_RX     1
  28#define BNXT_DIR_TX     0
  29};
  30
  31struct bnxt_tc_l3_key {
  32        union {
  33                struct {
  34                        struct in_addr daddr;
  35                        struct in_addr saddr;
  36                } ipv4;
  37                struct {
  38                        struct in6_addr daddr;
  39                        struct in6_addr saddr;
  40                } ipv6;
  41        };
  42};
  43
  44struct bnxt_tc_l4_key {
  45        u8  ip_proto;
  46        union {
  47                struct {
  48                        __be16 sport;
  49                        __be16 dport;
  50                } ports;
  51                struct {
  52                        u8 type;
  53                        u8 code;
  54                } icmp;
  55        };
  56};
  57
  58struct bnxt_tc_tunnel_key {
  59        struct bnxt_tc_l2_key   l2;
  60        struct bnxt_tc_l3_key   l3;
  61        struct bnxt_tc_l4_key   l4;
  62        __be32                  id;
  63};
  64
  65#define bnxt_eth_addr_key_mask_invalid(eth_addr, eth_addr_mask)         \
  66        ((is_wildcard(&(eth_addr)[0], ETH_ALEN) &&                      \
  67         is_wildcard(&(eth_addr)[ETH_ALEN / 2], ETH_ALEN)) ||           \
  68        (is_wildcard(&(eth_addr_mask)[0], ETH_ALEN) &&                  \
  69         is_wildcard(&(eth_addr_mask)[ETH_ALEN / 2], ETH_ALEN)))
  70
  71struct bnxt_tc_actions {
  72        u32                             flags;
  73#define BNXT_TC_ACTION_FLAG_FWD                 BIT(0)
  74#define BNXT_TC_ACTION_FLAG_FWD_VXLAN           BIT(1)
  75#define BNXT_TC_ACTION_FLAG_PUSH_VLAN           BIT(3)
  76#define BNXT_TC_ACTION_FLAG_POP_VLAN            BIT(4)
  77#define BNXT_TC_ACTION_FLAG_DROP                BIT(5)
  78#define BNXT_TC_ACTION_FLAG_TUNNEL_ENCAP        BIT(6)
  79#define BNXT_TC_ACTION_FLAG_TUNNEL_DECAP        BIT(7)
  80#define BNXT_TC_ACTION_FLAG_L2_REWRITE          BIT(8)
  81#define BNXT_TC_ACTION_FLAG_NAT_XLATE           BIT(9)
  82
  83        u16                             dst_fid;
  84        struct net_device               *dst_dev;
  85        __be16                          push_vlan_tpid;
  86        __be16                          push_vlan_tci;
  87
  88        /* tunnel encap */
  89        struct ip_tunnel_key            tun_encap_key;
  90#define PEDIT_OFFSET_SMAC_LAST_4_BYTES          0x8
  91        __be16                          l2_rewrite_dmac[3];
  92        __be16                          l2_rewrite_smac[3];
  93        struct {
  94                bool src_xlate;  /* true => translate src,
  95                                  * false => translate dst
  96                                  * Mutually exclusive, i.e cannot set both
  97                                  */
  98                bool l3_is_ipv4; /* false means L3 is ipv6 */
  99                struct bnxt_tc_l3_key l3;
 100                struct bnxt_tc_l4_key l4;
 101        } nat;
 102};
 103
 104struct bnxt_tc_flow {
 105        u32                             flags;
 106#define BNXT_TC_FLOW_FLAGS_ETH_ADDRS            BIT(1)
 107#define BNXT_TC_FLOW_FLAGS_IPV4_ADDRS           BIT(2)
 108#define BNXT_TC_FLOW_FLAGS_IPV6_ADDRS           BIT(3)
 109#define BNXT_TC_FLOW_FLAGS_PORTS                BIT(4)
 110#define BNXT_TC_FLOW_FLAGS_ICMP                 BIT(5)
 111#define BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS       BIT(6)
 112#define BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS      BIT(7)
 113#define BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS      BIT(8)
 114#define BNXT_TC_FLOW_FLAGS_TUNL_PORTS           BIT(9)
 115#define BNXT_TC_FLOW_FLAGS_TUNL_ID              BIT(10)
 116#define BNXT_TC_FLOW_FLAGS_TUNNEL       (BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS | \
 117                                         BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS | \
 118                                         BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS |\
 119                                         BNXT_TC_FLOW_FLAGS_TUNL_PORTS |\
 120                                         BNXT_TC_FLOW_FLAGS_TUNL_ID)
 121
 122        /* flow applicable to pkts ingressing on this fid */
 123        u16                             src_fid;
 124        struct bnxt_tc_l2_key           l2_key;
 125        struct bnxt_tc_l2_key           l2_mask;
 126        struct bnxt_tc_l3_key           l3_key;
 127        struct bnxt_tc_l3_key           l3_mask;
 128        struct bnxt_tc_l4_key           l4_key;
 129        struct bnxt_tc_l4_key           l4_mask;
 130        struct ip_tunnel_key            tun_key;
 131        struct ip_tunnel_key            tun_mask;
 132
 133        struct bnxt_tc_actions          actions;
 134
 135        /* updated stats accounting for hw-counter wrap-around */
 136        struct bnxt_tc_flow_stats       stats;
 137        /* previous snap-shot of stats */
 138        struct bnxt_tc_flow_stats       prev_stats;
 139        unsigned long                   lastused; /* jiffies */
 140        /* for calculating delta from prev_stats and
 141         * updating prev_stats atomically.
 142         */
 143        spinlock_t                      stats_lock;
 144};
 145
 146/* Tunnel encap/decap hash table
 147 * This table is used to maintain a list of flows that use
 148 * the same tunnel encap/decap params (ip_daddrs, vni, udp_dport)
 149 * and the FW returned handle.
 150 * A separate table is maintained for encap and decap
 151 */
 152struct bnxt_tc_tunnel_node {
 153        struct ip_tunnel_key            key;
 154        struct rhash_head               node;
 155
 156        /* tunnel l2 info */
 157        struct bnxt_tc_l2_key           l2_info;
 158
 159#define INVALID_TUNNEL_HANDLE           cpu_to_le32(0xffffffff)
 160        /* tunnel handle returned by FW */
 161        __le32                          tunnel_handle;
 162
 163        u32                             refcount;
 164        struct rcu_head                 rcu;
 165};
 166
 167/* L2 hash table
 168 * The same data-struct is used for L2-flow table and L2-tunnel table.
 169 * The L2 part of a flow or tunnel is stored in a hash table.
 170 * A flow that shares the same L2 key/mask with an
 171 * already existing flow/tunnel must refer to it's flow handle or
 172 * decap_filter_id respectively.
 173 */
 174struct bnxt_tc_l2_node {
 175        /* hash key: first 16b of key */
 176#define BNXT_TC_L2_KEY_LEN                      16
 177        struct bnxt_tc_l2_key   key;
 178        struct rhash_head       node;
 179
 180        /* a linked list of flows that share the same l2 key */
 181        struct list_head        common_l2_flows;
 182
 183        /* number of flows/tunnels sharing the l2 key */
 184        u16                     refcount;
 185
 186        struct rcu_head         rcu;
 187};
 188
 189struct bnxt_tc_flow_node {
 190        /* hash key: provided by TC */
 191        unsigned long                   cookie;
 192        struct rhash_head               node;
 193
 194        struct bnxt_tc_flow             flow;
 195
 196        __le64                          ext_flow_handle;
 197        __le16                          flow_handle;
 198        __le32                          flow_id;
 199
 200        /* L2 node in l2 hashtable that shares flow's l2 key */
 201        struct bnxt_tc_l2_node          *l2_node;
 202        /* for the shared_flows list maintained in l2_node */
 203        struct list_head                l2_list_node;
 204
 205        /* tunnel encap related */
 206        struct bnxt_tc_tunnel_node      *encap_node;
 207
 208        /* tunnel decap related */
 209        struct bnxt_tc_tunnel_node      *decap_node;
 210        /* L2 node in tunnel-l2 hashtable that shares flow's tunnel l2 key */
 211        struct bnxt_tc_l2_node          *decap_l2_node;
 212        /* for the shared_flows list maintained in tunnel decap l2_node */
 213        struct list_head                decap_l2_list_node;
 214
 215        struct rcu_head                 rcu;
 216};
 217
 218int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
 219                         struct flow_cls_offload *cls_flower);
 220int bnxt_init_tc(struct bnxt *bp);
 221void bnxt_shutdown_tc(struct bnxt *bp);
 222void bnxt_tc_flow_stats_work(struct bnxt *bp);
 223
 224static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)
 225{
 226        return bp->tc_info && bp->tc_info->enabled;
 227}
 228
 229#else /* CONFIG_BNXT_FLOWER_OFFLOAD */
 230
 231static inline int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
 232                                       struct flow_cls_offload *cls_flower)
 233{
 234        return -EOPNOTSUPP;
 235}
 236
 237static inline int bnxt_init_tc(struct bnxt *bp)
 238{
 239        return 0;
 240}
 241
 242static inline void bnxt_shutdown_tc(struct bnxt *bp)
 243{
 244}
 245
 246static inline void bnxt_tc_flow_stats_work(struct bnxt *bp)
 247{
 248}
 249
 250static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)
 251{
 252        return false;
 253}
 254#endif /* CONFIG_BNXT_FLOWER_OFFLOAD */
 255#endif /* BNXT_TC_H */
 256