Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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