|
|
1.1 root 1: /* tpkt.h - include file for transport providers (TS-PROVIDER) */
2:
3: /*
4: * $Header: /f/osi/h/RCS/tpkt.h,v 7.3 90/07/27 08:44:50 mrose Exp $
5: *
6: *
7: * $Log: tpkt.h,v $
8: * Revision 7.3 90/07/27 08:44:50 mrose
9: * update
10: *
11: * Revision 7.2 90/03/23 17:30:54 mrose
12: * 8
13: *
14: * Revision 7.1 89/12/07 01:07:57 mrose
15: * queued writes
16: *
17: * Revision 7.0 89/11/23 21:56:07 mrose
18: * Release 6.0
19: *
20: */
21:
22: /*
23: * NOTICE
24: *
25: * Acquisition, use, and distribution of this module and related
26: * materials are subject to the restrictions of a license agreement.
27: * Consult the Preface in the User's Manual for the full terms of
28: * this agreement.
29: *
30: */
31:
32:
33: #include "tsap.h" /* definitions for TS-USERs */
34:
35: /* */
36:
37:
38: #define tsapPsig(tb, sd) \
39: { \
40: if ((tb = findtblk (sd)) == NULL) { \
41: (void) sigiomask (smask); \
42: return tsaplose (td, DR_PARAMETER, NULLCP, \
43: "invalid transport descriptor"); \
44: } \
45: if (!(tb -> tb_flags & TB_CONN)) { \
46: (void) sigiomask (smask); \
47: return tsaplose (td, DR_OPERATION, NULLCP, \
48: "transport descriptor not connected"); \
49: } \
50: }
51:
52: #define missingP(p) \
53: { \
54: if (p == NULL) \
55: return tsaplose (td, DR_PARAMETER, NULLCP, \
56: "mandatory parameter \"%s\" missing", "p"); \
57: }
58:
59: #define toomuchP(b,n,m,p) \
60: { \
61: if (b == NULL) \
62: n = 0; \
63: else \
64: if (n > m) \
65: return tsaplose (td, DR_PARAMETER, NULLCP, \
66: "too much %s user data, %d octets", p, n); \
67: }
68:
69: #define copyTPKTdata(t,base,len) \
70: { \
71: register struct udvec *uv = t -> t_udvec; \
72: if (len > 0) \
73: uv -> uv_base = base, uv -> uv_len = len, uv++; \
74: uv -> uv_base = NULL; \
75: }
76:
77: #ifndef lint
78: #ifndef __STDC__
79: #define copyTSAPdata(base,len,d) \
80: { \
81: register int i = len; \
82: if ((d -> d/* */_cc = min (i, sizeof d -> d/* */_data)) > 0) \
83: bcopy (base, d -> d/* */_data, d -> d/* */_cc); \
84: }
85: #else
86: #define copyTSAPdata(base,len,d) \
87: { \
88: register int i = len; \
89: if ((d -> d##_cc = min (i, sizeof d -> d##_data)) > 0) \
90: bcopy (base, d -> d##_data, d -> d##_cc); \
91: }
92: #endif
93: #else
94: #define copyTSAPdata(base,len,d) bcopy (base, (char *) d, len)
95: #endif
96:
97:
98: int tpktlose (), tsaplose ();
99:
100: /* */
101:
102: struct tsapADDR {
103: struct NSAPaddr ta_addr;
104: int ta_present;
105:
106: int ta_selectlen;
107:
108: union {
109: char ta_un_selector[TSSIZE];
110:
111: u_short ta_un_port;
112: } un_ta;
113: };
114:
115: /* network type codes:
116: must be outside [0-9A-Fa-f] */
117: #define NT_TCP 'T' /* TCP */
118: #define NT_X25 'X' /* X.25 */
119: #define NT_BRG 'G' /* Bridge */
120: #define NT_BSD 'Z' /* 4.4BSD */
121: #define NT_SUN 'S' /* SunLink OSI */
122:
123:
124: struct tsapblk {
125: struct tsapblk *tb_forw; /* doubly-linked list */
126: struct tsapblk *tb_back; /* .. */
127:
128: int tb_fd; /* file descriptor */
129:
130: char tb_flags; /* our state */
131: #define TB_NULL 0x00
132: #define TB_CONN 0x01 /* connected */
133: #define TB_ASYN 0x02 /* asynchronous */
134: #define TB_EXPD 0x04 /* expedited transfer selected */
135: #define TB_TCP 0x08 /* underlying service is TCP */
136: #define TB_X25 0x10 /* .. is X.25 */
137: #define TB_BRG 0x20 /* .. is Bridge */
138: #define TB_TP0 (TB_TCP | TB_X25 | TB_BRG)
139: #define TB_TP4 0x40 /* .. is TP4 */
140: /* all TP4's use this value as it make
141: sense to have only one TP4 service
142: compiled in... */
143: #define TB_QWRITES 0x80 /* queued writes OK */
144:
145: char *tb_magic; /* generic pointer */
146:
147: /* saved retry variables */
148: char *tb_data; /* saved user data */
149: int tb_cc; /* saved user data count */
150: char tb_expedited; /* saved expedited */
151: struct TSAPaddr *tb_called; /* saved addresses */
152: struct TSAPaddr *tb_calling;/* .. */
153:
154: struct tsapkt *tb_retry; /* initial tpkt */
155:
156: u_short tb_srcref; /* source reference */
157: u_short tb_dstref; /* destination reference */
158:
159: int tb_tsdusize; /* maximum TSDU size */
160: int tb_tpduslop; /* .. */
161: int tb_tpdusize; /* for tp0ts */
162:
163: int tb_sent; /* TPDU bytes sent */
164: int tb_recv; /* TPDU bytes recv */
165:
166: struct QOStype tb_qos; /* quality of service */
167:
168: struct qbuf tb_qbuf; /* for segmented TSDUs */
169: int tb_len; /* .. */
170:
171: struct tsapADDR tb_initiating;/* initiator */
172: struct tsapADDR tb_responding;/* responder */
173:
174: IFP tb_retryfnx; /* resume async connection */
175:
176: IFP tb_connPfnx; /* TP connect */
177: IFP tb_retryPfnx; /* TP retry connect */
178: IFP tb_startPfnx; /* TP start accept */
179: IFP tb_acceptPfnx; /* TP accept */
180: IFP tb_writePfnx; /* TP write data */
181: IFP tb_readPfnx; /* TP read data */
182: IFP tb_discPfnx; /* TP disconnect */
183: IFP tb_losePfnx; /* TP loses */
184:
185: IFP tb_drainPfnx; /* TP drain queued writes */
186: IFP tb_queuePfnx; /* TP note queued writes */
187: struct qbuf tb_qwrites; /* queue of writes to retry */
188:
189: IFP tb_initfnx; /* init for read from network */
190: IFP tb_readfnx; /* read from network */
191: IFP tb_writefnx; /* write to network */
192: IFP tb_closefnx; /* close network */
193: IFP tb_selectfnx; /* select network */
194: IFP tb_checkfnx; /* check network prior to select */
195: IFP tb_nreadfnx; /* estimate of octets waiting to be read */
196:
197: IFP tb_DataIndication; /* INDICATION handlers */
198: IFP tb_DiscIndication; /* .. */
199:
200: #ifdef MGMT
201: IFP tb_manfnx; /* for management reports */
202: int tb_pdus; /* PDUs sent */
203: int tb_pdur; /* PDUs recv */
204: int tb_bytes; /* bytes sent since last report */
205: int tb_byter; /* bytes recv .. */
206: #endif
207: };
208: #define NULLBP ((struct tsapblk *) 0)
209:
210:
211: int freetblk ();
212: struct tsapblk *newtblk (), *findtblk ();
213:
214: /* TPKT datastructure */
215:
216: struct tsapkt {
217: int t_errno;
218:
219: struct {
220: u_char pk_vrsn;
221: #define TPKT_VRSN 3
222:
223: u_char pk_rsrvd;
224:
225: u_short pk_length;
226: #define TPKT_MAXLEN 0xffff
227: } t_pkthdr;
228: #define t_vrsn t_pkthdr.pk_vrsn
229: #define t_rsrvd t_pkthdr.pk_rsrvd
230: #define t_length t_pkthdr.pk_length
231:
232: #define TPKT_HDRLEN(t) (sizeof ((t) -> t_pkthdr) + sizeof ((t) -> t_li) \
233: + sizeof ((t) -> t_code))
234:
235: struct {
236: u_char tp_li;
237: #ifndef lint
238: #ifndef __STDC__
239: #define TPDU_MINLEN(t,c) (c/* */_SIZE(t) + sizeof ((t) -> t_code))
240: #else
241: #define TPDU_MINLEN(t,c) (c##_SIZE(t) + sizeof ((t) -> t_code))
242: #endif
243: #else
244: #define TPDU_MINLEN(t,c) (sizeof ((t) -> t_code))
245: #endif
246: #define TPDU_MAXLEN(t) \
247: (min (0xfe, (t) -> t_length - sizeof ((t) -> t_pkthdr) \
248: - sizeof ((t) -> t_li)))
249: #define TPDU_USRLEN(t) \
250: ((t) -> t_length - sizeof ((t) -> t_pkthdr) \
251: - sizeof ((t) -> t_li) - (t) -> t_li)
252:
253: u_char tp_code;
254: #define TPDU_CODE(t) ((t) -> t_code & 0xf0)
255: #define TPDU_CR 0xe0 /* CONNECTION REQUEST */
256: #define TPDU_CC 0xd0 /* CONNECTION CONFIRMATION */
257: #define TPDU_DR 0x80 /* DISCONNECT REQUEST */
258: #define TPDU_DC 0xc0 /* DISCONNECT CONFIRMATION */
259: #define TPDU_DT 0xf0 /* DATA */
260: #define TPDU_ED 0x10 /* EXPEDITED DATA */
261: #define TPDU_AK 0x60 /* ACKNOWLEDGE */
262: #define TPDU_EA 0x20 /* EXPEDITED ACKNOWLEDGE */
263: #define TPDU_RJ 0x50 /* REJECT */
264: #define TPDU_ER 0x70 /* ERROR */
265:
266: union {
267: struct {
268: /* FIXED part */
269: u_short un_cr_dstref;
270: u_short un_cr_srcref;
271:
272: u_char un_cr_class;
273: #define CR_CLASS(t) ((t) -> t_cr.cr_class & 0xf0)
274: #define CR_CLASS_TP0 0x00 /* class 0 */
275: #define CR_CLASS_TP1 0x10 /* .. 1 */
276: #define CR_CLASS_TP2 0x20 /* .. 2 */
277: #define CR_CLASS_TP3 0x30 /* .. 3 */
278: #define CR_CLASS_TP4 0x40 /* .. 4 */
279: #define CR_OPT_EXTD 0x02 /* extended formats in classes 2-4 */
280: #define CR_OPT_EXPL 0x01 /* explicit flow control in class 2 */
281:
282: /* VARIABLE part */
283: char un_cr_called[TSSIZE];
284: int un_cr_calledlen;
285:
286: char un_cr_calling[TSSIZE];
287: int un_cr_callinglen;
288:
289: u_char un_cr_tpdusize;
290:
291: u_short un_cr_options;
292:
293: u_char un_cr_alternate;
294: } un_cr;
295: #define cr_dstref un_cr_dstref
296: #define cr_srcref un_cr_srcref
297: #define cr_class un_cr_class
298: #define cr_tpdusize un_cr_tpdusize
299: #define cr_options un_cr_options
300: #define cr_alternate un_cr_alternate
301: #define CR_SIZE(t) 5
302:
303: #define un_cc un_cr
304: #define cc_dstref un_cr_dstref
305: #define cc_srcref un_cr_srcref
306: #define cc_class un_cr_class
307: #define cc_tpdusize un_cr_tpdusize
308: #define cc_options un_cr_options
309: #define CC_SIZE(t) 5
310:
311: struct {
312: /* FIXED part */
313: u_short un_dr_dstref;
314: u_short un_dr_srcref;
315: u_char un_dr_reason;
316: } un_dr;
317: #define dr_dstref un_dr_dstref
318: #define dr_srcref un_dr_srcref
319: #define dr_reason un_dr_reason
320: #define DR_SIZE(t) 5
321:
322: struct {
323: /* FIXED part */
324: u_char un_dt_nr;
325: #define DT_EOT 0x80
326: } un_dt;
327: #define dt_nr un_dt_nr
328: #define DT_SIZE(t) 1
329: #define DT_MAGIC (2 + 1)
330:
331: /* Expedited service is not allowed in TP0, but for testing purposes,
332: we permit it when the underlying service is TCP. Note we use a
333: non-standard packet format (identical to the DT format).
334: */
335: #define un_ed un_dt
336: #define ed_nr un_dt_nr
337: #define ED_SIZE(t) 1
338:
339: struct {
340: /* FIXED part */
341: u_short un_er_dstref;
342: u_char un_er_reject;
343: #define ER_REJ_NOTSPECIFIED 0x00 /* Reason not specified */
344: #define ER_REJ_CODE 0x01 /* Invalid parameter code */
345: #define ER_REJ_TPDU 0x02 /* Invalid TPDU type */
346: #define ER_REJ_VALUE 0x03 /* Invalid parameter value */
347: } un_er;
348: #define er_dstref un_er_dstref
349: #define er_reject un_er_reject
350: #define ER_SIZE(t) 3
351: } tp_un;
352: #define tp_cr tp_un.un_cr
353: #define tp_cc tp_un.un_cc
354: #define tp_dr tp_un.un_dr
355: #define tp_dt tp_un.un_dt
356: #define tp_ed tp_un.un_ed
357: #define tp_er tp_un.un_er
358:
359: int tp_vlen;
360: char *tp_vbase;
361:
362: struct qbuf *tp_qbuf; /* fd2tpkt ONLY */
363:
364: #define NTPUV 12 /* really should be
365: MSG_MAXIOVLEN - 4 */
366: struct udvec tp_udvec[NTPUV]; /* tpkt2fd ONLY */
367: } t_tpdu;
368: #define t_li t_tpdu.tp_li
369: #define t_code t_tpdu.tp_code
370: #define t_cr t_tpdu.tp_un.un_cr
371: #define t_called t_tpdu.tp_un.un_cr.un_cr_called
372: #define t_calledlen t_tpdu.tp_un.un_cr.un_cr_calledlen
373: #define t_calling t_tpdu.tp_un.un_cr.un_cr_calling
374: #define t_callinglen t_tpdu.tp_un.un_cr.un_cr_callinglen
375: #define t_tpdusize t_tpdu.tp_un.un_cr.un_cr_tpdusize
376: #define t_options t_tpdu.tp_un.un_cr.un_cr_options
377: #define t_alternate t_tpdu.tp_un.un_cr.un_cr_alternate
378: #define t_cc t_tpdu.tp_un.un_cc
379: #define t_dr t_tpdu.tp_un.un_dr
380: #define t_dt t_tpdu.tp_un.un_dt
381: #define t_ed t_tpdu.tp_un.un_ed
382: #define t_er t_tpdu.tp_un.un_er
383:
384: #define t_vdata t_tpdu.tp_vbase
385: #define t_vlen t_tpdu.tp_vlen
386:
387: #define t_qbuf t_tpdu.tp_qbuf
388:
389: #define t_udvec t_tpdu.tp_udvec
390: };
391: #define NULLPKT ((struct tsapkt *) 0)
392:
393:
394: int freetpkt ();
395: struct tsapkt *newtpkt ();
396:
397: void text2tpkt (), tpkt2text ();
398:
399: int tpkt2fd ();
400: struct tsapkt *fd2tpkt ();
401:
402: char *tpkt2str ();
403: struct tsapkt *str2tpkt ();
404:
405: /* VARIABLE DATA codes, from ISO8073: */
406:
407: /* for CR/CC TPDUs */
408: #define VDAT_TSAP_SRV 0xc2 /* TSAP ID of the calling TSAP */
409: #define VDAT_TSAP_CLI 0xc1 /* TSAP ID of the called TSAP */
410: #define VDAT_SIZE 0xc0 /* TPDU SIZE */
411: #define SIZE_8K 0x0d /* 8192 */
412: #define SIZE_4K 0x0c /* 4096 */
413: #define SIZE_2K 0x0b /* 2048 */
414: #define SIZE_1K 0x0a /* 1024 */
415: #define SIZE_512 0x09 /* 512 */
416: #define SIZE_256 0x08 /* 256 */
417: #define SIZE_128 0x07 /* 128 */
418: #define SIZE_DFLT SIZE_128
419: #define SIZE_MAXTP0 SIZE_2K
420: #define VDAT_VRSN 0xc4 /* Version number */
421: #define VDAT_SECURITY 0xc5 /* Security parameters */
422: #define VDAT_CHECKSUM 0xc3 /* Checksum */
423: #define VDAT_OPTIONS 0xc6 /* Additional option selections */
424: #define OPT_NEXPEDITE 0x08 /* Use network expedited */
425: #define OPT_CONFIRM 0x04 /* Use receipt confirmation */
426: #define OPT_CHECKSUM 0x02 /* Use 16-bit checksum */
427: #define OPT_TEXPEDITE 0x01 /* Use transport expedited */
428: #define VDAT_ALTERNATE 0xc7 /* Alterated protocol class(es) */
429: #define ALT_TP0 0x01 /* class 0 */
430: #define ALT_TP1 0x02 /* class 1 */
431: #define ALT_TP2 0x04 /* class 2 */
432: #define ALT_TP3 0x08 /* class 3 */
433: #define ALT_TP4 0x10 /* class 4 */
434: #define VDAT_ACKTIME 0x85 /* Acknowledge time */
435: #define VDAT_THROUGHPUT 0x89 /* Throughput */
436: #define VDAT_ERRORATE 0x86 /* Residual error rate */
437: #define VDAT_PRIORITY 0x87 /* Priority */
438: #define VDAT_DELAY 0x88 /* Transit delay */
439: #define VDAT_TTR 0x8b /* Reassignment time */
440:
441: /* for DR TPDUs */
442: #define VDAT_ADDITIONAL 0xe0 /* Additional information */
443:
444: /* for AK TPDUs */
445: #define VDAT_SUBSEQ 0x8c /* Sub-sequence number */
446: #define VDAT_FLOWCTL 0x8b /* Flow control confirmation */
447:
448: /* for ER TPDUs */
449: #define VDAT_INVALID 0xc1 /* invalid TPDU */
450:
451: /* */
452:
453: /* TP0 is the protocol */
454:
455: int tp0init ();
456: int tp0write ();
457:
458:
459: /* TCP is NS-provider */
460:
461: int tcpopen ();
462:
463: char *tcpsave ();
464: int tcprestore ();
465:
466:
467: /* X.25 is NS-provider */
468:
469: int x25open ();
470:
471: char *x25save ();
472: int x25restore ();
473:
474:
475: /* Bridge is NS-provider */
476:
477: int bridgeopen ();
478: int bridgediscrim ();
479:
480: char *bridgesave ();
481: int bridgerestore ();
482:
483:
484: /* TP4 is the protocol and the TS-provider */
485:
486: int tp4init ();
487:
488: int tp4open ();
489:
490: char *tp4save ();
491: int tp4restore ();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.