netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: ping6 is sent out from wrong interface
@ 2008-06-25  7:02 Naohiro Ooiwa
  2008-06-25  7:51 ` (usagi-users 04057) " Fey Marcus
  2008-06-27 19:14 ` YOSHIFUJI Hideaki / 吉藤英明
  0 siblings, 2 replies; 7+ messages in thread
From: Naohiro Ooiwa @ 2008-06-25  7:02 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki / 吉藤英明; +Cc: netdev, usagi-users

Hi YOSHIFUJI-san

Thank you for your reply.

> -I does not specify interface strictly but source address.
> Which means, if you just specify an address, interface is unspecified.
> You can give "-I eth1", too.

I'm not convinced yet.
I don't think it's correct that kernel or ping6 arbitrarily decides outgoing interface.

Is this really an expected behaviour?
Could you explain to me the reason of it, too?

I think the behavior should be similar to IPv4.

The following is my image. ipv6_dev_find() is an imaginary function, which
finds the interface with a given source address.

How do you think?



--- linux-2.6.25/net/ipv6/raw.c.orig    2008-04-17 11:49:44.000000000 +0900
+++ linux-2.6.25/net/ipv6/raw.c 2008-06-25 15:20:27.000000000 +0900
@@ -875,8 +875,13 @@ static int rawv6_sendmsg(struct kiocb *i
                final_p = &final;
        }

-       if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
-               fl.oif = np->mcast_oif;
+       if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst)) {
+               if (np->mcast_oif)
+                       fl.oif = np->mcast_oif;
+               else
+                       fl.oif = ipv6_dev_find(oldflp->fl6_src);
+       }
+
        security_sk_classify_flow(sk, &fl);

        err = ip6_dst_lookup(sk, &dst, &fl);





^ permalink raw reply	[flat|nested] 7+ messages in thread

* (usagi-users 04057) Re: ping6 is sent out from wrong interface
  2008-06-25  7:02 ping6 is sent out from wrong interface Naohiro Ooiwa
@ 2008-06-25  7:51 ` Fey Marcus
  2008-06-25 10:18   ` (usagi-users 04056) " Naohiro Ooiwa
  2008-06-27 19:14 ` YOSHIFUJI Hideaki / 吉藤英明
  1 sibling, 1 reply; 7+ messages in thread
From: Fey Marcus @ 2008-06-25  7:51 UTC (permalink / raw)
  To: usagi-users, YOSHIFUJI Hideaki / 吉藤英明
  Cc: netdev, usagi-users

Hi Naohiro,

>I'm not convinced yet.
>I don't think it's correct that kernel or ping6 arbitrarily 
>decides outgoing interface.
>
>Is this really an expected behaviour?
>Could you explain to me the reason of it, too?
>
>I think the behavior should be similar to IPv4.

It's due to routing.

Your routing table shows this:
---
    # route -A inet6
    Kernel IPv6 routing table
    Destination            Next Hop Flags Metric Ref    Use Iface
    2001:2c0:418:1::/64    *        U     256    0        0 eth0
    2001:2c0:418:2::/64    *        U     256    0        0 eth1
    fe80::/64              *        U     256    0        0 eth0
    fe80::/64              *        U     256    0        0 eth1
    ::::::
    2001:2c0:418:1::1/128  *        U     0      8        1 lo
    2001:2c0:418:2::2/128  *        U     0      5        1 lo
    ::::::
    ff00::/8               *        U     256    0        0 eth0
    ff00::/8               *        U     256    0        0 eth1
    #
---

...with eth0 being preferred over eth1 for multicast packets.

You could add a dedicated route for ff02::/16 to make the kernel output the packet via eth1.

Bye,

Marcus
-----------------------------------------
IABG mbH
Sitz der Gesellschaft: Ottobrunn, Registergericht: Amtsgericht Muenchen, HRB 5499
Geschaeftsfuehrung: Prof. Dr.-Ing. Rudolf F. Schwarz
Vorsitzender des Aufsichtsrats: General a. D. Wolfgang Altenburg

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: (usagi-users 04056) Re: ping6 is sent out from wrong interface
  2008-06-25  7:51 ` (usagi-users 04057) " Fey Marcus
@ 2008-06-25 10:18   ` Naohiro Ooiwa
  2008-06-25 11:26     ` Fey Marcus
  0 siblings, 1 reply; 7+ messages in thread
From: Naohiro Ooiwa @ 2008-06-25 10:18 UTC (permalink / raw)
  To: Fey Marcus
  Cc: usagi-users, YOSHIFUJI Hideaki / 吉藤英明,
	netdev, usagi-users

Hi Marcus

Thank you for your quick reply.

> It's due to routing.

For the reason of selecting 'eth0', I agree.
But, I think the device is specified before
looking up the routing table in this case.

> ...with eth0 being preferred over eth1 for multicast packets.
> You could add a dedicated route for ff02::/16 to make the kernel output the packet via eth1.

This works when using only "eth1" for multicasts.
When multiple I/Fs are connected to separate networks,
this scheme requires changing the route every time
a user need to send ping to different network.

I think kernel can solve this problem better.


Regards,
Naohiro Ooiwa


Fey Marcus さんは書きました:
> Hi Naohiro,
> 
>> I'm not convinced yet.
>> I don't think it's correct that kernel or ping6 arbitrarily 
>> decides outgoing interface.
>>
>> Is this really an expected behaviour?
>> Could you explain to me the reason of it, too?
>>
>> I think the behavior should be similar to IPv4.
> 
> It's due to routing.
> 
> Your routing table shows this:
> ---
>     # route -A inet6
>     Kernel IPv6 routing table
>     Destination            Next Hop Flags Metric Ref    Use Iface
>     2001:2c0:418:1::/64    *        U     256    0        0 eth0
>     2001:2c0:418:2::/64    *        U     256    0        0 eth1
>     fe80::/64              *        U     256    0        0 eth0
>     fe80::/64              *        U     256    0        0 eth1
>     ::::::
>     2001:2c0:418:1::1/128  *        U     0      8        1 lo
>     2001:2c0:418:2::2/128  *        U     0      5        1 lo
>     ::::::
>     ff00::/8               *        U     256    0        0 eth0
>     ff00::/8               *        U     256    0        0 eth1
>     #
> ---
> 
> ...with eth0 being preferred over eth1 for multicast packets.
> 
> You could add a dedicated route for ff02::/16 to make the kernel output the packet via eth1.
> 
> Bye,
> 
> Marcus
> -----------------------------------------
> IABG mbH
> Sitz der Gesellschaft: Ottobrunn, Registergericht: Amtsgericht Muenchen, HRB 5499
> Geschaeftsfuehrung: Prof. Dr.-Ing. Rudolf F. Schwarz
> Vorsitzender des Aufsichtsrats: General a. D. Wolfgang Altenburg
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: (usagi-users 04056) Re: ping6 is sent out from wrong interface
  2008-06-25 10:18   ` (usagi-users 04056) " Naohiro Ooiwa
@ 2008-06-25 11:26     ` Fey Marcus
  2008-06-26  0:48       ` Naohiro Ooiwa
  0 siblings, 1 reply; 7+ messages in thread
From: Fey Marcus @ 2008-06-25 11:26 UTC (permalink / raw)
  To: Naohiro Ooiwa
  Cc: usagi-users, YOSHIFUJI Hideaki / 吉藤英明,
	netdev, usagi-users

Hi Naohiro,

>
>Hi Marcus
>
>Thank you for your quick reply.
>
>> It's due to routing.
>
>For the reason of selecting 'eth0', I agree.
>But, I think the device is specified before looking up the 
>routing table in this case.

Well, ping's man page reads: 
---
       -I interface address
              Set source address to specified interface  address.  Argument
              may  be  numeric  IP  address or name of device. When pinging
              IPv6 link-local address this option is required.
---

So you only set the address, not the interface to be used for sending.

>
>> ...with eth0 being preferred over eth1 for multicast packets.
>> You could add a dedicated route for ff02::/16 to make the 
>kernel output the packet via eth1.
>
>This works when using only "eth1" for multicasts.
>When multiple I/Fs are connected to separate networks, this 
>scheme requires changing the route every time a user need to 
>send ping to different network.
>

Ok, my proposition was a bit too general. It would probably be better to set up routes for the exact addresses. So in your case to ff02::1. 

Of course, if you wish to send the same packet via several interfaces within a short time, this would still result in adding and deleting the routes over and over again.

>I think kernel can solve this problem better.
>

I don't think this would be intended....


Bye,

Marcus
-----------------------------------------
IABG mbH
Sitz der Gesellschaft: Ottobrunn, Registergericht: Amtsgericht Muenchen, HRB 5499
Geschaeftsfuehrung: Prof. Dr.-Ing. Rudolf F. Schwarz
Vorsitzender des Aufsichtsrats: General a. D. Wolfgang Altenburg


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: (usagi-users 04056) Re: ping6 is sent out from wrong interface
  2008-06-25 11:26     ` Fey Marcus
@ 2008-06-26  0:48       ` Naohiro Ooiwa
  0 siblings, 0 replies; 7+ messages in thread
From: Naohiro Ooiwa @ 2008-06-26  0:48 UTC (permalink / raw)
  To: Fey Marcus
  Cc: usagi-users, YOSHIFUJI Hideaki / 吉藤英明,
	netdev, usagi-users

Hi Marcus

Thank you for your comment.

>>
>> Thank you for your quick reply.
>>
>>> It's due to routing.
>> For the reason of selecting 'eth0', I agree.
>> But, I think the device is specified before looking up the 
>> routing table in this case.
> 
> Well, ping's man page reads: 
> ---
>        -I interface address
>               Set source address to specified interface  address.  Argument
>               may  be  numeric  IP  address or name of device. When pinging
>               IPv6 link-local address this option is required.
> ---
> 
> So you only set the address, not the interface to be used for sending.

Then, the man page doesn't match with the implementation.

> 
>>> ...with eth0 being preferred over eth1 for multicast packets.
>>> You could add a dedicated route for ff02::/16 to make the 
>> kernel output the packet via eth1.
>>
>> This works when using only "eth1" for multicasts.
>> When multiple I/Fs are connected to separate networks, this 
>> scheme requires changing the route every time a user need to 
>> send ping to different network.
>>
> 
> Ok, my proposition was a bit too general. It would probably be better to set up routes for the exact addresses. So in your case to ff02::1. 
> 
> Of course, if you wish to send the same packet via several interfaces within a short time, this would still result in adding and deleting the routes over and over again.
> 
>> I think kernel can solve this problem better.
>>
> 
> I don't think this would be intended....
> 

I was just confused by the difference of
source address things between IPv4 and IPv6.

Regards,
Naohiro Ooiwa



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: (usagi-users 04056) Re: ping6 is sent out from wrong interface
  2008-06-25  7:02 ping6 is sent out from wrong interface Naohiro Ooiwa
  2008-06-25  7:51 ` (usagi-users 04057) " Fey Marcus
@ 2008-06-27 19:14 ` YOSHIFUJI Hideaki / 吉藤英明
  2008-06-30 12:57   ` Naohiro Ooiwa
  1 sibling, 1 reply; 7+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2008-06-27 19:14 UTC (permalink / raw)
  To: usagi-users, nooiwa; +Cc: netdev, usagi-users

In article <4861ED72.6080100@miraclelinux.com> (at Wed, 25 Jun 2008 16:02:10 +0900), Naohiro Ooiwa <nooiwa@miraclelinux.com> says:

> Hi YOSHIFUJI-san
> 
> Thank you for your reply.
> 
> > -I does not specify interface strictly but source address.
> > Which means, if you just specify an address, interface is unspecified.
> > You can give "-I eth1", too.
> 
> I'm not convinced yet.
> I don't think it's correct that kernel or ping6 arbitrarily decides outgoing interface.
> 
> Is this really an expected behaviour?
> Could you explain to me the reason of it, too?

I have to agree it is rather strange (or not natural), but, I do not
agree with the solution.

In theory, outgoing interface must be selected by routing, if unspecified.
So, I'd propose something like this (not tested, not for real patch).

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index d1f3e19..81ddf9a 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -239,17 +239,28 @@ static inline int rt6_need_strict(struct in6_addr *daddr)
 
 static inline struct rt6_info *rt6_device_match(struct net *net,
 						    struct rt6_info *rt,
+						    struct in6_addr *saddr,
 						    int oif,
 						    int strict)
 {
 	struct rt6_info *local = NULL;
 	struct rt6_info *sprt;
 
-	if (oif) {
-		for (sprt = rt; sprt; sprt = sprt->u.dst.rt6_next) {
-			struct net_device *dev = sprt->rt6i_dev;
+	if (!oif && ipv6_addr_any(saddr))
+		saddr = NULL;
+
+	for (sprt = rt; sprt; sprt = sprt->u.dst.rt6_next) {
+		struct net_device *dev = sprt->rt6i_dev;
+
+		if (oif) {
 			if (dev->ifindex == oif)
 				return sprt;
+		} else {
+			if (saddr && ipv6_chk_addr(net, saddr, dev, strict))
+				return sprt;
+		}
+
+		if (oif) {
 			if (dev->flags & IFF_LOOPBACK) {
 				if (sprt->rt6i_idev == NULL ||
 				    sprt->rt6i_idev->dev->ifindex != oif) {
@@ -261,13 +272,13 @@ static inline struct rt6_info *rt6_device_match(struct net *net,
 				}
 				local = sprt;
 			}
-		}
 
-		if (local)
-			return local;
+			if (local)
+				return local;
 
-		if (strict)
-			return net->ipv6.ip6_null_entry;
+			if (strict)
+				return net->ipv6.ip6_null_entry;
+		}
 	}
 	return rt;
 }
@@ -541,7 +552,7 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net,
 	fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src);
 restart:
 	rt = fn->leaf;
-	rt = rt6_device_match(net, rt, fl->oif, flags);
+	rt = rt6_device_match(net, rt, &fl->fl6_src, fl->oif, flags);
 	BACKTRACK(net, &fl->fl6_src);
 out:
 	dst_use(&rt->u.dst, jiffies);

-- 
YOSHIFUJI Hideaki @ USAGI Project  <yoshfuji@linux-ipv6.org>
GPG-FP  : 9022 65EB 1ECF 3AD1 0BDF  80D8 4807 F894 E062 0EEA

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: (usagi-users 04056) Re: ping6 is sent out from wrong interface
  2008-06-27 19:14 ` YOSHIFUJI Hideaki / 吉藤英明
@ 2008-06-30 12:57   ` Naohiro Ooiwa
  0 siblings, 0 replies; 7+ messages in thread
From: Naohiro Ooiwa @ 2008-06-30 12:57 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki / 吉藤英明
  Cc: usagi-users, netdev, usagi-users

Hi YOSHIFUJI-san

Thanks for your proposal.

> > In theory, outgoing interface must be selected by routing, if unspecified.
> > So, I'd propose something like this (not tested, not for real patch).

This patch looks good enough to me.
I tested your patch and it works as I expected.
I'm looking forward to seeing your final fix as well.

Thank you so much.
Naohiro Ooiwa

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-06-30 12:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-25  7:02 ping6 is sent out from wrong interface Naohiro Ooiwa
2008-06-25  7:51 ` (usagi-users 04057) " Fey Marcus
2008-06-25 10:18   ` (usagi-users 04056) " Naohiro Ooiwa
2008-06-25 11:26     ` Fey Marcus
2008-06-26  0:48       ` Naohiro Ooiwa
2008-06-27 19:14 ` YOSHIFUJI Hideaki / 吉藤英明
2008-06-30 12:57   ` Naohiro Ooiwa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).