* Same priority level
*/
- if ((iter->rt6i_dev == rt->rt6i_dev) &&
- (ipv6_addr_cmp(&iter->rt6i_gateway,
- &rt->rt6i_gateway) == 0)) {
+ if (iter->rt6i_dev == rt->rt6i_dev &&
+ iter->rt6i_idev == rt->rt6i_idev &&
+ ipv6_addr_cmp(&iter->rt6i_gateway,
+ &rt->rt6i_gateway) == 0) {
if (!(iter->rt6i_flags&RTF_EXPIRES))
return -EEXIST;
iter->rt6i_expires = rt->rt6i_expires;
int err = -ENOMEM;
fn = fib6_add_1(root, &rt->rt6i_dst.addr, sizeof(struct in6_addr),
- rt->rt6i_dst.plen, (u8*) &rt->rt6i_dst - (u8*) rt);
+ rt->rt6i_dst.plen, offsetof(struct rt6_info, rt6i_dst));
if (fn == NULL)
goto out;
sn = fib6_add_1(sfn, &rt->rt6i_src.addr,
sizeof(struct in6_addr), rt->rt6i_src.plen,
- (u8*) &rt->rt6i_src - (u8*) rt);
+ offsetof(struct rt6_info, rt6i_src));
if (sn == NULL) {
/* If it is failed, discard just allocated
} else {
sn = fib6_add_1(fn->subtree, &rt->rt6i_src.addr,
sizeof(struct in6_addr), rt->rt6i_src.plen,
- (u8*) &rt->rt6i_src - (u8*) rt);
+ offsetof(struct rt6_info, rt6i_src));
if (sn == NULL)
goto st_failure;
struct in6_addr *saddr)
{
struct lookup_args args[2];
- struct rt6_info *rt = NULL;
struct fib6_node *fn;
- args[0].offset = (u8*) &rt->rt6i_dst - (u8*) rt;
+ args[0].offset = offsetof(struct rt6_info, rt6i_dst);
args[0].addr = daddr;
#ifdef CONFIG_IPV6_SUBTREES
- args[1].offset = (u8*) &rt->rt6i_src - (u8*) rt;
+ args[1].offset = offsetof(struct rt6_info, rt6i_src);
args[1].addr = saddr;
#endif
struct in6_addr *daddr, int dst_len,
struct in6_addr *saddr, int src_len)
{
- struct rt6_info *rt = NULL;
struct fib6_node *fn;
fn = fib6_locate_1(root, daddr, dst_len,
- (u8*) &rt->rt6i_dst - (u8*) rt);
+ offsetof(struct rt6_info, rt6i_dst));
#ifdef CONFIG_IPV6_SUBTREES
if (src_len) {
fn = fn->subtree;
if (fn)
fn = fib6_locate_1(fn, saddr, src_len,
- (u8*) &rt->rt6i_src - (u8*) rt);
+ offsetof(struct rt6_info, rt6i_src));
}
#endif
if (rt->rt6i_flags&RTF_EXPIRES && rt->rt6i_expires) {
if (time_after(now, rt->rt6i_expires)) {
RT6_TRACE("expiring %p\n", rt);
+ rt6_reset_dflt_pointer(rt);
return -1;
}
gc_args.more++;
time_after_eq(now, rt->u.dst.lastuse + gc_args.timeout)) {
RT6_TRACE("aging clone %p\n", rt);
return -1;
+ } else if ((rt->rt6i_flags & RTF_GATEWAY) &&
+ (!(rt->rt6i_nexthop->flags & NTF_ROUTER))) {
+ RT6_TRACE("purging route %p via non-router but gateway\n",
+ rt);
+ return -1;
}
gc_args.more++;
}