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

[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
...@@ -69,10 +69,7 @@ extern int ip6_ins_rt(struct rt6_info *, ...@@ -69,10 +69,7 @@ extern int ip6_ins_rt(struct rt6_info *,
struct nlmsghdr *, struct nlmsghdr *,
void *rtattr, void *rtattr,
struct netlink_skb_parms *req); struct netlink_skb_parms *req);
extern int ip6_del_rt(struct rt6_info *, extern int ip6_del_rt(struct rt6_info *);
struct nlmsghdr *,
void *rtattr,
struct netlink_skb_parms *req);
extern int ip6_rt_addr_add(struct in6_addr *addr, extern int ip6_rt_addr_add(struct in6_addr *addr,
struct net_device *dev, struct net_device *dev,
......
...@@ -736,7 +736,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) ...@@ -736,7 +736,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) { if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
if (onlink == 0) { if (onlink == 0) {
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
rt = NULL; rt = NULL;
} else if (!(rt->rt6i_flags & RTF_EXPIRES)) { } else if (!(rt->rt6i_flags & RTF_EXPIRES)) {
rt->rt6i_expires = expires; rt->rt6i_expires = expires;
...@@ -1662,7 +1662,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) ...@@ -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 && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
if (rt->rt6i_flags&RTF_EXPIRES) { if (rt->rt6i_flags&RTF_EXPIRES) {
if (valid_lft == 0) { if (valid_lft == 0) {
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
rt = NULL; rt = NULL;
} else { } else {
rt->rt6i_expires = jiffies + rt_expires; rt->rt6i_expires = jiffies + rt_expires;
...@@ -3557,7 +3557,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) ...@@ -3557,7 +3557,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
addrconf_leave_anycast(ifp); addrconf_leave_anycast(ifp);
addrconf_leave_solict(ifp->idev, &ifp->addr); addrconf_leave_solict(ifp->idev, &ifp->addr);
dst_hold(&ifp->rt->u.dst); 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); dst_free(&ifp->rt->u.dst);
break; break;
} }
......
...@@ -961,7 +961,7 @@ static void ndisc_recv_na(struct sk_buff *skb) ...@@ -961,7 +961,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
struct rt6_info *rt; struct rt6_info *rt;
rt = rt6_get_dflt_router(saddr, dev); rt = rt6_get_dflt_router(saddr, dev);
if (rt) if (rt)
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
} }
out: out:
...@@ -1114,7 +1114,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1114,7 +1114,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
if (rt && lifetime == 0) { if (rt && lifetime == 0) {
neigh_clone(neigh); neigh_clone(neigh);
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
rt = NULL; rt = NULL;
} }
......
...@@ -457,7 +457,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, ...@@ -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); rt = rt6_get_route_info(prefix, rinfo->prefix_len, gwaddr, dev->ifindex);
if (rt && !lifetime) { if (rt && !lifetime) {
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
rt = NULL; rt = NULL;
} }
...@@ -813,7 +813,7 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *dst) ...@@ -813,7 +813,7 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
if (rt) { if (rt) {
if (rt->rt6i_flags & RTF_CACHE) if (rt->rt6i_flags & RTF_CACHE)
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
else else
dst_release(dst); dst_release(dst);
} }
...@@ -1218,7 +1218,8 @@ out: ...@@ -1218,7 +1218,8 @@ out:
return err; 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; int err;
struct fib6_table *table; struct fib6_table *table;
...@@ -1237,6 +1238,11 @@ int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr, struct ...@@ -1237,6 +1238,11 @@ int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh, void *_rtattr, struct
return err; 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, static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
void *_rtattr, struct netlink_skb_parms *req, void *_rtattr, struct netlink_skb_parms *req,
u32 table_id) u32 table_id)
...@@ -1271,7 +1277,7 @@ static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh, ...@@ -1271,7 +1277,7 @@ static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh,
dst_hold(&rt->u.dst); dst_hold(&rt->u.dst);
read_unlock_bh(&table->tb6_lock); 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); read_unlock_bh(&table->tb6_lock);
...@@ -1395,7 +1401,7 @@ restart: ...@@ -1395,7 +1401,7 @@ restart:
call_netevent_notifiers(NETEVENT_REDIRECT, &netevent); call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
if (rt->rt6i_flags&RTF_CACHE) { if (rt->rt6i_flags&RTF_CACHE) {
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
return; return;
} }
...@@ -1631,7 +1637,7 @@ restart: ...@@ -1631,7 +1637,7 @@ restart:
if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) { if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) {
dst_hold(&rt->u.dst); dst_hold(&rt->u.dst);
read_unlock_bh(&table->tb6_lock); read_unlock_bh(&table->tb6_lock);
ip6_del_rt(rt, NULL, NULL, NULL); ip6_del_rt(rt);
goto restart; goto restart;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment