diff options
author | David S. Miller <davem@davemloft.net> | 2018-02-13 12:24:28 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-02-13 12:24:28 -0500 |
commit | 439ccd8ce9eeb4c44632404a0ba38f947e97caba (patch) | |
tree | 6f0d9db02b826a665e7567fd192e47b118aa88a1 | |
parent | d75de7b6e737148863705f3523f9575d10429815 (diff) | |
parent | e437f3b62d0844c4073c9e13263413748fa69093 (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.c | 141 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 16 |
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 | ||
39 | struct ip_tunnel_parm | 39 | struct ip_tunnel_parm |
40 | mlxsw_sp_ipip_netdev_parms(const struct net_device *ol_dev) | 40 | mlxsw_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 | ||
47 | static bool mlxsw_sp_ipip_parms_has_ikey(struct ip_tunnel_parm parms) | 47 | static 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 | ||
52 | static bool mlxsw_sp_ipip_parms_has_okey(struct ip_tunnel_parm parms) | 52 | static 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 | ||
57 | static u32 mlxsw_sp_ipip_parms_ikey(struct ip_tunnel_parm parms) | 57 | static 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 | ||
63 | static u32 mlxsw_sp_ipip_parms_okey(struct ip_tunnel_parm parms) | 63 | static 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 | ||
69 | static __be32 mlxsw_sp_ipip_parms_saddr4(struct ip_tunnel_parm parms) | 69 | static union mlxsw_sp_l3addr |
70 | mlxsw_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 | ||
74 | static union mlxsw_sp_l3addr | 75 | static union mlxsw_sp_l3addr |
75 | mlxsw_sp_ipip_parms_saddr(enum mlxsw_sp_l3proto proto, | 76 | mlxsw_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 | ||
93 | static __be32 mlxsw_sp_ipip_parms_daddr4(struct ip_tunnel_parm parms) | 81 | union mlxsw_sp_l3addr |
82 | mlxsw_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 | ||
98 | static union mlxsw_sp_l3addr | ||
99 | mlxsw_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 | |||
117 | static 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 | |||
122 | static 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 | ||
127 | static u32 mlxsw_sp_ipip_netdev_ikey(const struct net_device *ol_dev) | 99 | static __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 | ||
132 | static 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 | ||
137 | union mlxsw_sp_l3addr | 104 | return mlxsw_sp_ipip_parms4_daddr(parms4).addr4; |
138 | mlxsw_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 | |||
145 | static __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 | ||
150 | static union mlxsw_sp_l3addr | 107 | static union mlxsw_sp_l3addr |
151 | mlxsw_sp_ipip_netdev_daddr(enum mlxsw_sp_l3proto proto, | 108 | mlxsw_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 | ||
158 | static int | 125 | static 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 | |||
273 | mlxsw_sp_ipip_ol_loopback_config_gre4(struct mlxsw_sp *mlxsw_sp, | 245 | mlxsw_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 | ||
41 | struct ip_tunnel_parm | 42 | struct ip_tunnel_parm |
42 | mlxsw_sp_ipip_netdev_parms(const struct net_device *ol_dev); | 43 | mlxsw_sp_ipip_netdev_parms4(const struct net_device *ol_dev); |
43 | 44 | ||
44 | union mlxsw_sp_l3addr | 45 | union mlxsw_sp_l3addr |
45 | mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto, | 46 | mlxsw_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 | ||
62 | struct mlxsw_sp_ipip_ops { | 65 | struct 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 | ||