bnxt_tc.h (6606B)
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 */