public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Recent select() handling change breaks Poptop
@ 2004-12-07  0:35 Phil Oester
  2004-12-07  2:52 ` Mitchell Blank Jr
  0 siblings, 1 reply; 13+ messages in thread
From: Phil Oester @ 2004-12-07  0:35 UTC (permalink / raw)
  To: shemminger, linux-net, linux-kernel

The recent changeset [1] dealing with blocking usage of select() seems
to break the Poptop PPTP server.

After upgrading from -rc2 to -rc3, I could no longer connect to a server
running PopTop.  Ended up reverting various -bk snapshots, and the breakage
was between -bk13 and -bk14.  Reverting this change to af_inet:

-       .poll =         datagram_poll,
+       .poll =         udp_poll,

makes the Poptop server work again.

Any ideas?

Phil


[1] http://linux.bkbits.net:8080/linux-2.5/cset@41ad55f4lM2IigkTUmtz82At8P3duA?nav=index.html|ChangeSet@-2w

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

* Re: Recent select() handling change breaks Poptop
  2004-12-07  0:35 Recent select() handling change breaks Poptop Phil Oester
@ 2004-12-07  2:52 ` Mitchell Blank Jr
  2004-12-07  4:53   ` Phil Oester
  0 siblings, 1 reply; 13+ messages in thread
From: Mitchell Blank Jr @ 2004-12-07  2:52 UTC (permalink / raw)
  To: Phil Oester; +Cc: shemminger, linux-net, linux-kernel

Phil Oester wrote:
> -       .poll =         datagram_poll,
> +       .poll =         udp_poll,
> 
> makes the Poptop server work again.
> 
> Any ideas?

That's very strange.  It would be helpful if you could gather:
  1. strace of the server, both working and broken
  2. a "tcpdump -nvv" of its udp traffic (ideally captured from a seperate
     server, but from the server would probably be OK too)

Most of the discussion of this change was on the netdev mailing list, it
would probably be best to send this information there.

-Mitch

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

* Re: Recent select() handling change breaks Poptop
  2004-12-07  2:52 ` Mitchell Blank Jr
@ 2004-12-07  4:53   ` Phil Oester
  2004-12-07  5:48     ` Mitchell Blank Jr
  0 siblings, 1 reply; 13+ messages in thread
From: Phil Oester @ 2004-12-07  4:53 UTC (permalink / raw)
  To: Mitchell Blank Jr; +Cc: shemminger, linux-net, linux-kernel

On Mon, Dec 06, 2004 at 06:52:18PM -0800, Mitchell Blank Jr wrote:
> That's very strange.  It would be helpful if you could gather:
>   1. strace of the server, both working and broken

Will work on it

>   2. a "tcpdump -nvv" of its udp traffic (ideally captured from a seperate
>      server, but from the server would probably be OK too)

PPTP uses TCP 1723 and GRE (proto 47), so there is no udp traffic involved.
I suspect the change was made to all datagram traffic with the assumption 
that UDP was the only protocol impacted.  Perhaps GRE was not considered?

Phil

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

* Re: Recent select() handling change breaks Poptop
  2004-12-07  4:53   ` Phil Oester
@ 2004-12-07  5:48     ` Mitchell Blank Jr
  2004-12-07 15:08       ` [PATCH] fix select() for SOCK_RAW sockets Mitchell Blank Jr
  0 siblings, 1 reply; 13+ messages in thread
From: Mitchell Blank Jr @ 2004-12-07  5:48 UTC (permalink / raw)
  To: Phil Oester; +Cc: shemminger, linux-net, linux-kernel, netdev

(adding netdev to cc:)

Phil Oester wrote:
> >   2. a "tcpdump -nvv" of its udp traffic (ideally captured from a seperate
> >      server, but from the server would probably be OK too)
> 
> PPTP uses TCP 1723 and GRE (proto 47), so there is no udp traffic involved.
> I suspect the change was made to all datagram traffic with the assumption 
> that UDP was the only protocol impacted.  Perhaps GRE was not considered?

Yeah, it looks like the problem for sure.  The patch modifies the
structure "inet_dgram_ops" to use udp_poll(), but looking farther down:

static struct inet_protosw inetsw_array[] =
[...]
                .type =       SOCK_DGRAM,
                .protocol =   IPPROTO_UDP,
                .prot =       &udp_prot,
                .ops =        &inet_dgram_ops,
[...]
               .type =       SOCK_RAW,
               .protocol =   IPPROTO_IP,        /* wild card */
               .prot =       &raw_prot,
               .ops =        &inet_dgram_ops,
[...]

so it looks like udp_poll() will end up getting used for both SOCK_DGRAM
and SOCK_RAW inet sockets; obviously Poptop is using the latter and failing
as a result.  No need for the strace/tcpdump data I guess.

The fix is to just make a copy of the inet_dgram_ops called inet_udp_ops
and make the udp_poll() change only in that one (and obviously change the
SOCK_DGRAM case there to use &inet_udp_ops).  I don't have time right this
second to spin a patch, but could you try that out and see if it fixes
your problem.

-Mitch

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

* [PATCH] fix select() for SOCK_RAW sockets
  2004-12-07  5:48     ` Mitchell Blank Jr
@ 2004-12-07 15:08       ` Mitchell Blank Jr
  2004-12-07 17:28         ` Phil Oester
                           ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Mitchell Blank Jr @ 2004-12-07 15:08 UTC (permalink / raw)
  To: Phil Oester, David S. Miller, shemminger; +Cc: linux-net, linux-kernel, netdev

Phil: Here's a real patch for you to test.  I actually left inet_dgram_ops
alone since it's an exported symbol (two of the users just want the .do_ioctl
value which is the same between SOCK_DGRAM and SOCK_RAW; the other is ipv6
where it's clearly dealing with a UDP socket -- therefore I think its safest
to leave inet_dgram_ops to have the UDP behavior)

Davem: I only tested that this doesn't break UDP; if it works for Phil and
Stephen can verify that it doesn't break his bad-checksum UDP tests then
please push it for 2.6.10.

Patch is versus 2.6.10-rc3.

Signed-off-by: Mitchell Blank Jr <mitch@sfgoth.com>

-Mitch
--- linux-2.6.10-rc3-VIRGIN/net/ipv4/af_inet.c	2004-12-07 06:37:52.480082706 -0800
+++ linux-2.6.10-rc3/net/ipv4/af_inet.c	2004-12-07 06:57:47.799013216 -0800
@@ -821,6 +821,31 @@
 	.sendpage =	inet_sendpage,
 };
 
+/*
+ * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without
+ * udp_poll
+ */
+static struct proto_ops inet_sockraw_ops = {
+	.family =	PF_INET,
+	.owner =	THIS_MODULE,
+	.release =	inet_release,
+	.bind =		inet_bind,
+	.connect =	inet_dgram_connect,
+	.socketpair =	sock_no_socketpair,
+	.accept =	sock_no_accept,
+	.getname =	inet_getname,
+	.poll =		datagram_poll,
+	.ioctl =	inet_ioctl,
+	.listen =	sock_no_listen,
+	.shutdown =	inet_shutdown,
+	.setsockopt =	sock_common_setsockopt,
+	.getsockopt =	sock_common_getsockopt,
+	.sendmsg =	inet_sendmsg,
+	.recvmsg =	sock_common_recvmsg,
+	.mmap =		sock_no_mmap,
+	.sendpage =	inet_sendpage,
+};
+
 static struct net_proto_family inet_family_ops = {
 	.family = PF_INET,
 	.create = inet_create,
@@ -861,7 +886,7 @@
                .type =       SOCK_RAW,
                .protocol =   IPPROTO_IP,	/* wild card */
                .prot =       &raw_prot,
-               .ops =        &inet_dgram_ops,
+               .ops =        &inet_sockraw_ops,
                .capability = CAP_NET_RAW,
                .no_check =   UDP_CSUM_DEFAULT,
                .flags =      INET_PROTOSW_REUSE,

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

* Re: [PATCH] fix select() for SOCK_RAW sockets
  2004-12-07 15:08       ` [PATCH] fix select() for SOCK_RAW sockets Mitchell Blank Jr
@ 2004-12-07 17:28         ` Phil Oester
  2004-12-07 17:35         ` YOSHIFUJI Hideaki / 吉藤英明
                           ` (2 subsequent siblings)
  3 siblings, 0 replies; 13+ messages in thread
From: Phil Oester @ 2004-12-07 17:28 UTC (permalink / raw)
  To: Mitchell Blank Jr
  Cc: David S. Miller, shemminger, linux-net, linux-kernel, netdev

On Tue, Dec 07, 2004 at 07:08:34AM -0800, Mitchell Blank Jr wrote:
> Phil: Here's a real patch for you to test.  I actually left inet_dgram_ops
> alone since it's an exported symbol (two of the users just want the .do_ioctl
> value which is the same between SOCK_DGRAM and SOCK_RAW; the other is ipv6
> where it's clearly dealing with a UDP socket -- therefore I think its safest
> to leave inet_dgram_ops to have the UDP behavior)
> 
> Davem: I only tested that this doesn't break UDP; if it works for Phil and
> Stephen can verify that it doesn't break his bad-checksum UDP tests then
> please push it for 2.6.10.

Yup, that does indeed fix it for me, thanks.

Phil



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

* Re: [PATCH] fix select() for SOCK_RAW sockets
  2004-12-07 15:08       ` [PATCH] fix select() for SOCK_RAW sockets Mitchell Blank Jr
  2004-12-07 17:28         ` Phil Oester
@ 2004-12-07 17:35         ` YOSHIFUJI Hideaki / 吉藤英明
  2004-12-07 18:01           ` [PATCH] fix select() for SOCK_RAW sockets (ipv6) Stephen Hemminger
  2004-12-07 17:45         ` [PATCH] fix select() for SOCK_RAW sockets Stephen Hemminger
  2004-12-08  5:28         ` David S. Miller
  3 siblings, 1 reply; 13+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2004-12-07 17:35 UTC (permalink / raw)
  To: mitch; +Cc: kernel, davem, shemminger, linux-net, linux-kernel, netdev,
	yoshfuji

In article <20041207150834.GA75700@gaz.sfgoth.com> (at Tue, 7 Dec 2004 07:08:34 -0800), Mitchell Blank Jr <mitch@sfgoth.com> says:

> Phil: Here's a real patch for you to test.  I actually left inet_dgram_ops
> alone since it's an exported symbol (two of the users just want the .do_ioctl
> value which is the same between SOCK_DGRAM and SOCK_RAW; the other is ipv6
> where it's clearly dealing with a UDP socket -- therefore I think its safest
> to leave inet_dgram_ops to have the UDP behavior)

Probably, we need to do the same for ipv6, don't we?

--yoshfuji

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

* Re: [PATCH] fix select() for SOCK_RAW sockets
  2004-12-07 15:08       ` [PATCH] fix select() for SOCK_RAW sockets Mitchell Blank Jr
  2004-12-07 17:28         ` Phil Oester
  2004-12-07 17:35         ` YOSHIFUJI Hideaki / 吉藤英明
@ 2004-12-07 17:45         ` Stephen Hemminger
  2004-12-08  5:28         ` David S. Miller
  3 siblings, 0 replies; 13+ messages in thread
From: Stephen Hemminger @ 2004-12-07 17:45 UTC (permalink / raw)
  To: Mitchell Blank Jr
  Cc: Phil Oester, David S. Miller, linux-net, linux-kernel, netdev

On Tue, 7 Dec 2004 07:08:34 -0800
Mitchell Blank Jr <mitch@sfgoth.com> wrote:

> Phil: Here's a real patch for you to test.  I actually left inet_dgram_ops
> alone since it's an exported symbol (two of the users just want the .do_ioctl
> value which is the same between SOCK_DGRAM and SOCK_RAW; the other is ipv6
> where it's clearly dealing with a UDP socket -- therefore I think its safest
> to leave inet_dgram_ops to have the UDP behavior)
> 
> Davem: I only tested that this doesn't break UDP; if it works for Phil and
> Stephen can verify that it doesn't break his bad-checksum UDP tests then
> please push it for 2.6.10.
> 

Thanks, I'll retest UDP today, but it looks right.

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

* [PATCH] fix select() for SOCK_RAW sockets (ipv6)
  2004-12-07 17:35         ` YOSHIFUJI Hideaki / 吉藤英明
@ 2004-12-07 18:01           ` Stephen Hemminger
  2004-12-07 18:48             ` David S. Miller
  0 siblings, 1 reply; 13+ messages in thread
From: Stephen Hemminger @ 2004-12-07 18:01 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki / ____________
  Cc: mitch, kernel, davem, linux-net, linux-kernel, netdev, yoshfuji

> Probably, we need to do the same for ipv6, don't we?

diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
--- a/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
+++ b/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
@@ -513,6 +513,27 @@
 	.sendpage =	sock_no_sendpage,
 };
 
+struct proto_ops inet6_raw_ops = {
+	.family =	PF_INET6,
+	.owner =	THIS_MODULE,
+	.release =	inet6_release,
+	.bind =		inet6_bind,
+	.connect =	inet_dgram_connect,		/* ok		*/
+	.socketpair =	sock_no_socketpair,		/* a do nothing	*/
+	.accept =	sock_no_accept,			/* a do nothing	*/
+	.getname =	inet6_getname, 
+	.poll =		datagram_poll,			/* ok		*/
+	.ioctl =	inet6_ioctl,			/* must change  */
+	.listen =	sock_no_listen,			/* ok		*/
+	.shutdown =	inet_shutdown,			/* ok		*/
+	.setsockopt =	sock_common_setsockopt,		/* ok		*/
+	.getsockopt =	sock_common_getsockopt,		/* ok		*/
+	.sendmsg =	inet_sendmsg,			/* ok		*/
+	.recvmsg =	sock_common_recvmsg,		/* ok		*/
+	.mmap =		sock_no_mmap,
+	.sendpage =	sock_no_sendpage,
+};
+
 static struct net_proto_family inet6_family_ops = {
 	.family = PF_INET6,
 	.create = inet6_create,
@@ -528,7 +549,7 @@
 	.type		= SOCK_RAW,
 	.protocol	= IPPROTO_IP,	/* wild card */
 	.prot		= &rawv6_prot,
-	.ops		= &inet6_dgram_ops,
+	.ops		= &inet6_raw_ops,
 	.capability	= CAP_NET_RAW,
 	.no_check	= UDP_CSUM_DEFAULT,
 	.flags		= INET_PROTOSW_REUSE,

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

* Re: [PATCH] fix select() for SOCK_RAW sockets (ipv6)
  2004-12-07 18:01           ` [PATCH] fix select() for SOCK_RAW sockets (ipv6) Stephen Hemminger
@ 2004-12-07 18:48             ` David S. Miller
  2004-12-07 18:56               ` Stephen Hemminger
  2004-12-08  7:58               ` YOSHIFUJI Hideaki / 吉藤英明
  0 siblings, 2 replies; 13+ messages in thread
From: David S. Miller @ 2004-12-07 18:48 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: yoshfuji, mitch, kernel, linux-net, linux-kernel, netdev

On Tue, 7 Dec 2004 10:01:40 -0800
Stephen Hemminger <shemminger@osdl.org> wrote:

> > Probably, we need to do the same for ipv6, don't we?
> 
> diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
> --- a/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
> +++ b/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
> @@ -513,6 +513,27 @@

We didn't do the "UDP select() fix" on ipv6 because we don't
have the delayed checksumming optimization there.  So the
ipv6 side really doesn't need this change.

Or did I miss something?

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

* Re: [PATCH] fix select() for SOCK_RAW sockets (ipv6)
  2004-12-07 18:48             ` David S. Miller
@ 2004-12-07 18:56               ` Stephen Hemminger
  2004-12-08  7:58               ` YOSHIFUJI Hideaki / 吉藤英明
  1 sibling, 0 replies; 13+ messages in thread
From: Stephen Hemminger @ 2004-12-07 18:56 UTC (permalink / raw)
  To: David S. Miller; +Cc: yoshfuji, mitch, kernel, linux-net, linux-kernel, netdev

On Tue, 7 Dec 2004 10:48:15 -0800
"David S. Miller" <davem@davemloft.net> wrote:

> On Tue, 7 Dec 2004 10:01:40 -0800
> Stephen Hemminger <shemminger@osdl.org> wrote:
> 
> > > Probably, we need to do the same for ipv6, don't we?
> > 
> > diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
> > --- a/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
> > +++ b/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
> > @@ -513,6 +513,27 @@
> 
> We didn't do the "UDP select() fix" on ipv6 because we don't
> have the delayed checksumming optimization there.  So the
> ipv6 side really doesn't need this change.
> 
> Or did I miss something?

yeah, didn't look that deeply.

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

* Re: [PATCH] fix select() for SOCK_RAW sockets
  2004-12-07 15:08       ` [PATCH] fix select() for SOCK_RAW sockets Mitchell Blank Jr
                           ` (2 preceding siblings ...)
  2004-12-07 17:45         ` [PATCH] fix select() for SOCK_RAW sockets Stephen Hemminger
@ 2004-12-08  5:28         ` David S. Miller
  3 siblings, 0 replies; 13+ messages in thread
From: David S. Miller @ 2004-12-08  5:28 UTC (permalink / raw)
  To: Mitchell Blank Jr; +Cc: kernel, shemminger, linux-net, linux-kernel, netdev

On Tue, 7 Dec 2004 07:08:34 -0800
Mitchell Blank Jr <mitch@sfgoth.com> wrote:

> Davem: I only tested that this doesn't break UDP; if it works for Phil and
> Stephen can verify that it doesn't break his bad-checksum UDP tests then
> please push it for 2.6.10.

Looks good Mitchell, patch applied.

Thanks.

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

* Re: [PATCH] fix select() for SOCK_RAW sockets (ipv6)
  2004-12-07 18:48             ` David S. Miller
  2004-12-07 18:56               ` Stephen Hemminger
@ 2004-12-08  7:58               ` YOSHIFUJI Hideaki / 吉藤英明
  1 sibling, 0 replies; 13+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2004-12-08  7:58 UTC (permalink / raw)
  To: davem; +Cc: shemminger, mitch, kernel, linux-net, linux-kernel, netdev,
	yoshfuji

In article <20041207104815.3f7a4684.davem@davemloft.net> (at Tue, 7 Dec 2004 10:48:15 -0800), "David S. Miller" <davem@davemloft.net> says:

> On Tue, 7 Dec 2004 10:01:40 -0800
> Stephen Hemminger <shemminger@osdl.org> wrote:
> 
> > > Probably, we need to do the same for ipv6, don't we?
> > 
> > diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
> > --- a/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
> > +++ b/net/ipv6/af_inet6.c	2004-12-07 10:02:50 -08:00
> > @@ -513,6 +513,27 @@
> 
> We didn't do the "UDP select() fix" on ipv6 because we don't
> have the delayed checksumming optimization there.  So the
> ipv6 side really doesn't need this change.

Ok, thanks for the explanation.

--yoshfuji @ Strasbourg


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

end of thread, other threads:[~2004-12-08  7:57 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-12-07  0:35 Recent select() handling change breaks Poptop Phil Oester
2004-12-07  2:52 ` Mitchell Blank Jr
2004-12-07  4:53   ` Phil Oester
2004-12-07  5:48     ` Mitchell Blank Jr
2004-12-07 15:08       ` [PATCH] fix select() for SOCK_RAW sockets Mitchell Blank Jr
2004-12-07 17:28         ` Phil Oester
2004-12-07 17:35         ` YOSHIFUJI Hideaki / 吉藤英明
2004-12-07 18:01           ` [PATCH] fix select() for SOCK_RAW sockets (ipv6) Stephen Hemminger
2004-12-07 18:48             ` David S. Miller
2004-12-07 18:56               ` Stephen Hemminger
2004-12-08  7:58               ` YOSHIFUJI Hideaki / 吉藤英明
2004-12-07 17:45         ` [PATCH] fix select() for SOCK_RAW sockets Stephen Hemminger
2004-12-08  5:28         ` David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox