rx-send-error-code-propagation-20050915
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 16 Sep 2005 03:27:15 +0000 (03:27 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 16 Sep 2005 03:27:15 +0000 (03:27 +0000)
* add a version of rxi_DebugPrint for Windows that uses OutputDebugString

* migrate all printf statements to the dpf macro

* stop masking the errors from rx_sendmsg() so that higher level functions
  can make decisions based upon the failure.

* Windows reports EHOSTUNREACHABLE.  Similar to Linux, if it is reported
  reset the send packet start time to 0 in order to immediately cause the
  server to be marked down.

src/rx/rx.c
src/rx/rx_clock_nt.c
src/rx/rx_getaddr.c
src/rx/rx_globals.h
src/rx/rx_kcommon.c
src/rx/rx_packet.c
src/rx/rx_pthread.c
src/rx/rx_xmit_nt.c

index 7b44ff6..d24ee60 100644 (file)
@@ -6033,6 +6033,21 @@ rxi_DebugPrint(char *format, int a1, int a2, int a3, int a4, int a5, int a6,
               int a7, int a8, int a9, int a10, int a11, int a12, int a13,
               int a14, int a15)
 {
+#ifdef AFS_NT40_ENV
+    char msg[512];
+    int len;
+
+    len = _snprintf(msg, sizeof(msg)-2, 
+                   format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, 
+                   a11, a12, a13, a14, a15);
+    if (len > 0) {
+       if (msg[len-1] != '\n') {
+           msg[len] = '\n';
+           msg[len+1] = '\0';
+       }
+       OutputDebugString(msg);
+    }
+#else
     struct clock now;
     clock_GetTime(&now);
     fprintf(rx_Log, " %u.%.3u:", (unsigned int)now.sec,
@@ -6040,10 +6055,9 @@ rxi_DebugPrint(char *format, int a1, int a2, int a3, int a4, int a5, int a6,
     fprintf(rx_Log, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12,
            a13, a14, a15);
     putc('\n', rx_Log);
-}
 #endif
+}
 
-#ifdef RXDEBUG
 /*
  * This function is used to process the rx_stats structure that is local
  * to a process as well as an rx_stats structure received from a remote
index a449a4e..cab18d4 100644 (file)
@@ -47,7 +47,7 @@ void
 clock_Init(void)
 {
     if (!QueryPerformanceFrequency(&rxi_clockFreq)) {
-       printf("No High Performance clock, exiting.\n");
+       OutputDebugString("No High Performance clock, exiting.\n");
        exit(1);
     }
 
index ac30057..bf67a62 100644 (file)
@@ -169,7 +169,7 @@ rx_getAllAddr(afs_int32 buffer[], int maxSize)
     while (next < lim) {
        ifm = (struct if_msghdr *)next;
        if (ifm->ifm_type != RTM_IFINFO) {
-           printf("out of sync parsing NET_RT_IFLIST\n");
+           dpf(("out of sync parsing NET_RT_IFLIST\n"));
            free(buf);
            return 0;
        }
@@ -204,8 +204,8 @@ rx_getAllAddr(afs_int32 buffer[], int maxSize)
            a = info.rti_info[RTAX_IFA];
 
            if (count >= maxSize)       /* no more space */
-               printf("Too many interfaces..ignoring 0x%x\n",
-                      a->sin_addr.s_addr);
+               dpf(("Too many interfaces..ignoring 0x%x\n",
+                      a->sin_addr.s_addr));
            else
                buffer[count++] = a->sin_addr.s_addr;
            addrcount--;
@@ -253,7 +253,7 @@ rxi_getAllAddrMaskMtu(afs_int32 addrBuffer[], afs_int32 maskBuffer[],
     while (next < lim) {
        ifm = (struct if_msghdr *)next;
        if (ifm->ifm_type != RTM_IFINFO) {
-           printf("out of sync parsing NET_RT_IFLIST\n");
+           dpf(("out of sync parsing NET_RT_IFLIST\n"));
            free(buf);
            return 0;
        }
@@ -286,8 +286,8 @@ rxi_getAllAddrMaskMtu(afs_int32 addrBuffer[], afs_int32 maskBuffer[],
 
            if (a->sin_addr.s_addr != htonl(0x7f000001) ) {
                if (count >= maxSize) { /* no more space */
-                   printf("Too many interfaces..ignoring 0x%x\n",
-                          a->sin_addr.s_addr);
+                   dpf(("Too many interfaces..ignoring 0x%x\n",
+                          a->sin_addr.s_addr));
                } else {
                    struct ifreq ifr;
                    
@@ -381,8 +381,8 @@ rx_getAllAddr_internal(afs_int32 buffer[], int maxSize, int loopbacks)
                    continue;   /* skip aliased loopbacks as well. */
            }
            if (count >= maxSize)       /* no more space */
-               printf("Too many interfaces..ignoring 0x%x\n",
-                      a->sin_addr.s_addr);
+               dpf(("Too many interfaces..ignoring 0x%x\n",
+                      a->sin_addr.s_addr));
            else
                buffer[count++] = a->sin_addr.s_addr;
        }
@@ -462,8 +462,8 @@ rxi_getAllAddrMaskMtu(afs_int32 addrBuffer[], afs_int32 maskBuffer[],
                 continue;   /* skip loopback address as well. */
 
            if (count >= maxSize) {     /* no more space */
-               printf("Too many interfaces..ignoring 0x%x\n",
-                      a->sin_addr.s_addr);
+               dpf("Too many interfaces..ignoring 0x%x\n",
+                      a->sin_addr.s_addr));
                continue;
            }
 
index a2a1172..90fd15e 100644 (file)
@@ -507,7 +507,11 @@ EXT FILE *rx_debugFile;            /* Set by the user to a stdio file for debugging output
 EXT FILE *rxevent_debugFile;   /* Set to an stdio descriptor for event logging to that file */
 
 #define rx_Log rx_debugFile
+#ifdef AFS_NT40_ENV
+#define dpf(args) rxi_DebugPrint args; 
+#else
 #define dpf(args) if (rx_debugFile) rxi_DebugPrint args; else
+#endif
 #define rx_Log_event rxevent_debugFile
 
 EXT char *rx_packetTypes[RX_N_PACKET_TYPES] INIT(RX_PACKET_TYPES);     /* Strings defined in rx.h */
index b469bac..9120442 100644 (file)
@@ -126,7 +126,7 @@ osi_Panic(msg, a1, a2, a3)
     if (!msg)
        msg = "Unknown AFS panic";
 
-    printf(msg, a1, a2, a3);
+    dpf(msg, a1, a2, a3));
 #ifdef AFS_LINUX24_ENV
     BUG();
 #else
@@ -316,7 +316,7 @@ MyPacketProc(char **ahandle, int asize)
        rx_stats.bogusPacketOnRead++;
        MUTEX_EXIT(&rx_stats_mutex);
        /* I DON"T LIKE THIS PRINTF -- PRINTFS MAKE THINGS VERY VERY SLOOWWW */
-       printf("rx: packet dropped: bad ulen=%d\n", asize);
+       dpf(("rx: packet dropped: bad ulen=%d\n", asize));
        tp = NULL;
     }
 
@@ -495,7 +495,7 @@ shutdown_rxkernel(void)
            rxk_shutdownPorts();
            return;
        }
-    printf("shutdown_rxkernel: no udp proto");
+    dpf(("shutdown_rxkernel: no udp proto"));
 }
 #endif /* !AIX && !SUN && !NCR  && !UKERNEL */
 
@@ -864,7 +864,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     code = sobind(newSocket, (struct sockaddr *)&myaddr);
 #endif
     if (code) {
-       printf("sobind fails (%d)\n", (int)code);
+       dpf(("sobind fails (%d)\n", (int)code));
        soclose(newSocket);
        AFS_GLOCK();
        goto bad;
@@ -891,7 +891,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     code = sobind(newSocket, nam);
 #endif
     if (code) {
-       printf("sobind fails (%d)\n", (int)code);
+       dpf(("sobind fails (%d)\n", (int)code));
        soclose(newSocket);
 #ifndef AFS_SGI65_ENV
        m_freem(nam);
index 84a55c7..f0a8fe9 100644 (file)
@@ -1472,6 +1472,7 @@ osi_NetSend(osi_socket socket, void *addr, struct iovec *dvec, int nvecs,
            int length, int istack)
 {
     struct msghdr msg;
+       int ret;
 
     memset(&msg, 0, sizeof(msg));
     msg.msg_iov = dvec;
@@ -1479,9 +1480,9 @@ osi_NetSend(osi_socket socket, void *addr, struct iovec *dvec, int nvecs,
     msg.msg_name = addr;
     msg.msg_namelen = sizeof(struct sockaddr_in);
 
-    rxi_Sendmsg(socket, &msg, 0);
+    ret = rxi_Sendmsg(socket, &msg, 0);
 
-    return 0;
+    return ret;
 }
 #elif !defined(UKERNEL)
 /*
@@ -2134,6 +2135,15 @@ rxi_SendPacket(struct rx_call *call, struct rx_connection *conn,
            clock_Addmsec(&(p->retryTime),
                          10 + (((afs_uint32) p->backoff) << 8));
 
+#ifdef AFS_NT40_ENV
+           /* Windows is nice -- it can tell us right away that we cannot
+            * reach this recipient by returning an WSAEHOSTUNREACH error
+            * code.  So, when this happens let's "down" the host NOW so
+            * we don't sit around waiting for this host to timeout later.
+            */
+               if (call && code == -1 && errno == WSAEHOSTUNREACH)
+                       call->lastReceiveTime = 0;
+#endif
 #if defined(KERNEL) && defined(AFS_LINUX20_ENV)
            /* Linux is nice -- it can tell us right away that we cannot
             * reach this recipient by returning an ENETUNREACH error
index c0e4329..d67a691 100644 (file)
@@ -96,7 +96,7 @@ server_entry(void *argp)
 {
     void (*server_proc) () = (void (*)())argp;
     server_proc();
-    printf("rx_pthread.c: server_entry: Server proc returned unexpectedly\n");
+    dpf(("rx_pthread.c: server_entry: Server proc returned unexpectedly\n"));
     exit(1);
     return (void *)0;
 }
@@ -112,13 +112,13 @@ rxi_StartServerProc(void (*proc) (void), int stacksize)
     AFS_SIGSET_DECL;
 
     if (pthread_attr_init(&tattr) != 0) {
-       printf("Unable to Create Rx server thread (pthread_attr_init)\n");
+       dpf(("Unable to Create Rx server thread (pthread_attr_init)\n"));
        exit(1);
     }
 
     if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) != 0) {
-       printf
-           ("Unable to Create Rx server thread (pthread_attr_setdetachstate)\n");
+       dpf
+           (("Unable to Create Rx server thread (pthread_attr_setdetachstate)\n"));
        exit(1);
     }
 
@@ -127,7 +127,7 @@ rxi_StartServerProc(void (*proc) (void), int stacksize)
      */
     AFS_SIGSET_CLEAR();
     if (pthread_create(&thread, &tattr, server_entry, (void *)proc) != 0) {
-       printf("Unable to Create Rx server thread\n");
+       dpf(("Unable to Create Rx server thread\n"));
        exit(1);
     }
     AFS_SIGSET_RESTORE();
@@ -220,7 +220,7 @@ rxi_ListenerProc(int sock, int *tnop, struct rx_call **newcallp)
        } else {
            if (!(p = rxi_AllocPacket(RX_PACKET_CLASS_RECEIVE))) {
                /* Could this happen with multiple socket listeners? */
-               printf("rxi_Listener: no packets!");    /* Shouldn't happen */
+               dpf(("rxi_Listener: no packets!"));     /* Shouldn't happen */
                exit(1);
            }
        }
@@ -323,21 +323,21 @@ rxi_StartListener(void)
     AFS_SIGSET_DECL;
 
     if (pthread_attr_init(&tattr) != 0) {
-       printf
-           ("Unable to create Rx event handling thread (pthread_attr_init)\n");
+       dpf
+           (("Unable to create Rx event handling thread (pthread_attr_init)\n"));
        exit(1);
     }
 
     if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) != 0) {
-       printf
-           ("Unable to create Rx event handling thread (pthread_attr_setdetachstate)\n");
+       dpf
+           (("Unable to create Rx event handling thread (pthread_attr_setdetachstate)\n"));
        exit(1);
     }
 
     AFS_SIGSET_CLEAR();
     if (pthread_create(&event_handler_thread, &tattr, event_handler, NULL) !=
        0) {
-       printf("Unable to create Rx event handling thread\n");
+       dpf(("Unable to create Rx event handling thread\n"));
        exit(1);
     }
     MUTEX_ENTER(&rx_stats_mutex);
@@ -363,20 +363,20 @@ rxi_Listen(osi_socket sock)
     AFS_SIGSET_DECL;
 
     if (pthread_attr_init(&tattr) != 0) {
-       printf
-           ("Unable to create socket listener thread (pthread_attr_init)\n");
+       dpf
+           (("Unable to create socket listener thread (pthread_attr_init)\n"));
        exit(1);
     }
 
     if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) != 0) {
-       printf
-           ("Unable to create socket listener thread (pthread_attr_setdetachstate)\n");
+       dpf
+           (("Unable to create socket listener thread (pthread_attr_setdetachstate)\n"));
        exit(1);
     }
 
     AFS_SIGSET_CLEAR();
     if (pthread_create(&thread, &tattr, rx_ListenerProc, (void *)sock) != 0) {
-       printf("Unable to create socket listener thread\n");
+       dpf(("Unable to create socket listener thread\n"));
        exit(1);
     }
     MUTEX_ENTER(&rx_stats_mutex);
@@ -415,8 +415,9 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 #else
     if (ret == -1) {
 #endif
-       printf("rxi_sendmsg failed, error %d\n", errno);
+       dpf(("rxi_sendmsg failed, error %d\n", errno));
        fflush(stdout);
+       return -1;
     }
     return 0;
 }
index 8ce42e5..4e8d7ef 100644 (file)
@@ -139,12 +139,15 @@ sendmsg(int socket, struct msghdr *msgP, int flags)
        case WSAEWOULDBLOCK:
            errno = WSAEWOULDBLOCK;
            break;
+       case WSAEHOSTUNREACH:
+               errno = WSAEHOSTUNREACH;
+               break;
        default:
            errno = EIO;
            break;
        }
        code = -1;
-    }
+    } else
 #endif /* AFS_NT40_ENV */
 
     if (code < size) {