patch-2.1.15 linux/net/ipv6/ipv6_route.c

Next file: linux/net/ipv6/ipv6_sockglue.c
Previous file: linux/net/ipv6/ipv6_output.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.14/linux/net/ipv6/ipv6_route.c linux/net/ipv6/ipv6_route.c
@@ -1233,7 +1233,7 @@
 
 			if (dc->dc_nexthop)
 			{
-				ndisc_dec_neigh(dc->dc_nexthop);
+				neighbour_unlock(dc->dc_nexthop);
 			}
 			
 			if (dc->dc_flags & RTI_DCACHE)
@@ -1406,14 +1406,16 @@
 
 	if (rt->rt_nexthop)
 	{
-		if (ipv6_addr_cmp(&rt->rt_nexthop->addr, target) == 0)
+		struct nd_neigh *ndn = (struct nd_neigh *) rt->rt_nexthop;
+		
+		if (ipv6_addr_cmp(&ndn->ndn_addr, target) == 0)
 		{
-			atomic_inc(&rt->rt_nexthop->refcnt);
+			rt->rt_nexthop = neighbour_clone(rt->rt_nexthop);
 			goto exit;
 		}
 		else
 		{
-			ndisc_dec_neigh(rt->rt_nexthop);
+			neighbour_unlock(rt->rt_nexthop);
 		}
 	}
 	
@@ -1688,8 +1690,6 @@
 	if (skb == NULL)
 		return;
 
-	skb->free = 1;
-	
 	memcpy(skb_put(skb, sizeof(struct in6_rtmsg)), &rtmsg,
 	       sizeof(struct in6_rtmsg));
 	
@@ -1848,8 +1848,11 @@
 		{
 			for (i=0; i<16; i++)
 			{
+				struct nd_neigh *ndn;
+
+				ndn = (struct nd_neigh *) rt->rt_nexthop;
 				sprintf(arg->buffer + arg->len, "%02x",
-					rt->rt_nexthop->addr.s6_addr[i]);
+					ndn->ndn_addr.s6_addr[i]);
 				arg->len += 2;
 			}
 		}
@@ -2011,7 +2014,6 @@
 	if (skb == NULL)
 		return;
 
-	skb->free = 1;
 
 	msg = (struct in6_rtmsg *) skb_put(skb, sizeof(struct in6_rtmsg));
 	

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov