]>
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> |
1d447a39 SM |
38 | #include "eswitch.h" |
39 | #include "en.h" | |
40 | ||
e80541ec | 41 | #ifdef CONFIG_MLX5_ESWITCH |
37b498ff HHZ |
42 | struct mlx5e_neigh_update_table { |
43 | struct rhashtable neigh_ht; | |
44 | /* Save the neigh hash entries in a list in addition to the hash table | |
45 | * (neigh_ht). In order to iterate easily over the neigh entries. | |
46 | * Used for stats query. | |
47 | */ | |
48 | struct list_head neigh_list; | |
232c0013 HHZ |
49 | /* protect lookup/remove operations */ |
50 | spinlock_t encap_lock; | |
51 | struct notifier_block netevent_nb; | |
f6dfb4c3 HHZ |
52 | struct delayed_work neigh_stats_work; |
53 | unsigned long min_interval; /* jiffies */ | |
37b498ff HHZ |
54 | }; |
55 | ||
1d447a39 SM |
56 | struct mlx5e_rep_priv { |
57 | struct mlx5_eswitch_rep *rep; | |
37b498ff | 58 | struct mlx5e_neigh_update_table neigh_update; |
5ed99fb4 MB |
59 | struct net_device *netdev; |
60 | struct mlx5_flow_handle *vport_rx_rule; | |
61 | struct list_head vport_sqs_list; | |
655dc3d2 | 62 | struct rhashtable tc_ht; /* valid for uplink rep */ |
37b498ff HHZ |
63 | }; |
64 | ||
5ed99fb4 MB |
65 | static inline |
66 | struct mlx5e_rep_priv *mlx5e_rep_to_rep_priv(struct mlx5_eswitch_rep *rep) | |
67 | { | |
a4b97ab4 | 68 | return (struct mlx5e_rep_priv *)rep->rep_if[REP_ETH].priv; |
5ed99fb4 MB |
69 | } |
70 | ||
37b498ff HHZ |
71 | struct mlx5e_neigh { |
72 | struct net_device *dev; | |
73 | union { | |
74 | __be32 v4; | |
75 | struct in6_addr v6; | |
76 | } dst_ip; | |
f6dfb4c3 | 77 | int family; |
37b498ff HHZ |
78 | }; |
79 | ||
80 | struct mlx5e_neigh_hash_entry { | |
81 | struct rhash_head rhash_node; | |
82 | struct mlx5e_neigh m_neigh; | |
83 | ||
84 | /* Save the neigh hash entry in a list on the representor in | |
85 | * addition to the hash table. In order to iterate easily over the | |
86 | * neighbour entries. Used for stats query. | |
87 | */ | |
88 | struct list_head neigh_list; | |
232c0013 HHZ |
89 | |
90 | /* encap list sharing the same neigh */ | |
91 | struct list_head encap_list; | |
92 | ||
93 | /* valid only when the neigh reference is taken during | |
94 | * neigh_update_work workqueue callback. | |
95 | */ | |
96 | struct neighbour *n; | |
97 | struct work_struct neigh_update_work; | |
98 | ||
99 | /* neigh hash entry can be deleted only when the refcount is zero. | |
100 | * refcount is needed to avoid neigh hash entry removal by TC, while | |
101 | * it's used by the neigh notification call. | |
102 | */ | |
103 | refcount_t refcnt; | |
f6dfb4c3 HHZ |
104 | |
105 | /* Save the last reported time offloaded trafic pass over one of the | |
106 | * neigh hash entry flows. Use it to periodically update the neigh | |
107 | * 'used' value and avoid neigh deleting by the kernel. | |
108 | */ | |
109 | unsigned long reported_lastuse; | |
232c0013 HHZ |
110 | }; |
111 | ||
112 | enum { | |
113 | /* set when the encap entry is successfully offloaded into HW */ | |
114 | MLX5_ENCAP_ENTRY_VALID = BIT(0), | |
1d447a39 SM |
115 | }; |
116 | ||
c1ae1152 | 117 | struct mlx5e_encap_entry { |
232c0013 HHZ |
118 | /* neigh hash entry list of encaps sharing the same neigh */ |
119 | struct list_head encap_list; | |
120 | struct mlx5e_neigh m_neigh; | |
121 | /* a node of the eswitch encap hash table which keeping all the encap | |
122 | * entries | |
123 | */ | |
c1ae1152 OG |
124 | struct hlist_node encap_hlist; |
125 | struct list_head flows; | |
126 | u32 encap_id; | |
c1ae1152 OG |
127 | struct ip_tunnel_info tun_info; |
128 | unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ | |
129 | ||
130 | struct net_device *out_dev; | |
131 | int tunnel_type; | |
232c0013 HHZ |
132 | u8 flags; |
133 | char *encap_header; | |
134 | int encap_size; | |
c1ae1152 OG |
135 | }; |
136 | ||
2c47bf80 MB |
137 | struct mlx5e_rep_sq { |
138 | struct mlx5_flow_handle *send_to_vport_rule; | |
139 | struct list_head list; | |
140 | }; | |
141 | ||
07c9f1e5 | 142 | void *mlx5e_alloc_nic_rep_priv(struct mlx5_core_dev *mdev); |
1d447a39 SM |
143 | void mlx5e_register_vport_reps(struct mlx5e_priv *priv); |
144 | void mlx5e_unregister_vport_reps(struct mlx5e_priv *priv); | |
145 | bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv); | |
146 | int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv); | |
147 | void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv); | |
148 | ||
149 | int mlx5e_get_offload_stats(int attr_id, const struct net_device *dev, void *sp); | |
150 | bool mlx5e_has_offload_stats(const struct net_device *dev, int attr_id); | |
151 | ||
152 | int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr); | |
153 | void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); | |
154 | ||
232c0013 HHZ |
155 | int mlx5e_rep_encap_entry_attach(struct mlx5e_priv *priv, |
156 | struct mlx5e_encap_entry *e); | |
157 | void mlx5e_rep_encap_entry_detach(struct mlx5e_priv *priv, | |
158 | struct mlx5e_encap_entry *e); | |
159 | ||
f6dfb4c3 | 160 | void mlx5e_rep_queue_neigh_stats_work(struct mlx5e_priv *priv); |
e80541ec SM |
161 | #else /* CONFIG_MLX5_ESWITCH */ |
162 | static inline void mlx5e_register_vport_reps(struct mlx5e_priv *priv) {} | |
163 | static inline void mlx5e_unregister_vport_reps(struct mlx5e_priv *priv) {} | |
164 | static inline bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv) { return false; } | |
165 | static inline int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv) { return 0; } | |
166 | static inline void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv) {} | |
167 | #endif | |
f6dfb4c3 | 168 | |
1d447a39 | 169 | #endif /* __MLX5E_REP_H__ */ |