BSD 4_4 release
[unix-history] / usr / src / usr.bin / uucp / uucico / pk0.c
index 8d0789d..5907134 100644 (file)
@@ -1,6 +1,15 @@
+/*-
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This module is believed to contain source code proprietary to AT&T.
+ * Use and redistribution is subject to the Berkeley Software License
+ * Agreement and your Software Agreement with AT&T (Western Electric).
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)pk0.c      5.4 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)pk0.c      8.1 (Berkeley) 6/6/93";
+#endif /* not lint */
 
 #include "uucp.h"
 #include "pk.h"
 
 #include "uucp.h"
 #include "pk.h"
@@ -13,7 +22,14 @@ char next[8] = { 1, 2, 3, 4, 5, 6, 7, 0};    /* packet sequence numbers */
 char mask[8] = { 1, 2, 4, 010, 020, 040, 0100, 0200 };
 
 struct pack *pklines[NPLINES];
 char mask[8] = { 1, 2, 4, 010, 020, 040, 0100, 0200 };
 
 struct pack *pklines[NPLINES];
-int    pkactive;
+
+int Reacks;
+
+#define PKRTIME 4
+#define PKWTIME 4
+#define PKRSKEW 3
+#define PKWSKEW 2
+extern int pktimeout, pktimeskew, Ntimeout;
 
 /*
  * receive control messages
 
 /*
  * receive control messages
@@ -73,10 +89,24 @@ register struct pack *pk;
        case RJ:
                pk->p_state |= RXMIT;
                pk->p_msg |= M_RR;
        case RJ:
                pk->p_state |= RXMIT;
                pk->p_msg |= M_RR;
-       case RR:
                pk->p_rpr = val;
                (void) pksack(pk);
                break;
                pk->p_rpr = val;
                (void) pksack(pk);
                break;
+       case RR:
+               pk->p_rpr = val;
+               if (pk->p_rpr == pk->p_ps) {
+                       DEBUG(9, "Reack count is %d\n", ++Reacks);
+                       if (Reacks >= 4) {
+                               DEBUG(6, "Reack overflow on %d\n", val);
+                               pk->p_state |= RXMIT;
+                               pk->p_msg |= M_RR;
+                               Reacks = 0;
+                       }
+               } else {
+                       Reacks = 0;
+                       (void) pksack(pk);
+               }
+               break;
        case SRJ:
                logent("PK0", "srj not implemented");
                break;
        case SRJ:
                logent("PK0", "srj not implemented");
                break;
@@ -220,6 +250,9 @@ int icount;
 
        xfr = 0;
        count = 0;
 
        xfr = 0;
        count = 0;
+       pktimeout = PKRTIME;
+       pktimeskew = PKRSKEW;
+       Ntimeout = 0;
        while (pkaccept(pk) == 0)
                ;
 
        while (pkaccept(pk) == 0)
                ;
 
@@ -241,7 +274,7 @@ int icount;
                                                cp++;
                                }
                        }
                                                cp++;
                                }
                        }
-                       pkmove(cp, ibuf, cc, B_READ);
+                       bcopy(cp, ibuf, cc);
                        ibuf += cc;
                        icount -= cc;
                        count += cc;
                        ibuf += cc;
                        icount -= cc;
                        count += cc;
@@ -283,6 +316,9 @@ int icount;
                return -1;
        }
 
                return -1;
        }
 
+       pktimeout = PKWTIME;
+       pktimeskew = PKWSKEW;
+       Ntimeout = 0;
        count = icount;
        do {
                while (pk->p_xcount>=pk->p_swindow)  {
        count = icount;
        do {
                while (pk->p_xcount>=pk->p_swindow)  {
@@ -311,7 +347,7 @@ int icount;
                        partial = B_SHORT;
                } else
                        cc = pk->p_xsize;
                        partial = B_SHORT;
                } else
                        cc = pk->p_xsize;
-               pkmove(cp, ibuf, cc, B_WRITE);
+               bcopy(ibuf, cp, cc);
                ibuf += cc;
                icount -= cc;
                pk->p_osum[x] = chksum(pk->p_ob[x], pk->p_xsize);
                ibuf += cc;
                icount -= cc;
                pk->p_osum[x] = chksum(pk->p_ob[x], pk->p_xsize);
@@ -426,7 +462,6 @@ register struct pack *pk;
                pkxstart(pk, x, seq);
                pk->p_os[seq] = bstate;
                pk->p_state &= ~RXMIT;
                pkxstart(pk, x, seq);
                pk->p_os[seq] = bstate;
                pk->p_state &= ~RXMIT;
-               pk->p_nout++;
                goto out;
        }
        /*
                goto out;
        }
        /*
@@ -434,7 +469,6 @@ register struct pack *pk;
         * and transmission buffers are languishing
         */
        if (pk->p_xcount) {
         * and transmission buffers are languishing
         */
        if (pk->p_xcount) {
-               pk->p_timer = 2;
                pk->p_state |= WAITO;
        } else
                pk->p_state &= ~WAITO;
                pk->p_state |= WAITO;
        } else
                pk->p_state &= ~WAITO;
@@ -462,13 +496,11 @@ register struct pack *pk;
         * try to flush output
         */
        i = 0;
         * try to flush output
         */
        i = 0;
-       pk->p_timer = 2;
        while (pk->p_xcount && pk->p_state&LIVE) {
                if (pk->p_state&(RCLOSE+DOWN) || ++i > 2)
                        break;
                pkoutput(pk);
        }
        while (pk->p_xcount && pk->p_state&LIVE) {
                if (pk->p_state&(RCLOSE+DOWN) || ++i > 2)
                        break;
                pkoutput(pk);
        }
-       pk->p_timer = 0;
        pk->p_state |= DOWN;
 
        /*
        pk->p_state |= DOWN;
 
        /*
@@ -477,7 +509,6 @@ register struct pack *pk;
        i = 0;
        while ((pk->p_state&RCLOSE)==0 && i<2) {
                pk->p_msg = M_CLOSE;
        i = 0;
        while ((pk->p_state&RCLOSE)==0 && i<2) {
                pk->p_msg = M_CLOSE;
-               pk->p_timer = 2;
                pkoutput(pk);
                i++;
        }
                pkoutput(pk);
                i++;
        }
@@ -508,7 +539,8 @@ register struct pack *pk;
                free((char *)bp);
        }
        if (rcheck != pk->p_rwindow) {
                free((char *)bp);
        }
        if (rcheck != pk->p_rwindow) {
-               logent("PK0", "pkclose rcheck != p_rwindow");
+               syslog(LOG_WARNING, "%s: pk0: rc %d rw %d", Rmtname, rcheck,
+                       pk->p_rwindow);
        }
        free((char *)pk);
 }
        }
        free((char *)pk);
 }