Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44e3125c authored by David S. Miller's avatar David S. Miller
Browse files

ipvs: Eliminate rt->rt_dst usage in __ip_vs_get_out_rt().



We can simply track what destination address is used based upon which
code block is taken at the top of the function.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e58b3442
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -110,6 +110,7 @@ __ip_vs_get_out_rt(struct sk_buff *skb, struct ip_vs_dest *dest,
				  &dest->addr.ip,
				  &dest->addr.ip,
				  atomic_read(&rt->dst.__refcnt), rtos);
				  atomic_read(&rt->dst.__refcnt), rtos);
		}
		}
		daddr = dest->addr.ip;
		spin_unlock(&dest->dst_lock);
		spin_unlock(&dest->dst_lock);
	} else {
	} else {
		rt = ip_route_output(net, daddr, 0, rtos, 0);
		rt = ip_route_output(net, daddr, 0, rtos, 0);
@@ -125,7 +126,7 @@ __ip_vs_get_out_rt(struct sk_buff *skb, struct ip_vs_dest *dest,
	      rt_mode)) {
	      rt_mode)) {
		IP_VS_DBG_RL("Stopping traffic to %s address, dest: %pI4\n",
		IP_VS_DBG_RL("Stopping traffic to %s address, dest: %pI4\n",
			     (rt->rt_flags & RTCF_LOCAL) ?
			     (rt->rt_flags & RTCF_LOCAL) ?
			     "local":"non-local", &rt->rt_dst);
			     "local":"non-local", &daddr);
		ip_rt_put(rt);
		ip_rt_put(rt);
		return NULL;
		return NULL;
	}
	}
@@ -133,14 +134,14 @@ __ip_vs_get_out_rt(struct sk_buff *skb, struct ip_vs_dest *dest,
	    !((ort = skb_rtable(skb)) && ort->rt_flags & RTCF_LOCAL)) {
	    !((ort = skb_rtable(skb)) && ort->rt_flags & RTCF_LOCAL)) {
		IP_VS_DBG_RL("Redirect from non-local address %pI4 to local "
		IP_VS_DBG_RL("Redirect from non-local address %pI4 to local "
			     "requires NAT method, dest: %pI4\n",
			     "requires NAT method, dest: %pI4\n",
			     &ip_hdr(skb)->daddr, &rt->rt_dst);
			     &ip_hdr(skb)->daddr, &daddr);
		ip_rt_put(rt);
		ip_rt_put(rt);
		return NULL;
		return NULL;
	}
	}
	if (unlikely(!local && ipv4_is_loopback(ip_hdr(skb)->saddr))) {
	if (unlikely(!local && ipv4_is_loopback(ip_hdr(skb)->saddr))) {
		IP_VS_DBG_RL("Stopping traffic from loopback address %pI4 "
		IP_VS_DBG_RL("Stopping traffic from loopback address %pI4 "
			     "to non-local address, dest: %pI4\n",
			     "to non-local address, dest: %pI4\n",
			     &ip_hdr(skb)->saddr, &rt->rt_dst);
			     &ip_hdr(skb)->saddr, &daddr);
		ip_rt_put(rt);
		ip_rt_put(rt);
		return NULL;
		return NULL;
	}
	}