ip6_del_rt(rt, NULL, NULL); 
ip6_del_rt(rt, NULL, NULL, NULL); 
static void ipv6_del_addr(struct inet6_ifaddr *ifp){	struct inet6_ifaddr *ifa, **ifap;	struct inet6_dev *idev = ifp->idev;	int hash;	int deleted = 0, onlink = 0;	unsigned long expires = jiffies;	hash = ipv6_addr_hash(&ifp->addr);	ifp->dead = 1;	write_lock_bh(&addrconf_hash_lock);	for (ifap = &inet6_addr_lst[hash]; (ifa=*ifap) != NULL;	     ifap = &ifa->lst_next) {		if (ifa == ifp) {			*ifap = ifa->lst_next;			__in6_ifa_put(ifp);			ifa->lst_next = NULL;			break;		}	}	write_unlock_bh(&addrconf_hash_lock);	write_lock_bh(&idev->lock);#ifdef CONFIG_IPV6_PRIVACY	if (ifp->flags&IFA_F_TEMPORARY) {		for (ifap = &idev->tempaddr_list; (ifa=*ifap) != NULL;		     ifap = &ifa->tmp_next) {			if (ifa == ifp) {				*ifap = ifa->tmp_next;				if (ifp->ifpub) {					in6_ifa_put(ifp->ifpub);					ifp->ifpub = NULL;				}				__in6_ifa_put(ifp);				ifa->tmp_next = NULL;				break;			}		}	}#endif	for (ifap = &idev->addr_list; (ifa=*ifap) != NULL;	     ifap = &ifa->if_next) {		if (ifa == ifp) {			*ifap = ifa->if_next;			__in6_ifa_put(ifp);			ifa->if_next = NULL;			if (!(ifp->flags & IFA_F_PERMANENT) || onlink > 0)				break;			deleted = 1;		} else if (ifp->flags & IFA_F_PERMANENT) {			if (ipv6_prefix_equal(&ifa->addr, &ifp->addr,					      ifp->prefix_len)) {				if (ifa->flags & IFA_F_PERMANENT) {					onlink = 1;					if (deleted)						break;				} else {					unsigned long lifetime;					if (!onlink)						onlink = -1;					spin_lock(&ifa->lock);					lifetime = min_t(unsigned long,							 ifa->valid_lft, 0x7fffffffUL/HZ);					if (time_before(expires,							ifa->tstamp + lifetime * HZ))						expires = ifa->tstamp + lifetime * HZ;					spin_unlock(&ifa->lock);				}			}		}	}	write_unlock_bh(&idev->lock);	ipv6_ifa_notify(RTM_DELADDR, ifp);	notifier_call_chain(&inet6addr_chain,NETDEV_DOWN,ifp);	addrconf_del_timer(ifp);	/*	 * Purge or update corresponding prefix	 *	 * 1) we don't purge prefix here if address was not permanent.	 *    prefix is managed by its own lifetime.	 * 2) if there're no addresses, delete prefix.	 * 3) if there're still other permanent address(es),	 *    corresponding prefix is still permanent.	 * 4) otherwise, update prefix lifetime to the	 *    longest valid lifetime among the corresponding	 *    addresses on the device.	 *    Note: subsequent RA will update lifetime.	 *	 * --yoshfuji	 */	if ((ifp->flags & IFA_F_PERMANENT) && onlink < 1) {		struct in6_addr prefix;		struct rt6_info *rt;		ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len);		rt = rt6_lookup(&prefix, NULL, ifp->idev->dev->ifindex, 1);		if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {			if (onlink == 0) {				ip6_del_rt(rt, NULL, NULL);				rt = NULL;			} else if (!(rt->rt6i_flags & RTF_EXPIRES)) {				rt->rt6i_expires = expires;				rt->rt6i_flags |= RTF_EXPIRES;			}		}		dst_release(&rt->u.dst);	}	in6_ifa_put(ifp);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/0d51aa80a9b1db43920c0770c3bb842dd823c005/addrconf.c/buggy/net/ipv6/addrconf.c