Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Minor overlapping changes, nothing serious. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1226,11 +1226,13 @@ check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)
|
||||
}
|
||||
|
||||
static void
|
||||
cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt)
|
||||
cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires,
|
||||
bool del_rt, bool del_peer)
|
||||
{
|
||||
struct fib6_info *f6i;
|
||||
|
||||
f6i = addrconf_get_prefix_route(&ifp->addr, ifp->prefix_len,
|
||||
f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr,
|
||||
ifp->prefix_len,
|
||||
ifp->idev->dev, 0, RTF_DEFAULT, true);
|
||||
if (f6i) {
|
||||
if (del_rt)
|
||||
@@ -1293,7 +1295,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
|
||||
|
||||
if (action != CLEANUP_PREFIX_RT_NOP) {
|
||||
cleanup_prefix_route(ifp, expires,
|
||||
action == CLEANUP_PREFIX_RT_DEL);
|
||||
action == CLEANUP_PREFIX_RT_DEL, false);
|
||||
}
|
||||
|
||||
/* clean up prefsrc entries */
|
||||
@@ -3345,6 +3347,10 @@ static void addrconf_dev_config(struct net_device *dev)
|
||||
(dev->type != ARPHRD_NONE) &&
|
||||
(dev->type != ARPHRD_RAWIP)) {
|
||||
/* Alas, we support only Ethernet autoconfiguration. */
|
||||
idev = __in6_dev_get(dev);
|
||||
if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP &&
|
||||
dev->flags & IFF_MULTICAST)
|
||||
ipv6_mc_up(idev);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4584,12 +4590,14 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
}
|
||||
|
||||
static int modify_prefix_route(struct inet6_ifaddr *ifp,
|
||||
unsigned long expires, u32 flags)
|
||||
unsigned long expires, u32 flags,
|
||||
bool modify_peer)
|
||||
{
|
||||
struct fib6_info *f6i;
|
||||
u32 prio;
|
||||
|
||||
f6i = addrconf_get_prefix_route(&ifp->addr, ifp->prefix_len,
|
||||
f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
|
||||
ifp->prefix_len,
|
||||
ifp->idev->dev, 0, RTF_DEFAULT, true);
|
||||
if (!f6i)
|
||||
return -ENOENT;
|
||||
@@ -4600,7 +4608,8 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp,
|
||||
ip6_del_rt(dev_net(ifp->idev->dev), f6i);
|
||||
|
||||
/* add new one */
|
||||
addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
|
||||
addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
|
||||
ifp->prefix_len,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
} else {
|
||||
@@ -4622,6 +4631,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
||||
unsigned long timeout;
|
||||
bool was_managetempaddr;
|
||||
bool had_prefixroute;
|
||||
bool new_peer = false;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
@@ -4653,6 +4663,13 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
||||
cfg->preferred_lft = timeout;
|
||||
}
|
||||
|
||||
if (cfg->peer_pfx &&
|
||||
memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) {
|
||||
if (!ipv6_addr_any(&ifp->peer_addr))
|
||||
cleanup_prefix_route(ifp, expires, true, true);
|
||||
new_peer = true;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ifp->lock);
|
||||
was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR;
|
||||
had_prefixroute = ifp->flags & IFA_F_PERMANENT &&
|
||||
@@ -4668,6 +4685,9 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
||||
if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority)
|
||||
ifp->rt_priority = cfg->rt_priority;
|
||||
|
||||
if (new_peer)
|
||||
ifp->peer_addr = *cfg->peer_pfx;
|
||||
|
||||
spin_unlock_bh(&ifp->lock);
|
||||
if (!(ifp->flags&IFA_F_TENTATIVE))
|
||||
ipv6_ifa_notify(0, ifp);
|
||||
@@ -4676,7 +4696,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
||||
int rc = -ENOENT;
|
||||
|
||||
if (had_prefixroute)
|
||||
rc = modify_prefix_route(ifp, expires, flags);
|
||||
rc = modify_prefix_route(ifp, expires, flags, false);
|
||||
|
||||
/* prefix route could have been deleted; if so restore it */
|
||||
if (rc == -ENOENT) {
|
||||
@@ -4684,6 +4704,15 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
}
|
||||
|
||||
if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr))
|
||||
rc = modify_prefix_route(ifp, expires, flags, true);
|
||||
|
||||
if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) {
|
||||
addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
}
|
||||
} else if (had_prefixroute) {
|
||||
enum cleanup_prefix_rt_t action;
|
||||
unsigned long rt_expires;
|
||||
@@ -4694,7 +4723,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
||||
|
||||
if (action != CLEANUP_PREFIX_RT_NOP) {
|
||||
cleanup_prefix_route(ifp, rt_expires,
|
||||
action == CLEANUP_PREFIX_RT_DEL);
|
||||
action == CLEANUP_PREFIX_RT_DEL, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5981,9 +6010,9 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
|
||||
if (ifp->idev->cnf.forwarding)
|
||||
addrconf_join_anycast(ifp);
|
||||
if (!ipv6_addr_any(&ifp->peer_addr))
|
||||
addrconf_prefix_route(&ifp->peer_addr, 128, 0,
|
||||
ifp->idev->dev, 0, 0,
|
||||
GFP_ATOMIC);
|
||||
addrconf_prefix_route(&ifp->peer_addr, 128,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
0, 0, GFP_ATOMIC);
|
||||
break;
|
||||
case RTM_DELADDR:
|
||||
if (ifp->idev->cnf.forwarding)
|
||||
|
Reference in New Issue
Block a user