Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -1243,23 +1243,28 @@ out:
|
||||
* If fib6_add_1 has cleared the old leaf pointer in the
|
||||
* super-tree leaf node we have to find a new one for it.
|
||||
*/
|
||||
struct rt6_info *pn_leaf = rcu_dereference_protected(pn->leaf,
|
||||
lockdep_is_held(&table->tb6_lock));
|
||||
if (pn != fn && pn_leaf == rt) {
|
||||
pn_leaf = NULL;
|
||||
RCU_INIT_POINTER(pn->leaf, NULL);
|
||||
atomic_dec(&rt->rt6i_ref);
|
||||
}
|
||||
if (pn != fn && !pn_leaf && !(pn->fn_flags & RTN_RTINFO)) {
|
||||
pn_leaf = fib6_find_prefix(info->nl_net, table, pn);
|
||||
#if RT6_DEBUG >= 2
|
||||
if (!pn_leaf) {
|
||||
WARN_ON(!pn_leaf);
|
||||
pn_leaf = info->nl_net->ipv6.ip6_null_entry;
|
||||
if (pn != fn) {
|
||||
struct rt6_info *pn_leaf =
|
||||
rcu_dereference_protected(pn->leaf,
|
||||
lockdep_is_held(&table->tb6_lock));
|
||||
if (pn_leaf == rt) {
|
||||
pn_leaf = NULL;
|
||||
RCU_INIT_POINTER(pn->leaf, NULL);
|
||||
atomic_dec(&rt->rt6i_ref);
|
||||
}
|
||||
if (!pn_leaf && !(pn->fn_flags & RTN_RTINFO)) {
|
||||
pn_leaf = fib6_find_prefix(info->nl_net, table,
|
||||
pn);
|
||||
#if RT6_DEBUG >= 2
|
||||
if (!pn_leaf) {
|
||||
WARN_ON(!pn_leaf);
|
||||
pn_leaf =
|
||||
info->nl_net->ipv6.ip6_null_entry;
|
||||
}
|
||||
#endif
|
||||
atomic_inc(&pn_leaf->rt6i_ref);
|
||||
rcu_assign_pointer(pn->leaf, pn_leaf);
|
||||
atomic_inc(&pn_leaf->rt6i_ref);
|
||||
rcu_assign_pointer(pn->leaf, pn_leaf);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
goto failure;
|
||||
|
||||
@@ -1077,10 +1077,11 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
|
||||
memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
|
||||
neigh_release(neigh);
|
||||
}
|
||||
} else if (!(t->parms.flags &
|
||||
(IP6_TNL_F_USE_ORIG_TCLASS | IP6_TNL_F_USE_ORIG_FWMARK))) {
|
||||
/* enable the cache only only if the routing decision does
|
||||
* not depend on the current inner header value
|
||||
} else if (t->parms.proto != 0 && !(t->parms.flags &
|
||||
(IP6_TNL_F_USE_ORIG_TCLASS |
|
||||
IP6_TNL_F_USE_ORIG_FWMARK))) {
|
||||
/* enable the cache only if neither the outer protocol nor the
|
||||
* routing decision depends on the current inner header value
|
||||
*/
|
||||
use_cache = true;
|
||||
}
|
||||
@@ -1679,11 +1680,11 @@ int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
struct ip6_tnl *tnl = netdev_priv(dev);
|
||||
|
||||
if (tnl->parms.proto == IPPROTO_IPIP) {
|
||||
if (new_mtu < ETH_MIN_MTU)
|
||||
if (tnl->parms.proto == IPPROTO_IPV6) {
|
||||
if (new_mtu < IPV6_MIN_MTU)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (new_mtu < IPV6_MIN_MTU)
|
||||
if (new_mtu < ETH_MIN_MTU)
|
||||
return -EINVAL;
|
||||
}
|
||||
if (new_mtu > 0xFFF8 - dev->hard_header_len)
|
||||
|
||||
Reference in New Issue
Block a user