It assumes native SNA users, that is, those prepared to use SNA addresses and other SNA transport characteristics (for example, mode name for specifying quality of service).
Systems that do not support LU 6.2 full duplex can simulate them using twin-opposed half-duplex conversations. Protocols for doing so will be published separately.
The half-duplex verbs have been published for several years. The full duplex verbs are documented in the CPI-C Reference, Version 2.11.
This Appendix also defines data structures and constants required for
NetBIOS transport providers which are exposed through
For information about SNA addresses, see
Native SNA has no confirmed allocation protocol for full duplex conversations. When a conversation is allocated, the connection message is buffered and sent with the first data that is sent on the conversation. When the t_connect() or t_rcvconnect() function completes, connectivity has been established to the partner node, but not to the partner program. Since notification that the partner is not available may occur later, the disconnection reasons returned on t_rcvdis() include [T_SNA_CONNECTION_SETUP_FAILURE], indicating that the connection establishment never completed successfully.
An SNA program that needs to know that the partner is up and running before it proceeds sending data must have its own user-level protocol to determine if this is so.
LU 6.2 allows multiple, simultaneous connections between the same pair of addresses. The number of connections possible between two systems depends on limits defined by system administrators.
In connection-oriented mode, expedited data transfer can be negotiated by the two transport providers during connection establishment. Expedited data transfer is supported if both transport providers support it. However negotiation between transport users is not supported. Therefore the expedited option is read-only.
The semantics of
In order to take advantage of the performance improvement that SNA buffering offers, the XTI user must set the T_SNA_ALWAYS_PUSH option to T_NO (default is T_YES). If this option is not set to T_NO, a push will be done for every t_snd() and the T_PUSH flag will have no effect.
For the t_connect() and t_sndudata() functions, the address also contains a transaction program name (TPN), identifying the program addressed in the partner node. A file descriptor used to accept incoming connection requests should have a complete SNA name, including TPN, bound to it with t_bind().
A file descriptor used for outgoing connection requests may optionally have only a network-id-qualified LU name bound to it.
Since the t_listen() returns only the LU name part of the address, this address is not adequate for opening up a connection back to the source. The transport user must know the TPN of its partner by some mechanism other than XTI services.
However, t_rcvudata() returns the complete address of the partner that can be used to send a datagram back to it.
An SNA address has the following
structure. When the TPN is not included, the TPN length (sna_tpn_length)
is set to zero, and the string that follows is null.
-
-
/* The definitions for maximum LU name and netid lengths have specific */
/* values because these maxima are a fixed SNA characteristic, */
/* not an implementation option. Maximum TP length is a implementation */
/* option, although the maximum maximum is 64. */
#define T_SNA_MAX_NETID_LEN 8
#define T_SNA_MAX_LU_LEN 8
#define T_SNA_MAX_TPN_LEN
struct sna_addr{
u_char sna_netid (T_SNA_MAX_NETID_LEN),
u_char sna_lu (T_SNA_MAX_LU_LEN),
u_short sna_tpn_len, /* less than or equal to T_SNA_MAX_TPN_LEN */
u_char sna_tpn (sna_tpn_len)
}
This is adequate for file descriptors used for outgoing connection requests.
If no transaction program is associated with a file descriptor when a t_listen(), t_rcvudata(), or t_sndudata() is issued, the function will return a TPROTO error.
All options have end-to-end significance. Some may be negotiated in the XTI states T_IDLE and T_INCON, and all are read-only in all other states except T_UNINIT.
Option Name | Type of | Legal Option Value | Meaning |
---|---|---|---|
Option Value | |||
T_SNA_MODE | char | T_SNA_BATCH
T_SNA_BATCHSC T_SNA_INTER T_SNA_INTERSC T_SNA_DEFAULT any user-defined SNA mode value | SNA mode, which controls the underlying class of service
selected for the connection. The SNA mode is specified
only by the active side of the connection.
If not specified, the default mode is T_SNA_DEFAULT. The default mode characteristics may vary from system to system. |
T_SNA_ALWAYS_PUSH | t_uscalar_t | T_YES / T_NO | If T_YES, every t_snd() operation will cause the message
to be sent immediately.
If T_NO, the data from a t_snd() operation may be buffered and sent later. The transport user can set the T_PUSH flag on a t_snd() function call to cause the data to be sent immediately. Default value is T_NO. This option is primarily for programs migrated to SNA from other protocol stacks that always send data immediately. It allows them to request behaviour similar to that on the original provider. However, setting T_SNA_ALWAYS_PUSH to T_YES may affect its performance. |
If the endpoint was bound in the passive mode (that is, qlen > 0) and the requested address has a null transaction program subfield, the function completes with the T_BADADDR error.
An SNA transport provider allows more than one connection between the same address pair.
Since user data cannot be exchanged during the connection establishment phase, sndcall->udata.len must be set to 0. On return, rcvcall->udata.maxlen should be set to 0.
Parameters | Before Call | After Call |
---|---|---|
fd | x | / |
info->addr | / | 82 |
info->options | / | x 1 |
info->tsdu | / | T_INFINITE (-1) |
info->etsdu | / | T_INVALID (-2) / 86 2 |
info->connect | / | T_INVALID (-2) |
info->discon | / | T_INVALID (-2) |
info->servtype | / | T_COTS_ORD |
info->flags | / | T_SNDZERO |
The peeraddr value (if any) includes only the network-ID-qualified LU name of the partner.
Parameters | Before Call | After Call |
---|---|---|
name | x | / |
oflag | x | / |
info->addr | / | 82 |
info->options | / | x 1 |
info->tsdu | / | T_INFINITE (-1) |
info->etsdu | / | T_INVALID (-2) / 86 2 |
info->connect | / | T_INVALID (-2) |
info->discon | / | T_INVALID (-2) |
info->servtype | / | T_COTS_ORD |
info->flags | / | T_SNDZERO |
The following disconnection reason codes are valid for any implementation of an SNA transport provider under XTI:
-
-
#define T_SNA_CONNECTION_SETUP_FAILURE.
#define T_SNA_USER_DISCONNECT
#define T_SNA_SYSTEM_DISCONNECT
#define T_SNA_TIMEOUT
#define T_SNA_CONNECTION_OUTAGE
These definitions are exposed by the inclusion of
In order to take advantage of the performance improvement that SNA buffering offers, the XTI user must set the T_SNA_ALWAYS_PUSH option to T_NO (Default is T_YES). If this option is not set to T_NO, a push will be done for every t_snd() and the T_PUSH flag will have no effect.
If address associated with the file descriptor has a null transaction program name subfield, the function completes with the TPROTO error.
The unitdata->opt structure may contain an SNA mode governing the transmission of the data. For example, the program may confine data transmission to secure lines by selecting the T_SNA_INTERSC or T_SNA_BATCHSC modes.
First, several flow diagrams are given to illustrate the function of the XTI Mapper. Following this, mapping tables are given that show the FDX LU 6.2 verbs that the XTI Mapper needs to generate for each XTI function. For each XTI function that maps to a FDX verb, an additional table is referenced that gives the mappings of each parameter. Finally, a table shows mapping of LU 6.2 FDX return codes to XTI events.
The use of FDX LU 6.2 verbs in this section is for illustrative purposes only and is analogous to OSI's use of service primitives, that is, as a way to explain the semantics provided by the protocol. The FDX LU6.2 verbs are used only to help in understanding the SNA protocol, and are not a required part of an implementation.
FDX Verb | Description |
---|---|
ALLOCATE | Allocates a conversation between the local transaction program and a remote (partner) transaction program. |
DEALLOCATE | DEALLOCATE with TYPE(FLUSH) closes the local program's send queue. Both the local and remote program must close their send queues independently.
DEALLOCATE with TYPE(ABEND_PROG) is an abrupt termination that will close both sides of the conversation simultaneously. |
FLUSH | Flushes the local LU's send buffer. |
GET_ATTRIBUTES | Returns information pertaining to the specified conversation. |
GET_TP_PROPERTIES | Returns information pertaining to the transaction program issuing the verb. |
RECEIVE_ALLOCATE | Receives a new conversation with a partner transaction program that issued ALLOCATE. |
RECEIVE_AND_WAIT | Waits for data to arrive on the specified conversation and then receives the data. If data is already available, the program receives it without waiting. |
RECEIVE_EXPEDITED_DATA | Receives data sent by the remote transaction program in an expedited manner, via the SEND_EXPEDITED_DATA verb. |
SEND_DATA | Sends data to the remote transaction program. |
SEND_EXPEDITED_DATA | Sends data to the remote transaction program in an expedited manner. This means that it may arrive at the remote transaction program before data sent earlier via a send queue verb - for example, SEND_DATA. |
WAIT_FOR_COMPLETION | Waits for posting to occur on one or more non-blocking operations represented in the specified wait objects. Posting of a non-blocking operation occurs when the LU has completed the associated non-blocking verb and filled all the return values. |
When the t_connect has completed successfully a GET_ATTRIBUTES is issued if the mode name, or partner LU name are required on the return of the t_rcvconnect.
After the GET_ATTRIBUTES, a non-blocking RECEIVE_AND_WAIT is issued to post a receive for any incoming data.
The first
The second
The third
If EXPEDITED=YES, the mapper will issue a SEND_EXPEDITED_DATA verb rather than the SEND_DATA.
The XTI mapper then needs to issue a WAIT_FOR_COMPLETION to see if any other blocking LU 6.2 verbs have completed. This case is not shown in this diagram.
If EXPEDITED=YES, the mapper will issue a SEND_EXPEDITED_DATA verb rather than the SEND_DATA.
There may be an additional LU 6.2 verb issued due to the subsequent XTI verb that was issued. This is not shown in the above diagram.
In this diagram, the outstanding RECEIVE_AND_WAIT was issued when the connection was setup. This could be as a result of either a t_accept or t_connect.
In this diagram, the outstanding RECEIVE_AND_WAIT was issued when the connection was setup. This could be as a result of either a t_accept or t_connect.
It is possible that the amount of incoming data in the XTI mapper buffer is more than the XTI application stated on the t_rcv. In this case, the XTI Mapper will set the TMORE flag. Then, when the next t_rcv is issued, the remaining data will be passes to the XTI application BEFORE issuing the WAIT_FOR_COMPLETION to check the wait object on the outstanding RECEIVE_AND_WAIT.
The following table shows the mapping from XTI function calls to full duplex LU 6.2 verbs.
XTI Function | SNA FDX LU6.2 verb | Comments |
---|---|---|
t_accept() | RECEIVE_AND_WAIT | User data is not exchanged during connection establishment.
Refer to
|
t_alloc() | Local | |
t_bind() | If qlen>0: RECEIVE_ALLOCATE for each connection request that can be queued.
Optionally: DEFINE_TP
With the instantiation model, the TP name (that is, XTI application name)
must be known by the LU before the TP can be instantiated.
This is prior to the t_bind being issued. (Refer to
| Refer to
|
t_close() | If connection still up issue DEALLOCATE TYPE(FLUSH) | Refer to
|
t_connect() | ALLOCATE RETURN_CONTROL
GET_ATTRIBUTES RECEIVE_AND_WAIT | Refer to
|
t_error() | Local | |
t_free() | Local | |
t_getinfo() | Local | |
t_getprotaddr() | GET_TP_PROPERTIES to get OWN_FULLY_ QUALIFIED_LU_ NAME and OWN_TP_NAME
GET_ATTRIBUTES to get PARTNER_FULLY_ QUALIFIED_LU_ NAME | The partner's TP name must be learned by some mechanism other
than XTI services. In connectionless mode, there is no partner name.
Refer to
|
t_getstate() | Local | |
t_listen() | WAIT_FOR_COMPLETION | Refer to
|
t_look() | WAIT_FOR_COMPLETION | |
t_open() | Local | t_open sets blocking mode (that is, blocking or non-blocking) |
t_optmgmt() | GET_ATTRIBUTES | To get Mode name
Refer to
|
t_rcv() | WAIT_FOR_COMPLETION
RECEIVE_AND_WAIT [RECEIVE_EXPEDITED_DATA] WAIT_FOR_COMPLETION | Refer to
|
t_rcvconnect() | WAIT_FOR_COMPLETION
GET_ATTRIBUTES RECEIVE_AND_WAIT | Refer to
|
t_rcvdis() | Local | Event caused by DEALLOCATE_ABEND_* or RESOURCE_FAILURE_* return code on any verb |
t_rcvrel() | Local | Event caused by DEALLOCATE_NORMAL return code on RECEIVE_* verb |
t_snd() | SEND_DATA (expedited data)
[FLUSH] [SEND_EXPEDITED_DATA] | Every t_snd causes a SEND_DATA to be issued - even if T_MORE set.
If T_MORE is set, the LL continuation bit is set.
A zero-length TSDU causes the following LL to be sent: hex 0002. This can be used to turn off the LL continuation set on the previous send.
Refer to
|
t_snddis() | DEALLOCATE TYPE(ABEND_PROG) | Takes down both directions of the connection
Refer to
|
t_sndrel() | DEALLOCATE TYPE(FLUSH) | Takes down send direction of conversation only.
Refer to
|
t_sndudata() | SEND_DATA on datagram server conversation | Refer to
|
t_strerror() | local | |
t_sync() | local | |
t_unbind() | local |
Relation Symbol | Meaning |
---|---|
Used Locally | Value is used locally by XTI Mapper |
Created Locally | XTI Mapper creates the value |
Constant | Only one value is acceptable in this field. It is an error condition if any other value is passed. |
& | 60;& |
-> | FDX Verb parameter maps directly to XTI Application parameter. |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_accept | RECEIVE_AND_WAIT | |
Input | ||
fd | Used Locally | |
resfd | -> | RESOURCE(variable) |
call->addr.len | Used Locally | |
call->addr.buf | Used Locally | |
call->opt.len | Used Locally | |
call->opt.buf | Used Locally | |
call->udata.len | Constant | =0 |
call->udata.buf | Constant | =nullptr |
Created Locally | LENGTH(variable) | |
Created Locally | FILL(addr of local bufr) | |
Constant | WAIT_OBJECT(BLOCKING) | |
Output | ||
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_bind with qlen>0 | RECEIVE_ALLOCATE | |
Input | ||
fd | Used Locally | |
req->addr.len | Used Locally | |
req->addr.buf | & | 60;& |
LOCAL_LU_NAME(variable) | ||
TP_NAME(variable) | ||
T} | ||
req->qlen | Used Locally | >0, RECEIVE_ALLOCATE issued for each connection request that can be queued. |
ret->addr.maxlen | Used Locally | |
Constant | RETURN_CONTROL (WHEN_ALLOCATE_RECEIVED) | |
Constant | SCOPE(ALL) | |
Created Locally | WAIT_OBJECT(BLOCKING) | |
Output | ||
ret->addr.len | Created Locally | |
ret->addr.buf | -> | LOCAL_LU_NAME(variable)
TP_AL_LU_NAME(variable) |
ret->addr.qlen | Created Locally | |
Used Locally | RESOURCE(variable) | |
t_errno | -> | RETURN_CODE(variable) |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_close
If connection is still in T_DATAXFER state | DEALLOCATE | |
Input | ||
fd | -> | RESOURCE(variable) |
Constant | TYPE(FLUSH) | |
Output | ||
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_connect | ALLOCATE RETURN_CONTROL | |
Input | ||
fd | ||
sndcall->addr.len | Used Locally | |
sndcall->addr.buf | -> | LU_NAME(), TP_NAME() |
sndcall->opt.len | Used Locally | |
sndcall->opt.buf | -> | MODE_NAME() |
sndcall->udata.len | Constant | =0, user data not allowed |
sndcall->udata.buf | Constant | =nullptr |
rcvcall->addr.maxlen | Used Locally | |
rcvcall->addr.buf | Used Locally | |
rcvcall->opt.maxlen | Constant | =0, user data not allowed |
rcvcall->opt.buf | Used Locally | |
rcvcall->udata.maxlen | Constant | =0, user data not allowed |
rcvcall->udata.buf | Constant | =nullptr |
Constant | TYPE(FULL_DUPLEX_BASIC_CONV) | |
Created Locally | RETURN_CODE
(WHEN_SESSION_FREE)
If platform does not support this tower (Tower 205), use
| |
Created Locally | WAIT_OBJECT(BLOCKING) if blocking
WAIT_OBJECT(VALUE(variable)) if non-blocking | |
Output | ||
Used Locally | RESOURCE(variable) | |
t_errno | & | 60;& |
t_connect;;GET_ATTRIBUTES | ||
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Output | ||
rcvcall->addr.len | & | 60;& |
PARTNER_FULLY_QUALIFIED_ LU_NAME(variable) | ||
T} | ||
rcvcall->addr.buf | & | 60;& |
PARTNER_FULLY_QUALIFIED_ LU_NAME(variable) | ||
T} | ||
rcvcall->opt.len | & | 60;& |
rcvcall->opt.buf | & | 60;& |
t_errno | & | 60;& |
t_connect | RECEIVE_AND_WAIT | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Output | ||
Created Locally | LENGTH(variable) | |
Created Locally | FILL(addr of local bufr) | |
Constant | WAIT_OBJECT(BLOCKING) |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_getprotaddr | GET_ATTRIBUTES to get partner LU name | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
boundaddr->maxlen | Used Locally | |
boundaddr->addr.buf | Used Locally | |
peeraddr->maxlen | Used Locally | |
peeraddr->addr.buf | Used Locally | |
Output | ||
peeraddr->addr.len | Created Locally | |
buf(peeraddr->addr.buf) | & | 60;& |
PARTNER_FULLY_QUALIFIED_ LU_NAME(variable) | ||
T} | ||
t_errno | & | 60;& |
t_getprotaddr | GET_TP_PROPERTIES to get local TP name | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Output | ||
boundaddr->addr.len | Created Locally | |
buf(boundaddr->addr.buf) | & | 60;& |
OWN_FULLY_QUALIFIED_ LU_NAME(variable) | ||
OWN_TP_NAME(variable) | ||
T} | ||
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_listen | WAIT_FOR_COMPLETION | |
Input | ||
Created Locally | WAIT_OBJECT_LIST(variable) | |
Constant | TIMEOUT(VALUE(variable=0)) | |
Output | ||
t_errno | & | 60;& |
Used Locally | STATUS_LIST(variable) | |
t_listen | GET_ATTRIBUTES | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Output | ||
call->addr.len | & | 60;& |
PARTNER_FULLY_QUALIFIED _LU_NAME(variable) | ||
T} | ||
bufr&larrow.(call->addr.buf) | & | 60;& |
PARTNER_FULLY_QUALIFIED _LU_NAME(variable) | ||
T} | ||
call->opt.len | & | 60;& |
bufr&larrow.(call->opt.buf) | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_optmgmt | GET_ATTRIBUTES | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
req->opt.maxlen | Used Locally | |
req->opt.len | Used Locally | |
req->opt.buf | Used Locally | |
req->opt.flags | Used Locally | |
ret->opt.maxlen | Used Locally | |
ret->opt.buf | Used Locally | |
Output | ||
ret->opt.len | & | 60;& |
ret->opt.buf | & | 60;& |
ret->flags | Created Locally | |
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_rcv | RECEIVE_AND_WAIT | |
A RECEIVE_AND_WAIT has been issued prior to this t_rcv. The data
received on this RECEIVE_AND_WAIT will be returned to the XTI application
via the t_rcv.
Before the return to the t_rcv, the mapper will issue another RECEIVE_AND_WAIT to post a receive for any incoming data. | ||
Input | This is the RECEIVE_AND_WAIT that will be issued before the return to t_rcv. | |
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
nbytes | Used Locally | |
Created Locally | LENGTH(variable) | |
Created Locally | FILL(XTI mapper buffer) | |
Created Locally | WAIT_OBJECT(VALUE(variable)) | |
t_rcv | RECEIVE_AND_WAIT | |
Output | These are fields from the previously issued RECEIVE_AND_WAIT | |
buf | & | 60;& |
Return Value for function | & | 60;& |
flags
| Created Locally | WHAT_RECEIVED(variable)
If there is expedited data to be received, a RECEIVE_EXPEDITED_DATA verb will be issued to receive it. |
t_errno | & | 60;& |
t_rcv | WAIT_FOR_COMPLETION | |
Input | ||
Created Locally | WAIT_OBJECT_LIST(variable) | |
Constant | TIMEOUT(VALUE(variable=0)) | |
Output | ||
errno | & | 60;& |
T_LOOK | Used Locally | STATUS_LIST(variable) |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_rcvconnect | GET_ATTRIBUTES | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Output | ||
call->addr.len | & | 60;& |
PARTNER_FULLY_QUALIFIED_ LU_NAME(variable) | ||
T} | ||
call->addr.buf | & | 60;& |
PARTNER_FULLY_QUALIFIED_ LU_NAME(variable) | ||
T} | ||
call->opt.len | & | 60;& |
call->opt.buf | & | 60;& |
t_errno | & | 60;& |
t_rcvconnect | RECEIVE_AND_WAIT | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Created Locally | LENGTH(variable) | |
Created Locally | FILL(addr of local bufr) | |
Constant | WAIT_OBJECT(VALUE(variable)) | |
t_rcvconnect | WAIT_FOR_COMPLETION | |
Input | ||
Created Locally | WAIT_OBJECT_LIST(variable) | |
Constant | TIMEOUT(VALUE(variable=0)) | |
Output | ||
t_errno | & | 60;& |
T_LOOK | Used Locally | STATUS_LIST(variable) |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_snd() | SEND_DATA | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
buf | -> | DATA(variable) |
nbytes | -> | LENGTH(variable) |
flags
| -> | LL continuation bit |
Created Locally | WAIT_OBJECT(BLOCKING) if blocking
WAIT_OBJECT(VALUE(variable)) if non-blocking | |
Output | ||
(TLOOK) | & | 60;& |
t_errno | & | 60;& |
t_snd() | SEND_EXPEDITED_DATA | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
buf | -> | DATA(variable) |
nbytes | -> | LENGTH(variable) |
flags
| -> | LL continuation bit
FLUSH Verb |
Created Locally | WAIT_OBJECT(BLOCKING) if blocking | |
WAIT_OBJECT(VALUE(variable)) if non-blocking | ||
Output | ||
(TLOOK) | & | 60;& |
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_snddis()
For existing connection | DEALLOCATE | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
call | Constant | =nullptr |
Constant | TYPE(ABEND_PROG) | |
Output | ||
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_snddis()
To reject incoming connection request | DEALLOCATE | |
Input | ||
call->sequence | Used Locally | |
Output | ||
t_errno | & | 60;& |
XTI Function and Parameters | & | 60;& |
---|---|---|
t_sndrel() | DEALLOCATE | |
Input | ||
fd | Used Locally | |
Created Locally | RESOURCE(variable) | |
Created Locally | TYPE(FLUSH) | |
Output | ||
t_errno | & | 60;& |
The interface to the SNA transport provider is the FDX LU 6.2 interface. If the SNA transport provider does not support FDX LU 6.2, the FDX verbs can be mapped to two half-duplex LU 6.2 connections, one used to send in each direction. This gives the appearance of a full duplex connection without requiring any conversation direction turn-arounds on the half-duplex conversations.
The mapping of FDX LU 6.2 verbs to two half-duplex connections is described in FDX Kit.
The following table
Any return code for which there no mapping given in this table will create a disconnect.
XTI Event | Full Duplex SNA Event |
---|---|
T_CONNECT | ALLOCATE completes with RETURN_CODE=OK |
T_DATA | RECEIVE_AND_WAIT completes with OK return code
and WHAT_RECEIVED =
|
T_DISCONNECT | One of the following has occurred:
SEND_DATA issued with RETURN_CODE = ERROR_INDICATION with subcode from list below:
Any other verb issued with RETURN_CODE of
|
T_EXDATA | RECEIVE_EXPEDITED_DATA completes with OK return code |
T_GODATA | Flow control restrictions on normal data flow that lead to a [TFLOW] error have been lifted. Normal data may be sent again. |
T_GOEXDATA | Flow control restrictions on expedited data flow that lead to a [TFLOW] error have been lifted. Expedited data may be sent again. |
T_LISTEN | When the partner program is instantiated when the
connection request arrives
(the typical LU 6.2 model), this event is posted
as soon as the program issues
the t_listen() function call.
When the partner program already exists, this event is posted when the connection request arrives and is matched with the program. |
T_ORDREL | Set when a RECEIVE_* verb completes with RETURN_CODE = DEALLOCATE_NORMAL. |
Contents | Next section | Index |