1101f4de9SOz Shlomo /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2101f4de9SOz Shlomo /* Copyright (c) 2018 Mellanox Technologies. */
3101f4de9SOz Shlomo 
4101f4de9SOz Shlomo #ifndef __MLX5_EN_TC_TUNNEL_H__
5101f4de9SOz Shlomo #define __MLX5_EN_TC_TUNNEL_H__
6101f4de9SOz Shlomo 
7101f4de9SOz Shlomo #include <linux/netdevice.h>
8101f4de9SOz Shlomo #include <linux/mlx5/fs.h>
9101f4de9SOz Shlomo #include <net/pkt_cls.h>
10101f4de9SOz Shlomo #include <linux/netlink.h>
11101f4de9SOz Shlomo #include "en.h"
12101f4de9SOz Shlomo #include "en_rep.h"
13101f4de9SOz Shlomo 
1436280f07SVlad Buslov #ifdef CONFIG_MLX5_ESWITCH
1536280f07SVlad Buslov 
16101f4de9SOz Shlomo enum {
17101f4de9SOz Shlomo 	MLX5E_TC_TUNNEL_TYPE_UNKNOWN,
18df2ef3bfSOz Shlomo 	MLX5E_TC_TUNNEL_TYPE_VXLAN,
199272e3dfSYevgeny Kliteynik 	MLX5E_TC_TUNNEL_TYPE_GENEVE,
20d386939aSYevgeny Kliteynik 	MLX5E_TC_TUNNEL_TYPE_GRETAP,
21f828ca6aSEli Cohen 	MLX5E_TC_TUNNEL_TYPE_MPLSOUDP,
22101f4de9SOz Shlomo };
23101f4de9SOz Shlomo 
24929a2fadSDima Chumak struct mlx5e_encap_key {
25929a2fadSDima Chumak 	const struct ip_tunnel_key *ip_tun_key;
26929a2fadSDima Chumak 	struct mlx5e_tc_tunnel     *tc_tunnel;
27929a2fadSDima Chumak };
28929a2fadSDima Chumak 
29d386939aSYevgeny Kliteynik struct mlx5e_tc_tunnel {
30d386939aSYevgeny Kliteynik 	int tunnel_type;
31d386939aSYevgeny Kliteynik 	enum mlx5_flow_match_level match_level;
32d386939aSYevgeny Kliteynik 
33d386939aSYevgeny Kliteynik 	bool (*can_offload)(struct mlx5e_priv *priv);
34d386939aSYevgeny Kliteynik 	int (*calc_hlen)(struct mlx5e_encap_entry *e);
35d386939aSYevgeny Kliteynik 	int (*init_encap_attr)(struct net_device *tunnel_dev,
36d386939aSYevgeny Kliteynik 			       struct mlx5e_priv *priv,
37d386939aSYevgeny Kliteynik 			       struct mlx5e_encap_entry *e,
38d386939aSYevgeny Kliteynik 			       struct netlink_ext_ack *extack);
39d386939aSYevgeny Kliteynik 	int (*generate_ip_tun_hdr)(char buf[],
40d386939aSYevgeny Kliteynik 				   __u8 *ip_proto,
41d386939aSYevgeny Kliteynik 				   struct mlx5e_encap_entry *e);
42d386939aSYevgeny Kliteynik 	int (*parse_udp_ports)(struct mlx5e_priv *priv,
43d386939aSYevgeny Kliteynik 			       struct mlx5_flow_spec *spec,
44f9e30088SPablo Neira Ayuso 			       struct flow_cls_offload *f,
45d386939aSYevgeny Kliteynik 			       void *headers_c,
46d386939aSYevgeny Kliteynik 			       void *headers_v);
47d386939aSYevgeny Kliteynik 	int (*parse_tunnel)(struct mlx5e_priv *priv,
48d386939aSYevgeny Kliteynik 			    struct mlx5_flow_spec *spec,
49f9e30088SPablo Neira Ayuso 			    struct flow_cls_offload *f,
50d386939aSYevgeny Kliteynik 			    void *headers_c,
51d386939aSYevgeny Kliteynik 			    void *headers_v);
52929a2fadSDima Chumak 	bool (*encap_info_equal)(struct mlx5e_encap_key *a,
53929a2fadSDima Chumak 				 struct mlx5e_encap_key *b);
542f8ec867SChris Mi 	int (*get_remote_ifindex)(struct net_device *mirred_dev);
55d386939aSYevgeny Kliteynik };
56d386939aSYevgeny Kliteynik 
57d386939aSYevgeny Kliteynik extern struct mlx5e_tc_tunnel vxlan_tunnel;
589272e3dfSYevgeny Kliteynik extern struct mlx5e_tc_tunnel geneve_tunnel;
59d386939aSYevgeny Kliteynik extern struct mlx5e_tc_tunnel gre_tunnel;
60f828ca6aSEli Cohen extern struct mlx5e_tc_tunnel mplsoudp_tunnel;
61d386939aSYevgeny Kliteynik 
62d386939aSYevgeny Kliteynik struct mlx5e_tc_tunnel *mlx5e_get_tc_tun(struct net_device *tunnel_dev);
63d386939aSYevgeny Kliteynik 
64101f4de9SOz Shlomo int mlx5e_tc_tun_init_encap_attr(struct net_device *tunnel_dev,
65101f4de9SOz Shlomo 				 struct mlx5e_priv *priv,
66101f4de9SOz Shlomo 				 struct mlx5e_encap_entry *e,
67101f4de9SOz Shlomo 				 struct netlink_ext_ack *extack);
68101f4de9SOz Shlomo 
69101f4de9SOz Shlomo int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
70101f4de9SOz Shlomo 				    struct net_device *mirred_dev,
71101f4de9SOz Shlomo 				    struct mlx5e_encap_entry *e);
72c7b9038dSVlad Buslov int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv,
73c7b9038dSVlad Buslov 				    struct net_device *mirred_dev,
74c7b9038dSVlad Buslov 				    struct mlx5e_encap_entry *e);
75101f4de9SOz Shlomo 
76e689e998SSaeed Mahameed #if IS_ENABLED(CONFIG_INET) && IS_ENABLED(CONFIG_IPV6)
77101f4de9SOz Shlomo int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
78101f4de9SOz Shlomo 				    struct net_device *mirred_dev,
79101f4de9SOz Shlomo 				    struct mlx5e_encap_entry *e);
80c7b9038dSVlad Buslov int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv,
81c7b9038dSVlad Buslov 				    struct net_device *mirred_dev,
82c7b9038dSVlad Buslov 				    struct mlx5e_encap_entry *e);
83e689e998SSaeed Mahameed #else
84e689e998SSaeed Mahameed static inline int
mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv * priv,struct net_device * mirred_dev,struct mlx5e_encap_entry * e)85e689e998SSaeed Mahameed mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
86e689e998SSaeed Mahameed 				struct net_device *mirred_dev,
8787f77a67SArnd Bergmann 				struct mlx5e_encap_entry *e)
8887f77a67SArnd Bergmann { return -EOPNOTSUPP; }
8987f77a67SArnd Bergmann static inline int
mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv * priv,struct net_device * mirred_dev,struct mlx5e_encap_entry * e)9087f77a67SArnd Bergmann mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv,
91c7b9038dSVlad Buslov 				struct net_device *mirred_dev,
92c7b9038dSVlad Buslov 				struct mlx5e_encap_entry *e)
93c7b9038dSVlad Buslov { return -EOPNOTSUPP; }
94e689e998SSaeed Mahameed #endif
95a508728aSVlad Buslov int mlx5e_tc_tun_route_lookup(struct mlx5e_priv *priv,
96a508728aSVlad Buslov 			      struct mlx5_flow_spec *spec,
97819c319cSChris Mi 			      struct mlx5_flow_attr *attr,
98819c319cSChris Mi 			      struct net_device *filter_dev);
99101f4de9SOz Shlomo 
100101f4de9SOz Shlomo bool mlx5e_tc_tun_device_to_offload(struct mlx5e_priv *priv,
101101f4de9SOz Shlomo 				    struct net_device *netdev);
102101f4de9SOz Shlomo 
103101f4de9SOz Shlomo int mlx5e_tc_tun_parse(struct net_device *filter_dev,
104101f4de9SOz Shlomo 		       struct mlx5e_priv *priv,
105101f4de9SOz Shlomo 		       struct mlx5_flow_spec *spec,
106f9e30088SPablo Neira Ayuso 		       struct flow_cls_offload *f,
107ea4cd837SPaul Blakey 		       u8 *match_level);
108101f4de9SOz Shlomo 
109d386939aSYevgeny Kliteynik int mlx5e_tc_tun_parse_udp_ports(struct mlx5e_priv *priv,
110d386939aSYevgeny Kliteynik 				 struct mlx5_flow_spec *spec,
111f9e30088SPablo Neira Ayuso 				 struct flow_cls_offload *f,
112d386939aSYevgeny Kliteynik 				 void *headers_c,
113d386939aSYevgeny Kliteynik 				 void *headers_v);
114d386939aSYevgeny Kliteynik 
115929a2fadSDima Chumak bool mlx5e_tc_tun_encap_info_equal_generic(struct mlx5e_encap_key *a,
116929a2fadSDima Chumak 					   struct mlx5e_encap_key *b);
117929a2fadSDima Chumak 
118*58de53c1SGavin Li bool mlx5e_tc_tun_encap_info_equal_options(struct mlx5e_encap_key *a,
119*58de53c1SGavin Li 					   struct mlx5e_encap_key *b,
120*58de53c1SGavin Li 					   __be16 tun_flags);
12136280f07SVlad Buslov #endif /* CONFIG_MLX5_ESWITCH */
12236280f07SVlad Buslov 
123101f4de9SOz Shlomo #endif //__MLX5_EN_TC_TUNNEL_H__
124