Add a network namespace parameter to rt6_lookup().
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
                                           int dstlen, int srclen,
                                           int metric, __u32 flags);
 
-extern struct rt6_info         *rt6_lookup(struct in6_addr *daddr,
+extern struct rt6_info         *rt6_lookup(struct net *net,
+                                           struct in6_addr *daddr,
                                            struct in6_addr *saddr,
                                            int oif, int flags);
 
 
                struct rt6_info *rt;
 
                ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len);
-               rt = rt6_lookup(&prefix, NULL, ifp->idev->dev->ifindex, 1);
+               rt = rt6_lookup(&init_net, &prefix, NULL, ifp->idev->dev->ifindex, 1);
 
                if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
                        if (onlink == 0) {
 
        if (pinfo->onlink) {
                struct rt6_info *rt;
-               rt = rt6_lookup(&pinfo->prefix, NULL, dev->ifindex, 1);
+               rt = rt6_lookup(&init_net, &pinfo->prefix, NULL, dev->ifindex, 1);
 
                if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
                        if (rt->rt6i_flags&RTF_EXPIRES) {
 
        if (ifindex == 0) {
                struct rt6_info *rt;
 
-               rt = rt6_lookup(addr, NULL, 0, 0);
+               rt = rt6_lookup(&init_net, addr, NULL, 0, 0);
                if (rt) {
                        dev = rt->rt6i_dev;
                        dev_hold(dev);
 
                skb_reset_network_header(skb2);
 
                /* Try to guess incoming interface */
-               rt = rt6_lookup(&ipv6_hdr(skb2)->saddr, NULL, 0, 0);
+               rt = rt6_lookup(&init_net, &ipv6_hdr(skb2)->saddr, NULL, 0, 0);
 
                if (rt && rt->rt6i_dev)
                        skb2->dev = rt->rt6i_dev;
                int strict = (ipv6_addr_type(&p->raddr) &
                              (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL));
 
-               struct rt6_info *rt = rt6_lookup(&p->raddr, &p->laddr,
+               struct rt6_info *rt = rt6_lookup(&init_net, &p->raddr, &p->laddr,
                                                 p->link, strict);
 
                if (rt == NULL)
 
 
        if (ifindex == 0) {
                struct rt6_info *rt;
-               rt = rt6_lookup(addr, NULL, 0, 0);
+               rt = rt6_lookup(&init_net, addr, NULL, 0, 0);
                if (rt) {
                        dev = rt->rt6i_dev;
                        dev_hold(dev);
        if (ifindex == 0) {
                struct rt6_info *rt;
 
-               rt = rt6_lookup(group, NULL, 0, 0);
+               rt = rt6_lookup(&init_net, group, NULL, 0, 0);
                if (rt) {
                        dev = rt->rt6i_dev;
                        dev_hold(dev);
 
 
 }
 
-struct rt6_info *rt6_lookup(struct in6_addr *daddr, struct in6_addr *saddr,
-                           int oif, int strict)
+struct rt6_info *rt6_lookup(struct net *net, struct in6_addr *daddr,
+                           struct in6_addr *saddr, int oif, int strict)
 {
        struct flowi fl = {
                .oif = oif,
                flags |= RT6_LOOKUP_F_HAS_SADDR;
        }
 
-       dst = fib6_rule_lookup(&init_net, &fl, flags, ip6_pol_route_lookup);
+       dst = fib6_rule_lookup(net, &fl, flags, ip6_pol_route_lookup);
        if (dst->error == 0)
                return (struct rt6_info *) dst;
 
                        if (!(gwa_type&IPV6_ADDR_UNICAST))
                                goto out;
 
-                       grt = rt6_lookup(gw_addr, NULL, cfg->fc_ifindex, 1);
+                       grt = rt6_lookup(&init_net, gw_addr, NULL, cfg->fc_ifindex, 1);
 
                        err = -EHOSTUNREACH;
                        if (grt == NULL)
        struct rt6_info *rt, *nrt;
        int allfrag = 0;
 
-       rt = rt6_lookup(daddr, saddr, dev->ifindex, 0);
+       rt = rt6_lookup(dev->nd_net, daddr, saddr, dev->ifindex, 0);
        if (rt == NULL)
                return;
 
 
        skb_reset_network_header(skb2);
 
        /* Try to guess incoming interface */
-       rt6i = rt6_lookup(&iph6->saddr, NULL, NULL, 0);
+       rt6i = rt6_lookup(&init_net, &iph6->saddr, NULL, NULL, 0);
        if (rt6i && rt6i->rt6i_dev) {
                skb2->dev = rt6i->rt6i_dev;
 
-               rt6i = rt6_lookup(&iph6->daddr, &iph6->saddr, NULL, 0);
+               rt6i = rt6_lookup(&init_net, &iph6->daddr, &iph6->saddr, NULL, 0);
 
                if (rt6i && rt6i->rt6i_dev && rt6i->rt6i_dev->type == ARPHRD_SIT) {
                        struct ip_tunnel *t = netdev_priv(rt6i->rt6i_dev);