Annotation of researchv9/jerq/src/32ld/proto.c, revision 1.1.1.1

1.1       root        1: #include <signal.h>
                      2: #include <stdio.h>
                      3: #include "proto.h"
                      4: 
                      5: struct Packet{
                      6:        char    packet[MAXPKTSIZE];
                      7:        short   size;
                      8:        short   timo;
                      9:        short   state;
                     10: };
                     11: 
                     12: typedef struct Packet *        Pkp_t;
                     13: 
                     14: struct Packet  packets[NPBUFS];
                     15: int            ptype;
                     16: char           xseq;
                     17: char           freepkts;
                     18: char           nulls[MAXPKTSIZE-PKTHDRSIZE];
                     19: short          xtimo;
                     20: 
                     21: enum{
                     22:        badack, rack, unkack, skack, xpkts, timeout, dsize, speed, nstats
                     23: };
                     24: 
                     25: #define        BADACK          (int)badack
                     26: #define        RACK            (int)rack
                     27: #define        UNKACK          (int)unkack
                     28: #define        SKACK           (int)skack
                     29: #define        XPKTS           (int)xpkts
                     30: #define        TIMEOUT         (int)timeout
                     31: #define        DSIZE           (int)dsize
                     32: #define        SPEED           (int)speed
                     33: #define        NSTATS          (int)nstats
                     34: 
                     35: struct{
                     36:        char    *desc;
                     37:        long    count;
                     38: } stats[NSTATS]={
                     39:        {"unrecognised ack"},
                     40:        {"acks received"},
                     41:        {"unknown ack"},
                     42:        {"packets accepted by skipped sequence ack"},
                     43:        {"packets transmitted"},
                     44:        {"packets retransmitted by timeout"},
                     45:        {"max packet data size"},
                     46:        {"bytes/sec."},
                     47: };
                     48: 
                     49: #define        STATS(A)        stats[A].count++
                     50: 
                     51: void
                     52: pinit(lspeed, maxpktdsize, aptype)
                     53: {
                     54:        freepkts = NPBUFS;
                     55:        xtimo = (NPBUFS*(PKTHDRSIZE+PKTCRCSIZE+PKTASIZE+maxpktdsize)+lspeed-1)/lspeed+2;
                     56:        if((ptype=aptype) == ACKON)
                     57:                ptimeout();
                     58:        stats[DSIZE].count = maxpktdsize;
                     59:        stats[SPEED].count = lspeed;
                     60: }
                     61: 
                     62: void
                     63: precv(c)
                     64:        char            c;
                     65: {
                     66:        register Pkp_t  pkp;
                     67:        register char   pseq, seq = c & SEQMASK;
                     68:        register int    hit = 0;
                     69: 
                     70:        if((c&PTYP) != ptype){
                     71:                STATS(BADACK);
                     72:                return;
                     73:        }
                     74:        for (pkp = packets; pkp < &packets[NPBUFS]; pkp++)
                     75:                if(pkp->state == WAIT)
                     76:                {       pseq = (pkp->packet[0])&SEQMASK;
                     77:                        if (seq == pseq)
                     78:                        {       STATS(RACK);
                     79:                                pkp->state = OK;
                     80:                                freepkts++;
                     81:                                hit++;
                     82:                        } else
                     83:                        if ((seq > pseq && seq < pseq+NPBUFS)
                     84:                        ||  (seq < pseq && seq+SEQMOD < pseq+NPBUFS))
                     85:                        {       STATS(SKACK);
                     86:                                pkp->state = OK;
                     87:                                freepkts++;
                     88:                                hit++;
                     89: 
                     90:                }       }
                     91:        if (!hit)
                     92:                STATS(UNKACK);
                     93: }
                     94: 
                     95: int
                     96: psend(bufp, count)
                     97:        char *          bufp;
                     98:        register int    count;
                     99: {
                    100:        register Pkp_t  pkp;
                    101:        register int    i;
                    102: 
                    103:        if(ptype == ACKON){
                    104:                for(pkp=(Pkp_t)0, i=0; i<NPBUFS; i++ )
                    105:                        if(packets[i].state != WAIT){
                    106:                                if(pkp == (Pkp_t)0){
                    107:                                        pkp = &packets[i];
                    108:                                        pkp->state = WAIT;
                    109:                                        pkp->timo = xtimo;
                    110:                                        freepkts--;
                    111:                                }
                    112:                        }
                    113:                if(pkp == (Pkp_t)0)
                    114:                        return -1;
                    115:        } else
                    116:                pkp = packets;
                    117:        swab(bufp, &pkp->packet[PKTHDRSIZE], count);
                    118:        pkp->packet[0] = ptype | ((xseq++)&SEQMASK);
                    119:        pkp->packet[1] = count;
                    120:        count += PKTHDRSIZE;
                    121:        if(ptype != NOCRC){
                    122:                (void)crc(pkp->packet, count);
                    123:                count += PKTCRCSIZE;
                    124:        }
                    125:        pkp->size = count;
                    126:        Write(pkp->packet, count);
                    127:        STATS(XPKTS);
                    128:        return 0;
                    129: }
                    130: 
                    131: ptimeout()
                    132: {      register Pkp_t  pkp;
                    133: 
                    134:        (void)signal(SIGALRM, SIG_IGN);
                    135:        for (pkp = packets; pkp < &packets[NPBUFS]; pkp++)
                    136:                if (pkp->state == WAIT && --pkp->timo <= 0){
                    137:                        STATS(TIMEOUT);
                    138:                        pkp->timo = xtimo;
                    139:                        Write(nulls, pkp->size-PKTHDRSIZE);
                    140:                        Write(pkp->packet, pkp->size);
                    141:                }
                    142:        (void)signal(SIGALRM, ptimeout);
                    143: }
                    144: 
                    145: void
                    146: pstats(fd)
                    147:        FILE *  fd;
                    148: {
                    149:        register int    i;
                    150:        register int    count = 0;
                    151: 
                    152:        if (fd != NULL)
                    153:        for(i=0; i<NSTATS; i++ )
                    154:                if(stats[i].count){
                    155:                        if(count++ == 0)
                    156:                                fprintf(fd, "\nStatistics:\n");
                    157:                        fprintf(fd, "\t%ld %s\n", (long)stats[i].count, stats[i].desc);
                    158:                }
                    159: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.