?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Network Access : Nam Attribute Management Ring 3' ??
MODULE nam$manage_nam_attributes_r3;

{ PURPOSE:
{   This module contains the ring 3 procedures to manage the NAM/VE configurable
{   attributes.
{

?? NEWTITLE := 'Global Declarations Referenced by this Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc nat$am_login_prompt
*copyc nat$nam_attributes
*copyc nat$protocol_stack
*copyc nat$protocol_stack_integer
*copyc nlc$bm_buffer_pool_index
*copyc nlc$bm_minimum_buffers_for_cpu
*copyc nlc$nam_configuration_constants
*copyc nlt$connections_per_system
*copyc nlt$network_device_list
*copyc ofe$error_codes
?? POP ??
*copyc avp$configuration_administrator
*copyc avp$system_displays
*copyc nap$change_nam_attributes_r1
*copyc nap$get_nam_attributes_r1
*copyc nap$system_id
*copyc nlp$get_exclusive_access
*copyc nlp$release_exclusive_access
*copyc osp$clear_signature_lock
*copyc osp$set_signature_lock
*copyc osp$set_status_abnormal
*copyc nav$change_nam_attributes_lock
*copyc nav$final_login_prompt
*copyc nav$global_osi_statistics
*copyc nav$global_statistics
*copyc nav$ica_reset_down_threshold
*copyc nav$maximum_login_attempts
*copyc nav$mci_reset_down_threshold
*copyc nav$network_paged_heap
*copyc nav$force_password_prompt
*copyc nav$prompt_for_account
*copyc nav$prompt_for_family_name
*copyc nav$prompt_for_project
*copyc nav$statistics_enabled
*copyc nlv$bm_allocat_buffer_threshold
*copyc nlv$bm_allocated_buffer_maximum
*copyc nlv$bm_allocated_buffer_pool
*copyc nlv$configured_network_devices
*copyc nlv$directory_version

  VAR
    nlv$log_broadcast_requests: [XREF] boolean,
    nlv$log_broadcast_translations: [XREF] boolean,
    nlv$log_tcpip_device_select: [XREF] boolean;

*copyc nlv$tm_route_cache
?? TITLE := 'initialize_global_statistics', EJECT ??

{ PURPOSE:
{   The purpose of this procedure is to allocate space for the intranet statistics
{   and set the intranet and namve statistic values to zero.
{

  PROCEDURE initialize_global_statistics;

    VAR
      i: integer,
      j: integer,
      network_device_list: ^nlt$network_device_list,
      networks_count: integer;

    networks_count := 0;
    network_device_list := nlv$configured_network_devices.network_device_list;
    IF network_device_list <> NIL THEN
      networks_count := UPPERBOUND (network_device_list^);
      IF nav$global_statistics.intranet = NIL THEN

{ Allocate space for the intranet statistic data structure.

        REPEAT
          ALLOCATE nav$global_statistics.intranet: [1 .. networks_count] IN nav$network_paged_heap^;
          IF nav$global_statistics.intranet = NIL THEN
            syp$cycle;
          IFEND;
        UNTIL nav$global_statistics.intranet <> NIL;
      ELSE

{ Reset the namve statistic values to zero since statistics collection is being
{ enabled after being previously disabled.

        nav$global_statistics.internet.broadcasts_sent := 0;
        nav$global_statistics.internet.pdus_received := 0;
        nav$global_statistics.internet.pdus_sent := 0;
        nav$global_statistics.internet.pdus_relayed := 0;
        nav$global_statistics.internet.pdus_routed_locally := 0;

        nav$global_statistics.transport.initiated_connections := 0;
        nav$global_statistics.transport.active_connections := 0;
        nav$global_statistics.transport.reference_number_wait := 0;
        nav$global_statistics.transport.connections_terminated := 0;
        nav$global_statistics.transport.data_packets_received := 0;
        nav$global_statistics.transport.data_packets_sent := 0;
        nav$global_statistics.transport.discarded_data_packets := 0;
        nav$global_statistics.transport.duplicate_data_packets := 0;
        nav$global_statistics.transport.xdata_packets_received := 0;
        nav$global_statistics.transport.xdata_packets_sent := 0;
        nav$global_statistics.transport.discarded_xdata_packets := 0;
        nav$global_statistics.transport.duplicate_xdata_packets := 0;
        nav$global_statistics.transport.acknowledgment_requests_recved := 0;
        nav$global_statistics.transport.acknowledgment_requests_sent := 0;
        nav$global_statistics.transport.acknowledgments_discarded := 0;
        nav$global_statistics.transport.probe_packets_received := 0;
        nav$global_statistics.transport.probe_packets_sent := 0;
        nav$global_statistics.transport.probe_packets_discarded := 0;
        nav$global_statistics.transport.retransmissions := 0;
        nav$global_statistics.transport.error_packets_received := 0;
        nav$global_statistics.transport.error_packets_sent := 0;

        nav$global_statistics.session.synchronize_requests_received := 0;
        nav$global_statistics.session.synchronize_requests_sent := 0;
        nav$global_statistics.session.interrupt_requests_received := 0;
        nav$global_statistics.session.interrupt_requests_sent := 0;

        nav$global_statistics.routing.duplicate_received_ridus := 0;
        nav$global_statistics.routing.ridus_received := 0;
        nav$global_statistics.routing.ridus_sent := 0;
        nav$global_statistics.routing.ridus_aged_out := 0;
        nav$global_statistics.routing.table_recomputed_direct_network := 0;
        nav$global_statistics.routing.table_recomputed_remote_network := 0;
        nav$global_statistics.routing.table_partial_updates := 0;

        nav$global_statistics.directory.current_registered_titles := 0;
        nav$global_statistics.directory.current_cache_entries := 0;
        nav$global_statistics.directory.directory_searches_active := 0;
        nav$global_statistics.directory.directory_searches_initiated := 0;
        nav$global_statistics.directory.translations_delivered := 0;
        nav$global_statistics.directory.translations_found_in_local_dir := 0;
        nav$global_statistics.directory.translations_found_in_cache := 0;
        nav$global_statistics.directory.broadcast_translations_received := 0;
        nav$global_statistics.directory.translations_broadcast := 0;
        nav$global_statistics.directory.translations_received := 0;
        nav$global_statistics.directory.translations_sent := 0;
        nav$global_statistics.directory.translation_requests_broadcast := 0;
        nav$global_statistics.directory.translation_requests_received := 0;

        nav$global_statistics.file_access.active_connections := 0;
        nav$global_statistics.file_access.file_access_requests := 0;

        nav$global_statistics.buffer_manager.descriptor_pool_empty_count := 0;
        nav$global_statistics.buffer_manager.containers_allocated [1] := 0;
        nav$global_statistics.buffer_manager.containers_allocated [2] := 0;
        nav$global_statistics.buffer_manager.containers_freed [1] := 0;
        nav$global_statistics.buffer_manager.containers_freed [2] := 0;

        nav$global_statistics.pp_buffer_pool.replenish_pools_count := 0;
        FOR i := 1 TO 2 DO
          FOR j := 1 TO 2 DO
            nav$global_statistics.pp_buffer_pool.empty_pools_count [i] [j] := 0;
          FOREND;
          nav$global_statistics.pp_buffer_pool.pools_replenished [i] := 0;
        FOREND;
      IFEND;

{ Set the intranet statistic values to zero.

      FOR i := 1 TO networks_count DO
        nav$global_statistics.intranet^ [i].current_send_pdus_queued := 0;
        nav$global_statistics.intranet^ [i].logical_unit_number := network_device_list^ [i].logical_unit;
        nav$global_statistics.intranet^ [i].multicasts_received := 0;
        nav$global_statistics.intranet^ [i].multicasts_sent := 0;
        nav$global_statistics.intranet^ [i].network_id := 0;
        nav$global_statistics.intranet^ [i].receive.value := 0;
        nav$global_statistics.intranet^ [i].receive_pdus_discarded := 0;
        nav$global_statistics.intranet^ [i].send.value := 0;
        nav$global_statistics.intranet^ [i].send_pdus_discarded := 0;
      FOREND;

{ Initialize NAM/VE global osi statistics.

      IF nav$global_osi_statistics.channel_connection_device = NIL THEN
        REPEAT
          ALLOCATE nav$global_osi_statistics.channel_connection_device: [1 .. networks_count]
                IN nav$network_paged_heap^;
          IF nav$global_osi_statistics.channel_connection_device = NIL THEN
            syp$cycle;
          IFEND;
        UNTIL nav$global_osi_statistics.channel_connection_device <> NIL;
      ELSE

{ Reset the namve statistic values to zero since statistics collection is being
{ enabled after being previously disabled.

        nav$global_osi_statistics.channel_connection.broadcast_connect_requests := 0;
        nav$global_osi_statistics.channel_connection.normal_connections := 0;
        nav$global_osi_statistics.channel_connection.priority_connections := 0;

        nav$global_osi_statistics.link_access_agent.current_saps_open := 0;
        nav$global_osi_statistics.link_access_agent.pdus_received := 0;
        nav$global_osi_statistics.link_access_agent.pdus_sent := 0;
        nav$global_osi_statistics.link_access_agent.total_bytes_received := 0;
        nav$global_osi_statistics.link_access_agent.total_bytes_sent := 0;

        nav$global_osi_statistics.network_access_agent.broadcasts_sent := 0;
        nav$global_osi_statistics.network_access_agent.pdus_received := 0;
        nav$global_osi_statistics.network_access_agent.pdus_sent := 0;
        nav$global_osi_statistics.network_access_agent.total_bytes_received := 0;
        nav$global_osi_statistics.network_access_agent.total_bytes_sent := 0;

        nav$global_osi_statistics.system_management_entity.cdna_address_select_device_reqs := 0;
        nav$global_osi_statistics.system_management_entity.noncdna_addr_select_device_reqs := 0;
        nav$global_osi_statistics.system_management_entity.cdna_address_route_unknown := 0;
        nav$global_osi_statistics.system_management_entity.noncdna_address_route_unknown := 0;
        nav$global_osi_statistics.system_management_entity.device_routing_queries := 0;
        nav$global_osi_statistics.system_management_entity.subnet_attribute_updates_rcvd := 0;

        nav$global_osi_statistics.transport_access_agent.data_pdus_received := 0;
        nav$global_osi_statistics.transport_access_agent.data_pdus_sent := 0;
        nav$global_osi_statistics.transport_access_agent.expedited_pdus_received := 0;
        nav$global_osi_statistics.transport_access_agent.expedited_pdus_sent := 0;
        nav$global_osi_statistics.transport_access_agent.total_bytes_received := 0;
        nav$global_osi_statistics.transport_access_agent.total_bytes_sent := 0;
      IFEND;

      FOR i := 1 TO networks_count DO
        nav$global_osi_statistics.channel_connection_device^ [i].network_id := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].credit_pdus_received := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].credit_pdus_sent := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].current_normal_connections := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].current_priority_connections := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].device_resets := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].duplicate_connect_indications := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].normal_send_pdus_queued := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].pdus_processed_out_of_order := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_receive.value := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_receive_expedited_pdus := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_receive_pdus_discarded := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_send.value := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_send_expedited_pdus := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_send_pdus_discarded := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].priority_send_pdus_queued := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].receive.value := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].receive_pdus_discarded := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].received_expedited_pdus := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].send.value := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].send_expedited_pdus := 0;
        nav$global_osi_statistics.channel_connection_device^ [i].send_pdus_discarded := 0;
      FOREND;
    IFEND;
  PROCEND initialize_global_statistics;
?? TITLE := '[XDCL, #GATE] nap$change_nam_attributes_r3', EJECT ??

{ PURPOSE:
{   Store the new values for the nam attributes in the network paged heap.
{

  PROCEDURE [XDCL, #GATE] nap$change_nam_attributes_r3 (
         nam_attributes: nat$nam_attributes;
     VAR status:  ost$status);

    VAR
      i: integer,
      j: integer;

    IF NOT avp$configuration_administrator () THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'configuration_administration', status);
      RETURN;
    IFEND;

    osp$set_signature_lock (nav$change_nam_attributes_lock, osc$wait, status);

    FOR i := LOWERBOUND (nam_attributes) TO UPPERBOUND (nam_attributes) DO
      CASE nam_attributes [i].kind OF
      = nac$enable_statistics_attr =
        IF NOT nav$statistics_enabled THEN

{ Initialize the global statistic fields if statistics collection is turned on.

          IF nam_attributes [i].enable_statistics THEN
            nlp$get_exclusive_access (nlv$configured_network_devices.access_control);
            initialize_global_statistics;
            nlp$release_exclusive_access (nlv$configured_network_devices.access_control);
          IFEND;
        IFEND;
        nav$statistics_enabled := nam_attributes [i].enable_statistics;

      = nac$ica_reset_down_thresh_attr =
        nav$ica_reset_down_threshold := nam_attributes [i].ica_reset_down_threshold;

      = nac$max_connections_attr =
        nap$change_nam_attributes_r1 (nac$max_connections_attr, nam_attributes [i]);

        IF nam_attributes [i].maximum_connections > nlc$default_maximum_connections THEN
          nlv$bm_allocated_buffer_maximum := nam_attributes [i].maximum_connections * 2;
        ELSE
          nlv$bm_allocated_buffer_maximum := nlc$default_maximum_connections * 2;
        IFEND;
        IF nlv$bm_allocated_buffer_maximum > (nlv$bm_allocated_buffer_pool [nlc$bm_large_buffer_index].
              sub_pool_allocation_size * UPPERBOUND (nlv$bm_allocated_buffer_pool [nlc$bm_large_buffer_index].
              sub_pool^)) THEN
          nlv$bm_allocated_buffer_maximum := nlv$bm_allocated_buffer_pool [nlc$bm_large_buffer_index].
              sub_pool_allocation_size * UPPERBOUND (nlv$bm_allocated_buffer_pool [nlc$bm_large_buffer_index].
              sub_pool^);
        IFEND;
        nlv$bm_allocat_buffer_threshold := nlv$bm_allocated_buffer_maximum - nlc$bm_minimum_buffers_for_cpu;

      = nac$maximum_login_attempts_attr =
        nav$maximum_login_attempts := nam_attributes [i].maximum_login_attempts;

      = nac$mci_reset_down_thresh_attr =
        nav$mci_reset_down_threshold := nam_attributes [i].mci_reset_down_threshold;

      = nac$prompt_for_family_name_attr =
        nav$prompt_for_family_name := nam_attributes [i].prompt_for_family_name;

      = nac$prompt_for_account_attr =
        nav$prompt_for_account := nam_attributes [i].prompt_for_account;

      = nac$prompt_for_project_attr =
        nav$prompt_for_project := nam_attributes [i].prompt_for_project;

      = nac$force_password_prompt_attr =
        nav$force_password_prompt := nam_attributes [i].force_password_prompt;

      = nac$tcpip_refresh_interval =
        nlv$tm_route_cache.refresh_interval := nam_attributes [i].tcpip_refresh_interval;

      = nac$tcpip_stale_release_intervl =
        nlv$tm_route_cache.stale_release_interval := nam_attributes [i].tcpip_stale_release_interval;

      = nac$directory_version =
        nlv$directory_version := nam_attributes [i].directory_version;

      = nac$display_directory_traffic =
        nlv$log_broadcast_requests := nam_attributes [i].display_directory_traffic;
        nlv$log_broadcast_translations := nam_attributes [i].display_directory_traffic;

      = nac$log_tcpip_routing =
        nlv$log_tcpip_device_select := nam_attributes [i].log_tcpip_routing;

      ELSE
      CASEND;
    FOREND;

{ Setup the final prompt of the interactive login dialog.

    IF nav$prompt_for_project THEN
      nav$final_login_prompt := nac$am_project_name;
    ELSEIF nav$prompt_for_account THEN
      nav$final_login_prompt := nac$am_account_name;
    ELSEIF nav$prompt_for_family_name THEN
      nav$final_login_prompt := nac$am_family_name;
    ELSE
      nav$final_login_prompt := nac$am_password;
    IFEND;

    osp$clear_signature_lock (nav$change_nam_attributes_lock, status);

  PROCEND nap$change_nam_attributes_r3;
?? TITLE := '[XDCL, #GATE] nap$get_nam_attributes_r3', EJECT ??

{ PURPOSE:
{   Get the values of the nam attributes from the network paged heap.
{

  PROCEDURE [XDCL, #GATE] nap$get_nam_attributes_r3 (
    VAR nam_attributes: nat$nam_attributes;
    VAR status:  ost$status);

    VAR
      i: integer;

    IF NOT (avp$configuration_administrator () OR avp$system_displays () ) THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'configuration_administration OR system_displays',
            status);
      RETURN;
    IFEND;

    FOR i := LOWERBOUND (nam_attributes) TO UPPERBOUND (nam_attributes) DO
      CASE nam_attributes [i].kind OF
      = nac$enable_statistics_attr =
        nam_attributes [i].enable_statistics := nav$statistics_enabled;

      = nac$ica_reset_down_thresh_attr =
        nam_attributes [i].ica_reset_down_threshold := nav$ica_reset_down_threshold;

      = nac$max_connections_attr =
        nap$get_nam_attributes_r1 (nac$max_connections_attr, nam_attributes [i]);

      = nac$maximum_login_attempts_attr =
        nam_attributes [i].maximum_login_attempts := nav$maximum_login_attempts;

      = nac$mci_reset_down_thresh_attr =
        nam_attributes [i].mci_reset_down_threshold := nav$mci_reset_down_threshold;

      = nac$prompt_for_family_name_attr =
        nam_attributes [i].prompt_for_family_name := nav$prompt_for_family_name;

      = nac$prompt_for_account_attr =
        nam_attributes [i].prompt_for_account := nav$prompt_for_account;

      = nac$prompt_for_project_attr =
        nam_attributes [i].prompt_for_project := nav$prompt_for_project;

      = nac$force_password_prompt_attr =
        nam_attributes [i].force_password_prompt := nav$force_password_prompt;

      = nac$current_connections_status =
        nap$get_nam_attributes_r1 (nac$current_connections_status, nam_attributes [i]);

      = nac$tcpip_refresh_interval =
        nam_attributes [i].tcpip_refresh_interval := nlv$tm_route_cache.refresh_interval;

      = nac$tcpip_stale_release_intervl =
        nam_attributes [i].tcpip_stale_release_interval := nlv$tm_route_cache.stale_release_interval;

      = nac$directory_version =
        nam_attributes [i].directory_version := nlv$directory_version;

      = nac$system_identifier_attr =
        nam_attributes [i].system_id := nap$system_id ();

      ELSE
      CASEND;
    FOREND

  PROCEND nap$get_nam_attributes_r3;
?? TITLE := '[XDCL, #GATE] nap$supported_protocol_stacks', EJECT ??

{ PURPOSE:
{   The purpose of this request is to return the protocol stacks supported
{   by NAM/VE.

  FUNCTION [XDCL, #GATE] nap$supported_protocol_stacks: nat$protocol_stack_integer;

    nap$supported_protocol_stacks := nac$osi_protocol_stack;

  FUNCEND nap$supported_protocol_stacks;

MODEND nam$manage_nam_attributes_r3;
