]>
Commit | Line | Data |
---|---|---|
1d447a39 SM |
1 | /* |
2 | * Copyright (c) 2017, Mellanox Technologies. All rights reserved. | |
3 | * | |
4 | * This software is available to you under a choice of one of two | |
5 | * licenses. You may choose to be licensed under the terms of the GNU | |
6 | * General Public License (GPL) Version 2, available from the file | |
7 | * COPYING in the main directory of this source tree, or the | |
8 | * OpenIB.org BSD license below: | |
9 | * | |
10 | * Redistribution and use in source and binary forms, with or | |
11 | * without modification, are permitted provided that the following | |
12 | * conditions are met: | |
13 | * | |
14 | * - Redistributions of source code must retain the above | |
15 | * copyright notice, this list of conditions and the following | |
16 | * disclaimer. | |
17 | * | |
18 | * - Redistributions in binary form must reproduce the above | |
19 | * copyright notice, this list of conditions and the following | |
20 | * disclaimer in the documentation and/or other materials | |
21 | * provided with the distribution. | |
22 | * | |
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
30 | * SOFTWARE. | |
31 | */ | |
32 | ||
33 | #ifndef __MLX5E_REP_H__ | |
34 | #define __MLX5E_REP_H__ | |
35 | ||
c1ae1152 | 36 | #include <net/ip_tunnels.h> |
37b498ff | 37 | #include <linux/rhashtable.h> |
70e83bd3 | 38 | #include <linux/mutex.h> |
1d447a39 SM |
39 | #include "eswitch.h" |
40 | #include "en.h" | |
97417f61 | 41 | #include "lib/port_tun.h" |
1d447a39 | 42 | |
e80541ec | 43 | #ifdef CONFIG_MLX5_ESWITCH |
37b498ff HHZ |
44 | struct mlx5e_neigh_update_table { |
45 | struct rhashtable neigh_ht; | |
46 | /* Save the neigh hash entries in a list in addition to the hash table | |
47 | * (neigh_ht). In order to iterate easily over the neigh entries. | |
48 | * Used for stats query. | |
49 | */ | |
50 | struct list_head neigh_list; | |
232c0013 | 51 | /* protect lookup/remove operations */ |
70e83bd3 | 52 | struct mutex encap_lock; |
232c0013 | 53 | struct notifier_block netevent_nb; |
f6dfb4c3 HHZ |
54 | struct delayed_work neigh_stats_work; |
55 | unsigned long min_interval; /* jiffies */ | |
37b498ff HHZ |
56 | }; |
57 | ||
4c3844d9 | 58 | struct mlx5_tc_ct_priv; |
ec1366c2 OS |
59 | struct mlx5_rep_uplink_priv { |
60 | /* Filters DB - instantiated by the uplink representor and shared by | |
61 | * the uplink's VFs | |
62 | */ | |
63 | struct rhashtable tc_ht; | |
f5bc2c5d OS |
64 | |
65 | /* indirect block callbacks are invoked on bind/unbind events | |
66 | * on registered higher level devices (e.g. tunnel devices) | |
67 | * | |
68 | * tc_indr_block_cb_priv_list is used to lookup indirect callback | |
69 | * private data | |
70 | * | |
71 | * netdevice_nb is the netdev events notifier - used to register | |
72 | * tunnel devices for block events | |
73 | * | |
74 | */ | |
75 | struct list_head tc_indr_block_priv_list; | |
76 | struct notifier_block netdevice_nb; | |
d48834f9 | 77 | struct netdev_net_notifier netdevice_nn; |
97417f61 EB |
78 | |
79 | struct mlx5_tun_entropy tun_entropy; | |
b4a23329 | 80 | |
ad86755b VB |
81 | /* protects unready_flows */ |
82 | struct mutex unready_flows_lock; | |
b4a23329 RD |
83 | struct list_head unready_flows; |
84 | struct work_struct reoffload_flows_work; | |
0a7fcb78 PB |
85 | |
86 | /* maps tun_info to a unique id*/ | |
87 | struct mapping_ctx *tunnel_mapping; | |
88 | /* maps tun_enc_opts to a unique id*/ | |
89 | struct mapping_ctx *tunnel_enc_opts_mapping; | |
4c3844d9 PB |
90 | |
91 | struct mlx5_tc_ct_priv *ct_priv; | |
ec1366c2 OS |
92 | }; |
93 | ||
1d447a39 SM |
94 | struct mlx5e_rep_priv { |
95 | struct mlx5_eswitch_rep *rep; | |
37b498ff | 96 | struct mlx5e_neigh_update_table neigh_update; |
5ed99fb4 | 97 | struct net_device *netdev; |
20f7b37f | 98 | struct mlx5_flow_table *root_ft; |
5ed99fb4 MB |
99 | struct mlx5_flow_handle *vport_rx_rule; |
100 | struct list_head vport_sqs_list; | |
ec1366c2 | 101 | struct mlx5_rep_uplink_priv uplink_priv; /* valid for uplink rep */ |
fcb64c0f | 102 | struct rtnl_link_stats64 prev_vf_vport_stats; |
f60f315d | 103 | struct devlink_port dl_port; |
37b498ff HHZ |
104 | }; |
105 | ||
5ed99fb4 MB |
106 | static inline |
107 | struct mlx5e_rep_priv *mlx5e_rep_to_rep_priv(struct mlx5_eswitch_rep *rep) | |
108 | { | |
8693115a | 109 | return rep->rep_data[REP_ETH].priv; |
5ed99fb4 MB |
110 | } |
111 | ||
37b498ff HHZ |
112 | struct mlx5e_neigh { |
113 | struct net_device *dev; | |
114 | union { | |
115 | __be32 v4; | |
116 | struct in6_addr v6; | |
117 | } dst_ip; | |
f6dfb4c3 | 118 | int family; |
37b498ff HHZ |
119 | }; |
120 | ||
121 | struct mlx5e_neigh_hash_entry { | |
122 | struct rhash_head rhash_node; | |
123 | struct mlx5e_neigh m_neigh; | |
61081f9c | 124 | struct mlx5e_priv *priv; |
37b498ff HHZ |
125 | |
126 | /* Save the neigh hash entry in a list on the representor in | |
127 | * addition to the hash table. In order to iterate easily over the | |
128 | * neighbour entries. Used for stats query. | |
129 | */ | |
130 | struct list_head neigh_list; | |
232c0013 | 131 | |
ac0d9176 VB |
132 | /* protects encap list */ |
133 | spinlock_t encap_list_lock; | |
232c0013 HHZ |
134 | /* encap list sharing the same neigh */ |
135 | struct list_head encap_list; | |
136 | ||
137 | /* valid only when the neigh reference is taken during | |
138 | * neigh_update_work workqueue callback. | |
139 | */ | |
140 | struct neighbour *n; | |
141 | struct work_struct neigh_update_work; | |
142 | ||
143 | /* neigh hash entry can be deleted only when the refcount is zero. | |
144 | * refcount is needed to avoid neigh hash entry removal by TC, while | |
145 | * it's used by the neigh notification call. | |
146 | */ | |
147 | refcount_t refcnt; | |
f6dfb4c3 HHZ |
148 | |
149 | /* Save the last reported time offloaded trafic pass over one of the | |
150 | * neigh hash entry flows. Use it to periodically update the neigh | |
151 | * 'used' value and avoid neigh deleting by the kernel. | |
152 | */ | |
153 | unsigned long reported_lastuse; | |
1216ce9d VB |
154 | |
155 | struct rcu_head rcu; | |
232c0013 HHZ |
156 | }; |
157 | ||
158 | enum { | |
159 | /* set when the encap entry is successfully offloaded into HW */ | |
160 | MLX5_ENCAP_ENTRY_VALID = BIT(0), | |
1d447a39 SM |
161 | }; |
162 | ||
c1ae1152 | 163 | struct mlx5e_encap_entry { |
61081f9c VB |
164 | /* attached neigh hash entry */ |
165 | struct mlx5e_neigh_hash_entry *nhe; | |
232c0013 HHZ |
166 | /* neigh hash entry list of encaps sharing the same neigh */ |
167 | struct list_head encap_list; | |
168 | struct mlx5e_neigh m_neigh; | |
169 | /* a node of the eswitch encap hash table which keeping all the encap | |
170 | * entries | |
171 | */ | |
c1ae1152 OG |
172 | struct hlist_node encap_hlist; |
173 | struct list_head flows; | |
2b688ea5 | 174 | struct mlx5_pkt_reformat *pkt_reformat; |
1f6da306 | 175 | const struct ip_tunnel_info *tun_info; |
c1ae1152 OG |
176 | unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ |
177 | ||
178 | struct net_device *out_dev; | |
6707f74b | 179 | struct net_device *route_dev; |
d386939a | 180 | struct mlx5e_tc_tunnel *tunnel; |
54c177ca | 181 | int reformat_type; |
232c0013 HHZ |
182 | u8 flags; |
183 | char *encap_header; | |
184 | int encap_size; | |
948993f2 | 185 | refcount_t refcnt; |
d589e785 VB |
186 | struct completion res_ready; |
187 | int compl_result; | |
ac0d9176 | 188 | struct rcu_head rcu; |
c1ae1152 OG |
189 | }; |
190 | ||
2c47bf80 MB |
191 | struct mlx5e_rep_sq { |
192 | struct mlx5_flow_handle *send_to_vport_rule; | |
193 | struct list_head list; | |
194 | }; | |
195 | ||
aec002f6 OG |
196 | void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev); |
197 | void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev); | |
1d447a39 SM |
198 | bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv); |
199 | int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv); | |
200 | void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv); | |
201 | ||
1d447a39 | 202 | void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); |
dfd9e750 PB |
203 | void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq, |
204 | struct mlx5_cqe64 *cqe); | |
1d447a39 | 205 | |
232c0013 HHZ |
206 | int mlx5e_rep_encap_entry_attach(struct mlx5e_priv *priv, |
207 | struct mlx5e_encap_entry *e); | |
208 | void mlx5e_rep_encap_entry_detach(struct mlx5e_priv *priv, | |
209 | struct mlx5e_encap_entry *e); | |
210 | ||
f6dfb4c3 | 211 | void mlx5e_rep_queue_neigh_stats_work(struct mlx5e_priv *priv); |
a0646c88 EB |
212 | |
213 | bool mlx5e_eswitch_rep(struct net_device *netdev); | |
ffec9702 | 214 | bool mlx5e_eswitch_uplink_rep(struct net_device *netdev); |
a0646c88 | 215 | |
e80541ec | 216 | #else /* CONFIG_MLX5_ESWITCH */ |
e80541ec SM |
217 | static inline bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv) { return false; } |
218 | static inline int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv) { return 0; } | |
219 | static inline void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv) {} | |
220 | #endif | |
f6dfb4c3 | 221 | |
d9ee0491 OG |
222 | static inline bool mlx5e_is_vport_rep(struct mlx5e_priv *priv) |
223 | { | |
224 | return (MLX5_ESWITCH_MANAGER(priv->mdev) && priv->ppriv); | |
225 | } | |
1d447a39 | 226 | #endif /* __MLX5E_REP_H__ */ |