@@ -119,13 +119,12 @@ __mtu_check_toobig_v6(const struct sk_buff *skb, u32 mtu)
119
119
return false;
120
120
}
121
121
122
- /* Get route to daddr, update *saddr, optionally bind route to saddr */
122
+ /* Get route to daddr, optionally bind route to saddr */
123
123
static struct rtable * do_output_route4 (struct net * net , __be32 daddr ,
124
- int rt_mode , __be32 * saddr )
124
+ int rt_mode , __be32 * ret_saddr )
125
125
{
126
126
struct flowi4 fl4 ;
127
127
struct rtable * rt ;
128
- bool loop = false;
129
128
130
129
memset (& fl4 , 0 , sizeof (fl4 ));
131
130
fl4 .daddr = daddr ;
@@ -135,23 +134,17 @@ static struct rtable *do_output_route4(struct net *net, __be32 daddr,
135
134
retry :
136
135
rt = ip_route_output_key (net , & fl4 );
137
136
if (IS_ERR (rt )) {
138
- /* Invalid saddr ? */
139
- if (PTR_ERR (rt ) == - EINVAL && * saddr &&
140
- rt_mode & IP_VS_RT_MODE_CONNECT && !loop ) {
141
- * saddr = 0 ;
142
- flowi4_update_output (& fl4 , 0 , daddr , 0 );
143
- goto retry ;
144
- }
145
137
IP_VS_DBG_RL ("ip_route_output error, dest: %pI4\n" , & daddr );
146
138
return NULL ;
147
- } else if (!* saddr && rt_mode & IP_VS_RT_MODE_CONNECT && fl4 .saddr ) {
139
+ }
140
+ if (rt_mode & IP_VS_RT_MODE_CONNECT && fl4 .saddr ) {
148
141
ip_rt_put (rt );
149
- * saddr = fl4 .saddr ;
150
142
flowi4_update_output (& fl4 , 0 , daddr , fl4 .saddr );
151
- loop = true ;
143
+ rt_mode = 0 ;
152
144
goto retry ;
153
145
}
154
- * saddr = fl4 .saddr ;
146
+ if (ret_saddr )
147
+ * ret_saddr = fl4 .saddr ;
155
148
return rt ;
156
149
}
157
150
@@ -344,19 +337,15 @@ __ip_vs_get_out_rt(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,
344
337
if (ret_saddr )
345
338
* ret_saddr = dest_dst -> dst_saddr .ip ;
346
339
} else {
347
- __be32 saddr = htonl (INADDR_ANY );
348
-
349
340
noref = 0 ;
350
341
351
342
/* For such unconfigured boxes avoid many route lookups
352
343
* for performance reasons because we do not remember saddr
353
344
*/
354
345
rt_mode &= ~IP_VS_RT_MODE_CONNECT ;
355
- rt = do_output_route4 (net , daddr , rt_mode , & saddr );
346
+ rt = do_output_route4 (net , daddr , rt_mode , ret_saddr );
356
347
if (!rt )
357
348
goto err_unreach ;
358
- if (ret_saddr )
359
- * ret_saddr = saddr ;
360
349
}
361
350
362
351
local = (rt -> rt_flags & RTCF_LOCAL ) ? 1 : 0 ;
0 commit comments