rx: Remove idleDeadDetection
[openafs.git] / src / rx / rx.c
index 338e3a6..63859eb 100644 (file)
@@ -1137,7 +1137,6 @@ void
 rx_SetConnIdleDeadTime(struct rx_connection *conn, int seconds)
 {
     conn->idleDeadTime = seconds;
-    conn->idleDeadDetection = (seconds ? 1 : 0);
     rxi_CheckConnTimeouts(conn);
 }
 
@@ -1803,7 +1802,6 @@ rx_NewServiceHost(afs_uint32 host, u_short port, u_short serviceId,
            service->minProcs = 0;
            service->maxProcs = 1;
            service->idleDeadTime = 60;
-           service->idleDeadErr = 0;
            service->connDeadTime = rx_connDeadTime;
            service->executeRequestProc = serviceProc;
            service->checkReach = 0;
@@ -2888,7 +2886,7 @@ rxi_SetPeerMtu(struct rx_peer *peer, afs_uint32 host, afs_uint32 port, int mtu)
        if (peer->ifMTU < OLD_MAX_PACKET_SIZE)
            peer->maxDgramPackets = 1;
        /* We no longer have valid peer packet information */
-       if (peer->maxPacketSize-RX_IPUDP_SIZE > peer->ifMTU)
+       if (peer->maxPacketSize + RX_HEADER_SIZE > peer->ifMTU)
            peer->maxPacketSize = 0;
         MUTEX_EXIT(&peer->peer_lock);
 
@@ -3159,8 +3157,7 @@ rxi_FindConnection(osi_socket socket, afs_uint32 host,
        conn->nSpecific = 0;
        conn->specific = NULL;
        rx_SetConnDeadTime(conn, service->connDeadTime);
-       conn->idleDeadTime = service->idleDeadTime;
-       conn->idleDeadDetection = service->idleDeadErr ? 1 : 0;
+       rx_SetConnIdleDeadTime(conn, service->idleDeadTime);
        for (i = 0; i < RX_MAXCALLS; i++) {
            conn->twind[i] = rx_initSendWindow;
            conn->rwind[i] = rx_initReceiveWindow;
@@ -3494,6 +3491,7 @@ rxi_ReceivePacket(struct rx_packet *np, osi_socket socket,
        addr.sin_family = AF_INET;
        addr.sin_port = port;
        addr.sin_addr.s_addr = host;
+       memset(&addr.sin_zero, 0, sizeof(addr.sin_zero));
 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
        addr.sin_len = sizeof(addr);
 #endif /* AFS_OSF_ENV */
@@ -4395,12 +4393,12 @@ rxi_ReceiveAckPacket(struct rx_call *call, struct rx_packet *np,
         * but we are clearly receiving.
         */
        if (!peer->maxPacketSize)
-           peer->maxPacketSize = RX_MIN_PACKET_SIZE+RX_IPUDP_SIZE;
+           peer->maxPacketSize = RX_MIN_PACKET_SIZE - RX_HEADER_SIZE;
 
        if (pktsize > peer->maxPacketSize) {
            peer->maxPacketSize = pktsize;
-           if ((pktsize-RX_IPUDP_SIZE > peer->ifMTU)) {
-               peer->ifMTU=pktsize-RX_IPUDP_SIZE;
+           if ((pktsize + RX_HEADER_SIZE > peer->ifMTU)) {
+               peer->ifMTU = pktsize + RX_HEADER_SIZE;
                peer->natMTU = rxi_AdjustIfMTU(peer->ifMTU);
                rxi_ScheduleGrowMTUEvent(call, 1);
            }
@@ -4805,6 +4803,16 @@ rxi_ReceiveResponsePacket(struct rx_connection *conn,
     if (RXS_CheckAuthentication(conn->securityObject, conn) == 0)
        return np;
 
+    if (!conn->securityChallengeSent) {
+       /* We've never sent out a challenge for this connection, so this
+        * response cannot possibly be correct; ignore it. This can happen
+        * if we sent a challenge to the client, then we were restarted, and
+        * then the client sent us a response. If we ignore the response, the
+        * client will eventually resend a data packet, causing us to send a
+        * new challenge and the client to send a new response. */
+       return np;
+    }
+
     /* Otherwise, have the security object evaluate the response packet */
     error = RXS_CheckResponse(conn->securityObject, conn, np);
     if (error) {
@@ -5414,7 +5422,6 @@ rxi_ResetCall(struct rx_call *call, int newcall)
     call->rprev = 0;
     call->lastAcked = 0;
     call->localStatus = call->remoteStatus = 0;
-    call->lastSendData = 0;
 
     if (flags & RX_CALL_READER_WAIT) {
 #ifdef RX_ENABLE_LOCKS
@@ -5520,7 +5527,7 @@ rxi_SendAck(struct rx_call *call,
         */
        if (call->conn->peer->maxPacketSize &&
            (call->conn->peer->maxPacketSize < OLD_MAX_PACKET_SIZE
-            +RX_IPUDP_SIZE))
+            - RX_HEADER_SIZE))
            padbytes = call->conn->peer->maxPacketSize+16;
        else
            padbytes = call->conn->peer->maxMTU + 128;
@@ -5850,9 +5857,6 @@ rxi_SendList(struct rx_call *call, struct xmitlist *xmit,
      * processing), and for the connection (so that we can discover
      * idle connections) */
     conn->lastSendTime = call->lastSendTime = clock_Sec();
-    /* Let a set of retransmits trigger an idle timeout */
-    if (!xmit->resending)
-       call->lastSendData = call->lastSendTime;
 }
 
 /* When sending packets we need to follow these rules:
@@ -6288,12 +6292,6 @@ rxi_Send(struct rx_call *call, struct rx_packet *p,
        (p->length <= (rx_AckDataSize(call->rwind) + 4 * sizeof(afs_int32))))
     {
        conn->lastSendTime = call->lastSendTime = clock_Sec();
-       /* Don't count keepalive ping/acks here, so idleness can be tracked. */
-       if ((p->header.type != RX_PACKET_TYPE_ACK) ||
-           ((((struct rx_ackPacket *)rx_DataOf(p))->reason != RX_ACK_PING) &&
-            (((struct rx_ackPacket *)rx_DataOf(p))->reason !=
-             RX_ACK_PING_RESPONSE)))
-           call->lastSendData = call->lastSendTime;
     }
 }
 
@@ -6362,33 +6360,6 @@ rxi_CheckCall(struct rx_call *call, int haveCTLock)
      * number of seconds. */
     if (now > (call->lastReceiveTime + deadTime)) {
        if (call->state == RX_STATE_ACTIVE) {
-#ifdef AFS_ADAPT_PMTU
-# if defined(KERNEL) && defined(AFS_SUN5_ENV)
-           ire_t *ire;
-#  if defined(AFS_SUN510_ENV) && defined(GLOBAL_NETSTACKID)
-           netstack_t *ns = netstack_find_by_stackid(GLOBAL_NETSTACKID);
-           ip_stack_t *ipst = ns->netstack_ip;
-#  endif
-           ire = ire_cache_lookup(conn->peer->host
-#  if defined(AFS_SUN510_ENV) && defined(ALL_ZONES)
-                                  , ALL_ZONES
-#    if defined(ICL_3_ARG) || defined(GLOBAL_NETSTACKID)
-                                  , NULL
-#     if defined(GLOBAL_NETSTACKID)
-                                  , ipst
-#     endif
-#    endif
-#  endif
-               );
-
-           if (ire && ire->ire_max_frag > 0)
-               rxi_SetPeerMtu(NULL, conn->peer->host, 0,
-                              ire->ire_max_frag);
-#  if defined(GLOBAL_NETSTACKID)
-           netstack_rele(ns);
-#  endif
-# endif
-#endif /* AFS_ADAPT_PMTU */
            cerror = RX_CALL_DEAD;
            goto mtuout;
        } else {
@@ -6418,29 +6389,18 @@ rxi_CheckCall(struct rx_call *call, int haveCTLock)
         * attached process can die reasonably gracefully. */
     }
 
-    if (conn->idleDeadDetection) {
-        if (conn->idleDeadTime) {
-            idleDeadTime = conn->idleDeadTime + fudgeFactor;
-        }
-
-        if (idleDeadTime) {
-            /* see if we have a non-activity timeout */
-            if (call->startWait && ((call->startWait + idleDeadTime) < now) &&
-                (call->flags & RX_CALL_READER_WAIT)) {
-                if (call->state == RX_STATE_ACTIVE) {
-                    cerror = RX_CALL_TIMEOUT;
-                    goto mtuout;
-                }
-            }
+    if (conn->idleDeadTime) {
+       idleDeadTime = conn->idleDeadTime + fudgeFactor;
+    }
 
-            if (call->lastSendData && ((call->lastSendData + idleDeadTime) < now)) {
-                if (call->state == RX_STATE_ACTIVE) {
-                    cerror = conn->service ? conn->service->idleDeadErr : RX_CALL_IDLE;
-                    idle_timeout = 1;
-                    goto mtuout;
-                }
-            }
-        }
+    if (idleDeadTime) {
+       /* see if we have a non-activity timeout */
+       if (call->startWait && ((call->startWait + idleDeadTime) < now)) {
+           if (call->state == RX_STATE_ACTIVE) {
+               cerror = RX_CALL_TIMEOUT;
+               goto mtuout;
+           }
+       }
     }
 
     if (conn->hardDeadTime) {
@@ -6460,13 +6420,14 @@ mtuout:
         call->lastReceiveTime) {
        int oldMTU = conn->peer->ifMTU;
 
-       /* if we thought we could send more, perhaps things got worse */
-       if (conn->peer->maxPacketSize > conn->lastPacketSize)
-           /* maxpacketsize will be cleared in rxi_SetPeerMtu */
-           newmtu = MAX(conn->peer->maxPacketSize-RX_IPUDP_SIZE,
-                        conn->lastPacketSize-(128+RX_IPUDP_SIZE));
+       /* If we thought we could send more, perhaps things got worse.
+        * Shrink by 128 bytes and try again. */
+       if (conn->peer->maxPacketSize < conn->lastPacketSize)
+           /* maxPacketSize will be cleared in rxi_SetPeerMtu */
+           newmtu = MAX(conn->peer->maxPacketSize + RX_HEADER_SIZE,
+                        conn->lastPacketSize - 128 + RX_HEADER_SIZE);
        else
-           newmtu = conn->lastPacketSize-(128+RX_IPUDP_SIZE);
+           newmtu = conn->lastPacketSize - 128 + RX_HEADER_SIZE;
 
        /* minimum capped in SetPeerMtu */
        rxi_SetPeerMtu(conn->peer, 0, 0, newmtu);
@@ -6506,6 +6467,7 @@ rxi_NatKeepAliveEvent(struct rxevent *event, void *arg1,
     taddr.sin_family = AF_INET;
     taddr.sin_port = rx_PortOf(rx_PeerOf(conn));
     taddr.sin_addr.s_addr = rx_HostOf(rx_PeerOf(conn));
+    memset(&taddr.sin_zero, 0, sizeof(taddr.sin_zero));
 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
     taddr.sin_len = sizeof(struct sockaddr_in);
 #endif
@@ -6649,7 +6611,7 @@ rxi_GrowMTUEvent(struct rxevent *event, void *arg1, void *dummy, int dummy2)
      */
     if ((conn->peer->maxPacketSize != 0) &&
        (conn->peer->natMTU < RX_MAX_PACKET_SIZE) &&
-       conn->idleDeadDetection)
+       conn->idleDeadTime)
        (void)rxi_SendAck(call, NULL, 0, RX_ACK_MTU, 0);
     rxi_ScheduleGrowMTUEvent(call, 0);
     MUTEX_EXIT(&call->lock);
@@ -6734,22 +6696,6 @@ rxi_KeepAliveOn(struct rx_call *call)
     rxi_ScheduleKeepAliveEvent(call);
 }
 
-void
-rx_KeepAliveOff(struct rx_call *call)
-{
-    MUTEX_ENTER(&call->lock);
-    rxi_CancelKeepAliveEvent(call);
-    MUTEX_EXIT(&call->lock);
-}
-
-void
-rx_KeepAliveOn(struct rx_call *call)
-{
-    MUTEX_ENTER(&call->lock);
-    rxi_KeepAliveOn(call);
-    MUTEX_EXIT(&call->lock);
-}
-
 static void
 rxi_GrowMTUOn(struct rx_call *call)
 {
@@ -6866,6 +6812,7 @@ rxi_ChallengeEvent(struct rxevent *event,
            rxi_SendSpecial((struct rx_call *)0, conn, packet,
                            RX_PACKET_TYPE_CHALLENGE, NULL, -1, 0);
            rxi_FreePacket(packet);
+           conn->securityChallengeSent = 1;
        }
        clock_GetTime(&now);
        when = now;
@@ -7516,6 +7463,7 @@ MakeDebugCall(osi_socket socket, afs_uint32 remoteAddr, afs_uint16 remotePort,
     taddr.sin_family = AF_INET;
     taddr.sin_port = remotePort;
     taddr.sin_addr.s_addr = remoteAddr;
+    memset(&taddr.sin_zero, 0, sizeof(taddr.sin_zero));
 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
     taddr.sin_len = sizeof(struct sockaddr_in);
 #endif
@@ -9353,7 +9301,7 @@ int rx_DumpCalls(FILE *outputFile, char *cookie)
                 "rqc=%u,%u, tqc=%u,%u, iovqc=%u,%u, "
                 "lstatus=%u, rstatus=%u, error=%d, timeout=%u, "
                 "resendEvent=%d, keepAliveEvt=%d, delayedAckEvt=%d, delayedAbortEvt=%d, abortCode=%d, abortCount=%d, "
-                "lastSendTime=%u, lastRecvTime=%u, lastSendData=%u"
+                "lastSendTime=%u, lastRecvTime=%u"
 #ifdef RX_ENABLE_LOCKS
                 ", refCount=%u"
 #endif
@@ -9367,7 +9315,7 @@ int rx_DumpCalls(FILE *outputFile, char *cookie)
                 (afs_uint32)c->rqc, (afs_uint32)rqc, (afs_uint32)c->tqc, (afs_uint32)tqc, (afs_uint32)c->iovqc, (afs_uint32)iovqc,
                 (afs_uint32)c->localStatus, (afs_uint32)c->remoteStatus, c->error, c->timeout,
                 c->resendEvent?1:0, c->keepAliveEvent?1:0, c->delayedAckEvent?1:0, c->delayedAbortEvent?1:0,
-                c->abortCode, c->abortCount, c->lastSendTime, c->lastReceiveTime, c->lastSendData
+                c->abortCode, c->abortCount, c->lastSendTime, c->lastReceiveTime
 #ifdef RX_ENABLE_LOCKS
                 , (afs_uint32)c->refCount
 #endif