]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv6/route.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[karo-tx-linux.git] / net / ipv6 / route.c
index 969913da494fdf1d80ce674c3b6c421fdab18d3d..49817555449e2956fcfe81555e646b5f9b53261a 100644 (file)
@@ -1042,8 +1042,8 @@ static struct rt6_info *rt6_make_pcpu_route(struct rt6_info *rt)
        return pcpu_rt;
 }
 
-static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, int oif,
-                                     struct flowi6 *fl6, int flags)
+struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
+                              int oif, struct flowi6 *fl6, int flags)
 {
        struct fib6_node *fn, *saved_fn;
        struct rt6_info *rt;
@@ -1139,6 +1139,7 @@ redo_rt6_select:
 
        }
 }
+EXPORT_SYMBOL_GPL(ip6_pol_route);
 
 static struct rt6_info *ip6_pol_route_input(struct net *net, struct fib6_table *table,
                                            struct flowi6 *fl6, int flags)
@@ -1782,7 +1783,7 @@ static struct rt6_info *ip6_nh_lookup_table(struct net *net,
        };
        struct fib6_table *table;
        struct rt6_info *rt;
-       int flags = 0;
+       int flags = RT6_LOOKUP_F_IFACE;
 
        table = fib6_get_table(net, cfg->fc_table);
        if (!table)
@@ -2200,7 +2201,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
         *      first-hop router for the specified ICMP Destination Address.
         */
 
-       if (!ndisc_parse_options(msg->opt, optlen, &ndopts)) {
+       if (!ndisc_parse_options(skb->dev, msg->opt, optlen, &ndopts)) {
                net_dbg_ratelimited("rt6_redirect: invalid ND options\n");
                return;
        }
@@ -2235,12 +2236,12 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
         *      We have finally decided to accept it.
         */
 
-       neigh_update(neigh, lladdr, NUD_STALE,
+       ndisc_update(skb->dev, neigh, lladdr, NUD_STALE,
                     NEIGH_UPDATE_F_WEAK_OVERRIDE|
                     NEIGH_UPDATE_F_OVERRIDE|
                     (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
-                                    NEIGH_UPDATE_F_ISROUTER))
-                    );
+                                    NEIGH_UPDATE_F_ISROUTER)),
+                    NDISC_REDIRECT, &ndopts);
 
        nrt = ip6_rt_cache_alloc(rt, &msg->dest, NULL);
        if (!nrt)
@@ -2585,23 +2586,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
        return rt;
 }
 
-int ip6_route_get_saddr(struct net *net,
-                       struct rt6_info *rt,
-                       const struct in6_addr *daddr,
-                       unsigned int prefs,
-                       struct in6_addr *saddr)
-{
-       struct inet6_dev *idev =
-               rt ? ip6_dst_idev((struct dst_entry *)rt) : NULL;
-       int err = 0;
-       if (rt && rt->rt6i_prefsrc.plen)
-               *saddr = rt->rt6i_prefsrc.addr;
-       else
-               err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
-                                        daddr, prefs, saddr);
-       return err;
-}
-
 /* remove deleted ip from prefsrc entries */
 struct arg_dev_net_ip {
        struct net_device *dev;
@@ -3306,6 +3290,8 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
 
        err = -EINVAL;
        memset(&fl6, 0, sizeof(fl6));
+       rtm = nlmsg_data(nlh);
+       fl6.flowlabel = ip6_make_flowinfo(rtm->rtm_tos, 0);
 
        if (tb[RTA_SRC]) {
                if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))