1 /* Broadcom NetXtreme-C/E network driver.
3 * Copyright (c) 2017 Broadcom Limited
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.
13 #ifdef CONFIG_BNXT_FLOWER_OFFLOAD
15 #include <net/ip_tunnels.h>
17 /* Structs used for storing the filter/actions of the TC cmd.
19 struct bnxt_tc_l2_key
{
22 __be16 inner_vlan_tpid
;
23 __be16 inner_vlan_tci
;
28 struct bnxt_tc_l3_key
{
35 struct in6_addr daddr
;
36 struct in6_addr saddr
;
41 struct bnxt_tc_l4_key
{
55 struct 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
;
62 struct bnxt_tc_actions
{
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)
73 struct net_device
*dst_dev
;
74 __be16 push_vlan_tpid
;
78 struct ip_tunnel_key tun_encap_key
;
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)
99 /* flow applicable to pkts ingressing on this 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
;
110 struct bnxt_tc_actions actions
;
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.
120 spinlock_t stats_lock
;
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
129 struct bnxt_tc_tunnel_node
{
130 struct ip_tunnel_key key
;
131 struct rhash_head node
;
134 struct bnxt_tc_l2_key l2_info
;
136 #define INVALID_TUNNEL_HANDLE cpu_to_le32(0xffffffff)
137 /* tunnel handle returned by FW */
138 __le32 tunnel_handle
;
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.
151 struct 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
;
157 /* a linked list of flows that share the same l2 key */
158 struct list_head common_l2_flows
;
160 /* number of flows/tunnels sharing the l2 key */
166 struct bnxt_tc_flow_node
{
167 /* hash key: provided by TC */
168 unsigned long cookie
;
169 struct rhash_head node
;
171 struct bnxt_tc_flow flow
;
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
;
180 /* tunnel encap related */
181 struct bnxt_tc_tunnel_node
*encap_node
;
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
;
193 int bnxt_tc_setup_flower(struct bnxt
*bp
, u16 src_fid
,
194 struct tc_cls_flower_offload
*cls_flower
);
195 int bnxt_init_tc(struct bnxt
*bp
);
196 void bnxt_shutdown_tc(struct bnxt
*bp
);
197 void bnxt_tc_flow_stats_work(struct bnxt
*bp
);
199 static inline bool bnxt_tc_flower_enabled(struct bnxt
*bp
)
201 return bp
->tc_info
&& bp
->tc_info
->enabled
;
204 #else /* CONFIG_BNXT_FLOWER_OFFLOAD */
206 static inline int bnxt_tc_setup_flower(struct bnxt
*bp
, u16 src_fid
,
207 struct tc_cls_flower_offload
*cls_flower
)
212 static inline int bnxt_init_tc(struct bnxt
*bp
)
217 static inline void bnxt_shutdown_tc(struct bnxt
*bp
)
221 static inline void bnxt_tc_flow_stats_work(struct bnxt
*bp
)
225 static inline bool bnxt_tc_flower_enabled(struct bnxt
*bp
)
229 #endif /* CONFIG_BNXT_FLOWER_OFFLOAD */
230 #endif /* BNXT_TC_H */