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 | ||
ec1366c2 OS |
58 | struct mlx5_rep_uplink_priv { |
59 | /* Filters DB - instantiated by the uplink representor and shared by | |
60 | * the uplink's VFs | |
61 | */ | |
62 | struct rhashtable tc_ht; | |
f5bc2c5d OS |
63 | |
64 | /* indirect block callbacks are invoked on bind/unbind events | |
65 | * on registered higher level devices (e.g. tunnel devices) | |
66 | * | |
67 | * tc_indr_block_cb_priv_list is used to lookup indirect callback | |
68 | * private data | |
69 | * | |
70 | * netdevice_nb is the netdev events notifier - used to register | |
71 | * tunnel devices for block events | |
72 | * | |
73 | */ | |
74 | struct list_head tc_indr_block_priv_list; | |
75 | struct notifier_block netdevice_nb; | |
d48834f9 | 76 | struct netdev_net_notifier netdevice_nn; |
97417f61 EB |
77 | |
78 | struct mlx5_tun_entropy tun_entropy; | |
b4a23329 | 79 | |
ad86755b VB |
80 | /* protects unready_flows */ |
81 | struct mutex unready_flows_lock; | |
b4a23329 RD |
82 | struct list_head unready_flows; |
83 | struct work_struct reoffload_flows_work; | |
ec1366c2 OS |
84 | }; |
85 | ||
1d447a39 SM |
86 | struct mlx5e_rep_priv { |
87 | struct mlx5_eswitch_rep *rep; | |
37b498ff | 88 | struct mlx5e_neigh_update_table neigh_update; |
5ed99fb4 | 89 | struct net_device *netdev; |
20f7b37f | 90 | struct mlx5_flow_table *root_ft; |
5ed99fb4 MB |
91 | struct mlx5_flow_handle *vport_rx_rule; |
92 | struct list_head vport_sqs_list; | |
ec1366c2 | 93 | struct mlx5_rep_uplink_priv uplink_priv; /* valid for uplink rep */ |
fcb64c0f | 94 | struct rtnl_link_stats64 prev_vf_vport_stats; |
f60f315d | 95 | struct devlink_port dl_port; |
37b498ff HHZ |
96 | }; |
97 | ||
5ed99fb4 MB |
98 | static inline |
99 | struct mlx5e_rep_priv *mlx5e_rep_to_rep_priv(struct mlx5_eswitch_rep *rep) | |
100 | { | |
8693115a | 101 | return rep->rep_data[REP_ETH].priv; |
5ed99fb4 MB |
102 | } |
103 | ||
37b498ff HHZ |
104 | struct mlx5e_neigh { |
105 | struct net_device *dev; | |
106 | union { | |
107 | __be32 v4; | |
108 | struct in6_addr v6; | |
109 | } dst_ip; | |
f6dfb4c3 | 110 | int family; |
37b498ff HHZ |
111 | }; |
112 | ||
113 | struct mlx5e_neigh_hash_entry { | |
114 | struct rhash_head rhash_node; | |
115 | struct mlx5e_neigh m_neigh; | |
61081f9c | 116 | struct mlx5e_priv *priv; |
37b498ff HHZ |
117 | |
118 | /* Save the neigh hash entry in a list on the representor in | |
119 | * addition to the hash table. In order to iterate easily over the | |
120 | * neighbour entries. Used for stats query. | |
121 | */ | |
122 | struct list_head neigh_list; | |
232c0013 | 123 | |
ac0d9176 VB |
124 | /* protects encap list */ |
125 | spinlock_t encap_list_lock; | |
232c0013 HHZ |
126 | /* encap list sharing the same neigh */ |
127 | struct list_head encap_list; | |
128 | ||
129 | /* valid only when the neigh reference is taken during | |
130 | * neigh_update_work workqueue callback. | |
131 | */ | |
132 | struct neighbour *n; | |
133 | struct work_struct neigh_update_work; | |
134 | ||
135 | /* neigh hash entry can be deleted only when the refcount is zero. | |
136 | * refcount is needed to avoid neigh hash entry removal by TC, while | |
137 | * it's used by the neigh notification call. | |
138 | */ | |
139 | refcount_t refcnt; | |
f6dfb4c3 HHZ |
140 | |
141 | /* Save the last reported time offloaded trafic pass over one of the | |
142 | * neigh hash entry flows. Use it to periodically update the neigh | |
143 | * 'used' value and avoid neigh deleting by the kernel. | |
144 | */ | |
145 | unsigned long reported_lastuse; | |
1216ce9d VB |
146 | |
147 | struct rcu_head rcu; | |
232c0013 HHZ |
148 | }; |
149 | ||
150 | enum { | |
151 | /* set when the encap entry is successfully offloaded into HW */ | |
152 | MLX5_ENCAP_ENTRY_VALID = BIT(0), | |
1d447a39 SM |
153 | }; |
154 | ||
c1ae1152 | 155 | struct mlx5e_encap_entry { |
61081f9c VB |
156 | /* attached neigh hash entry */ |
157 | struct mlx5e_neigh_hash_entry *nhe; | |
232c0013 HHZ |
158 | /* neigh hash entry list of encaps sharing the same neigh */ |
159 | struct list_head encap_list; | |
160 | struct mlx5e_neigh m_neigh; | |
161 | /* a node of the eswitch encap hash table which keeping all the encap | |
162 | * entries | |
163 | */ | |
c1ae1152 OG |
164 | struct hlist_node encap_hlist; |
165 | struct list_head flows; | |
2b688ea5 | 166 | struct mlx5_pkt_reformat *pkt_reformat; |
1f6da306 | 167 | const struct ip_tunnel_info *tun_info; |
c1ae1152 OG |
168 | unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ |
169 | ||
170 | struct net_device *out_dev; | |
6707f74b | 171 | struct net_device *route_dev; |
d386939a | 172 | struct mlx5e_tc_tunnel *tunnel; |
54c177ca | 173 | int reformat_type; |
232c0013 HHZ |
174 | u8 flags; |
175 | char *encap_header; | |
176 | int encap_size; | |
948993f2 | 177 | refcount_t refcnt; |
d589e785 VB |
178 | struct completion res_ready; |
179 | int compl_result; | |
ac0d9176 | 180 | struct rcu_head rcu; |
c1ae1152 OG |
181 | }; |
182 | ||
2c47bf80 MB |
183 | struct mlx5e_rep_sq { |
184 | struct mlx5_flow_handle *send_to_vport_rule; | |
185 | struct list_head list; | |
186 | }; | |
187 | ||
aec002f6 OG |
188 | void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev); |
189 | void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev); | |
1d447a39 SM |
190 | bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv); |
191 | int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv); | |
192 | void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv); | |
193 | ||
1d447a39 SM |
194 | void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); |
195 | ||
232c0013 HHZ |
196 | int mlx5e_rep_encap_entry_attach(struct mlx5e_priv *priv, |
197 | struct mlx5e_encap_entry *e); | |
198 | void mlx5e_rep_encap_entry_detach(struct mlx5e_priv *priv, | |
199 | struct mlx5e_encap_entry *e); | |
200 | ||
f6dfb4c3 | 201 | void mlx5e_rep_queue_neigh_stats_work(struct mlx5e_priv *priv); |
a0646c88 EB |
202 | |
203 | bool mlx5e_eswitch_rep(struct net_device *netdev); | |
ffec9702 | 204 | bool mlx5e_eswitch_uplink_rep(struct net_device *netdev); |
a0646c88 | 205 | |
e80541ec | 206 | #else /* CONFIG_MLX5_ESWITCH */ |
e80541ec SM |
207 | static inline bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv) { return false; } |
208 | static inline int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv) { return 0; } | |
209 | static inline void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv) {} | |
210 | #endif | |
f6dfb4c3 | 211 | |
d9ee0491 OG |
212 | static inline bool mlx5e_is_vport_rep(struct mlx5e_priv *priv) |
213 | { | |
214 | return (MLX5_ESWITCH_MANAGER(priv->mdev) && priv->ppriv); | |
215 | } | |
1d447a39 | 216 | #endif /* __MLX5E_REP_H__ */ |