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