
  PROCEDURE [INLINE] nlp$ta_send_data_fragments
    (    cl_connection { input, output } : ^nlt$cl_connection;
         data: nat$data_fragments;
         end_of_message: boolean;
     VAR status: ost$status);

?? PUSH (LISTEXT := ON) ??
?? RIGHT := 110 ??

    VAR
      actual: integer,
      data_length: integer,
      data_p: ^nat$data_fragment,
      i: integer,
      output_message: ^nat$data_fragments,
      pdu_header: nlt$ta_data_pdu;

    status.normal := TRUE;

  /validate_data/
    BEGIN
      data_length := 0;
      FOR i := LOWERBOUND (data) TO UPPERBOUND (data) DO
        data_p := ^data [i];
        IF (data_p^.address <> NIL) THEN
          data_length := data_length + data_p^.length;
          IF data_length >= nlc$ta_minimum_data_length THEN
            EXIT /validate_data/; {----->
          IFEND;
        IFEND;
      FOREND;
      osp$set_status_condition (nae$ta_data_length_error, status);
      osp$append_status_integer (osc$status_parameter_delimiter, nlc$ta_minimum_data_length, 10, TRUE,
            status);
      RETURN; {----->
    END /validate_data/;

{ Build data pdu.

    pdu_header.length := #SIZE (nlt$ta_data_pdu);
    pdu_header.kind := nlc$ta_data_request;
    pdu_header.end_of_message := end_of_message;

    PUSH output_message: [1 .. (UPPERBOUND (data) + 1)];
    output_message^ [1].address := ^pdu_header;
    output_message^ [1].length := #SIZE (pdu_header);
    FOR i := 2 TO UPPERBOUND (output_message^) DO
      output_message^ [i] := data [i - 1];
    FOREND;

    nlp$cc_send_data_fragments (cl_connection, output_message^, status);

{! statistics begin}
    IF status.normal THEN
      osp$increment_locked_variable (nav$global_osi_statistics.transport_access_agent.data_pdus_sent, 0,
            actual);
      osp$add_to_locked_variable (nav$global_osi_statistics.transport_access_agent.total_bytes_sent, 0,
            data_length + pdu_header.length, actual);
    IFEND;
{! statistics end}

  PROCEND nlp$ta_send_data_fragments;

*copy nlh$ta_send_data_fragments

*copyc nae$osi_internal_interfaces
*copyc nat$data_length
*copyc nlc$ta_data_lengths
*copyc nlt$cl_connection
*copyc nlt$ta_protocol_data_unit
*copyc ost$status
*copyc nlp$cc_send_data_fragments
*copyc osp$add_to_locked_variable
*copyc osp$append_status_integer
*copyc osp$increment_locked_variable
*copyc osp$set_status_condition
*copyc nav$global_osi_statistics
?? POP ??
