aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/route.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-05-18 18:42:43 -0400
committerDavid S. Miller <davem@davemloft.net>2011-05-18 18:42:43 -0400
commita48eff128865aa20520fa6e0e0c5fbd2ac50d712 (patch)
treec60e376c3fca23bb215c977e42661187076dccbf /net/ipv4/route.c
parented2361e66eec60645f8e4715fe39a42235ef43ae (diff)
ipv4: Pass explicit destination address to rt_bind_peer().
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r--net/ipv4/route.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 9c5ad86bc783..b24d58e6bbcd 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -156,7 +156,7 @@ static u32 *ipv4_cow_metrics(struct dst_entry *dst, unsigned long old)
156 u32 *p = NULL; 156 u32 *p = NULL;
157 157
158 if (!rt->peer) 158 if (!rt->peer)
159 rt_bind_peer(rt, 1); 159 rt_bind_peer(rt, rt->rt_dst, 1);
160 160
161 peer = rt->peer; 161 peer = rt->peer;
162 if (peer) { 162 if (peer) {
@@ -1193,11 +1193,11 @@ static u32 rt_peer_genid(void)
1193 return atomic_read(&__rt_peer_genid); 1193 return atomic_read(&__rt_peer_genid);
1194} 1194}
1195 1195
1196void rt_bind_peer(struct rtable *rt, int create) 1196void rt_bind_peer(struct rtable *rt, __be32 daddr, int create)
1197{ 1197{
1198 struct inet_peer *peer; 1198 struct inet_peer *peer;
1199 1199
1200 peer = inet_getpeer_v4(rt->rt_dst, create); 1200 peer = inet_getpeer_v4(daddr, create);
1201 1201
1202 if (peer && cmpxchg(&rt->peer, NULL, peer) != NULL) 1202 if (peer && cmpxchg(&rt->peer, NULL, peer) != NULL)
1203 inet_putpeer(peer); 1203 inet_putpeer(peer);
@@ -1231,7 +1231,7 @@ void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more)
1231 1231
1232 if (rt) { 1232 if (rt) {
1233 if (rt->peer == NULL) 1233 if (rt->peer == NULL)
1234 rt_bind_peer(rt, 1); 1234 rt_bind_peer(rt, rt->rt_dst, 1);
1235 1235
1236 /* If peer is attached to destination, it is never detached, 1236 /* If peer is attached to destination, it is never detached,
1237 so that we need not to grab a lock to dereference it. 1237 so that we need not to grab a lock to dereference it.
@@ -1377,7 +1377,7 @@ void ip_rt_send_redirect(struct sk_buff *skb)
1377 rcu_read_unlock(); 1377 rcu_read_unlock();
1378 1378
1379 if (!rt->peer) 1379 if (!rt->peer)
1380 rt_bind_peer(rt, 1); 1380 rt_bind_peer(rt, rt->rt_dst, 1);
1381 peer = rt->peer; 1381 peer = rt->peer;
1382 if (!peer) { 1382 if (!peer) {
1383 icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway); 1383 icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
@@ -1445,7 +1445,7 @@ static int ip_error(struct sk_buff *skb)
1445 } 1445 }
1446 1446
1447 if (!rt->peer) 1447 if (!rt->peer)
1448 rt_bind_peer(rt, 1); 1448 rt_bind_peer(rt, rt->rt_dst, 1);
1449 peer = rt->peer; 1449 peer = rt->peer;
1450 1450
1451 send = true; 1451 send = true;
@@ -1552,7 +1552,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
1552 dst_confirm(dst); 1552 dst_confirm(dst);
1553 1553
1554 if (!rt->peer) 1554 if (!rt->peer)
1555 rt_bind_peer(rt, 1); 1555 rt_bind_peer(rt, rt->rt_dst, 1);
1556 peer = rt->peer; 1556 peer = rt->peer;
1557 if (peer) { 1557 if (peer) {
1558 if (mtu < ip_rt_min_pmtu) 1558 if (mtu < ip_rt_min_pmtu)
@@ -1609,7 +1609,7 @@ static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie)
1609 struct inet_peer *peer; 1609 struct inet_peer *peer;
1610 1610
1611 if (!rt->peer) 1611 if (!rt->peer)
1612 rt_bind_peer(rt, 0); 1612 rt_bind_peer(rt, rt->rt_dst, 0);
1613 1613
1614 peer = rt->peer; 1614 peer = rt->peer;
1615 if (peer && peer->pmtu_expires) 1615 if (peer && peer->pmtu_expires)