Previous section.

CDE 1.1: Remote Procedure Call
Copyright © 1997 The Open Group

Connectionless RPC Protocol Machines

This chapter specifies the connectionless RPC protocol as a series of statecharts and accompanying tables of definitions.

CL_CLIENT Machine

CL_CLIENT Statechart shows the CL_CLIENT machine statechart.

Figure: CL_CLIENT Statechart

CL_CLIENT Activities

The CL_CLIENT statechart defines the following activities:

Chart:
CL_CLIENT

Activity:
ABORT_CALL

Description:
Flush and discard any further responses for this call. If this activity was caused by a detected failure, there may be numerous additional packets in the pipeline. The flush may be lazy, upon subsequent receive processing. Also, notify the run-time system and stub to reclaim any resources for this call.


Chart:
CL_CLIENT

Activity:
EXCEPTION

Description:
Raise a fault and return to calling routine.


Chart:
CL_CLIENT

Activity:
FETCH_TICKET

Description:
Obtains the security context for the RPC session from the security service (that is, kerberos ticket, if authentication service is rpc_c_authn_dce_secret).

The activity resets the conditional flag TICKET to false at the beginning, and sets TICKET to true before termination only if the fetch operation succeeded. FETCH_TICKET is a self-terminating activity.


Chart:
CL_CLIENT

Activity:
HANDLE_OUT_FRAG

Description:
This activity is invoked at each received fragment evaluation of out parameters for multi-fragmented RPC responses. The HANDLE_OUT_FRAG activity makes received data of continuous fragments available to the stub for unmarshalling and the object UUID (RT_OBJ_ID) available to the manager routine. This does not require a transfer of control from the run-time system to the stub for each fragment; implementation policy determines when control is transferred.

In addition, if the client receives a fragment out of order, HANDLE_OUT_FRAG buffers this fragment temporarily until subsequently received fragments allow for a consecutive inclusion of these temporarily buffered fragments. The fragment ordering is determined by the fragment number (RT_OUT_FRAG_NUM). If previously buffered out of order fragments are appended to the continuous receive buffer (RT_OUT_PARAMS), HANDLE_OUT_FRAG must also adjust the state variable RT_CONT_OUT_FRAG_NUM. HANDLE_OUT_FRAG also maintains the selective acknowledgement bit masks which are used in the fack PDU.

Modifications of RT_CONT_OUT_FRAG_NUM must be synchronised with other actions (DO_OUT_PKT) performed by the protocol machine.


Chart:
CL_CLIENT

Activity:
RESET_IN_FRAG

Description:
This activity is invoked if the protocol machine determines that a set of fragments needs to be retransmitted. RESET_IN_FRAG resets the values of SND_FRAG_NUM and RT_IN_FRAG to the beginning of the transmission queue. Note that the condition LAST_IN_FRAG must also be set appropriately.

The first fragment in this queue may not have fragment number 0, since other fragment acknowledgements may have been received, allowing the client to free previously sent data packets. Run time implementations must keep state about the acknowledgement of sent fragmented request PDUs.

This activity generates the event RESEND and marks TRANSMIT_REQ as true to trigger the transitions that actually invoke the appropriate SEND_PKT activities.


Chart:
CL_CLIENT

Activity:
SEND_PKT

Description:
Prepare a PDU to send to the server, adding the appropriate header information as necessary. If security services were requested (conditional flag AUTH is true), apply per-message security services. Send the PDU.

The conditional flags and data items set in the run-time system (with prefix SND_) provide the appropriate input for generating the PDU data. Note that actions within the same execution step that started this activity may have assigned values to the SND_* variables which have to be taken by this instance of the activity.

After sending a request PDU, the RT_IN_FRAG pointer is incremented accordingly, to point to the remaining data in the transmit queue.

Note:
The SEND_PKT activity may be invoked simultaneously by several orthogonal states (DATA, CONTROL, CANCEL, and so on). The run-time system must catch these send requests, buffer these and the associated data, and perform the sends in sequential order.


Chart:
CL_CLIENT

Activity:
VERIFY_AUTH

Description:
Verify the authentication trailer of PDU and decrypt message if necessary.

This activity takes as input values the PDU header field auth_proto (authentication protocol specifier: RT_AUTH_SPEC) and the authentication verifier (PDU trailer: RT_AUTH_VERIFIER).

Depending on the result of the verification, the activity VERIFY_AUTH generates either the event AUTHENTICATED (success) or DENIED (authentication failure).

The algorithm applied to this activity is dependent on the security service in use (determined by RT_AUTH_SPEC). The general evaluation steps for authentication service rpc_c_authn_dce_secret are as follows (for more details see Security ):


Note:
The VERIFY_AUTH activity may be invoked simultaneously by several orthogonal states (DATA, CONTROL and CANCEL). VERIFY_AUTH must not generate the event AUTHENTICATED unless the entire requested authentication processing is completed. If VERIFY_AUTH detects an authentication failure and generates the event DENIED, the protocol machine rejects the RPC call and no further processing is required.

CL_CLIENT States

The CL_CLIENT statechart defines the following states:


Chart:
CL_CLIENT

State:
AUTHENTICATION

Description:
Process authentication verification.

Reactions
Trigger Action
[RT_SECURITY_CONTEXT] st!(VERIFY_AUTH)



Chart:
CL_CLIENT

State:
AUTHENTICATION

Description:
Process authentication verification.

Reactions
Trigger Action
[RT_SECURITY_CONTEXT] st!(VERIFY_AUTH)



Chart:
CL_CLIENT

State:
CANCEL

Description:
Processing of requests to terminate a call in progress.


Chart:
CL_CLIENT

State:
CAN_IDLE

Description:
Wait for cancel requests.

Reactions
Trigger Action
en(CAN_IDLE) IF CURRENT_PENDING_CANCEL THEN tr!(RT_PENDING_CANCEL) END IF



Chart:
CL_CLIENT

State:
CL_CLIENT

Description:
Main state for statechart CL_CLIENT.

Reactions
Trigger Action
entering SND_ACTIVITY_ID:=SESSION_ACTIVITY_ID


Chart:
CL_CLIENT

State:
CNTL_IDLE

Description:
Wait for incoming control PDUs.

Reactions
Trigger Action
en(CNTL_IDLE) fs!(FAULT_PDU); fs!(WORKING_PDU); fs!(NOCALL_PDU); fs!(REJECT_PDU); fs!(FACK_PDU); fs!(CANCEL_ACK_PDU) T{ RECEIVE_PDU[PDU_TYPE=FACK and VALID_PDU_HEADER]
RECEIVE_PDU[PDU_TYPE=FAULT and VALID_PDU_HEADER] tr!(FAULT_PDU)
exiting IF AUTH THEN RT_AUTH_VERIFIER_CNTL:= PDU_AUTH_VERIFIER END IF
RECEIVE_PDU[PDU_TYPE=WORKING and VALID_PDU_HEADER] tr!(WORKING_PDU)
RECEIVE_PDU[PDU_TYPE=NOCALL and VALID_PDU_HEADER] tr!(NOCALL_PDU)
RECEIVE_PDU[PDU_TYPE=REJECT and VALID_PDU_HEADER] tr!(REJECT_PDU)
RECEIVE_PDU[PDU_TYPE=CANCEL_ACK and VALID_PDU_HEADER] tr!(CANCEL_ACK_PDU); RT_RCV_CANCEL_ID:=PDU_CANCEL_ID
RECEIVE_PDU[CNTL_PDU and VALID_PDU_HEADER] RCV_CNTL_PDU



Chart:
CL_CLIENT

State:
COMM_FAIL

Description:
Handle communication failures.

Reactions
Trigger Action
en(COMM_FAIL) RT_EXCEPTION_STATUS:=CONST_COMM_FAILURE; st!(EXCEPTION); st!(ABORT_CALL)



Chart:
CL_CLIENT

State:
COMPLETE

Description:
Call completed successfully (If NON_IDEMPOTENT wait for ACK_TIMEOUT).


Chart:
CL_CLIENT

State:
CONFIRMATION

Description:
Process response data (out parameters) for remote procedure call.

Reactions
Trigger Action
en(CONFIRMATION) fs!(RESPONSE_ACTIVE); RT_OUT_PARAMS:=NULL; RT_OUT_SERIAL_NUM:=-1; RT_CONT_OUT_FRAG_NUM:=-1; RT_LAST_OUT_FRAG_NUM:=-1; fs!(LAST_OUT_FRAG)


Chart:
CL_CLIENT

State:
CONF_IDLE

Description:
Receive response data from server (possibly fragmented).

Reactions
Trigger Action
en(CONF_IDLE)[RESPONSE_ACTIVE and RT_OUT_FRAG_NUM=RT_CONT_OUT_FRAG_NUM+1] DO_OUT_PKT; st!(HANDLE_OUT_FRAG)
en(CONF_IDLE)[RESPONSE_ACTIVE and (not NO_FACK or NO_FACK and RT_BUF_LIMIT)] FACK_CALL
en(CONF_IDLE)[RESPONSE_ACTIVE and RT_OUT_FRAG_NUM/=RT_CONT_OUT_FRAG_NUM+1] st!(HANDLE_OUT_FRAG)
RECEIVE_PDU[PDU_TYPE=RESPONSE and VALID_PDU_HEADER and not AUTH] tr!(RESPONSE_ACTIVE); DO_RESP; RCV_FRAG_PDU
RECEIVE_PDU[PDU_TYPE=RESPONSE and VALID_PDU_HEADER and AUTH] tr!(RESPONSE_ACTIVE); DO_RESP; RCV_FRAG_PDU_A
en(CONF_IDLE)[RESPONSE_ACTIVE and LAST_OUT_FRAG and RT_LAST_OUT_FRAG_NUM= RT_CONT_OUT_FRAG_NUM+1] RCV_LAST_OUT_FRAG



Chart:
CL_CLIENT

State:
CONTROL

Description:
Process received control PDUs.


Chart:
CL_CLIENT

State:
DATA

Description:
Process RPC call data.


Chart:
CL_CLIENT

State:
FAULT

Description:
Handle faults in processing call.

Reactions
Trigger Action
en(FAULT)[FAULT_PDU] RT_EXCEPTION_STATUS:=PDU_FAULT_STATUS; st!(EXCEPTION); st!(ABORT_CALL)
en(FAULT)[REJECT_PDU] RT_EXCEPTION_STATUS:=PDU_REJECT_STATUS; st!(EXCEPTION); st!(ABORT_CALL)
en(FAULT)[not FAULT_PDU
and not REJECT_PDU]
RT_EXCEPTION_STATUS:=PDU_REJECT_STATUS; st!(EXCEPTION); st!(ABORT_CALL)



Chart:
CL_CLIENT

State:
GET_TICKET

Description:
Get authentication ticket from security server (security service-specific).

Activities Throughout:

FETCH_TICKET


Chart:
CL_CLIENT

State:
INIT

Description:
Initial remote procedure call state.

Reactions
Trigger Action
exiting SETUP_CALL



Chart:
CL_CLIENT

State:
PING

Description:
Main state to handle asynchronous ping requests.


Chart:
CL_CLIENT

State:
PING_IDLE

Description:
Wait for expiration of WAIT_TIMEOUT.

Reactions
Trigger Action
exiting RT_PING_COUNT:=0



Chart:
CL_CLIENT

State:
REQUEST

Description:
Process request data (in parameters) for remote procedure call.


Chart:
CL_CLIENT

State:
REQ_WAIT

Description:
Handle fragmented requests to server.

Reactions
Trigger Action
tm(en(REQ_WAIT), TIMEOUT_FRAG) RESEND_IN_FRAGS
en(REQ_WAIT)[not REQUEST_ACTIVE] FIRST_REQ



Chart:
CL_CLIENT

State:
SND_CAN

Description:
Process cancel requests. Sends cancel PDU.

Reactions
Trigger Action
en(SND_CAN) or CLIENT_CANCEL or tm(CLIENT_CANCEL, TIMEOUT_CANCEL) CAN_CALL



Chart:
CL_CLIENT

State:
SND_PING

Description:
Send ping PDU.

Reactions
Trigger Action
en(SND_PING) or tm(en(SND_PING), TIMEOUT_PING) RT_PING_COUNT:=RT_PING_COUNT+1; SND_SERIAL_NUM:=SND_SERIAL_NUM+1; SND_REQUEST_TYPE:=PING; st!(SEND_PKT)



Chart:
CL_CLIENT

State:
WORKING

Description:
Main working state for call instance.

CL_CLIENT Events

The CL_CLIENT statechart defines the following events:


Chart:
CL_CLIENT

Event:
ABORT

Description:
RPC session (same activity UUID) has terminated.

Definition:
st(ABORT_CALL) or sp(FETCH_TICKET)[not
TICKET]


Chart:
CL_CLIENT

Event:
AUTHENTICATED

Description:
Authentication processing completed successfully.


Chart:
CL_CLIENT

Event:
CANCEL_REQ

Description:
Events which cause a transition into an active cancel state.

Definition:
CLIENT_CANCEL or [RT_PENDING_CANCEL] or
tm(CLIENT_CANCEL, TIMEOUT_CANCEL)


Chart:
CL_CLIENT

Event:
CLIENT_CANCEL

Description:
The client has issued a request to terminate a call.


Chart:
CL_CLIENT

Event:
COMPLETE

Description:
RPC completed (with success or fault).

Definition:
(en(COMPLETE)[not NON_IDEMPOTENT] or
en(CONFIRMATION)[MAYBE] or TM_ACK) and not
NO_CONNECTION and not FAULTS


Chart:
CL_CLIENT

Event:
DENIED

Description:
Authentication failure detected.

The VERIFY_AUTH activity generates this event if either the integrity check failed or the requested protection level for authentication services does not match.


Chart:
CL_CLIENT

Event:
FAULTS

Description:
Received a fault or reject PDU or a PDU with wrong authentication verifier.

Definition:
(RCV_FAULT or DENIED) and not NO_CONNECTION


Chart:
CL_CLIENT

Event:
FETCHED_TICKET

Description:
Client fetched a valid Ticket Granting Ticket.

Definition:
sp(FETCH_TICKET)[TICKET]


Chart:
CL_CLIENT

Event:
LAST_IN_PKT

Description:
Statechart internal event: last packet of fragmented request.

Definition:
[TRANSMIT_REQ and LAST_IN_FRAG and BURST and
REQUEST_ACTIVE] or
en(CNTL_IDLE)[TRANSMIT_REQ and FACK_PDU
and LAST_IN_FRAG and IN_FRAG_NUM_EQ and
REQUEST_ACTIVE]


Chart:
CL_CLIENT

Event:
NEXT_IN_PKT

Description:
Statechart internal event: intermediate packet of fragmented request.

Definition:
[TRANSMIT_REQ and not LAST_IN_FRAG and BURST
and REQUEST_ACTIVE] or
en(CNTL_IDLE)[TRANSMIT_REQ and FACK_PDU
and not LAST_IN_FRAG and IN_FRAG_NUM_EQ and
REQUEST_ACTIVE]


Chart:
CL_CLIENT

Event:
NO_CONNECTION

Description:
Detected communications failure due to timeout events or excessive retries.

Definition:
tm(en(CONFIRMATION),
TIMEOUT_BROADCAST)[BROADCAST] or
[in(SND_PING) and
RT_PING_COUNT>MAX_PINGS] or
[RT_REQUEST_COUNT>MAX_REQUESTS]


Chart:
CL_CLIENT

Event:
RCV_CNTL_PDU

Description:
Received one of the control PDUs with valid header.


Chart:
CL_CLIENT

Event:
RCV_FAULT

Description:
Received a fault or reject PDU. Generated in CNTL_CALL action.


Chart:
CL_CLIENT

Event:
RCV_FRAG_PDU

Description:
Received a response PDU for a non-authenticated call.


Chart:
CL_CLIENT

Event:
RCV_FRAG_PDU_A

Description:
Received a response PDU for an authenticated call.


Chart:
CL_CLIENT

Event:
RCV_LAST_OUT_FRAG

Description:
Received last fragment of response PDU and signalled completion to stub.

The last fragment of a multi-fragmented response or a single packet response was received. RCV_LAST_OUT_FRAG signals that the complete response data is available to the stub for unmarshalling.


Chart:
CL_CLIENT

Event:
RECEIVE_PDU

Description:
Received a PDU from server.


Chart:
CL_CLIENT

Event:
RESEND

Description:
Statechart internal event that triggers a resend of previously sent request PDUs.


Chart:
CL_CLIENT

Event:
RESEND_REQ

Description:
Resend the request if no fault was detected.

Definition:
RESEND and not NO_CONNECTION and not FAULTS


Chart:
CL_CLIENT

Event:
RESET

Description:
Reset ping processing after receiving an acknowledge from server.

Definition:
en(CNTL_IDLE)[WORKING_PDU] or
en(CONF_IDLE) or ex(CONFIRMATION)


Chart:
CL_CLIENT

Event:
START_CALL

Description:
Client has initiated an RPC and allocated the data (INVOKE service primitive). The AUTH conditional flag is initialised by the run-time system to reflect the requested security context.


Chart:
CL_CLIENT

Event:
TM_ACK

Description:
Timeout for sending an acknowledge PDU for non-idempotent calls.

Definition:
tm(ex(CONFIRMATION),
TIMEOUT_ACK)[NON_IDEMPOTENT]


Chart:
CL_CLIENT

Event:
TM_WAIT

Description:
Timeout for receiving a response PDU.

Definition:
tm(en(CONF_IDLE) or
en(PING_IDLE)[in(CONF_IDLE)],
TIMEOUT_WAIT)

CL_CLIENT Conditions

The CL_CLIENT statechart defines the following conditions:


Chart:
CL_CLIENT

Condition:
AUTH

Description:
Statechart internal flag: indicates that call is authenticated.


Chart:
CL_CLIENT

Condition:
BOOT_TIME_EQ

Description:
Statechart internal flag.

Definition:
SND_BOOT_TIME=PDU_BOOT_TIME or
SND_BOOT_TIME=0


Chart:
CL_CLIENT

Condition:
BROADCAST

Description:
Statechart internal flag: broadcast call semantic.


Chart:
CL_CLIENT

Condition:
BURST

Description:
Run time internal flag set if no fack is expected before sending next fragment. This flag is used by RPC run-time implementations to optimise the frequency of fragmented outbound packets.

The algorithms used to optimise traffic and avoid congestion are implementation-specific. The protocol machine waits for incoming fack PDUs if burst mode is off. The next outbound fragment is triggered by an inbound fack PDU.

Run time implementations are responsible for setting the corresponding nofack flags in the PDU header.


Chart:
CL_CLIENT

Condition:
CANCEL_ACK_PDU

Description:
Statechart internal flag: received cancel_ack PDU.


Chart:
CL_CLIENT

Condition:
CNTL_PDU

Description:
Statechart internal flag: control PDUs to be received.

Definition:
PDU_TYPE=FAULT or PDU_TYPE=WORKING or
PDU_TYPE=NOCALL or PDU_TYPE=REJECT or
PDU_TYPE=FACK


Chart:
CL_CLIENT

Condition:
CURRENT_PENDING_CANCEL

Description:
Cancel pending state passed from stub during initialisation of call.


Chart:
CL_CLIENT

Condition:
FACK_PDU

Description:
Statechart internal flag: received fack PDU.


Chart:
CL_CLIENT

Condition:
FAULT_PDU

Description:
Statechart internal flag: received fault PDU.


Chart:
CL_CLIENT

Condition:
IDEMPOTENT

Description:
Statechart internal flag: idempotent call.


Chart:
CL_CLIENT

Condition:
IN_FRAG_NUM_EQ

Description:
Statechart internal flag: received frag at server and last sent frag are equal.

This condition verifies the fragment number that was received in a fack PDU. (See RPC PDU Encodings for details.)

Definition:
SND_FRAG_NUM=PDU_FRAG_NUM


Chart:
CL_CLIENT

Condition:
IN_FRAG_NUM_NE

Description:
Statechart internal flag: received frag at server and last sent frag are not equal.

This condition verifies the fragment number that was received in a fack PDU. (See RPC PDU Encodings for details.)

Definition:
SND_FRAG_NUM/=PDU_FRAG_NUM


Chart:
CL_CLIENT

Condition:
LAST_IN_FRAG

Description:
Statechart internal flag: last in fragment or non-frag in packet ready to send.

This flag is set by the run-time system if the transmit queue contains the last fragment (see also Connection-oriented Protocol ).


Chart:
CL_CLIENT

Condition:
LAST_OUT_FRAG

Description:
Statechart internal flag: last out fragment or non-frag out packet received.


Chart:
CL_CLIENT

Condition:
MAYBE

Description:
Statechart internal flag: maybe call.


Chart:
CL_CLIENT

Condition:
NOCALL_PDU

Description:
Statechart internal flag: received nocall PDU.


Chart:
CL_CLIENT

Condition:
NON_IDEMPOTENT

Description:
Statechart internal flag: non-idempotent (at-most-once) call.

Definition:
not IDEMPOTENT and not BROADCAST and not MAYBE


Chart:
CL_CLIENT

Condition:
NO_FACK

Description:
Statechart internal flag: received PDU with nofack flag true.


Chart:
CL_CLIENT

Condition:
PDU_FRAG

Description:
PDU flag fragment.


Chart:
CL_CLIENT

Condition:
PDU_LAST_FRAG

Description:
PDU flag lastfrag.


Chart:
CL_CLIENT

Condition:
PDU_NO_FACK

Description:
PDU flag nofack.


Chart:
CL_CLIENT

Condition:
REJECT_PDU

Description:
Statechart internal flag: received reject PDU.


Chart:
CL_CLIENT

Condition:
REQUEST_ACTIVE

Description:
Statechart internal flag: send request has started.


Chart:
CL_CLIENT

Condition:
RESPONSE_ACTIVE

Description:
Statechart internal flag: indicates availability of response data.


Chart:
CL_CLIENT

Condition:
RT_BUF_LIMIT

Description:
Statechart internal flag: buffer limit reached for out packets.

The conditional flag RT_BUF_LIMIT triggers the generation of a fack PDU which requests the sender of data fragments to readjust the transmission rate.

It is a mechanism to indicate internal buffer limits (overflow) for avoidance of congestions and retransmissions. Since recipients may not evaluate the fack body data in a certain way, implementations must not rely on changes in the transmission rate. This indication is an advisory.

Run time implementations are responsible for setting the RT_BUF_LIMIT flag, according to its policies.


Chart:
CL_CLIENT

Condition:
RT_PENDING_CANCEL

Description:
Statechart internal: cancel pending state at server's provider.


Chart:
CL_CLIENT

Condition:
RT_SECURITY_CONTEXT

Description:
Statechart internal flag: set true if security context for call has been established.


Chart:
CL_CLIENT

Condition:
SEQ_NUM_GTE

Description:
Statechart internal flag: received sequence number >= initial call sequence number.

Definition:
PDU_SEQ_NUM>=RT_SEQ_NUM


Chart:
CL_CLIENT

Condition:
SESSION

Description:
Verify that call request is for same session (activity UUID matches).

Definition:
SND_ACTIVITY_ID=SESSION_ACTIVITY_ID


Chart:
CL_CLIENT

Condition:
SND_FRAG

Description:
Statechart internal flag: header flag frag of next fragments to be sent.


Chart:
CL_CLIENT

Condition:
SND_LAST_FRAG

Description:
Statechart internal flag: header flag lastfrag for PDU to be sent.


Chart:
CL_CLIENT

Condition:
TICKET

Description:
The authentication ticket is valid (not expired or about to expire).

The authentication ticket from the call's client principal to the server's principal is valid. The particular ticket depends on the client/server pair of principals, and may be different for different RPCs.

Note that implementations may cache unexpired tickets, even across process invocations or system reboots. Therefore, this condition predicate may be maintained external to the RPC run-time system.


Chart:
CL_CLIENT

Condition:
TRANSMIT_REQ

Description:
One or more fragments queued for transmission of request data.

This flag indicates that one or more request fragment(s) are queued in a run-time internal buffer and ready to be transmitted. In conjunction with the BURST flag and possibly expected fack PDUs, an event for transmitting the next fragment will be generated.

The run-time system internally sets this flag to true after the stub initially provided data in the transmit queue, sufficient for at least the first PDU fragment to be transmitted. The protocol machine resets this flag if it has detected and taken an event for sending the next fragment in the queue. The run-time system sets this flag again after completion of a SEND_PKT activity if the transmit queue contains enough data for the next PDU fragment to be transmitted.


Chart:
CL_CLIENT

Condition:
VALID_PDU_HEADER

Description:
Pre-evaluation of PDU header (before authentication processing).

Definition:
PDU_ACTIVITY_ID=SESSION_ACTIVITY_ID and
PDU_AUTH_SPEC=RT_AUTH_SPEC and
SEQ_NUM_GTE and BOOT_TIME_EQ and
PDU_VERSION_NUM=CL_VERSION_NUM_V20


Chart:
CL_CLIENT

Condition:
WORKING_PDU

Description:
Statechart internal flag: received working PDU.

CL_CLIENT Actions

The CL_CLIENT statechart defines the following actions:


Chart:
CL_CLIENT

Action:
CAN_CALL

Description:
Set up cancel PDU to be sent.

Definition:
INCR_CANCEL_ID;
SND_REQUEST_TYPE:=CANCEL;
st!(SEND_PKT)


Chart:
CL_CLIENT

Action:
CNTL_CALL

Description:
Reactions on received control PDUs.

Definition:
IF
CANCEL_ACK_PDU and
RT_RCV_CANCEL_ID>RT_CANCEL_ID
THEN
RT_CANCEL_ID:=RT_RCV_CANCEL_ID
END IF;
IF
FACK_PDU or NOCALL_PDU and
PDU_FACK_BODY/=NULL
THEN
EVAL_FACK_BODY
END IF;
IF
WORKING_PDU
THEN
RT_WAIT_COUNT:=RT_WAIT_COUNT+1
END IF;
IF
NOCALL_PDU or FACK_PDU and
IN_FRAG_NUM_NE
THEN
RESEND_IN_FRAGS
END IF;
IF
FAULT_PDU or REJECT_PDU
THEN
RCV_FAULT
END IF


Chart:
CL_CLIENT

Action:
DO_OUT_PKT

Description:
Append received response PDU body data to internal buffer.

Definition:
RT_CONT_OUT_FRAG_NUM:=RT_CONT_OUT_FRAG_NUM+1;
RT_OUT_PARAMS:=RT_OUT_PARAMS+RT_BODY


Chart:
CL_CLIENT

Action:
DO_REQ

Description:
Send last in fragment to server.

Definition:
fs!(TRANSMIT_REQ);
IF
LAST_IN_FRAG
THEN
tr!(SND_LAST_FRAG)
ELSE
fs!(SND_LAST_FRAG)
END IF;
SND_FRAG_NUM:=SND_FRAG_NUM+1;
SND_SERIAL_NUM:=SND_SERIAL_NUM+1;
RT_REQUEST_COUNT:=0;
RT_WAIT_COUNT:=0;
SND_IN_PARAMS:=RT_IN_FRAG;
SND_REQUEST_TYPE:=REQUEST;
st!(SEND_PKT)


Chart:
CL_CLIENT

Action:
DO_RESP

Description:
Evaluate response PDU header.

Definition:
RT_BODY:=PDU_BODY;
RT_OUT_FRAG_NUM:=PDU_FRAG_NUM;
RT_OUT_SERIAL_NUM:=PDU_SERIAL_NUM;
IF
AUTH
THEN
RT_AUTH_VERIFIER_CALL:=PDU_AUTH_VERIFIER
END IF;
IF
PDU_NO_FACK
THEN
tr!(NO_FACK)
ELSE
fs!(NO_FACK)
END IF;
IF
PDU_LAST_FRAG or not PDU_FRAG
THEN
tr!(LAST_OUT_FRAG);
RT_LAST_OUT_FRAG_NUM:=PDU_FRAG_NUM
END IF


Chart:
CL_CLIENT

Action:
EVAL_FACK_BODY

Description:
Invoke implementation-specific activity to evaluate fack PDU body data.

This action reads the fack PDU body data according to the PDU specification. It is RPC run-time system implementation-specific how this data will be evaluated and used for subsequent fragmented transmissions. Note that this action also handles nocall PDUs that have body data, equivalent to fack PDU body data.

Definition:
rd!(PDU_FACK_BODY)


Chart:
CL_CLIENT

Action:
FACK_CALL

Description:
Send fack PDU if nofack flag is false or receiver has buffer full condition.

Definition:
SND_IN_PARAMS:=RT_FACK_BODY;
SND_REQUEST_TYPE:=FACK;
st!(SEND_PKT)


Chart:
CL_CLIENT

Action:
FINAL

Description:
Send ack PDU to server (for non-idempotent calls only).

Definition:
WHEN
TM_ACK
THEN
SND_REQUEST_TYPE:=ACK;
st!(SEND_PKT)
END WHEN


Chart:
CL_CLIENT

Action:
FIRST_REQ

Description:
Set up and send first request PDU.

If the request is non-fragmented (single PDU), the actual send activity will be performed through the LAST_REQ action.

Definition:
tr!(REQUEST_ACTIVE);
SND_FRAG_NUM:=0;
RT_IN_FRAG:=RT_IN_PARAMS;
SND_SEQ_NUM:=RT_SEQ_NUM;
SND_IF_ID:=RT_IF_ID;
SND_IF_VERSION:=RT_IF_VERSION;
SND_OBJ_ID:=RT_OBJ_ID;
SND_OP_NUM:=RT_OP_NUM;
SND_AUTH_SPEC:=RT_AUTH_SPEC;
RT_WAIT_COUNT:=0;
IF
not LAST_IN_FRAG
THEN
fs!(TRANSMIT_REQ);
tr!(SND_FRAG);
SND_IN_PARAMS:=RT_IN_PARAMS;
SND_REQUEST_TYPE:=REQUEST;
st!(SEND_PKT)
ELSE
fs!(SND_FRAG)
END IF


Chart:
CL_CLIENT

Action:
INCR_CANCEL_ID

Description:
Increment cancel_id (implementation-specific algorithm).

Definition:
RT_CANCEL_ID:=RT_CANCEL_ID+1


Chart:
CL_CLIENT

Action:
INIT_CANCEL_ID

Description:
Initialise the cancel_id to be sent in the 1st request (implementation-specific).

Definition:
RT_CANCEL_ID:=0;
RT_RCV_CANCEL_ID:=0


Chart:
CL_CLIENT

Action:
RESEND_IN_FRAGS

Description:
Perform a resend of previously sent request fragments.

Definition:
fs!(TRANSMIT_REQ);
RT_REQUEST_COUNT:=RT_REQUEST_COUNT+1;
st!(RESET_IN_FRAG)


Chart:
CL_CLIENT

Action:
SETUP_CALL

Description:
Set up and initialise call data.

Definition:
fs!(REQUEST_ACTIVE);
RT_SEQ_NUM:=RT_SEQ_NUM+1;
RT_REQUEST_COUNT:=0;
fs!(SND_LAST_FRAG);
SND_SERIAL_NUM:=0;
INIT_CANCEL_ID;
fs!(RT_PENDING_CANCEL)

CL_CLIENT Data-Items

The CL_CLIENT statechart defines the following data items:


Chart:
CL_CLIENT

Data Item:
ACK

Description:
Constant: PDU type ack.

Definition:
7


Chart:
CL_CLIENT

Data Item:
CANCEL

Description:
Constant: PDU type cancel.

Definition:
8


Chart:
CL_CLIENT

Data Item:
CANCEL_ACK

Description:
Constant: PDU type cancel_ack.

Definition:
10


Chart:
CL_CLIENT

Data Item:
CL_VERSION_NUM_V20

Description:
Constant: RPC protocol version 2.0 version number.

Definition:
4


Chart:
CL_CLIENT

Data Item:
CONST_COMM_FAILURE

Description:
Reject status code.


Chart:
CL_CLIENT

Data Item:
FACK

Description:
Constant: PDU type fack.

Definition:
9


Chart:
CL_CLIENT

Data Item:
FAULT

Description:
Constant: PDU type fault.

Definition:
3


Chart:
CL_CLIENT

Data Item:
MAX_PINGS

Description:
Constant for max numbers of unacknowledged pings.


Chart:
CL_CLIENT

Data Item:
MAX_REQUESTS

Description:
Constant for maximum numbers of requests that should be sent per call.


Chart:
CL_CLIENT

Data Item:
NOCALL

Description:
Constant: PDU type nocall.

Definition:
5


Chart:
CL_CLIENT

Data Item:
PDU_ACTIVITY_ID

Description:
PDU header field: act_id.


Chart:
CL_CLIENT

Data Item:
PDU_AUTH_SPEC

Description:
PDU header field: auth_proto.


Chart:
CL_CLIENT

Data Item:
PDU_AUTH_VERIFIER

Description:
PDU trailer: authentication verifier (authentication protocol-specific).


Chart:
CL_CLIENT

Data Item:
PDU_BODY

Description:
Array of PDU body data.


Chart:
CL_CLIENT

Data Item:
PDU_BOOT_TIME

Description:
PDU header field: server_boot (value of zero at first request from client).


Chart:
CL_CLIENT

Data Item:
PDU_CANCEL_ID

Description:
cancel_id of received cancel_ack PDU body data.


Chart:
CL_CLIENT

Data Item:
PDU_FACK_BODY

Description:
Body information of fack PDU (implementation-dependent).


Chart:
CL_CLIENT

Data Item:
PDU_FAULT_STATUS

Description:
Fault status associated with the fault PDU body.


Chart:
CL_CLIENT

Data Item:
PDU_FRAG_NUM

Description:
PDU header field: fragnum.


Chart:
CL_CLIENT

Data Item:
PDU_REJECT_STATUS

Description:
Reject status code associated with reject PDU body.


Chart:
CL_CLIENT

Data Item:
PDU_SEQ_NUM

Description:
PDU header field: seqnum.


Chart:
CL_CLIENT

Data Item:
PDU_SERIAL_NUM

Description:
PDU header field: serial_hi.


Chart:
CL_CLIENT

Data Item:
PDU_TYPE

Description:
PDU header field: ptype.


Chart:
CL_CLIENT

Data Item:
PDU_VERSION_NUM

Description:
PDU header field: rpc_vers.


Chart:
CL_CLIENT

Data Item:
PING

Description:
Constant: PDU type ping.

Definition:
1


Chart:
CL_CLIENT

Data Item:
REJECT

Description:
Constant: PDU type reject.

Definition:
6


Chart:
CL_CLIENT

Data Item:
REQUEST

Description:
Constant: PDU type request.

Definition:
0


Chart:
CL_CLIENT

Data Item:
RESPONSE

Description:
Constant: PDU type response.

Definition:
2


Chart:
CL_CLIENT

Data Item:
RT_AUTH_SPEC

Description:
Statechart internal: authentication protocol specifier used in current call.


Chart:
CL_CLIENT

Data Item:
RT_AUTH_VERIFIER_CALL

Description:
Statechart internal: received authentication trailer (verifier) for response PDU.


Chart:
CL_CLIENT

Data Item:
RT_AUTH_VERIFIER_CNTL

Description:
Received authentication trailer (verifier) for control PDU.


Chart:
CL_CLIENT

Data Item:
RT_BODY

Description:
Statechart internal: temporarily buffered response PDU body data.


Chart:
CL_CLIENT

Data Item:
RT_CANCEL_ID

Description:
Statechart internal: cancel_id as received with cancel_ack PDU.


Chart:
CL_CLIENT

Data Item:
RT_CONT_OUT_FRAG_NUM

Description:
Statechart internal: last fragment number of continuously buffered out block.


Chart:
CL_CLIENT

Data Item:
RT_EXCEPTION_STATUS

Description:
Statechart internal: status value passed to exception handler.


Chart:
CL_CLIENT

Data Item:
RT_FACK_BODY

Description:
Statechart internal: body data for fack PDU.


Chart:
CL_CLIENT

Data Item:
RT_IF_ID

Description:
Statechart internal: buffered interface UUID of RPC.


Chart:
CL_CLIENT

Data Item:
RT_IF_VERSION

Description:
Statechart internal: buffered interface version of RPC.


Chart:
CL_CLIENT

Data Item:
RT_IN_FRAG

Description:
Statechart internal pointer to data to be sent in next request PDU.

The SEND_PKT activity increments this pointer after a request PDU was sent.


Chart:
CL_CLIENT

Data Item:
RT_IN_PARAMS

Description:
Statechart internal: buffered array of reassembled input data.

RT_IN_PARAMS is the queue of transmit data provided by the stub. A possible segmentation of this queue is not equivalent to the sizes of PDU fragments sent by the run-time system (SEND_PKT) activity.

The RT_IN_FRAG variable is a pointer data type that points to the to be transmitted data fragment within this RT_IN_PARAMS queue.


Chart:
CL_CLIENT

Data Item:
RT_LAST_OUT_FRAG_NUM

Description:
Fragment number of last out fragment of remote procedure call.


Chart:
CL_CLIENT

Data Item:
RT_OBJ_ID

Description:
Statechart internal: buffered object UUID of RPC.


Chart:
CL_CLIENT

Data Item:
RT_OP_NUM

Description:
Statechart internal: buffered operation number of RPC.


Chart:
CL_CLIENT

Data Item:
RT_OUT_FRAG_NUM

Description:
Statechart internal: fragnum of currently received response PDU.


Chart:
CL_CLIENT

Data Item:
RT_OUT_PARAMS

Description:
Buffered array of unfragmented output data.


Chart:
CL_CLIENT

Data Item:
RT_OUT_SERIAL_NUM

Description:
Serial number of sent fragment.


Chart:
CL_CLIENT

Data Item:
RT_PING_COUNT

Description:
Counter for transmitted ping PDUs per WAIT cycle.


Chart:
CL_CLIENT

Data Item:
RT_RCV_CANCEL_ID

Description:
Statechart internal: received cancel identifier.


Chart:
CL_CLIENT

Data Item:
RT_REQUEST_COUNT

Description:
The number of times a request PDU has been sent for the current fragment.


Chart:
CL_CLIENT

Data Item:
RT_SEQ_NUM

Description:
Sequence number of call: determined by the run-time system (implementation-specific).

The SETUP_CALL action increments this sequence number for every new instance of a call. Implementations may choose a different algorithm, complying to the definition of sequence numbers as specified in Connectionless RPC PDUs .


Chart:
CL_CLIENT

Data Item:
RT_WAIT_COUNT

Description:
Statechart internal: counter to determine the length of wait in REQ_WAIT state.


Chart:
CL_CLIENT

Data Item:
SESSION_ACTIVITY_ID

Description:
Statechart internal: activity UUID of current RPC (passed from stub).


Chart:
CL_CLIENT

Data Item:
SND_ACTIVITY_ID

Description:
Activity UUID of current RPC.


Chart:
CL_CLIENT

Data Item:
SND_AUTH_SPEC

Description:
Authentication specifier used for current RPC.


Chart:
CL_CLIENT

Data Item:
SND_BOOT_TIME

Description:
Boot time value promoted to SEND_PKT activity.


Chart:
CL_CLIENT

Data Item:
SND_FRAG_NUM

Description:
Fragment number of PDU to be sent.


Chart:
CL_CLIENT

Data Item:
SND_IF_ID

Description:
Interface UUID of current RPC.


Chart:
CL_CLIENT

Data Item:
SND_IF_VERSION

Description:
Interface version number of current RPC.


Chart:
CL_CLIENT

Data Item:
SND_IN_PARAMS

Description:
PDU body data promoted to SEND_PKT activity.


Chart:
CL_CLIENT

Data Item:
SND_OBJ_ID

Description:
Object UUID of current RPC.


Chart:
CL_CLIENT

Data Item:
SND_OP_NUM

Description:
Operation number of current RPC.


Chart:
CL_CLIENT

Data Item:
SND_REQUEST_TYPE

Description:
PDU type to be sent.


Chart:
CL_CLIENT

Data Item:
SND_SEQ_NUM

Description:
Sequence number of current RPC.


Chart:
CL_CLIENT

Data Item:
SND_SERIAL_NUM

Description:
Serial number of PDU to be sent.


Chart:
CL_CLIENT

Data Item:
TIMEOUT_ACK

Description:
Timeout value for how long the client will wait before sending an ack PDU.


Chart:
CL_CLIENT

Data Item:
TIMEOUT_BROADCAST

Description:
Timeout value for how long the client will wait for response to a broadcast PDU.


Chart:
CL_CLIENT

Data Item:
TIMEOUT_CANCEL

Description:
Timeout value for cancel requests.

Sets the lower bound on the time to wait before timing out after forwarding a cancel PDU to the server. The default of this timeout value is set to one second (refer to Architected and Default Values for Protocol Machines .) Applications may set a different value via the rpc_mgmt_set_cancel_timeout RPC API.


Chart:
CL_CLIENT

Data Item:
TIMEOUT_FRAG

Description:
Timeout value for wait for a fack PDU after a request PDU (no nofack) sent.


Chart:
CL_CLIENT

Data Item:
TIMEOUT_PING

Description:
Timeout value for how long to wait for response to a ping PDU.


Chart:
CL_CLIENT

Data Item:
TIMEOUT_WAIT

Description:
Timeout value for how long the client will wait for a response.


Chart:
CL_CLIENT

Data Item:
WORKING

Description:
Constant: PDU type working.

Definition:
4

CL_SERVER Machine

CL_SERVER Statechart shows the CL_SERVER machine statechart.

Figure: CL_SERVER Statechart

CL_SERVER Activities

The CL_SERVER statechart defines the following activities:


Chart:
CL_SERVER

Activity:
ABORT_CALL

Description:
Flush and discard any further received packets for this call. If this activity was caused by a detected failure, there may be numerous additional packets in the pipeline. The flush may be lazy, upon subsequent receive processing. Also, notify the run-time system and stub to reclaim any resources for this call.


Chart:
CL_SERVER

Activity:
CANCEL_NOTIFY_APP

Description:
This activity notifies the manager routine of the RPC application about the cancel request issued by the client.

CANCEL_NOTIFY_APP activity terminates after acknowledgement from the stub. The stub sets the RETURN_PENDING_CANCEL flag appropriately.


Chart:
CL_SERVER

Activity:
HANDLE_IN_FRAG

Description:
This activity is invoked at each received fragment evaluation of in parameters for multi-fragmented RPC requests.

The HANDLE_IN_FRAG activity makes received data of continuous fragments available to the stub for unmarshalling and passes the object UUID (RT_OBJ_ID) to the manager routine. This does not require a transfer of control from the run-time system to the stub for each fragment; implementation policy determines when control is transferred.

In addition, if the server receives a fragment out of order, HANDLE_IN_FRAG buffers this fragment temporarily until subsequently received fragments allow for a consecutive inclusion of these temporarily buffered fragments. The fragment ordering is determined by the fragment number (RT_IN_FRAG_NUM). If previously buffered out of order fragments are appended to the continuous receive buffer (RT_IN_PARAMS), HANDLE_IN_FRAG must also adjust the state variable RT_CONT_IN_FRAG_NUM. HANDLE_IN_FRAG also maintains the selective acknowledgement bit masks which are used in the fack PDU.

Modifications of RT_CONT_IN_FRAG_NUM must be synchronised with other actions (DO_IN_PKT) performed by the protocol machine.


Chart:
CL_SERVER

Activity:
RESET_OUT_FRAG

Description:
This activity is invoked if the protocol machine determines that a set of fragments needs to be retransmitted. RESET_OUT_FRAG resets the values of SND_FRAG_NUM and RT_OUT_FRAG to the beginning of the transmission queue. Note that the condition LAST_OUT_FRAG must also be set appropriately.

The first fragment in this queue may not fragment number 0, since other fragment acknowledgements may have been received, allowing the server to free previously sent data packets. Implementations must keep state about the acknowledgement of sent fragmented response PDUs.

This activity generates the event RESEND and marks TRANSMIT_RESP as true to trigger the transitions that actually invoke the appropriate SEND_PKT activities.


Chart:
CL_SERVER

Activity:
SEND_PKT

Description:
Prepare a PDU to send to the client, adding the appropriate header information as necessary. If security services were requested (conditional flag AUTH is true), apply per-message security services. Send the PDU.

The conditional flags and data items set in the run-time system (with prefix SND_) provide the appropriate input for generating the PDU data. Note that actions within the same execution step that started this activity may have assigned values to the SND_* variables which have to be taken by this instance of the activity.

After sending a response PDU, the RT_OUT_FRAG pointer is incremented accordingly, to point to the remaining data in the transmit queue.

Note:
The SEND_PKT activity may be invoked simultaneously by several orthogonal states (WORKING, CONTROL, CANCEL, and so on). The run-time system must catch these send requests, buffer these and the associated data, and perform the sends in sequential order.


Chart:
CL_SERVER

Activity:
SEND_WAY

Description:
Set up and perform the conversation manager remote procedure call conv_who_are_you() (specified in Conversation Manager Interface Definition ). Conversation manager operations enable servers to enforce at-most-once execution semantics.

The server invokes this activity when it does not have a record of the client's call sequence number.

There are three cases in which a server will have no record of a client's sequence number:

Input parameters for this call are:

h
The primitive call handle.

actuid
This is SND_ACTIVITY_ID, passed from the protocol machine; the activity UUID of the current outstanding request. In implementations that support multiple simultaneous client requests, this value is used to identify the client about whose request the server is querying.

boot_time
This is SYS_BOOT_TIME, passed from the protocol machine; the server's boot time.

Output parameters are:

seq
This is passed as PARAM_CB_SEQ_NUM to the protocol machine: the sequence number that the client associates with its current outstanding request.

st
This is passed as PARAM_CB_STATUS to the protocol machine; the status information returned by the operation. This may be one of:

CONST_RPC_S_OK
Operation succeeded.

CONST_YOU_CRASHED
The server has crashed and rebooted since establishing communication with the client.

CONST_BAD_ACT_ID
The activity UUID was wrong.

The client of the initiating RPC acts as server for an idempotent call with the same activity identifier (that is, a CL_SERVER protocol machine gets instantiated). The client (now acting as server) sets the received server boot_time (SYS_BOOT_TIME) in the client protocol machine (SND_BOOT_TIME). If the client subsequently receives a conversation manager request whose SYS_BOOT_TIME is later than the stored SND_BOOT_TIME, the client knows that the server has crashed and rebooted and sends a status CONST_YOU_CRASHED in its response.


Chart:
CL_SERVER

Activity:
SEND_WAY2

Description:
SEND_WAY2 supersedes SEND_WAY and is called only if the server stub signals that it requires the execution context of the current call and if the run-time protocol machine has not obtained this state information yet. This activity performs the conv_who_are_you2() remote procedure call (specified in Conversation Manager Interface Definition ).

The additional output parameter is:

cas_uuid
This is passed as PARAM_CLIENT_EXECUTION_CONTEXT to the protocol machine: a UUID that uniquely identifies the execution context (address space) of the calling client. This information is needed for servers that maintain client context state.

Note:
If the RPC is an authenticated call, the run-time system should have the execution context information already, since PARAM_CLIENT_EXECUTION_CONTEXT is carried as out parameter of the SEND_WAYAUTH activity.


Chart:
CL_SERVER

Activity:
SEND_WAYAUTH

Description:
SEND_WAYAUTH supersedes SEND_WAY and SEND_WAY2 and is called only for authenticated RPC requests (conditional flag AUTH is true) that do not use a previously established security context (RT_SECURITY_CONTEXT condition is false). This activity performs the conv_who_are_you_auth() remote procedure call (specified in Conversation Manager Interface Definition ).

Should the security information be larger than a full packet, the client returns a partial credentials status code. The server then makes additional calls to conv_who_are_you_auth_more() until the complete security credentials are assembled. If the conv_who_are_you_auth() call is returned with a challenge malformed, the server then assumes that the client does not support EPAC and an old style challenge is issued.

The additional input parameters for conv_who_are_you_auth() are:

in_len
This is SND_CB_IN_LEN, passed from the protocol machine; the length in bytes of SND_CB_IN_DATA.

in_data
This is SND_CB_IN_DATA, passed from the protocol machine; An array of bytes issued to the client as an authentication challenge.

Contents of in_data are determined by the authentication protocol used. Encodings for the protocol dce_c_rpc_authn_protocol_krb5 are specified in Security Services for Connectionless Protocol .

out_max_len
This is SND_CB_OUT_MAX_LEN, passed from the protocol machine; the maximum length in bytes of the array to be returned in PARAM_CB_OUT_DATA.

The additional output parameters are:

out_len
This is passed as PARAM_CB_OUT_LEN to the protocol machine; the length in bytes of PARAM_CB_OUT_DATA.

out_data
This is passed as PARAM_CB_OUT_DATA to the protocol machine; an array of bytes returned to the server as an authentication response.

Contents of out_data are determined by the authentication protocol used. Encodings for dce_c_rpc_authn_protocol_krb5 protocol are specified in Security Services for Connectionless Protocol .

The client of the initiating RPC (now acting as server) verifies the received challenge message and sets (if succeeded) the condition flag RT_SECURITY_CONTEXT in the client protocol machine to true, otherwise it sets RT_SECURITY_CONTEXT to false and raises the event DENIED.


Chart:
CL_SERVER

Activity:
VERIFY_AUTH

Description:
Verify the authentication trailer of PDU and decrypt message if necessary.

This activity takes as input values the PDU header field auth_proto (authentication protocol specifier: RT_AUTH_SPEC) and the authentication verifier (PDU trailer: RT_AUTH_VERIFIER).

Depending on the result of the verification, the activity VERIFY_AUTH generates either the event AUTHENTICATED (success) or DENIED (authentication failure).

The algorithm applied to this activity is dependent on the security service in use (determined by RT_AUTH_SPEC). The general evaluation steps for authentication service rpc_c_authn_dce_secret are as follows (for more details see Security ):

Note:
The VERIFY_AUTH activity may be invoked simultaneously by several orthogonal states (WORKING, CONTROL and CANCEL). VERIFY_AUTH must not generate the event AUTHENTICATED unless the entire requested authentication processing is completed. If VERIFY_AUTH detects an authentication failure and generates the event DENIED, the protocol machine rejects the RPC and no further processing is required.


Chart:
CL_SERVER

Activity:
VERIFY_AUTH_CONTEXT

Description:
Verifies the results of the conversation manager callback (SEND_WAYAUTH) according to the authentication protocol used.

This activity evaluates the returned parameter PARAM_CB_OUT_DATA (PARAM_CB_OUT_LEN), containing the authentication response. It sets the condition flag RT_SECURITY_CONTEXT to true if verification succeeded or raises DENIED if verification failed.

CL_SERVER States

The CL_SERVER statechart defines the following states:


Chart:
CL_SERVER

State:
AUTHENTICATION

Description:
Process authentication verification.

Reactions
Trigger Action
[RT_SECURITY_CONTEXT] st!(VERIFY_AUTH)



Chart:
CL_SERVER

State:
AUTHENTICATION

Description:
Process authentication verification.

Reactions
Trigger Action
[RT_SECURITY_CONTEXT] st!(VERIFY_AUTH)



Chart:
CL_SERVER

State:
AUTHENTICATION

Description:
Process authentication verification.

Reactions
Trigger Action
[RT_SECURITY_CONTEXT] st!(VERIFY_AUTH)



Chart:
CL_SERVER

State:
CALL

Description:
Processing a remote procedure call request.

Reactions
Trigger Action
entering RT_IN_PARAMS:=NULL; RT_CONT_IN_FRAG_NUM:=-1
entering IF PDU_IDEMPOTENT THEN tr!(IDEMPOTENT) END IF
entering IF PDU_MAYBE THEN tr!(MAYBE) END IF
entering IF PDU_BROADCAST THEN tr!(BROADCAST) END IF
entering IF SEQ_NUM_GT THEN RT_SEQ_NUM:=PDU_SEQ_NUM END IF



Chart:
CL_SERVER

State:
CALLBACK

Description:
Processing of conversation manager callback procedures.


Chart:
CL_SERVER

State:
CANCEL

Description:
Processing of client requests to terminate the call in progress.

The reaction within this state senses the termination of the CANCEL_NOTIFY_APP activity as cancel acknowledgement from the server manager routine. The manager routine also sets the RETURN_PENDING_CANCEL flag appropriately.


Reactions
Trigger Action
entering fs!(SND_PENDING_CANCEL); RT_CANCEL_ID:=0
sp(CANCEL_NOTIFY_APP) IF RETURN_PENDING_CANCEL THEN tr!(SND_PENDING_CANCEL) END IF; CANACK_CALL



Chart:
CL_SERVER

State:
CAN_IDLE

Description:
Waits for cancel requests.

Reactions
Trigger Action
exiting IF AUTH THEN RT_AUTH_VERIFIER_CAN:=PDU_AUTH_VERIFIER END IF



Chart:
CL_SERVER

State:
CHK_SEC_CNTXT

Description:
Verify the security context negotiated through SEND_WAYAUTH callback.

Activities Throughout:

VERIFY_AUTH_CONTEXT

Reactions
Trigger Action
ex(CHK_SEC_CNTXT)  
[RT_SECURITY_CONTEXT] fs!(CONTEXT_REQUEST); RT_CLIENT_EXECUTION_CONTEXT:= PARAM_CLIENT_EXECUTION_CONTEXT



Chart:
CL_SERVER

State:
CL_SERVER

Description:
Main state for statechart CL_SERVER.


Chart:
CL_SERVER

State:
CNTL_IDLE

Description:
Waits for incoming control PDUs.

Reactions
Trigger Action
RECEIVE_PDU[PDU_TYPE=ACK and VALID_PDU_HEADER] tr!(ACK_PDU)
RECEIVE_PDU[PDU_TYPE=FACK and VALID_PDU_HEADER] tr!(FACK_PDU)
RECEIVE_PDU[PDU_TYPE=PING and VALID_PDU_HEADER] tr!(PING_PDU)
exiting IF AUTH THEN RT_AUTH_VERIFIER_CNTL:= PDU_AUTH_VERIFIER END IF
en(CNTL_IDLE) fs!(ACK_PDU); fs!(FACK_PDU); fs!(PING_PDU)
RECEIVE_PDU[CNTL_PDU and VALID_PDU_HEADER] RCV_CNTL_PDU



Chart:
CL_SERVER

State:
CONTROL

Description:
Processing received control PDUs.


Chart:
CL_SERVER

State:
DATA

Description:
Processing the data PDUs for remote procedure call.

Reactions
Trigger Action
en(DATA) SND_SERIAL_NUM:=0; RT_REPLY_COUNT:=0



Chart:
CL_SERVER

State:
INDICATION

Description:
Handles incoming RPC request fragments.

Reactions
Trigger Action
en(INDICATION)[not NO_FACK or not LAST_IN_FRAG and RT_BUF_LIMIT and NO_FACK] FACK_CALL
en(INDICATION)[not LAST_IN_FRAG and RT_IN_FRAG_NUM=RT_CONT_IN_FRAG_NUM+1] DO_IN_PKT; st!(HANDLE_IN_FRAG)
en(INDICATION)[not LAST_IN_FRAG and RT_IN_FRAG_NUM/=RT_CONT_IN_FRAG_NUM+1] st!(HANDLE_IN_FRAG)
RECEIVE_PDU[PDU_TYPE=REQUEST and VALID_PDU_HEADER and not AUTH] DO_REQ; RCV_FRAG_PDU
RECEIVE_PDU[PDU_TYPE=REQUEST and VALID_PDU_HEADER and AUTH] DO_REQ; RCV_FRAG_PDU_A
en(INDICATION)[LAST_IN_FRAG and RT_LAST_IN_FRAG_NUM= RT_CONT_IN_FRAG_NUM+1] st!(HANDLE_IN_FRAG); RCV_LAST_IN_FRAG



Chart:
CL_SERVER

State:
INIT

Description:
Initial call state. Waits for request from client.

Reactions
Trigger Action
RECEIVE_PDU[PDU_TYPE=REQUEST and not BOOT_TIME_EQ] REJECT_CALL
tm(en(WORKING), TIMEOUT_IDLE) st!(ABORT_CALL)



Chart:
CL_SERVER

State:
PROCESS_REQ

Description:
Promotes completely received request to manager routine (RPC stub).

Reactions
Trigger Action
entering RT_OUT_PARAMS:=NULL



Chart:
CL_SERVER

State:
REPLIED

Description:
Terminal state for at-most-once calls.

Reactions
Trigger Action
tm(en(REPLIED), TIMEOUT_RESEND) RESEND_OUT_FRAGS



Chart:
CL_SERVER

State:
REPLYING

Description:
Handles fragmented reply to client.

Reactions
Trigger Action
tm(en(REPLYING), TIMEOUT_RESEND) RESEND_OUT_FRAGS



Chart:
CL_SERVER

State:
WAIT_WAY

Description:
Invoke conversation manager and wait for response.

Reactions
Trigger Action
en(WAIT_WAY) DO_CALLBACK
ex(WAIT_WAY)[not AUTH and CONTEXT_REQUEST] fs!(CONTEXT_REQUEST); RT_CLIENT_EXECUTION_CONTEXT:= PARAM_CLIENT_EXECUTION_CONTEXT



Chart:
CL_SERVER

State:
WAY_IDLE

Description:
Idle unless new conversation manager request.


Chart:
CL_SERVER

State:
WORKING

Description:
Main working state for call instance.

Reactions
Trigger Action
en(WORKING) fs!(BROADCAST); fs!(MAYBE); fs!(IDEMPOTENT); fs!(LAST_IN_FRAG)


CL_SERVER Events

The CL_SERVER statechart defines the following events:


Chart:
CL_SERVER

Event:
ABORT

Description:
RPC session (same activity UUID) has terminated.

Definition:
st(ABORT_CALL)


Chart:
CL_SERVER

Event:
AUTHENTICATED

Description:
Authentication processing completed successfully.


Chart:
CL_SERVER

Event:
AUTHENTICATED_RES

Description:
Authentication for cancel PDU successful (request already processed).

Definition:
AUTHENTICATED[in(CANCEL.AUTHENTICATION)
and (in(REPLYING) or in(REPLIED))]


Chart:
CL_SERVER

Event:
CB_COMPLETES

Description:
Callback completes successfully: the conversation manager callback has completed.

Definition:
(sp(SEND_WAY) or
sp(SEND_WAYAUTH))[PARAM_CB_STATUS=CONST_RPC_S_OK]


Chart:
CL_SERVER

Event:
CB_FAULT

Description:
Callback completes: client detected mismatch in sequence numbers.

Definition:
(sp(SEND_WAY) or
sp(SEND_WAYAUTH))[RT_SEQ_NUM/=PARAM_CB_SEQ_NUM]


Chart:
CL_SERVER

Event:
CB_REJECT

Description:
Callback completes: client detected wrong activity identifier or a server boot time error.

Definition:
(sp(SEND_WAY) or
sp(SEND_WAYAUTH))[PARAM_CB_STATUS=CONST_YOU_CRASHED
or PARAM_CB_STATUS=CONST_BAD_ACT_ID]


Chart:
CL_SERVER

Event:
COMPLETE

Description:
RPC completed (with success or fault).

Definition:
sp(SEND_PKT)[SND_REPLY_TYPE=CANCEL_ACK]
or CB_FAULT or CB_REJECT or
PROCESSING_FAULT[IDEMPOTENT or BROADCAST or MAYBE]
or COMPLETE_CLEAR or COMPLETE_FREE
or en(REPLIED)[LAST_OUT_FRAG and IDEMPOTENT]
or DENIED


Chart:
CL_SERVER

Event:
COMPLETE_CLEAR

Description:
Ready to clear out parameters.

Definition:
PROCESSING_FDNE[IDEMPOTENT] or
[(in(REPLYING) or in(REPLIED)) and
RT_REPLY_COUNT>MAX_REPLIES] or
AUTHENTICATED_RES or
en(CNTL_IDLE)[ACK_PDU and NON_IDEMPOTENT]


Chart:
CL_SERVER

Event:
COMPLETE_FREE

Description:
Ready to free activity record for requesting client.

Definition:
PROC_RESPONSE[MAYBE] or
PROCESSING_FDNE[BROADCAST or MAYBE] or
[AUTH and TICKET_EXP]


Chart:
CL_SERVER

Event:
DENIED

Description:
Authentication failure detected.

The VERIFY_AUTH activity generates this event if either the integrity check failed or the requested protection level for authentication services does not match.


Chart:
CL_SERVER

Event:
LAST_OUT_PKT

Description:
Statechart internal event: last fragment of fragmented response.

Definition:
[TRANSMIT_RESP and LAST_OUT_FRAG and BURST]
or en(CNTL_IDLE)[TRANSMIT_RESP and
FACK_PDU and LAST_OUT_FRAG and
OUT_FRAG_NUM_EQ]


Chart:
CL_SERVER

Event:
NEXT_OUT_PKT

Description:
Statechart internal event: intermediate fragment of fragmented response

Definition:
[TRANSMIT_RESP and not LAST_OUT_FRAG and
BURST] or en(CNTL_IDLE)[TRANSMIT_RESP and
FACK_PDU and not LAST_OUT_FRAG and
OUT_FRAG_NUM_EQ]


Chart:
CL_SERVER

Event:
PROCESSING_FAULT

Description:
Execution of procedure failed. Returned from called procedure (stub).


Chart:
CL_SERVER

Event:
PROCESSING_FDNE

Description:
Stub (manager routine) or run-time system rejected RPC request.

The call did not execute.


Chart:
CL_SERVER

Event:
PROC_FAULT

Description:
Cannot execute or fault returned from called procedure (stub).

Definition:
PROCESSING_FAULT or PROCESSING_FDNE[not
BROADCAST and not MAYBE]


Chart:
CL_SERVER

Event:
PROC_RESPONSE

Description:
Call returned from called procedure (server manager routine).

This event indicates that the called application procedure is ready to response to the RPC request and has provided out parameter data in the RT_OUT_PARAMS queue. The processing of the application procedure may not have been completed and more out parameter data may to be queued (sensed by the TRANSMIT_RESP and LAST_OUT_FRAG condition flags).


Chart:
CL_SERVER

Event:
RCV_CAN_PDU

Description:
Received cancel PDU with valid header.

Definition:
RECEIVE_PDU[PDU_TYPE=CANCEL and
VALID_PDU_HEADER and
PDU_CANCEL_VERSION=CONST_CANCEL_VERSION
and in(DATA)]


Chart:
CL_SERVER

Event:
RCV_CNTL_PDU

Description:
Received one of the control PDUs (ack, fack or ping) with valid header.


Chart:
CL_SERVER

Event:
RCV_FRAG_PDU

Description:
Received PDU for nonauthenticated fragmented requests with valid header.


Chart:
CL_SERVER

Event:
RCV_FRAG_PDU_A

Description:
Received PDU for authenticated fragmented request with valid header.


Chart:
CL_SERVER

Event:
RCV_LAST_IN_FRAG

Description:
Received last fragment of request PDU and callback completed (for at-most-once).

All fragments of a multi-fragmented request are received or a single packet request was received. RCV_LAST_IN_FRAG signals that the complete request data is available to the stub for unmarshalling, and it transfers the control from the run-time system to the stub for processing the RPC request.


Chart:
CL_SERVER

Event:
RCV_NEXT_CALL

Description:
Receive next remote procedure call with same activity ID.

Definition:
RCV_REQ_PDU[in(REPLIED)]


Chart:
CL_SERVER

Event:
RCV_REQ_PDU

Description:
Received request PDU (first packet for fragmented requests) with valid header.

Definition:
RECEIVE_PDU[PDU_TYPE=REQUEST and
(PDU_FRAG and PDU_FRAG_NUM=0 or not
PDU_FRAG) and SEQ_NUM_GT and BOOT_TIME_EQ
and PDU_VERSION_NUM=CL_VERSION_NUM_V20]


Chart:
CL_SERVER

Event:
RECEIVE_PDU

Description:
Received a PDU from client.


Chart:
CL_SERVER

Event:
RESEND

Description:
Statechart internal event that triggers a resend of complete reply PDUs.


Chart:
CL_SERVER

Event:
SEND_RESPONSE

Description:
Called procedure provided out parameters to be sent.

Definition:
PROC_RESPONSE[not MAYBE]

CL_SERVER Actions

The CL_SERVER statechart defines the following actions:


Chart:
CL_SERVER

Action:
CANACK_CALL

Description:
Set up cancel_ack PDU to be sent.

The body data of this cancel acknowledgement message consists of:

(See also the PDU encoding of cancel_ack.)

Definition:
SND_REPLY_TYPE:=CANCEL_ACK;
st!(SEND_PKT)


Chart:
CL_SERVER

Action:
CNTL_CALL

Description:
Reactions on received control PDUs.

Definition:
IF
PING_PDU
THEN
PING_CALL
END IF;
IF
FACK_PDU
THEN
EVAL_FACK_BODY;
IF
in(REPLYING) and OUT_FRAG_NUM_NE or
in(REPLIED) and SEQ_NUM_LE
THEN
RESEND_OUT_FRAGS
END IF
END IF


Chart:
CL_SERVER

Action:
DO_CALLBACK

Description:
Initialise and start activity SEND_WAY (conversation manager callback procedure).

Definition:
SND_ACTIVITY_ID:=RT_ACTIVITY_ID;
SND_AUTH_SPEC:=RT_AUTH_SPEC;
IF
not AUTH and not CONTEXT_REQUEST or AUTH
and RT_SECURITY_CONTEXT
THEN
st!(SEND_WAY)
END IF;
IF
not AUTH and CONTEXT_REQUEST
THEN
st!(SEND_WAY2)
END IF;
IF
AUTH and not RT_SECURITY_CONTEXT
THEN
st!(SEND_WAYAUTH)
END IF


Chart:
CL_SERVER

Action:
DO_IN_PKT

Description:
Append received request PDU body data to internal buffer.

Definition:
RT_CONT_IN_FRAG_NUM:=RT_CONT_IN_FRAG_NUM+1;
RT_IN_PARAMS:=RT_IN_PARAMS+RT_BODY


Chart:
CL_SERVER

Action:
DO_REPLY

Description:
Send out fragment to requesting client.

Definition:
fs!(TRANSMIT_RESP);
IF
LAST_OUT_FRAG
THEN
tr!(SND_LAST_FRAG)
ELSE
fs!(SND_LAST_FRAG)
END IF;
SND_FRAG_NUM:=SND_FRAG_NUM+1;
SND_SERIAL_NUM:=SND_SERIAL_NUM+1;
SND_OUT_PARAMS:=RT_OUT_FRAG;
SND_REPLY_TYPE:=RESPONSE;
st!(SEND_PKT)


Chart:
CL_SERVER

Action:
DO_REQ

Description:
Evaluate request PDU header.

Definition:
RT_BODY:=PDU_BODY;
RT_IN_FRAG_NUM:=PDU_FRAG_NUM;
RT_IN_SERIAL_NUM:=PDU_SERIAL_NUM;
IF
PDU_AUTH_SPEC/=0
THEN
RT_AUTH_VERIFIER_CALL:=PDU_AUTH_VERIFIER
END IF;
IF
PDU_NO_FACK or PDU_FRAG
THEN
tr!(NO_FACK)
ELSE
fs!(NO_FACK)
END IF;
IF
PDU_LAST_FRAG or not PDU_FRAG
THEN
tr!(LAST_IN_FRAG);
RT_LAST_IN_FRAG_NUM:=PDU_FRAG_NUM
END IF


Chart:
CL_SERVER

Action:
ERROR_CALL

Description:
Set up error PDU (fault or reject) to be sent.

Definition:
WHEN
PROCESSING_FAULT[not BROADCAST and not
MAYBE]
THEN
RT_OUT_PARAMS:=SND_FAULT_STATUS;
SND_REPLY_TYPE:=FAULT;
st!(SEND_PKT)
ELSE
WHEN
PROCESSING_FDNE[not BROADCAST and
not MAYBE]
THEN
RT_OUT_PARAMS:=SND_REJECT_STATUS;
SND_REPLY_TYPE:=REJECT;
st!(SEND_PKT)
END WHEN
END WHEN


Chart:
CL_SERVER

Action:
EVAL_FACK_BODY

Description:
Invoke implementation-specific activity to evaluate fack body data.

This action reads the fack PDU body data according to the PDU specification. It is RPC run-time implementation-specific how this data will be evaluated and used for subsequent fragmented transmissions.

Definition:
rd!(PDU_FACK_BODY)


Chart:
CL_SERVER

Action:
FACK_CALL

Description:
Send fack PDU if nofack flag is false or receiver has buffer full condition.

Definition:
SND_OUT_PARAMS:=RT_FACK_BODY;
SND_REPLY_TYPE:=FACK;
st!(SEND_PKT)


Chart:
CL_SERVER

Action:
FINAL

Description:
Perform final actions for RPC.

Definition:
WHEN
COMPLETE_CLEAR
THEN
RT_OUT_PARAMS:=NULL
END WHEN;
WHEN
COMPLETE_FREE
THEN
st!(ABORT_CALL)
END WHEN;
WHEN
DENIED
THEN
SND_OUT_PARAMS:=CONST_NCA_S_INVALID_CHKSUM;
SND_REPLY_TYPE:=REJECT;
st!(SEND_PKT)
END WHEN;
WHEN
CB_REJECT
THEN
SND_OUT_PARAMS:=PARAM_CB_STATUS;
SND_REPLY_TYPE:=REJECT;
st!(SEND_PKT)
END WHEN


Chart:
CL_SERVER

Action:
FIRST_REPLY

Description:
Initialise and send first reply PDU.

Definition:
fs!(TRANSMIT_RESP);
IF
LAST_OUT_FRAG
THEN
fs!(SND_FRAG);
tr!(SND_LAST_FRAG)
ELSE
tr!(SND_FRAG);
fs!(SND_LAST_FRAG)
END IF;
SND_SEQ_NUM:=RT_SEQ_NUM;
SND_IF_ID:=RT_IF_ID;
SND_IF_VERSION:=RT_IF_VERSION;
SND_OBJ_ID:=RT_OBJ_ID;
SND_OP_NUM:=RT_OP_NUM;
SND_ACTIVITY_ID:=RT_ACTIVITY_ID;
SND_AUTH_SPEC:=RT_AUTH_SPEC;
SND_BOOT_TIME:=RT_BOOT_TIME;
RT_OUT_FRAG:=RT_OUT_PARAMS;
SND_OUT_PARAMS:=RT_OUT_PARAMS;
SND_FRAG_NUM:=0;
SND_REPLY_TYPE:=RESPONSE;
st!(SEND_PKT)


Chart:
CL_SERVER

Action:
NO_CALL

Description:
Set up nocall PDU to be sent.

Definition:
SND_OUT_PARAMS:=RT_FACK_BODY;
SND_REPLY_TYPE:=NOCALL;
st!(SEND_PKT)


Chart:
CL_SERVER

Action:
PING_CALL

Description:
Actions in response to a ping PDU call.

Definition:
IF
BOOT_TIME_EQ
THEN
IF
in(INIT) or (in(INDICATION) or
in(DATA.AUTHENTICATION)) and
SEQ_NUM_EQ or SEQ_NUM_GT
THEN
NO_CALL
END IF;
IF
in(PROCESS_REQ) and SEQ_NUM_EQ
THEN
SND_REPLY_TYPE:=WORKING;
st!(SEND_PKT)
END IF;
IF
(in(REPLYING) or in(REPLIED)) and
SEQ_NUM_LE
THEN
RESEND_OUT_FRAGS
END IF
ELSE
SND_OUT_PARAMS:=CONST_WRONG_BOOT_TIME;
SND_REPLY_TYPE:=REJECT;
st!(SEND_PKT)
END IF


Chart:
CL_SERVER

Action:
PROCESS_CAN

Description:
Process cancel request (signal manager routine).

Definition:
IF
PDU_CANCEL_ID>RT_CANCEL_ID
THEN
RT_CANCEL_ID:=PDU_CANCEL_ID
END IF;
IF
in(DATA) and not in(REPLYING) and not
in(REPLIED)
THEN
st!(CANCEL_NOTIFY_APP)
END IF;
IF
in(REPLYING) or in(REPLIED)
THEN
tr!(SND_PENDING_CANCEL);
CANACK_CALL
END IF


Chart:
CL_SERVER

Action:
REJECT_CALL

Description:
Perform a reject call.

Definition:
IF
not BOOT_TIME_EQ
THEN
SND_OUT_PARAMS:=CONST_WRONG_BOOT_TIME
ELSE
SND_OUT_PARAMS:=CONST_UNSPEC_REJECT
END IF;
SND_REPLY_TYPE:=REJECT;
st!(SEND_PKT)


Chart:
CL_SERVER

Action:
RESEND_OUT_FRAGS

Description:
Perform a resend of previously sent response PDUs.

Definition:
fs!(TRANSMIT_RESP);
RT_REPLY_COUNT:=RT_REPLY_COUNT+1;
IF
SND_FRAG
THEN
fs!(LAST_OUT_FRAG)
END IF;
st!(RESET_OUT_FRAG)


Chart:
CL_SERVER

Action:
SETUP_CALL

Description:
Set up call data at first call's request PDU.

Definition:
RT_CLIENT_EXECUTION_CONTEXT:=NULL;
fs!(CONTEXT_REQUEST);
tr!(NO_FACK);
RT_ACTIVITY_ID:=PDU_ACTIVITY_ID;
RT_SEQ_NUM:=PDU_SEQ_NUM;
RT_IF_ID:=PDU_IF_ID;
RT_IF_VERSION:=PDU_IF_VERSION;
RT_OBJ_ID:=PDU_OBJ_ID;
RT_OP_NUM:=PDU_OP_NUM;
RT_AUTH_SPEC:=PDU_AUTH_SPEC;
IF
PDU_AUTH_SPEC/=0
THEN
RT_AUTH_VERIFIER_CALL:=PDU_AUTH_VERIFIER
tr!(AUTH)
ELSE
fs!(AUTH)
END IF

CL_SERVER Conditions

The CL_SERVER statechart defines the following conditions:


Chart:
CL_SERVER

Condition:
ACK_PDU

Description:
Statechart internal flag: received PDU type ack.


Chart:
CL_SERVER

Condition:
AUTH

Description:
Statechart internal flag: false if PDU auth_id = 0; true otherwise.


Chart:
CL_SERVER

Condition:
BOOT_TIME_EQ

Description:
Statechart internal flag.

Definition:
PDU_BOOT_TIME=SYS_BOOT_TIME or
PDU_BOOT_TIME=0 and (RT_IN_FRAG_NUM=0 or
not PDU_FRAG)


Chart:
CL_SERVER

Condition:
BROADCAST

Description:
Statechart internal flag: broadcast call semantic.


Chart:
CL_SERVER

Condition:
BURST

Description:
Run time internal flag set if no fack is expected before sending next fragment.

This flag is used by run-time implementations to optimise the frequency of fragmented outbound packets.

The algorithms used to optimise traffic and avoid congestion are implementation-specific. The protocol machine (state RESP_WAIT) waits for inbound fack PDUs if burst mode is off. The next outbound fragment is triggered by an inbound fack PDU. Implementations are responsible for setting the corresponding nofack flags in the PDU header.


Chart:
CL_SERVER

Condition:
CNTL_PDU

Description:
Statechart internal flag: control PDUs to be received.

Definition:
PDU_TYPE=ACK or PDU_TYPE=PING or
PDU_TYPE=FACK


Chart:
CL_SERVER

Condition:
CONTEXT_REQUEST

Description:
Stub requests client's execution context for which it has no record.


Chart:
CL_SERVER

Condition:
FACK_PDU

Description:
Statechart internal flag: received PDU type fack.


Chart:
CL_SERVER

Condition:
IDEMPOTENT

Description:
Statechart internal flag: idempotent call.


Chart:
CL_SERVER

Condition:
LAST_IN_FRAG

Description:
Statechart internal flag: last in fragment or non-frag in packet received.


Chart:
CL_SERVER

Condition:
LAST_OUT_FRAG

Description:
Statechart internal flag: last out fragment or non-frag out packet ready to send.

This flag is set by the run-time system if the transmit queue contains the last fragment (see also Connection-oriented Protocol ).


Chart:
CL_SERVER

Condition:
LOST

Description:
Statechart internal: server boot time = 0 or client's context or cached sequence number lost.

Definition:
(PDU_BOOT_TIME=0 or SEQ_NUM_LOST) and
NON_IDEMPOTENT or AUTH and not
RT_SECURITY_CONTEXT or CONTEXT_REQUEST and
RT_CLIENT_EXECUTION_CONTEXT=NULL


Chart:
CL_SERVER

Condition:
MAYBE

Description:
Statechart internal flag: maybe call.


Chart:
CL_SERVER

Condition:
NON_IDEMPOTENT

Description:
Statechart internal flag: non-idempotent (at-most-once) call.

Definition:
not IDEMPOTENT and not BROADCAST and not MAYBE


Chart:
CL_SERVER

Condition:
NO_FACK

Description:
Statechart internal flag: received PDU with nofack flag true.


Chart:
CL_SERVER

Condition:
OUT_FRAG_NUM_EQ

Description:
Statechart internal flag: received fragment number at client and last sent fragment number are equal.

This condition verifies the fragment number that was received in a fack PDU. (See RPC PDU Encodings for details.)

Definition:
SND_FRAG_NUM=PDU_FRAG_NUM


Chart:
CL_SERVER

Condition:
OUT_FRAG_NUM_NE

Description:
Statechart internal flag: received fragment number at client and last sent fragment number are not equal.

This condition verifies the fragment number that was received in a fack PDU. (See RPC PDU Encodings for details.)

Definition:
SND_FRAG_NUM/=PDU_FRAG_NUM


Chart:
CL_SERVER

Condition:
PDU_BROADCAST

Description:
PDU flag broadcast.


Chart:
CL_SERVER

Condition:
PDU_FRAG

Description:
PDU flag frag.


Chart:
CL_SERVER

Condition:
PDU_IDEMPOTENT

Description:
PDU flag idempotent.


Chart:
CL_SERVER

Condition:
PDU_LAST_FRAG

Description:
PDU flag lastfrag.


Chart:
CL_SERVER

Condition:
PDU_MAYBE

Description:
PDU flag maybe.


Chart:
CL_SERVER

Condition:
PDU_NO_FACK

Description:
PDU flag nofack.


Chart:
CL_SERVER

Condition:
PING_PDU

Description:
Statechart internal flag: received PDU type ping.


Chart:
CL_SERVER

Condition:
RETURN_PENDING_CANCEL

Description:
Cancel pending state returned from stub after processing the cancel request.


Chart:
CL_SERVER

Condition:
RT_BUF_LIMIT

Description:
Statechart internal flag: buffer limit reached for in packets.

The conditional flag RT_BUF_LIMIT triggers the generation of a fack PDU which requests the sender of data fragments to readjust the transmission rate.

This is a mechanism to indicate internal buffer limits (overflow) for avoidance of congestion and retransmissions. Since recipients may evaluate fack body data in an implementation-dependent way, implementations must not rely on changes in the transmission rate. This indication is an advisory.

Run-time implementations are responsible for setting the RT_BUF_LIMIT flag according to their own policies.


Chart:
CL_SERVER

Condition:
RT_SECURITY_CONTEXT

Description:
Security context associated with call activity UUID is set up and valid.


Chart:
CL_SERVER

Condition:
SEQ_NUM_EQ

Description:
Statechart internal flag: received sequence number equals cached sequence number.

Definition:
PDU_SEQ_NUM=RT_SEQ_NUM


Chart:
CL_SERVER

Condition:
SEQ_NUM_GT

Description:
Statechart internal flag: received sequence number > cached sequence number.

Definition:
PDU_SEQ_NUM>RT_SEQ_NUM


Chart:
CL_SERVER

Condition:
SEQ_NUM_LE

Description:
Statechart internal flag: received sequence number <= cached sequence number.

Definition:
PDU_SEQ_NUM<=RT_SEQ_NUM


Chart:
CL_SERVER

Condition:
SEQ_NUM_LOST

Description:
Statechart internal flag: cached sequence number invalid.

Definition:
RT_SEQ_NUM=0


Chart:
CL_SERVER

Condition:
SND_FRAG

Description:
Statechart internal flag: header flag frag of fragments to be sent.


Chart:
CL_SERVER

Condition:
SND_LAST_FRAG

Description:
Statechart internal flag: header flag lastfrag for PDU to be sent.


Chart:
CL_SERVER

Condition:
SND_PENDING_CANCEL

Description:
Cancel pending state for current call at server.


Chart:
CL_SERVER

Condition:
TICKET_EXP

Description:
Statechart internal flag: ticket expired.

Definition:
SYS_TIME>GRACE_PERIOD+PDU_EXP_TIME


Chart:
CL_SERVER

Condition:
TRANSMIT_RESP

Description:
One or more fragments queued for transmission of response data.

This flag indicates that one or more response fragments are queued in a run-time internal buffer and ready to be transmitted. In conjunction with the BURST flag and possibly expected fack PDUs, an event for transmitting the next fragment will be generated.

The run-time system internally sets this flag (true) after the stub initially provides data in the transmit queue, sufficient for at least the first PDU fragment to be transmitted. The protocol machine resets this flag if it has detected and taken an event for sending the next fragment in the queue.

The run-time system sets this flag again after completion of a SEND_PKT activity if the transmit queue contains enough data for the next PDU fragment to be transmitted.


Chart:
CL_SERVER

Condition:
VALID_PDU_HEADER

Description:
Pre-evaluation of PDU header (before authentication processing).

Definition:
PDU_ACTIVITY_ID=RT_ACTIVITY_ID and
PDU_AUTH_SPEC=RT_AUTH_SPEC and SEQ_NUM_EQ
and BOOT_TIME_EQ and
PDU_VERSION_NUM=CL_VERSION_NUM_V20

CL_SERVER Data-Items

The CL_SERVER statechart defines the following data items:


Chart:
CL_SERVER

Data Item:
ACK

Description:
Constant: PDU type ack.

Definition:
7


Chart:
CL_SERVER

Data Item:
CANCEL

Description:
Constant: PDU type cancel.

Definition:
8


Chart:
CL_SERVER

Data Item:
CANCEL_ACK

Description:
Constant: PDU cancel_ack.

Definition:
10


Chart:
CL_SERVER

Data Item:
CL_VERSION_NUM_V20

Description:
Constant: RPC protocol version 2.0 version number.

Definition:
4


Chart:
CL_SERVER

Data Item:
CONST_BAD_ACT_ID

Description:
Reject status code for WAY callback. The encoding is specified in Conversation Manager Interface Definition .


Chart:
CL_SERVER

Data Item:
CONST_CANCEL_VERSION

Description:
Supported version number for cancel PDU body data.

Definition:
0


Chart:
CL_SERVER

Data Item:
CONST_NCA_S_INVALID_CHKSUM

Description:
Constant: reject status code nca_s_invalid_chksum.


Chart:
CL_SERVER

Data Item:
CONST_RPC_S_OK

Description:
Constant: status code for successful completion of WAY callback.

Definition:
0


Chart:
CL_SERVER

Data Item:
CONST_UNSPEC_REJECT

Description:
Constant: unspecified reject status code (0x1C000009).


Chart:
CL_SERVER

Data Item:
CONST_WRONG_BOOT_TIME

Description:
Reject status code.


Chart:
CL_SERVER

Data Item:
CONST_YOU_CRASHED

Description:
Reject status code for WAY callback. Specified in Conversation Manager Interface Definition .


Chart:
CL_SERVER

Data Item:
FACK

Description:
Constant: PDU type fack.

Definition:
9


Chart:
CL_SERVER

Data Item:
FAULT

Description:
Constant: PDU type fault.

Definition:
3


Chart:
CL_SERVER

Data Item:
GRACE_PERIOD

Description:
Grace period on server after ticket expiration (implementation-specific).


Chart:
CL_SERVER

Data Item:
MAX_REPLIES

Description:
Maximum number of times a response PDU should be resent.


Chart:
CL_SERVER

Data Item:
NOCALL

Description:
Constant: PDU type nocall.

Definition:
5


Chart:
CL_SERVER

Data Item:
PARAM_CB_OUT_DATA

Description:
Callback out parameter: the returned authentication response as array of bytes.


Chart:
CL_SERVER

Data Item:
PARAM_CB_OUT_LEN

Description:
Callback out parameter: length of received PARAM_CB_OUT_DATA field.


Chart:
CL_SERVER

Data Item:
PARAM_CB_SEQ_NUM

Description:
Callback out parameter: sequence number.


Chart:
CL_SERVER

Data Item:
PARAM_CB_STATUS

Description:
Callback out parameter: status.


Chart:
CL_SERVER

Data Item:
PARAM_CLIENT_EXECUTION_CONTEXT

Description:
Callback out parameter: client address space UUID (execution context).


Chart:
CL_SERVER

Data Item:
PDU_ACTIVITY_ID

Description:
PDU header field: act_id.


Chart:
CL_SERVER

Data Item:
PDU_AUTH_SPEC

Description:
PDU header field: auth_proto.


Chart:
CL_SERVER

Data Item:
PDU_AUTH_VERIFIER

Description:
PDU trailer: authentication verifier (authentication protocol-specific).


Chart:
CL_SERVER

Data Item:
PDU_BODY

Description:
Array of PDU body data.


Chart:
CL_SERVER

Data Item:
PDU_BOOT_TIME

Description:
PDU header field: server_boot. Zero at first request from client.


Chart:
CL_SERVER

Data Item:
PDU_CANCEL_ID

Description:
cancel_id of received cancel PDU body data.


Chart:
CL_SERVER

Data Item:
PDU_CANCEL_VERSION

Description:
Version number (vers) of cancel PDUs body data format (currently supported version 0).


Chart:
CL_SERVER

Data Item:
PDU_EXP_TIME

Description:
Ticket expiration time transmitted in the authentication verifier.


Chart:
CL_SERVER

Data Item:
PDU_FACK_BODY

Description:
Body information of fack PDU (implementation-dependent).


Chart:
CL_SERVER

Data Item:
PDU_FRAG_NUM

Description:
PDU header field: frag_num.


Chart:
CL_SERVER

Data Item:
PDU_IF_ID

Description:
PDU header field: if_id.


Chart:
CL_SERVER

Data Item:
PDU_IF_VERSION

Description:
PDU header field: if_vers.


Chart:
CL_SERVER

Data Item:
PDU_OBJ_ID

Description:
PDU header field: object.


Chart:
CL_SERVER

Data Item:
PDU_OP_NUM

Description:
PDU header field: opnum.


Chart:
CL_SERVER

Data Item:
PDU_SEQ_NUM

Description:
PDU header field: seqnum.


Chart:
CL_SERVER

Data Item:
PDU_SERIAL_NUM

Description:
PDU header field: serial_hi.


Chart:
CL_SERVER

Data Item:
PDU_TYPE

Description:
PDU header field: ptype.


Chart:
CL_SERVER

Data Item:
PDU_VERSION_NUM

Description:
PDU header field: rpc_vers.


Chart:
CL_SERVER

Data Item:
PING

Description:
Constant: PDU type ping.

Definition:
1


Chart:
CL_SERVER

Data Item:
REJECT

Description:
Constant: PDU type reject.

Definition:
6


Chart:
CL_SERVER

Data Item:
REQUEST

Description:
Constant: PDU type request.

Definition:
0


Chart:
CL_SERVER

Data Item:
RESPONSE

Description:
Constant: PDU type response.

Definition:
2


Chart:
CL_SERVER

Data Item:
RT_ACTIVITY_ID

Description:
Statechart internal: activity UUID of current RPC.


Chart:
CL_SERVER

Data Item:
RT_AUTH_SPEC

Description:
Statechart internal: authentication protocol specifier received and used in call.


Chart:
CL_SERVER

Data Item:
RT_AUTH_VERIFIER_CALL

Description:
Statechart internal: authentication verifier received in CALL state.


Chart:
CL_SERVER

Data Item:
RT_AUTH_VERIFIER_CAN

Description:
Authentication verifier received for cancel PDU.


Chart:
CL_SERVER

Data Item:
RT_AUTH_VERIFIER_CNTL

Description:
Authentication verifier received for control PDU.


Chart:
CL_SERVER

Data Item:
RT_BODY

Description:
Statechart internal: temporarily buffered request PDU body data.


Chart:
CL_SERVER

Data Item:
RT_BOOT_TIME

Description:
Statechart internal: boot time of server system.


Chart:
CL_SERVER

Data Item:
RT_CANCEL_ID

Description:
Statechart internal: identifier for received cancel request with highest count.


Chart:
CL_SERVER

Data Item:
RT_CLIENT_EXECUTION_CONTEXT

Description:
The UUID uniquely identifying the execution context (address space) of the client.


Chart:
CL_SERVER

Data Item:
RT_CONT_IN_FRAG_NUM

Description:
Statechart internal: last fragment number of continuously buffered in block.


Chart:
CL_SERVER

Data Item:
RT_FACK_BODY

Description:
Statechart internal: body data for fack PDU.

The run-time implementation must ensure that fack and nocall PDU body data is generated in accordance with the specifications given in RPC PDU Encodings .


Chart:
CL_SERVER

Data Item:
RT_IF_ID

Description:
Statechart internal: buffered interface UUID of RPC.


Chart:
CL_SERVER

Data Item:
RT_IF_VERSION

Description:
Statechart internal: buffered interface version of RPC.


Chart:
CL_SERVER

Data Item:
RT_IN_FRAG_NUM

Description:
Statechart internal: fragment number of currently received request PDU.


Chart:
CL_SERVER

Data Item:
RT_IN_PARAMS

Description:
Statechart internal: buffered array of reassembled input data.


Chart:
CL_SERVER

Data Item:
RT_IN_SERIAL_NUM

Description:
Statechart internal: serial number of previously received fragment.


Chart:
CL_SERVER

Data Item:
RT_LAST_IN_FRAG_NUM

Description:
Fragment number of last in fragment of remote procedure call.


Chart:
CL_SERVER

Data Item:
RT_OBJ_ID

Description:
Statechart internal: buffered object UUID of RPC.


Chart:
CL_SERVER

Data Item:
RT_OP_NUM

Description:
Statechart internal: buffered operation number of RPC.


Chart:
CL_SERVER

Data Item:
RT_OUT_FRAG

Description:
Statechart internal pointer to data to be sent in next response PDU.

The SEND_PKT activity increments this pointer after a response PDU was sent.


Chart:
CL_SERVER

Data Item:
RT_OUT_PARAMS

Description:
Buffered array of unfragmented output data.

RT_OUT_PARAMS is the queue of transmit data provided by the stub. A possible segmentation of this queue is not equivalent to the sizes of PDU fragments sent by the run-time system (SEND_PKT) activity.

The RT_OUT_FRAG variable is a pointer data type that points to the to be transmitted data fragment within this RT_IN_PARAMS queue.


Chart:
CL_SERVER

Data Item:
RT_REPLY_COUNT

Description:
Counter for transmitted replies.


Chart:
CL_SERVER

Data Item:
RT_SEQ_NUM

Description:
Sequence number of previously received PDU.


Chart:
CL_SERVER

Data Item:
SND_ACTIVITY_ID

Description:
Activity UUID to be sent.


Chart:
CL_SERVER

Data Item:
SND_AUTH_SPEC

Description:
Authentication specifier to be sent.


Chart:
CL_SERVER

Data Item:
SND_BOOT_TIME

Description:
Boot time to be sent.


Chart:
CL_SERVER

Data Item:
SND_CB_IN_DATA

Description:
Callback in parameter: the authentication challenge as an array of bytes.


Chart:
CL_SERVER

Data Item:
SND_CB_IN_LEN

Description:
Callback in parameter: the length of SND_CB_IN_DATA parameter.


Chart:
CL_SERVER

Data Item:
SND_CB_OUT_MAX_LEN

Description:
Callback in parameter: the maximum length for the out field PARAM_CB_OUT_DATA.


Chart:
CL_SERVER

Data Item:
SND_FAULT_STATUS

Description:
Fault status associated with the fault PDU body represented as NDR unsigned long.


Chart:
CL_SERVER

Data Item:
SND_FRAG_NUM

Description:
Fragment number of PDU to be sent.


Chart:
CL_SERVER

Data Item:
SND_IF_ID

Description:
Interface UUID to be sent.


Chart:
CL_SERVER

Data Item:
SND_IF_VERSION

Description:
Interface version number to be sent.


Chart:
CL_SERVER

Data Item:
SND_OBJ_ID

Description:
Object UUID to be sent.


Chart:
CL_SERVER

Data Item:
SND_OP_NUM

Description:
Operation number to be sent.


Chart:
CL_SERVER

Data Item:
SND_OUT_PARAMS

Description:
PDU body data promoted to SEND_PKT activity.


Chart:
CL_SERVER

Data Item:
SND_REJECT_STATUS

Description:
Reject status code associated with reject PDU body represented as NDR type.


Chart:
CL_SERVER

Data Item:
SND_REPLY_TYPE

Description:
PDU type to be sent.


Chart:
CL_SERVER

Data Item:
SND_SEQ_NUM

Description:
Sequence number of PDU to be sent.


Chart:
CL_SERVER

Data Item:
SND_SERIAL_NUM

Description:
Serial number of PDU to be sent.


Chart:
CL_SERVER

Data Item:
SYS_BOOT_TIME

Description:
Boot time of server system: an implementation-specific value.


Chart:
CL_SERVER

Data Item:
SYS_TIME

Description:
Secure reference time of local system


Chart:
CL_SERVER

Data Item:
TIMEOUT_IDLE

Description:
Timeout value for keeping client's activity record.


Chart:
CL_SERVER

Data Item:
TIMEOUT_RESEND

Description:
Timeout value for retransmitting a response PDU.


Chart:
CL_SERVER

Data Item:
WORKING

Description:
Constant: PDU type working.

Definition:
4


Please note that the html version of this specification may contain formatting aberrations. The definitive version is available as an electronic publication on CD-ROM from The Open Group.

Contents Next section Index