Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -3303,14 +3303,24 @@ static void addrconf_gre_config(struct net_device *dev)
|
||||
static int fixup_permanent_addr(struct inet6_dev *idev,
|
||||
struct inet6_ifaddr *ifp)
|
||||
{
|
||||
if (!ifp->rt) {
|
||||
struct rt6_info *rt;
|
||||
/* rt6i_ref == 0 means the host route was removed from the
|
||||
* FIB, for example, if 'lo' device is taken down. In that
|
||||
* case regenerate the host route.
|
||||
*/
|
||||
if (!ifp->rt || !atomic_read(&ifp->rt->rt6i_ref)) {
|
||||
struct rt6_info *rt, *prev;
|
||||
|
||||
rt = addrconf_dst_alloc(idev, &ifp->addr, false);
|
||||
if (unlikely(IS_ERR(rt)))
|
||||
return PTR_ERR(rt);
|
||||
|
||||
/* ifp->rt can be accessed outside of rtnl */
|
||||
spin_lock(&ifp->lock);
|
||||
prev = ifp->rt;
|
||||
ifp->rt = rt;
|
||||
spin_unlock(&ifp->lock);
|
||||
|
||||
ip6_rt_put(prev);
|
||||
}
|
||||
|
||||
if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) {
|
||||
|
@@ -933,8 +933,6 @@ static int __init inet6_init(void)
|
||||
if (err)
|
||||
goto igmp_fail;
|
||||
|
||||
ipv6_stub = &ipv6_stub_impl;
|
||||
|
||||
err = ipv6_netfilter_init();
|
||||
if (err)
|
||||
goto netfilter_fail;
|
||||
@@ -1014,6 +1012,10 @@ static int __init inet6_init(void)
|
||||
if (err)
|
||||
goto sysctl_fail;
|
||||
#endif
|
||||
|
||||
/* ensure that ipv6 stubs are visible only after ipv6 is ready */
|
||||
wmb();
|
||||
ipv6_stub = &ipv6_stub_impl;
|
||||
out:
|
||||
return err;
|
||||
|
||||
|
@@ -909,6 +909,8 @@ static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto,
|
||||
{
|
||||
switch (opt->type) {
|
||||
case IPV6_SRCRT_TYPE_0:
|
||||
case IPV6_SRCRT_STRICT:
|
||||
case IPV6_SRCRT_TYPE_2:
|
||||
ipv6_push_rthdr0(skb, proto, opt, addr_p, saddr);
|
||||
break;
|
||||
case IPV6_SRCRT_TYPE_4:
|
||||
@@ -1163,6 +1165,8 @@ struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
|
||||
|
||||
switch (opt->srcrt->type) {
|
||||
case IPV6_SRCRT_TYPE_0:
|
||||
case IPV6_SRCRT_STRICT:
|
||||
case IPV6_SRCRT_TYPE_2:
|
||||
fl6->daddr = *((struct rt0_hdr *)opt->srcrt)->addr;
|
||||
break;
|
||||
case IPV6_SRCRT_TYPE_4:
|
||||
|
@@ -1037,7 +1037,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
|
||||
struct ip6_tnl *t = netdev_priv(dev);
|
||||
struct net *net = t->net;
|
||||
struct net_device_stats *stats = &t->dev->stats;
|
||||
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
||||
struct ipv6hdr *ipv6h;
|
||||
struct ipv6_tel_txoption opt;
|
||||
struct dst_entry *dst = NULL, *ndst = NULL;
|
||||
struct net_device *tdev;
|
||||
@@ -1057,26 +1057,28 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
|
||||
|
||||
/* NBMA tunnel */
|
||||
if (ipv6_addr_any(&t->parms.raddr)) {
|
||||
struct in6_addr *addr6;
|
||||
struct neighbour *neigh;
|
||||
int addr_type;
|
||||
if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
struct in6_addr *addr6;
|
||||
struct neighbour *neigh;
|
||||
int addr_type;
|
||||
|
||||
if (!skb_dst(skb))
|
||||
goto tx_err_link_failure;
|
||||
if (!skb_dst(skb))
|
||||
goto tx_err_link_failure;
|
||||
|
||||
neigh = dst_neigh_lookup(skb_dst(skb),
|
||||
&ipv6_hdr(skb)->daddr);
|
||||
if (!neigh)
|
||||
goto tx_err_link_failure;
|
||||
neigh = dst_neigh_lookup(skb_dst(skb),
|
||||
&ipv6_hdr(skb)->daddr);
|
||||
if (!neigh)
|
||||
goto tx_err_link_failure;
|
||||
|
||||
addr6 = (struct in6_addr *)&neigh->primary_key;
|
||||
addr_type = ipv6_addr_type(addr6);
|
||||
addr6 = (struct in6_addr *)&neigh->primary_key;
|
||||
addr_type = ipv6_addr_type(addr6);
|
||||
|
||||
if (addr_type == IPV6_ADDR_ANY)
|
||||
addr6 = &ipv6_hdr(skb)->daddr;
|
||||
if (addr_type == IPV6_ADDR_ANY)
|
||||
addr6 = &ipv6_hdr(skb)->daddr;
|
||||
|
||||
memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
|
||||
neigh_release(neigh);
|
||||
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
|
||||
|
@@ -1753,7 +1753,8 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event,
|
||||
idev = in6_dev_get(dev);
|
||||
if (!idev)
|
||||
break;
|
||||
if (idev->cnf.ndisc_notify)
|
||||
if (idev->cnf.ndisc_notify ||
|
||||
net->ipv6.devconf_all->ndisc_notify)
|
||||
ndisc_send_unsol_na(dev);
|
||||
in6_dev_put(idev);
|
||||
break;
|
||||
|
@@ -1178,8 +1178,7 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
||||
spin_lock_bh(&sk->sk_receive_queue.lock);
|
||||
skb = skb_peek(&sk->sk_receive_queue);
|
||||
if (skb)
|
||||
amount = skb_tail_pointer(skb) -
|
||||
skb_transport_header(skb);
|
||||
amount = skb->len;
|
||||
spin_unlock_bh(&sk->sk_receive_queue.lock);
|
||||
return put_user(amount, (int __user *)arg);
|
||||
}
|
||||
|
Reference in New Issue
Block a user