q3server

Matthew Dillon dillon at apollo.backplane.com
Sun Apr 4 16:12:23 PDT 2004


    Here's what I get:

  ...
  1428 q3ded    CALL  gettimeofday(0xbfbfeea4,0)
  1428 q3ded    RET   gettimeofday 0
  1428 q3ded    CALL  read(0,0xbfbfb987,0x1)
  1428 q3ded    RET   read -1 errno 11 Resource deadlock avoided
  1428 q3ded    CALL  linux_socketcall(0xc,0xbfbfb998)
  1428 q3ded    GIO   fd 12 read 16 bytes
       "\M^?\M^?\M^?\M^?getchallenge"
  1428 q3ded    RET   linux_socketcall 16/0x10
  1428 q3ded    CALL  gettimeofday(0xbfbfba00,0)
  1428 q3ded    RET   gettimeofday 0
  1428 q3ded    CALL  linux_socketcall(0xb,0xbfbf74f8)
  1428 q3ded    RET   linux_socketcall -1 errno 92 Unknown error: 92
  1428 q3ded    CALL  write(0x2,0xbfbf64e8,0x43)
  1428 q3ded    GIO   fd 2 wrote 67 bytes
       "NET_SendPacket ERROR: Protocol not available to 192.168.0.69:27960
       "
  1428 q3ded    RET   write 67/0x43
  1428 q3ded    CALL  write(0xd,0xbfbf64e8,0x43)
  1428 q3ded    GIO   fd 13 wrote 67 bytes
       "NET_SendPacket ERROR: Protocol not available to 192.168.0.69:27960
       "

    So, a linux_socketcall(0xb = LINUX_SENDTO, ...) is failing with error
    code 92.  Error code 92 == BSD error code 42 == ENOPROTOOPT.

    I think the problem is that the linux_sendto() code is incorrectly
    aborting when the IPPROTO_IP/IP_HDRINCL socket opt fails.  FreeBSD-4
    does not do this, it simply assumes that IP_HDRINCL is not set.

    Sascha, please try the below patch and tell us if it fixes the 
    q3 problem.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>

Index: linux_socket.c
===================================================================
RCS file: /cvs/src/sys/emulation/linux/linux_socket.c,v
retrieving revision 1.16
diff -u -r1.16 linux_socket.c
--- linux_socket.c	9 Jan 2004 21:49:30 -0000	1.16
+++ linux_socket.c	4 Apr 2004 23:10:56 -0000
@@ -677,9 +677,8 @@
 	sopt.sopt_valsize = sizeof(optval);
 	sopt.sopt_td = NULL;
 
-	error = kern_getsockopt(linux_args.s, &sopt);
-	if (error)
-		return (error);
+	if (kern_getsockopt(linux_args.s, &sopt) != 0)
+		optval = 0;
 
 	if (optval == 0) {
 		/*





More information about the Bugs mailing list