root/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. bnxt_tc_flower_enabled
  2. bnxt_tc_setup_flower
  3. bnxt_init_tc
  4. bnxt_shutdown_tc
  5. bnxt_tc_flow_stats_work
  6. bnxt_tc_flower_enabled

   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  */
  19 struct 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 
  31 struct 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 
  44 struct 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 
  58 struct 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 struct 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 
  84 struct 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  */
 132 struct 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  */
 154 struct 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 
 169 struct 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 
 198 int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
 199                          struct flow_cls_offload *cls_flower);
 200 int bnxt_init_tc(struct bnxt *bp);
 201 void bnxt_shutdown_tc(struct bnxt *bp);
 202 void bnxt_tc_flow_stats_work(struct bnxt *bp);
 203 
 204 static 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 
 211 static 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 
 217 static inline int bnxt_init_tc(struct bnxt *bp)
 218 {
 219         return 0;
 220 }
 221 
 222 static inline void bnxt_shutdown_tc(struct bnxt *bp)
 223 {
 224 }
 225 
 226 static inline void bnxt_tc_flow_stats_work(struct bnxt *bp)
 227 {
 228 }
 229 
 230 static 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 */

/* [<][>][^][v][top][bottom][index][help] */