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

Commit e0a1ad73 authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller
Browse files

[IPv6] route: Simplify ip6_del_rt()



Provide a simple ip6_del_rt() for the majority of users and
an alternative for the exception via netlink. Avoids code
obfuscation.

Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e9ce1cd3
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -69,10 +69,7 @@ extern int ip6_ins_rt(struct rt6_info *,
					   struct nlmsghdr *,
					   void *rtattr,
					   struct netlink_skb_parms *req);
extern int			ip6_del_rt(struct rt6_info *,
					   struct nlmsghdr *,
					   void *rtattr,
					   struct netlink_skb_parms *req);
extern int			ip6_del_rt(struct rt6_info *);

extern int			ip6_rt_addr_add(struct in6_addr *addr,
						struct net_device *dev,
+3 −3
Original line number Diff line number Diff line
@@ -736,7 +736,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)

		if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
			if (onlink == 0) {
				ip6_del_rt(rt, NULL, NULL, NULL);
				ip6_del_rt(rt);
				rt = NULL;
			} else if (!(rt->rt6i_flags & RTF_EXPIRES)) {
				rt->rt6i_expires = expires;
@@ -1662,7 +1662,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
		if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
			if (rt->rt6i_flags&RTF_EXPIRES) {
				if (valid_lft == 0) {
					ip6_del_rt(rt, NULL, NULL, NULL);
					ip6_del_rt(rt);
					rt = NULL;
				} else {
					rt->rt6i_expires = jiffies + rt_expires;
@@ -3557,7 +3557,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
			addrconf_leave_anycast(ifp);
		addrconf_leave_solict(ifp->idev, &ifp->addr);
		dst_hold(&ifp->rt->u.dst);
		if (ip6_del_rt(ifp->rt, NULL, NULL, NULL))
		if (ip6_del_rt(ifp->rt))
			dst_free(&ifp->rt->u.dst);
		break;
	}
+2 −2
Original line number Diff line number Diff line
@@ -961,7 +961,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
			struct rt6_info *rt;
			rt = rt6_get_dflt_router(saddr, dev);
			if (rt)
				ip6_del_rt(rt, NULL, NULL, NULL);
				ip6_del_rt(rt);
		}

out:
@@ -1114,7 +1114,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)

	if (rt && lifetime == 0) {
		neigh_clone(neigh);
		ip6_del_rt(rt, NULL, NULL, NULL);
		ip6_del_rt(rt);
		rt = NULL;
	}

+12 −6
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
	rt = rt6_get_route_info(prefix, rinfo->prefix_len, gwaddr, dev->ifindex);

	if (rt && !lifetime) {
		ip6_del_rt(rt, NULL, NULL, NULL);
		ip6_del_rt(rt);
		rt = NULL;
	}

@@ -813,7 +813,7 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)

	if (rt) {
		if (rt->rt6i_flags & RTF_CACHE)
			ip6_del_rt(rt, NULL, NULL, NULL);
			ip6_del_rt(rt);
		else
			dst_release(dst);
	}
@@ -1218,7 +1218,8 @@ int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
	return err;
}

int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr, struct netlink_skb_parms *req)
static int __ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh,
			void *_rtattr, struct netlink_skb_parms *req)
{
	int err;
	struct fib6_table *table;
@@ -1237,6 +1238,11 @@ int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr, struct
	return err;
}

int ip6_del_rt(struct rt6_info *rt)
{
	return __ip6_del_rt(rt, NULL, NULL, NULL);
}

static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
			 void *_rtattr, struct netlink_skb_parms *req,
			 u32 table_id)
@@ -1271,7 +1277,7 @@ static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
			dst_hold(&rt->u.dst);
			read_unlock_bh(&table->tb6_lock);

			return ip6_del_rt(rt, nlh, _rtattr, req);
			return __ip6_del_rt(rt, nlh, _rtattr, req);
		}
	}
	read_unlock_bh(&table->tb6_lock);
@@ -1395,7 +1401,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *saddr,
	call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);

	if (rt->rt6i_flags&RTF_CACHE) {
		ip6_del_rt(rt, NULL, NULL, NULL);
		ip6_del_rt(rt);
		return;
	}

@@ -1631,7 +1637,7 @@ void rt6_purge_dflt_routers(void)
		if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) {
			dst_hold(&rt->u.dst);
			read_unlock_bh(&table->tb6_lock);
			ip6_del_rt(rt, NULL, NULL, NULL);
			ip6_del_rt(rt);
			goto restart;
		}
	}