* Ville Nuorvala <[EMAIL PROTECTED]> 2006-10-17 03:27
> @@ -123,7 +111,7 @@ static int fib6_rule_match(struct fib_ru
>               return 0;
> 
>       if (r->src.plen) {
> -             if (!(flags & RT6_LOOKUP_F_HAS_SADDR) ||
> +             if (flags & RT6_LOOKUP_F_HAS_SADDR &&
>                   !ipv6_prefix_equal(&fl->fl6_src, &r->src.addr, r->src.plen))
>                       return 0;
>       }

This is wrong, rules matching on a source prefix must fail if no
source address is available.

>  static struct rt6_info *ip6_pol_route_output(struct fib6_table *table,
> -                                          struct flowi *fl, int flags)
> +                                          struct flowi *fl, int flags,
> +                                          struct fib6_rule *rule)
>  {
>       struct fib6_node *fn;
>       struct rt6_info *rt, *nrt;
> @@ -730,6 +733,16 @@ static struct rt6_info *ip6_pol_route_ou
>       struct in6_addr saddr;
> 
>       ipv6_addr_copy(&saddr, &fl->fl6_src);
> +#ifdef CONFIG_IPV6_SUBTREES
> +     if (!has_saddr && rule->src.plen > 0) {
> +             /* a source prefix specific policy rule has to override the
> +                normal source address selection process */
> +             if (ipv6_get_saddr(fl->oif, &fl->fl6_dst, &rule->src, &saddr))
> +                     goto no_saddr;
> +             has_saddr = RT6_LOOKUP_F_HAS_SADDR;
> +             ipv6_addr_copy(&fl->fl6_src, &saddr);
> +     }
> +#endif
>  relookup:
>       read_lock_bh(&table->tb6_lock);

I can see why you want the above change but we have to find another way.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to