1/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2/* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */
3
4#ifndef _MLXSW_IPIP_H_
5#define _MLXSW_IPIP_H_
6
7#include "spectrum_router.h"
8#include <net/ip_fib.h>
9#include <linux/if_tunnel.h>
10#include <net/ip6_tunnel.h>
11
12struct ip_tunnel_parm
13mlxsw_sp_ipip_netdev_parms4(const struct net_device *ol_dev);
14struct __ip6_tnl_parm
15mlxsw_sp_ipip_netdev_parms6(const struct net_device *ol_dev);
16
17union mlxsw_sp_l3addr
18mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,
19 const struct net_device *ol_dev);
20
21bool mlxsw_sp_l3addr_is_zero(union mlxsw_sp_l3addr addr);
22
23enum mlxsw_sp_ipip_type {
24 MLXSW_SP_IPIP_TYPE_GRE4,
25 MLXSW_SP_IPIP_TYPE_GRE6,
26 MLXSW_SP_IPIP_TYPE_MAX,
27};
28
29struct mlxsw_sp_ipip_parms {
30 enum mlxsw_sp_l3proto proto;
31 union mlxsw_sp_l3addr saddr;
32 union mlxsw_sp_l3addr daddr;
33 int link;
34 u32 ikey;
35 u32 okey;
36};
37
38struct mlxsw_sp_ipip_entry {
39 enum mlxsw_sp_ipip_type ipipt;
40 struct net_device *ol_dev; /* Overlay. */
41 struct mlxsw_sp_rif_ipip_lb *ol_lb;
42 struct mlxsw_sp_fib_entry *decap_fib_entry;
43 struct list_head ipip_list_node;
44 struct mlxsw_sp_ipip_parms parms;
45 u32 dip_kvdl_index;
46};
47
48struct mlxsw_sp_ipip_ops {
49 int dev_type;
50 enum mlxsw_sp_l3proto ul_proto; /* Underlay. */
51 bool inc_parsing_depth;
52 bool double_rif_entry;
53
54 struct mlxsw_sp_ipip_parms
55 (*parms_init)(const struct net_device *ol_dev);
56
57 int (*nexthop_update)(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
58 struct mlxsw_sp_ipip_entry *ipip_entry,
59 bool force, char *ratr_pl);
60
61 bool (*can_offload)(const struct mlxsw_sp *mlxsw_sp,
62 const struct net_device *ol_dev);
63
64 /* Return a configuration for creating an overlay loopback RIF. */
65 struct mlxsw_sp_rif_ipip_lb_config
66 (*ol_loopback_config)(struct mlxsw_sp *mlxsw_sp,
67 const struct net_device *ol_dev);
68
69 int (*decap_config)(struct mlxsw_sp *mlxsw_sp,
70 struct mlxsw_sp_ipip_entry *ipip_entry,
71 u32 tunnel_index);
72
73 int (*ol_netdev_change)(struct mlxsw_sp *mlxsw_sp,
74 struct mlxsw_sp_ipip_entry *ipip_entry,
75 struct netlink_ext_ack *extack);
76 int (*rem_ip_addr_set)(struct mlxsw_sp *mlxsw_sp,
77 struct mlxsw_sp_ipip_entry *ipip_entry);
78 void (*rem_ip_addr_unset)(struct mlxsw_sp *mlxsw_sp,
79 const struct mlxsw_sp_ipip_entry *ipip_entry);
80};
81
82extern const struct mlxsw_sp_ipip_ops *mlxsw_sp1_ipip_ops_arr[];
83extern const struct mlxsw_sp_ipip_ops *mlxsw_sp2_ipip_ops_arr[];
84
85#endif /* _MLXSW_IPIP_H_*/
86

source code of linux/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h