|
|
1.1 root 1: /*
2: @(#) xtproto.h version 2.1 (Blit) of 7/20/83 15:43:49
3: Last Delta: 7/10/83 19:08:18 to /usr/jerq/sccs/src/xt/uts/sys/s.xtproto.h
4: */
5:
6: /*
7: ** Bx -- Blit packet protocol definition
8: */
9:
10: typedef unsigned char Pbyte; /* The unit of communication */
11:
12: #define NPCBUFS 2 /* Double buffered protocol */
13: #define MAXPCHAN 8 /* Maximum channel number */
14: #define CHANBITS 3 /* Bits for channel number */
15: #define CHANMASK 07 /* 2**CHANBITS - 1 */
16: /*
17: * MAXPKTDSIZE should be CLSIZE - sizeof(struct P_header) - EDSIZE
18: */
19: #define MAXPKTDSIZE (32 * sizeof(Pbyte)) /* Maximum data part size */
20: #define EDSIZE (2 * sizeof(Pbyte)) /* Error detection part size */
21: #define SEQMOD 8 /* Sequence number modulus */
22: #define SEQBITS 3 /* Bits for sequence number */
23: #define SEQMASK 07 /* 2**SEQBITS - 1 */
24:
25: /*
26: ** Packet header
27: ** (if only bit fields in C were m/c independent, sigh...)
28: */
29:
30: #ifndef u3b
31:
32: struct P_header
33: {
34: # ifdef vax
35: # ifdef OLDMPX
36: Pbyte channel :CHANBITS, /* Channel number */
37: seq :SEQBITS, /* Sequence number */
38: # else OLDMPX
39: Pbyte seq :SEQBITS, /* Sequence number */
40: channel :CHANBITS, /* Channel number */
41: # endif OLDMPX
42: cntl :1, /* TRUE if control packet */
43: ptyp :1; /* Always 1 */
44: Pbyte dsize; /* Size of data part */
45: # endif vax
46: # ifdef mc68000
47: short ptyp :1, /* Always 1 */
48: cntl :1, /* TRUE if control packet */
49: channel :CHANBITS, /* Channel number */
50: seq :SEQBITS, /* Sequence number */
51: dsize :8; /* Size of data part */
52: # endif mc68000
53: };
54:
55: typedef struct P_header Ph_t;
56:
57: /*
58: ** Packet definition for maximum sized packet
59: */
60:
61: struct Packet
62: {
63: Ph_t header; /* Header part */
64: Pbyte data[MAXPKTDSIZE]; /* Data part */
65: Pbyte edb[EDSIZE]; /* Error detection part */
66: };
67:
68: #else u3b
69:
70: /*
71: ** Packet header (real size)
72: */
73:
74: typedef short Ph_t;
75:
76: /*
77: ** Packet definition for maximum sized packet
78: */
79:
80: struct Packet {
81: Pbyte header; /* Packet into */
82: Pbyte dsize; /* Size of data part */
83: Pbyte data[MAXPKTDSIZE]; /* Data part */
84: Pbyte edb[EDSIZE]; /* Error detection part */
85: };
86:
87: /*
88: ** Macros to access fields of header byte
89: */
90:
91: #define SET_CNTL(x) (x)|=0100
92: #define GET_CNTL(x) (((x)>>6)&1)
93: #define GET_PTYP(x) (((x)>>7)&1)
94: #define GET_SEQ(x) ((x)&7)
95: #define GET_CHAN(x) (((x)>>3)&7)
96: #define MK_HDR(x,chan,seq) (x)=0200|((chan)<<3)|(seq)
97:
98: #endif u3b
99:
100: typedef struct Packet * Pkt_p;
101:
102: /*
103: ** Control codes
104: */
105:
106: #define PCDATA (Pbyte)002 /* Data only control packet */
107: #define ACK (Pbyte)006 /* Last packet with same sequence ok and in sequence */
108: #define NAK (Pbyte)025 /* Last packet with same sequence received out of sequence */
109:
110: /*
111: ** Definition of a structure to hold status information
112: ** for a conversation with a channel.
113: */
114:
115: struct Pktstate
116: {
117: struct Packet pkt; /* The packet */
118: short timo; /* Timeout count */
119: unsigned char state; /* Protocol state */
120: unsigned char size; /* Packet size */
121: };
122:
123: typedef struct Pktstate *Pks_p;
124:
125: struct Pchannel
126: {
127: struct Pktstate pkts[NPCBUFS]; /* The packets */
128: Pks_p nextpkt; /* Next packet to be acknowledged */
129: Pbyte cdata[SEQMOD]; /* Remember transmitted control data */
130: Pbyte rseq :SEQBITS; /* Next receive sequence number */
131: Pbyte xseq :SEQBITS; /* Next transmit sequence number */
132: char outen; /* Output packets enabled */
133: char flags; /* Control flags */
134: #if XTDRIVER == 1
135: char channo; /* This channel's number */
136: char link; /* This channel's link */
137: # ifdef u3b
138: struct clist xoutq; /* Processed output for channel */
139: struct clist xinq; /* Processed input for channel */
140: char esc; /* saw "\" flag for tty input */
141: # endif u3b
142: #endif
143: };
144:
145: #define XACK 1 /* Send ACK */
146: #define XNAK 2 /* Send NAK */
147: #define XCDATA 4 /* Send control data in ACK packet */
148:
149: typedef struct Pchannel *Pch_p;
150:
151: /** Transmit packet states **/
152:
153: enum { px_null, px_ready, px_wait, px_ok };
154:
155: #define PX_NULL (int)px_null /* Empty packet */
156: #define PX_READY (int)px_ready /* Full packet awaiting transmission */
157: #define PX_WAIT (int)px_wait /* Packet awaiting acknowledgement */
158: #define PX_OK (int)px_ok /* Packet has been acknowledged */
159:
160: /** Receive packet states **/
161:
162: enum { pr_null, pr_size, pr_data };
163:
164: #define PR_NULL (int)pr_null /* New packet expected */
165: #define PR_SIZE (int)pr_size /* Size byte next */
166: #define PR_DATA (int)pr_data /* Receiving data */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.