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
  65struct bnxt_tc_actions {
  66        u32                             flags;
  67#define BNXT_TC_ACTION_FLAG_FWD                 BIT(0)
  68#define BNXT_TC_ACTION_FLAG_FWD_VXLAN           BIT(1)
  69#define BNXT_TC_ACTION_FLAG_PUSH_VLAN           BIT(3)
  70#define BNXT_TC_ACTION_FLAG_POP_VLAN            BIT(4)
  71#define BNXT_TC_ACTION_FLAG_DROP                BIT(5)
  72#define BNXT_TC_ACTION_FLAG_TUNNEL_ENCAP        BIT(6)
  73#define BNXT_TC_ACTION_FLAG_TUNNEL_DECAP        BIT(7)
  74
  75        u16                             dst_fid;
  76        struct net_device               *dst_dev;
  77        __be16                          push_vlan_tpid;
  78        __be16                          push_vlan_tci;
  79
  80        /* tunnel encap */
  81        struct ip_tunnel_key            tun_encap_key;
  82};
  83
  84struct bnxt_tc_flow {
  85        u32                             flags;
  86#define BNXT_TC_FLOW_FLAGS_ETH_ADDRS            BIT(1)
  87#define BNXT_TC_FLOW_FLAGS_IPV4_ADDRS           BIT(2)
  88#define BNXT_TC_FLOW_FLAGS_IPV6_ADDRS           BIT(3)
  89#define BNXT_TC_FLOW_FLAGS_PORTS                BIT(4)
  90#define BNXT_TC_FLOW_FLAGS_ICMP                 BIT(5)
  91#define BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS       BIT(6)
  92#define BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS      BIT(7)
  93#define BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS      BIT(8)
  94#define BNXT_TC_FLOW_FLAGS_TUNL_PORTS           BIT(9)
  95#define BNXT_TC_FLOW_FLAGS_TUNL_ID              BIT(10)
  96#define BNXT_TC_FLOW_FLAGS_TUNNEL       (BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS | \
  97                                         BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS | \
  98                                         BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS |\
  99                                         BNXT_TC_FLOW_FLAGS_TUNL_PORTS |\
 100                                         BNXT_TC_FLOW_FLAGS_TUNL_ID)
 101
 102        /* flow applicable to pkts ingressing on this fid */
 103        u16                             src_fid;
 104        struct bnxt_tc_l2_key           l2_key;
 105        struct bnxt_tc_l2_key           l2_mask;
 106        struct bnxt_tc_l3_key           l3_key;
 107        struct bnxt_tc_l3_key           l3_mask;
 108        struct bnxt_tc_l4_key           l4_key;
 109        struct bnxt_tc_l4_key           l4_mask;
 110        struct ip_tunnel_key            tun_key;
 111        struct ip_tunnel_key            tun_mask;
 112
 113        struct bnxt_tc_actions          actions;
 114
 115        /* updated stats accounting for hw-counter wrap-around */
 116        struct bnxt_tc_flow_stats       stats;
 117        /* previous snap-shot of stats */
 118        struct bnxt_tc_flow_stats       prev_stats;
 119        unsigned long                   lastused; /* jiffies */
 120        /* for calculating delta from prev_stats and
 121         * updating prev_stats atomically.
 122         */
 123        spinlock_t                      stats_lock;
 124};
 125
 126/* Tunnel encap/decap hash table
 127 * This table is used to maintain a list of flows that use
 128 * the same tunnel encap/decap params (ip_daddrs, vni, udp_dport)
 129 * and the FW returned handle.
 130 * A separate table is maintained for encap and decap
 131 */
 132struct bnxt_tc_tunnel_node {
 133        struct ip_tunnel_key            key;
 134        struct rhash_head               node;
 135
 136        /* tunnel l2 info */
 137        struct bnxt_tc_l2_key           l2_info;
 138
 139#define INVALID_TUNNEL_HANDLE           cpu_to_le32(0xffffffff)
 140        /* tunnel handle returned by FW */
 141        __le32                          tunnel_handle;
 142
 143        u32                             refcount;
 144        struct rcu_head                 rcu;
 145};
 146
 147/* L2 hash table
 148 * The same data-struct is used for L2-flow table and L2-tunnel table.
 149 * The L2 part of a flow or tunnel is stored in a hash table.
 150 * A flow that shares the same L2 key/mask with an
 151 * already existing flow/tunnel must refer to it's flow handle or
 152 * decap_filter_id respectively.
 153 */
 154struct bnxt_tc_l2_node {
 155        /* hash key: first 16b of key */
 156#define BNXT_TC_L2_KEY_LEN                      16
 157        struct bnxt_tc_l2_key   key;
 158        struct rhash_head       node;
 159
 160        /* a linked list of flows that share the same l2 key */
 161        struct list_head        common_l2_flows;
 162
 163        /* number of flows/tunnels sharing the l2 key */
 164        u16                     refcount;
 165
 166        struct rcu_head         rcu;
 167};
 168
 169struct bnxt_tc_flow_node {
 170        /* hash key: provided by TC */
 171        unsigned long                   cookie;
 172        struct rhash_head               node;
 173
 174        struct bnxt_tc_flow             flow;
 175
 176        __le64                          ext_flow_handle;
 177        __le16                          flow_handle;
 178        __le32                          flow_id;
 179
 180        /* L2 node in l2 hashtable that shares flow's l2 key */
 181        struct bnxt_tc_l2_node          *l2_node;
 182        /* for the shared_flows list maintained in l2_node */
 183        struct list_head                l2_list_node;
 184
 185        /* tunnel encap related */
 186        struct bnxt_tc_tunnel_node      *encap_node;
 187
 188        /* tunnel decap related */
 189        struct bnxt_tc_tunnel_node      *decap_node;
 190        /* L2 node in tunnel-l2 hashtable that shares flow's tunnel l2 key */
 191        struct bnxt_tc_l2_node          *decap_l2_node;
 192        /* for the shared_flows list maintained in tunnel decap l2_node */
 193        struct list_head                decap_l2_list_node;
 194
 195        struct rcu_head                 rcu;
 196};
 197
 198int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
 199                         struct flow_cls_offload *cls_flower);
 200int bnxt_init_tc(struct bnxt *bp);
 201void bnxt_shutdown_tc(struct bnxt *bp);
 202void bnxt_tc_flow_stats_work(struct bnxt *bp);
 203
 204static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)
 205{
 206        return bp->tc_info && bp->tc_info->enabled;
 207}
 208
 209#else /* CONFIG_BNXT_FLOWER_OFFLOAD */
 210
 211static inline int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
 212                                       struct flow_cls_offload *cls_flower)
 213{
 214        return -EOPNOTSUPP;
 215}
 216
 217static inline int bnxt_init_tc(struct bnxt *bp)
 218{
 219        return 0;
 220}
 221
 222static inline void bnxt_shutdown_tc(struct bnxt *bp)
 223{
 224}
 225
 226static inline void bnxt_tc_flow_stats_work(struct bnxt *bp)
 227{
 228}
 229
 230static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)
 231{
 232        return false;
 233}
 234#endif /* CONFIG_BNXT_FLOWER_OFFLOAD */
 235#endif /* BNXT_TC_H */
 236