1 /* 2 * Copyright (c) 1988 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 * 17 * @(#)api_exch.h 3.4 (Berkeley) 08/28/88 18 */ 19 20 /* 21 * This file describes the structures passed back and forth 22 * between the API client and API server on a Unix-based 23 * tn3270 implementation. 24 */ 25 26 /* 27 * The following are the low-level opcodes exchanged between the 28 * two sides. These are designed to allow for type, sequence number, 29 * and direction checking. 30 * 31 * We enforce conversation flow. There are three states: CONTENTION, 32 * SEND, and RECEIVE. Both sides start in CONTENTION. 33 * We never leave RECEIVE state without first reading a TURNAROUND 34 * opcode. We never leave SEND state without first writing a TURNAROUND 35 * opcode. This scheme ensures that we always have conversation flowing 36 * in a synchronized direction (or detect an application error), and that 37 * we never hang with both sides trying to read from the "wire". 38 * 39 * State event action 40 * 41 * CONTENTION read request send TURNAROUND 42 * read RTS 43 * enter RECEIVE 44 * CONTENTION write request send RTS 45 * read TURNAROUND 46 * enter SEND 47 * 48 * RECEIVE read request read whatever 49 * RECEIVE write request read TURNAROUND 50 * 51 * SEND read request send TURNAROUND 52 * SEND write write whatever 53 */ 54 55 #define EXCH_EXCH_COMMAND 0 /* The following is a command */ 56 #define EXCH_EXCH_TURNAROUND 1 /* Your turn to send */ 57 #define EXCH_EXCH_RTS 2 /* Request to send */ 58 #define EXCH_EXCH_TYPE 3 /* The following is a type */ 59 60 struct exch_exch { 61 char 62 opcode; /* COMMAND, TURNAROUND, or TYPE */ 63 unsigned char 64 my_sequence, /* 0-ff, initially zero */ 65 your_sequence, /* 0-ff, initially zero */ 66 command_or_type; /* Application level command or type */ 67 unsigned short 68 length; /* The length of any following data */ 69 }; 70 71 /* 72 * The following are the command codes which the higher level protocols 73 * send and receive. 74 */ 75 76 #define EXCH_CMD_ASSOCIATE 0 /* Connect [client->server] */ 77 /* 78 * struct storage_desc 79 * char key[] 80 */ 81 #define EXCH_CMD_DISASSOCIATE 1 /* Disconnect [client->server] */ 82 #define EXCH_CMD_SEND_AUTH 2 /* Send password [server->client] */ 83 /* 84 * struct storage_desc 85 * char prompt[] 86 * struct storage_desc 87 * char seed[] 88 */ 89 #define EXCH_CMD_AUTH 3 /* Authorization [client->server] */ 90 /* 91 * struct storage_desc 92 * char authenticator[] 93 */ 94 #define EXCH_CMD_ASSOCIATED 4 /* Connected [server->client] */ 95 #define EXCH_CMD_REJECTED 5 /* Too bad [server->client] */ 96 /* 97 * struct storage_desc 98 * char message[] 99 */ 100 101 #define EXCH_CMD_REQUEST 6 /* A request [client->server] */ 102 /* struct regs, 103 * struct sregs, 104 * struct storage_desc 105 * char bytes[] 106 */ 107 #define EXCH_CMD_GIMME 7 /* Send storage [server->client] */ 108 /* 109 * struct storage_desc 110 */ 111 #define EXCH_CMD_HEREIS 8 /* Here is storage [BOTH WAYS] */ 112 /* 113 * struct storage_desc 114 * char bytes[] 115 */ 116 #define EXCH_CMD_REPLY 9 /* End of discussion */ 117 /* 118 * struct regs, 119 * struct sregs, 120 */ 121 122 /* 123 * The following are typed parameters sent across the wire. 124 * 125 * This should be done much more generally, with some form of 126 * XDR or mapped conversation ability. 127 */ 128 129 #define EXCH_TYPE_REGS 0 130 #define EXCH_TYPE_SREGS 1 131 #define EXCH_TYPE_STORE_DESC 2 132 #define EXCH_TYPE_BYTES 3 133 134 /* 135 * each parameter that comes over looks like: 136 * 137 * char type of following 138 * short (2 bytes) length of following (network byte order) 139 * following 140 */ 141 142 struct storage_descriptor { 143 long location; /* In network byte order */ 144 short length; /* In network byte order */ 145 }; 146