[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: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Acked-by: Ville Nuorvala <vnuorval@tcs.hut.fi Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4e96c2b418
commit
77d16f450a
|
@ -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 {
|
||||||
#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)
|
||||||
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 @@
|
||||||
|
|
||||||
#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,
|
||||||
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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
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,
|
||||||
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)
|
||||||
},
|
},
|
||||||
.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,
|
||||||
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)
|
||||||
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,
|
||||||
},
|
},
|
||||||
.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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue