aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-02-13 12:24:28 -0500
committerDavid S. Miller <davem@davemloft.net>2018-02-13 12:24:28 -0500
commit439ccd8ce9eeb4c44632404a0ba38f947e97caba (patch)
tree6f0d9db02b826a665e7567fd192e47b118aa88a1
parentd75de7b6e737148863705f3523f9575d10429815 (diff)
parente437f3b62d0844c4073c9e13263413748fa69093 (diff)
Merge branch 'mlxsw-IPIP-cleanups'
Jiri Pirko says: ==================== mlxsw: IPIP cleanups In the first patch, a forgotten #include is added. Even though the code compiles as-is, the include is necessary for modules that should include spectrum_ipip.h. The second patch corrects an assumption that IPv6 tunnels use struct ip_tunnel_parm to store tunnel parameters. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c141
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h7
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c16
3 files changed, 73 insertions, 91 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c
index 7502e53447bd..a1c4b1e63f8d 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c
@@ -37,122 +37,89 @@
37#include "spectrum_ipip.h" 37#include "spectrum_ipip.h"
38 38
39struct ip_tunnel_parm 39struct ip_tunnel_parm
40mlxsw_sp_ipip_netdev_parms(const struct net_device *ol_dev) 40mlxsw_sp_ipip_netdev_parms4(const struct net_device *ol_dev)
41{ 41{
42 struct ip_tunnel *tun = netdev_priv(ol_dev); 42 struct ip_tunnel *tun = netdev_priv(ol_dev);
43 43
44 return tun->parms; 44 return tun->parms;
45} 45}
46 46
47static bool mlxsw_sp_ipip_parms_has_ikey(struct ip_tunnel_parm parms) 47static bool mlxsw_sp_ipip_parms4_has_ikey(struct ip_tunnel_parm parms)
48{ 48{
49 return !!(parms.i_flags & TUNNEL_KEY); 49 return !!(parms.i_flags & TUNNEL_KEY);
50} 50}
51 51
52static bool mlxsw_sp_ipip_parms_has_okey(struct ip_tunnel_parm parms) 52static bool mlxsw_sp_ipip_parms4_has_okey(struct ip_tunnel_parm parms)
53{ 53{
54 return !!(parms.o_flags & TUNNEL_KEY); 54 return !!(parms.o_flags & TUNNEL_KEY);
55} 55}
56 56
57static u32 mlxsw_sp_ipip_parms_ikey(struct ip_tunnel_parm parms) 57static u32 mlxsw_sp_ipip_parms4_ikey(struct ip_tunnel_parm parms)
58{ 58{
59 return mlxsw_sp_ipip_parms_has_ikey(parms) ? 59 return mlxsw_sp_ipip_parms4_has_ikey(parms) ?
60 be32_to_cpu(parms.i_key) : 0; 60 be32_to_cpu(parms.i_key) : 0;
61} 61}
62 62
63static u32 mlxsw_sp_ipip_parms_okey(struct ip_tunnel_parm parms) 63static u32 mlxsw_sp_ipip_parms4_okey(struct ip_tunnel_parm parms)
64{ 64{
65 return mlxsw_sp_ipip_parms_has_okey(parms) ? 65 return mlxsw_sp_ipip_parms4_has_okey(parms) ?
66 be32_to_cpu(parms.o_key) : 0; 66 be32_to_cpu(parms.o_key) : 0;
67} 67}
68 68
69static __be32 mlxsw_sp_ipip_parms_saddr4(struct ip_tunnel_parm parms) 69static union mlxsw_sp_l3addr
70mlxsw_sp_ipip_parms4_saddr(struct ip_tunnel_parm parms)
70{ 71{
71 return parms.iph.saddr; 72 return (union mlxsw_sp_l3addr) { .addr4 = parms.iph.saddr };
72} 73}
73 74
74static union mlxsw_sp_l3addr 75static union mlxsw_sp_l3addr
75mlxsw_sp_ipip_parms_saddr(enum mlxsw_sp_l3proto proto, 76mlxsw_sp_ipip_parms4_daddr(struct ip_tunnel_parm parms)
76 struct ip_tunnel_parm parms)
77{ 77{
78 switch (proto) { 78 return (union mlxsw_sp_l3addr) { .addr4 = parms.iph.daddr };
79 case MLXSW_SP_L3_PROTO_IPV4:
80 return (union mlxsw_sp_l3addr) {
81 .addr4 = mlxsw_sp_ipip_parms_saddr4(parms),
82 };
83 case MLXSW_SP_L3_PROTO_IPV6:
84 break;
85 }
86
87 WARN_ON(1);
88 return (union mlxsw_sp_l3addr) {
89 .addr4 = 0,
90 };
91} 79}
92 80
93static __be32 mlxsw_sp_ipip_parms_daddr4(struct ip_tunnel_parm parms) 81union mlxsw_sp_l3addr
82mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,
83 const struct net_device *ol_dev)
94{ 84{
95 return parms.iph.daddr; 85 struct ip_tunnel_parm parms4;
96}
97 86
98static union mlxsw_sp_l3addr
99mlxsw_sp_ipip_parms_daddr(enum mlxsw_sp_l3proto proto,
100 struct ip_tunnel_parm parms)
101{
102 switch (proto) { 87 switch (proto) {
103 case MLXSW_SP_L3_PROTO_IPV4: 88 case MLXSW_SP_L3_PROTO_IPV4:
104 return (union mlxsw_sp_l3addr) { 89 parms4 = mlxsw_sp_ipip_netdev_parms4(ol_dev);
105 .addr4 = mlxsw_sp_ipip_parms_daddr4(parms), 90 return mlxsw_sp_ipip_parms4_saddr(parms4);
106 };
107 case MLXSW_SP_L3_PROTO_IPV6: 91 case MLXSW_SP_L3_PROTO_IPV6:
108 break; 92 break;
109 } 93 }
110 94
111 WARN_ON(1); 95 WARN_ON(1);
112 return (union mlxsw_sp_l3addr) { 96 return (union mlxsw_sp_l3addr) {0};
113 .addr4 = 0,
114 };
115}
116
117static bool mlxsw_sp_ipip_netdev_has_ikey(const struct net_device *ol_dev)
118{
119 return mlxsw_sp_ipip_parms_has_ikey(mlxsw_sp_ipip_netdev_parms(ol_dev));
120}
121
122static bool mlxsw_sp_ipip_netdev_has_okey(const struct net_device *ol_dev)
123{
124 return mlxsw_sp_ipip_parms_has_okey(mlxsw_sp_ipip_netdev_parms(ol_dev));
125} 97}
126 98
127static u32 mlxsw_sp_ipip_netdev_ikey(const struct net_device *ol_dev) 99static __be32 mlxsw_sp_ipip_netdev_daddr4(const struct net_device *ol_dev)
128{ 100{
129 return mlxsw_sp_ipip_parms_ikey(mlxsw_sp_ipip_netdev_parms(ol_dev));
130}
131 101
132static u32 mlxsw_sp_ipip_netdev_okey(const struct net_device *ol_dev) 102 struct ip_tunnel_parm parms4 = mlxsw_sp_ipip_netdev_parms4(ol_dev);
133{
134 return mlxsw_sp_ipip_parms_okey(mlxsw_sp_ipip_netdev_parms(ol_dev));
135}
136 103
137union mlxsw_sp_l3addr 104 return mlxsw_sp_ipip_parms4_daddr(parms4).addr4;
138mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,
139 const struct net_device *ol_dev)
140{
141 return mlxsw_sp_ipip_parms_saddr(proto,
142 mlxsw_sp_ipip_netdev_parms(ol_dev));
143}
144
145static __be32 mlxsw_sp_ipip_netdev_daddr4(const struct net_device *ol_dev)
146{
147 return mlxsw_sp_ipip_parms_daddr4(mlxsw_sp_ipip_netdev_parms(ol_dev));
148} 105}
149 106
150static union mlxsw_sp_l3addr 107static union mlxsw_sp_l3addr
151mlxsw_sp_ipip_netdev_daddr(enum mlxsw_sp_l3proto proto, 108mlxsw_sp_ipip_netdev_daddr(enum mlxsw_sp_l3proto proto,
152 const struct net_device *ol_dev) 109 const struct net_device *ol_dev)
153{ 110{
154 return mlxsw_sp_ipip_parms_daddr(proto, 111 struct ip_tunnel_parm parms4;
155 mlxsw_sp_ipip_netdev_parms(ol_dev)); 112
113 switch (proto) {
114 case MLXSW_SP_L3_PROTO_IPV4:
115 parms4 = mlxsw_sp_ipip_netdev_parms4(ol_dev);
116 return mlxsw_sp_ipip_parms4_daddr(parms4);
117 case MLXSW_SP_L3_PROTO_IPV6:
118 break;
119 }
120
121 WARN_ON(1);
122 return (union mlxsw_sp_l3addr) {0};
156} 123}
157 124
158static int 125static int
@@ -176,12 +143,17 @@ mlxsw_sp_ipip_fib_entry_op_gre4_rtdp(struct mlxsw_sp *mlxsw_sp,
176 u32 tunnel_index, 143 u32 tunnel_index,
177 struct mlxsw_sp_ipip_entry *ipip_entry) 144 struct mlxsw_sp_ipip_entry *ipip_entry)
178{ 145{
179 bool has_ikey = mlxsw_sp_ipip_netdev_has_ikey(ipip_entry->ol_dev);
180 u16 rif_index = mlxsw_sp_ipip_lb_rif_index(ipip_entry->ol_lb); 146 u16 rif_index = mlxsw_sp_ipip_lb_rif_index(ipip_entry->ol_lb);
181 u32 ikey = mlxsw_sp_ipip_netdev_ikey(ipip_entry->ol_dev);
182 char rtdp_pl[MLXSW_REG_RTDP_LEN]; 147 char rtdp_pl[MLXSW_REG_RTDP_LEN];
148 struct ip_tunnel_parm parms;
183 unsigned int type_check; 149 unsigned int type_check;
150 bool has_ikey;
184 u32 daddr4; 151 u32 daddr4;
152 u32 ikey;
153
154 parms = mlxsw_sp_ipip_netdev_parms4(ipip_entry->ol_dev);
155 has_ikey = mlxsw_sp_ipip_parms4_has_ikey(parms);
156 ikey = mlxsw_sp_ipip_parms4_ikey(parms);
185 157
186 mlxsw_reg_rtdp_pack(rtdp_pl, MLXSW_REG_RTDP_TYPE_IPIP, tunnel_index); 158 mlxsw_reg_rtdp_pack(rtdp_pl, MLXSW_REG_RTDP_TYPE_IPIP, tunnel_index);
187 159
@@ -273,14 +245,15 @@ static struct mlxsw_sp_rif_ipip_lb_config
273mlxsw_sp_ipip_ol_loopback_config_gre4(struct mlxsw_sp *mlxsw_sp, 245mlxsw_sp_ipip_ol_loopback_config_gre4(struct mlxsw_sp *mlxsw_sp,
274 const struct net_device *ol_dev) 246 const struct net_device *ol_dev)
275{ 247{
248 struct ip_tunnel_parm parms = mlxsw_sp_ipip_netdev_parms4(ol_dev);
276 enum mlxsw_reg_ritr_loopback_ipip_type lb_ipipt; 249 enum mlxsw_reg_ritr_loopback_ipip_type lb_ipipt;
277 250
278 lb_ipipt = mlxsw_sp_ipip_netdev_has_okey(ol_dev) ? 251 lb_ipipt = mlxsw_sp_ipip_parms4_has_okey(parms) ?
279 MLXSW_REG_RITR_LOOPBACK_IPIP_TYPE_IP_IN_GRE_KEY_IN_IP : 252 MLXSW_REG_RITR_LOOPBACK_IPIP_TYPE_IP_IN_GRE_KEY_IN_IP :
280 MLXSW_REG_RITR_LOOPBACK_IPIP_TYPE_IP_IN_GRE_IN_IP; 253 MLXSW_REG_RITR_LOOPBACK_IPIP_TYPE_IP_IN_GRE_IN_IP;
281 return (struct mlxsw_sp_rif_ipip_lb_config){ 254 return (struct mlxsw_sp_rif_ipip_lb_config){
282 .lb_ipipt = lb_ipipt, 255 .lb_ipipt = lb_ipipt,
283 .okey = mlxsw_sp_ipip_netdev_okey(ol_dev), 256 .okey = mlxsw_sp_ipip_parms4_okey(parms),
284 .ul_protocol = MLXSW_SP_L3_PROTO_IPV4, 257 .ul_protocol = MLXSW_SP_L3_PROTO_IPV4,
285 .saddr = mlxsw_sp_ipip_netdev_saddr(MLXSW_SP_L3_PROTO_IPV4, 258 .saddr = mlxsw_sp_ipip_netdev_saddr(MLXSW_SP_L3_PROTO_IPV4,
286 ol_dev), 259 ol_dev),
@@ -300,16 +273,12 @@ mlxsw_sp_ipip_ol_netdev_change_gre4(struct mlxsw_sp *mlxsw_sp,
300 bool update_nhs = false; 273 bool update_nhs = false;
301 int err = 0; 274 int err = 0;
302 275
303 new_parms = mlxsw_sp_ipip_netdev_parms(ipip_entry->ol_dev); 276 new_parms = mlxsw_sp_ipip_netdev_parms4(ipip_entry->ol_dev);
304 277
305 new_saddr = mlxsw_sp_ipip_parms_saddr(MLXSW_SP_L3_PROTO_IPV4, 278 new_saddr = mlxsw_sp_ipip_parms4_saddr(new_parms);
306 new_parms); 279 old_saddr = mlxsw_sp_ipip_parms4_saddr(ipip_entry->parms4);
307 old_saddr = mlxsw_sp_ipip_parms_saddr(MLXSW_SP_L3_PROTO_IPV4, 280 new_daddr = mlxsw_sp_ipip_parms4_daddr(new_parms);
308 ipip_entry->parms); 281 old_daddr = mlxsw_sp_ipip_parms4_daddr(ipip_entry->parms4);
309 new_daddr = mlxsw_sp_ipip_parms_daddr(MLXSW_SP_L3_PROTO_IPV4,
310 new_parms);
311 old_daddr = mlxsw_sp_ipip_parms_daddr(MLXSW_SP_L3_PROTO_IPV4,
312 ipip_entry->parms);
313 282
314 if (!mlxsw_sp_l3addr_eq(&new_saddr, &old_saddr)) { 283 if (!mlxsw_sp_l3addr_eq(&new_saddr, &old_saddr)) {
315 u16 ul_tb_id = mlxsw_sp_ipip_dev_ul_tb_id(ipip_entry->ol_dev); 284 u16 ul_tb_id = mlxsw_sp_ipip_dev_ul_tb_id(ipip_entry->ol_dev);
@@ -326,14 +295,14 @@ mlxsw_sp_ipip_ol_netdev_change_gre4(struct mlxsw_sp *mlxsw_sp,
326 } 295 }
327 296
328 update_tunnel = true; 297 update_tunnel = true;
329 } else if ((mlxsw_sp_ipip_parms_okey(ipip_entry->parms) != 298 } else if ((mlxsw_sp_ipip_parms4_okey(ipip_entry->parms4) !=
330 mlxsw_sp_ipip_parms_okey(new_parms)) || 299 mlxsw_sp_ipip_parms4_okey(new_parms)) ||
331 ipip_entry->parms.link != new_parms.link) { 300 ipip_entry->parms4.link != new_parms.link) {
332 update_tunnel = true; 301 update_tunnel = true;
333 } else if (!mlxsw_sp_l3addr_eq(&new_daddr, &old_daddr)) { 302 } else if (!mlxsw_sp_l3addr_eq(&new_daddr, &old_daddr)) {
334 update_nhs = true; 303 update_nhs = true;
335 } else if (mlxsw_sp_ipip_parms_ikey(ipip_entry->parms) != 304 } else if (mlxsw_sp_ipip_parms4_ikey(ipip_entry->parms4) !=
336 mlxsw_sp_ipip_parms_ikey(new_parms)) { 305 mlxsw_sp_ipip_parms4_ikey(new_parms)) {
337 update_decap = true; 306 update_decap = true;
338 } 307 }
339 308
@@ -350,7 +319,7 @@ mlxsw_sp_ipip_ol_netdev_change_gre4(struct mlxsw_sp *mlxsw_sp,
350 false, false, false, 319 false, false, false,
351 extack); 320 extack);
352 321
353 ipip_entry->parms = new_parms; 322 ipip_entry->parms4 = new_parms;
354 return err; 323 return err;
355} 324}
356 325
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h
index 04b08d9d76e9..a4ff5737eccc 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h
@@ -37,9 +37,10 @@
37 37
38#include "spectrum_router.h" 38#include "spectrum_router.h"
39#include <net/ip_fib.h> 39#include <net/ip_fib.h>
40#include <linux/if_tunnel.h>
40 41
41struct ip_tunnel_parm 42struct ip_tunnel_parm
42mlxsw_sp_ipip_netdev_parms(const struct net_device *ol_dev); 43mlxsw_sp_ipip_netdev_parms4(const struct net_device *ol_dev);
43 44
44union mlxsw_sp_l3addr 45union mlxsw_sp_l3addr
45mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto, 46mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,
@@ -56,7 +57,9 @@ struct mlxsw_sp_ipip_entry {
56 struct mlxsw_sp_rif_ipip_lb *ol_lb; 57 struct mlxsw_sp_rif_ipip_lb *ol_lb;
57 struct mlxsw_sp_fib_entry *decap_fib_entry; 58 struct mlxsw_sp_fib_entry *decap_fib_entry;
58 struct list_head ipip_list_node; 59 struct list_head ipip_list_node;
59 struct ip_tunnel_parm parms; 60 union {
61 struct ip_tunnel_parm parms4;
62 };
60}; 63};
61 64
62struct mlxsw_sp_ipip_ops { 65struct mlxsw_sp_ipip_ops {
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index f0b25baba09a..d8aaf8fd9cc2 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -1,10 +1,10 @@
1/* 1/*
2 * drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c 2 * drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
3 * Copyright (c) 2016-2017 Mellanox Technologies. All rights reserved. 3 * Copyright (c) 2016-2018 Mellanox Technologies. All rights reserved.
4 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com> 4 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
5 * Copyright (c) 2016 Ido Schimmel <idosch@mellanox.com> 5 * Copyright (c) 2016 Ido Schimmel <idosch@mellanox.com>
6 * Copyright (c) 2016 Yotam Gigi <yotamg@mellanox.com> 6 * Copyright (c) 2016 Yotam Gigi <yotamg@mellanox.com>
7 * Copyright (c) 2017 Petr Machata <petrm@mellanox.com> 7 * Copyright (c) 2017-2018 Petr Machata <petrm@mellanox.com>
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met: 10 * modification, are permitted provided that the following conditions are met:
@@ -1020,9 +1020,11 @@ mlxsw_sp_ipip_entry_alloc(struct mlxsw_sp *mlxsw_sp,
1020 enum mlxsw_sp_ipip_type ipipt, 1020 enum mlxsw_sp_ipip_type ipipt,
1021 struct net_device *ol_dev) 1021 struct net_device *ol_dev)
1022{ 1022{
1023 const struct mlxsw_sp_ipip_ops *ipip_ops;
1023 struct mlxsw_sp_ipip_entry *ipip_entry; 1024 struct mlxsw_sp_ipip_entry *ipip_entry;
1024 struct mlxsw_sp_ipip_entry *ret = NULL; 1025 struct mlxsw_sp_ipip_entry *ret = NULL;
1025 1026
1027 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt];
1026 ipip_entry = kzalloc(sizeof(*ipip_entry), GFP_KERNEL); 1028 ipip_entry = kzalloc(sizeof(*ipip_entry), GFP_KERNEL);
1027 if (!ipip_entry) 1029 if (!ipip_entry)
1028 return ERR_PTR(-ENOMEM); 1030 return ERR_PTR(-ENOMEM);
@@ -1036,7 +1038,15 @@ mlxsw_sp_ipip_entry_alloc(struct mlxsw_sp *mlxsw_sp,
1036 1038
1037 ipip_entry->ipipt = ipipt; 1039 ipip_entry->ipipt = ipipt;
1038 ipip_entry->ol_dev = ol_dev; 1040 ipip_entry->ol_dev = ol_dev;
1039 ipip_entry->parms = mlxsw_sp_ipip_netdev_parms(ol_dev); 1041
1042 switch (ipip_ops->ul_proto) {
1043 case MLXSW_SP_L3_PROTO_IPV4:
1044 ipip_entry->parms4 = mlxsw_sp_ipip_netdev_parms4(ol_dev);
1045 break;
1046 case MLXSW_SP_L3_PROTO_IPV6:
1047 WARN_ON(1);
1048 break;
1049 }
1040 1050
1041 return ipip_entry; 1051 return ipip_entry;
1042 1052