Commit 77d16f45 authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki Committed by David S. Miller

[IPV6] ROUTE: Unify RT6_F_xxx and RT6_SELECT_F_xxx flags

Unify RT6_F_xxx and RT6_SELECT_F_xxx flags into
RT6_LOOKUP_F_xxx flags, and put them into ip6_route.h
Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Acked-by: Ville Nuorvala <vnuorval@tcs.hut.fi
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4e96c2b4
...@@ -173,9 +173,6 @@ struct fib6_table { ...@@ -173,9 +173,6 @@ struct fib6_table {
#define RT6_TABLE_LOCAL RT6_TABLE_MAIN #define RT6_TABLE_LOCAL RT6_TABLE_MAIN
#endif #endif
#define RT6_F_STRICT 1
#define RT6_F_HAS_SADDR 2
typedef struct rt6_info *(*pol_lookup_t)(struct fib6_table *, typedef struct rt6_info *(*pol_lookup_t)(struct fib6_table *,
struct flowi *, int); struct flowi *, int);
......
...@@ -32,6 +32,10 @@ struct route_info { ...@@ -32,6 +32,10 @@ struct route_info {
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
#define RT6_LOOKUP_F_IFACE 0x1
#define RT6_LOOKUP_F_REACHABLE 0x2
#define RT6_LOOKUP_F_HAS_SADDR 0x4
struct pol_chain { struct pol_chain {
int type; int type;
int priority; int priority;
......
...@@ -117,7 +117,7 @@ static int fib6_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) ...@@ -117,7 +117,7 @@ static int fib6_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
if (!ipv6_prefix_equal(&fl->fl6_dst, &r->dst.addr, r->dst.plen)) if (!ipv6_prefix_equal(&fl->fl6_dst, &r->dst.addr, r->dst.plen))
return 0; return 0;
if ((flags & RT6_F_HAS_SADDR) && if ((flags & RT6_LOOKUP_F_HAS_SADDR) &&
!ipv6_prefix_equal(&fl->fl6_src, &r->src.addr, r->src.plen)) !ipv6_prefix_equal(&fl->fl6_src, &r->src.addr, r->src.plen))
return 0; return 0;
......
...@@ -76,9 +76,6 @@ ...@@ -76,9 +76,6 @@
#define CLONE_OFFLINK_ROUTE 0 #define CLONE_OFFLINK_ROUTE 0
#define RT6_SELECT_F_IFACE 0x1
#define RT6_SELECT_F_REACHABLE 0x2
static int ip6_rt_max_size = 4096; static int ip6_rt_max_size = 4096;
static int ip6_rt_gc_min_interval = HZ / 2; static int ip6_rt_gc_min_interval = HZ / 2;
static int ip6_rt_gc_timeout = 60*HZ; static int ip6_rt_gc_timeout = 60*HZ;
...@@ -340,7 +337,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif, ...@@ -340,7 +337,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif,
int m, n; int m, n;
m = rt6_check_dev(rt, oif); m = rt6_check_dev(rt, oif);
if (!m && (strict & RT6_SELECT_F_IFACE)) if (!m && (strict & RT6_LOOKUP_F_IFACE))
return -1; return -1;
#ifdef CONFIG_IPV6_ROUTER_PREF #ifdef CONFIG_IPV6_ROUTER_PREF
m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
...@@ -348,7 +345,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif, ...@@ -348,7 +345,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif,
n = rt6_check_neigh(rt); n = rt6_check_neigh(rt);
if (n > 1) if (n > 1)
m |= 16; m |= 16;
else if (!n && strict & RT6_SELECT_F_REACHABLE) else if (!n && strict & RT6_LOOKUP_F_REACHABLE)
return -1; return -1;
return m; return m;
} }
...@@ -388,7 +385,7 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif, ...@@ -388,7 +385,7 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif,
} }
if (!match && if (!match &&
(strict & RT6_SELECT_F_REACHABLE) && (strict & RT6_LOOKUP_F_REACHABLE) &&
last && last != rt0) { last && last != rt0) {
/* no entries matched; do round-robin */ /* no entries matched; do round-robin */
static DEFINE_SPINLOCK(lock); static DEFINE_SPINLOCK(lock);
...@@ -511,7 +508,7 @@ static struct rt6_info *ip6_pol_route_lookup(struct fib6_table *table, ...@@ -511,7 +508,7 @@ static struct rt6_info *ip6_pol_route_lookup(struct fib6_table *table,
fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src);
restart: restart:
rt = fn->leaf; rt = fn->leaf;
rt = rt6_device_match(rt, fl->oif, flags & RT6_F_STRICT); rt = rt6_device_match(rt, fl->oif, flags);
BACKTRACK(&fl->fl6_src); BACKTRACK(&fl->fl6_src);
dst_hold(&rt->u.dst); dst_hold(&rt->u.dst);
out: out:
...@@ -537,7 +534,7 @@ struct rt6_info *rt6_lookup(struct in6_addr *daddr, struct in6_addr *saddr, ...@@ -537,7 +534,7 @@ struct rt6_info *rt6_lookup(struct in6_addr *daddr, struct in6_addr *saddr,
}, },
}; };
struct dst_entry *dst; struct dst_entry *dst;
int flags = strict ? RT6_F_STRICT : 0; int flags = strict ? RT6_LOOKUP_F_IFACE : 0;
dst = fib6_rule_lookup(&fl, flags, ip6_pol_route_lookup); dst = fib6_rule_lookup(&fl, flags, ip6_pol_route_lookup);
if (dst->error == 0) if (dst->error == 0)
...@@ -633,10 +630,9 @@ static struct rt6_info *ip6_pol_route_input(struct fib6_table *table, ...@@ -633,10 +630,9 @@ static struct rt6_info *ip6_pol_route_input(struct fib6_table *table,
int strict = 0; int strict = 0;
int attempts = 3; int attempts = 3;
int err; int err;
int reachable = RT6_SELECT_F_REACHABLE; int reachable = RT6_LOOKUP_F_REACHABLE;
if (flags & RT6_F_STRICT) strict |= flags & RT6_LOOKUP_F_IFACE;
strict = RT6_SELECT_F_IFACE;
relookup: relookup:
read_lock_bh(&table->tb6_lock); read_lock_bh(&table->tb6_lock);
...@@ -712,10 +708,7 @@ void ip6_route_input(struct sk_buff *skb) ...@@ -712,10 +708,7 @@ void ip6_route_input(struct sk_buff *skb)
}, },
.proto = iph->nexthdr, .proto = iph->nexthdr,
}; };
int flags = 0; int flags = rt6_need_strict(&iph->daddr) ? RT6_LOOKUP_F_IFACE : 0;
if (rt6_need_strict(&iph->daddr))
flags |= RT6_F_STRICT;
skb->dst = fib6_rule_lookup(&fl, flags, ip6_pol_route_input); skb->dst = fib6_rule_lookup(&fl, flags, ip6_pol_route_input);
} }
...@@ -728,10 +721,9 @@ static struct rt6_info *ip6_pol_route_output(struct fib6_table *table, ...@@ -728,10 +721,9 @@ static struct rt6_info *ip6_pol_route_output(struct fib6_table *table,
int strict = 0; int strict = 0;
int attempts = 3; int attempts = 3;
int err; int err;
int reachable = RT6_SELECT_F_REACHABLE; int reachable = RT6_LOOKUP_F_REACHABLE;
if (flags & RT6_F_STRICT) strict |= flags & RT6_LOOKUP_F_IFACE;
strict = RT6_SELECT_F_IFACE;
relookup: relookup:
read_lock_bh(&table->tb6_lock); read_lock_bh(&table->tb6_lock);
...@@ -797,7 +789,7 @@ struct dst_entry * ip6_route_output(struct sock *sk, struct flowi *fl) ...@@ -797,7 +789,7 @@ struct dst_entry * ip6_route_output(struct sock *sk, struct flowi *fl)
int flags = 0; int flags = 0;
if (rt6_need_strict(&fl->fl6_dst)) if (rt6_need_strict(&fl->fl6_dst))
flags |= RT6_F_STRICT; flags |= RT6_LOOKUP_F_IFACE;
return fib6_rule_lookup(fl, flags, ip6_pol_route_output); return fib6_rule_lookup(fl, flags, ip6_pol_route_output);
} }
...@@ -1362,7 +1354,7 @@ static struct rt6_info *ip6_route_redirect(struct in6_addr *dest, ...@@ -1362,7 +1354,7 @@ static struct rt6_info *ip6_route_redirect(struct in6_addr *dest,
}, },
.gateway = *gateway, .gateway = *gateway,
}; };
int flags = rt6_need_strict(dest) ? RT6_F_STRICT : 0; int flags = rt6_need_strict(dest) ? RT6_LOOKUP_F_IFACE : 0;
return (struct rt6_info *)fib6_rule_lookup((struct flowi *)&rdfl, flags, __ip6_route_redirect); return (struct rt6_info *)fib6_rule_lookup((struct flowi *)&rdfl, flags, __ip6_route_redirect);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment