Files
microser/mmslib/mvlu/s_info.c

220 lines
7.6 KiB
C
Raw Normal View History

2026-06-15 15:48:16 +08:00
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1994 - 1996, All Rights Reserved */
/* */
/* MODULE NAME : s_info.c */
/* PRODUCT(S) : MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* NONE */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 04/09/07 MDE 20 Enhanced filtered logging */
/* 01/30/06 GLB 19 Integrated porting changes for VMS */
/* 12/12/02 JRB 18 Add & use mvl_encode_info_rpt funct. */
/* Use new thread-safe mpl_info,_mvl_send_msg */
/* and skip S_LOCK.. */
/* Pass net_info to mvl_get_va_asn1_data so */
/* don't need mvl_curr_net_info global var. */
/* 07/10/02 JRB 17 Call mvl_ureq_bufs_avail. */
/* 02/25/02 MDE 16 Now get max PDU size from mvl_cfg_info */
/* 09/21/01 JRB 15 Alloc global bufs only once at startup. */
/* 03/30/01 MDE 14 Changed MSMEM_ENC_INFO to MSMEM_ENC_OS_INFO */
/* 10/06/00 MDE 13 Added LOCK/UNLOCK */
/* 08/07/00 JRB 12 Set scope & domain name correctly for NVL. */
/* 05/15/00 MDE 11 Added MMS statistics */
/* 04/14/00 JRB 10 Lint cleanup. */
/* 01/21/00 MDE 09 Now use MEM_SMEM for dynamic memory */
/* 09/13/99 MDE 08 Added SD_CONST modifiers */
/* 09/07/99 MDE 07 Changed MVL_VA_SCOPE to MVL_SCOPE */
/* 12/11/98 MDE 06 Removed scope references from VA */
/* 11/16/98 MDE 05 Renamed internal functions (prefix '_') */
/* 06/15/98 MDE 04 Changes to allow compile under C++ */
/* 02/10/98 MDE 03 Removed NEST_RT_TYPES, always support AA */
/* 09/18/97 MDE 02 Fixed problem when no nvl->altAcc */
/* 09/10/97 MDE 01 MMS-LITE V4.0 Release */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "mmsdefs.h"
#include "mms_pvar.h"
#include "mms_vvar.h"
#include "mvl_acse.h"
#include "mvl_log.h"
/************************************************************************/
/* For debug version, use a static pointer to avoid duplication of */
/* __FILE__ strings. */
/************************************************************************/
#ifdef DEBUG_SISCO
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
#endif
/************************************************************************/
/************************************************************************/
ST_RET mvl_info_variables (MVL_NET_INFO *net_info, MVL_NVLIST_CTRL *nvl,
ST_BOOLEAN listOfVariables)
{
ST_RET rc;
ASN1_ENC_CTXT aCtx;
ST_UCHAR *my_enc_buf;
if (mvl_ureq_bufs_avail (net_info) <= 0)
{
MVL_LOG_ERR0 ("Not enough ACSE buffers available to send InformationReport");
return (MVL_ERR_REQ_PEND_COUNT);
}
my_enc_buf = (ST_UCHAR *) mvl_enc_buf_alloc (mmsl_enc_buf_size);
asn1r_strt_asn1_bld (&aCtx, my_enc_buf, mmsl_enc_buf_size);/*CRITICAL*/
rc = mvl_encode_info_rpt (net_info, nvl, listOfVariables, &aCtx);
if (rc == SD_SUCCESS)
{ /* Encode was successful, go ahead and send. */
rc = _mvl_send_msg (ASN1_ENC_PTR(&aCtx),ASN1_ENC_LEN(&aCtx),net_info);
if (rc == SD_SUCCESS) /* _mvl_send_msg logs on any error. */
++mvl_mms_statistics.serverInfoRpt;
}
mvl_enc_buf_free (my_enc_buf);
return(rc);
}
/************************************************************************/
/* mvl_encode_info_rpt */
/************************************************************************/
ST_RET mvl_encode_info_rpt (MVL_NET_INFO *net_info,
MVL_NVLIST_CTRL *nvl,
ST_BOOLEAN listOfVariables,
ASN1_ENC_CTXT *aCtx)
{
ST_RET rc;
INFO_REQ_INFO *info_info;
ACCESS_RESULT *ar;
ST_INT req_info_size;
MVL_VAR_ASSOC *va;
MVL_SCOPE *va_scope;
MVL_SCOPE vmdVaScope;
ST_UCHAR *asn1_buf;
ST_UCHAR *asn1_start;
ST_INT asn1_len;
ST_INT asn1_buf_left;
VARIABLE_LIST *vl;
ST_INT num_var;
ST_INT i;
ST_BOOLEAN alt_access_pres;
ALT_ACCESS *alt_acc;
va = *nvl->entries;
num_var = nvl->num_of_entries;
/* Calculate the required size for the info report information */
req_info_size = sizeof(INFO_REQ_INFO) +
(num_var * sizeof(ACCESS_RESULT));
/* May need to add some more to handle the variable specification */
if (listOfVariables == SD_TRUE)
req_info_size += (num_var * sizeof(VARIABLE_LIST));
info_info = (INFO_REQ_INFO *) M_CALLOC (MSMEM_ENC_OS_INFO, 1, req_info_size);
info_info->num_of_acc_result = num_var;
/* We need to create the variable specification - either a list of */
/* variables or a named variable list */
if (listOfVariables == SD_TRUE)
{
info_info->va_spec.var_acc_tag = VAR_ACC_VARLIST;
info_info->va_spec.num_of_variables = num_var;
vl = (VARIABLE_LIST *) (info_info + 1);
for (i = 0; i < nvl->num_of_entries; ++i, ++vl)
{
va = nvl->entries[i];
/* For backwards compatibility only ... */
if (nvl->va_scope != NULL)
va_scope = &nvl->va_scope[i];
else
{
MVL_LOG_NERR0 ("Warning: Info Rpt nvl->va_scope is NULL, using VMD scope");
va_scope = &vmdVaScope;
va_scope->scope = VMD_SPEC;
}
/* We know this is a union so the following line is OK ... */
vl->var_spec.vs.name.obj_name.vmd_spec = va->name;
vl->var_spec.vs.name.object_tag = va_scope->scope;
if (va_scope->scope == DOM_SPEC)
vl->var_spec.vs.name.domain_id = va_scope->dom->name;
}
info_info->acc_rslt_list = (ACCESS_RESULT *) (vl);
}
else /* Named Variable List */
{
info_info->va_spec.var_acc_tag = VAR_ACC_NAMEDLIST;
info_info->va_spec.vl_name.object_tag = nvl->nvl_scope.scope;
if (nvl->nvl_scope.scope == DOM_SPEC)
info_info->va_spec.vl_name.domain_id = nvl->nvl_scope.dom->name;
info_info->va_spec.vl_name.obj_name.vmd_spec = nvl->name;
info_info->acc_rslt_list = (ACCESS_RESULT *) (info_info + 1);
}
ar = info_info->acc_rslt_list;
asn1_buf = (ST_UCHAR *) M_MALLOC (MSMEM_ASN1_DATA_ENC, mvl_cfg_info->max_msg_size);
asn1_buf_left = mvl_cfg_info->max_msg_size;
/* Now encode the data, create the access result */
asn1_start = asn1_buf;
for (i = 0; i < nvl->num_of_entries; ++i, ++ar)
{
va = nvl->entries[i];
alt_access_pres = SD_FALSE;
if (nvl->altAcc)
{
alt_acc = nvl->altAcc[i];
if (alt_acc != NULL)
alt_access_pres = SD_TRUE;
}
else
alt_acc = NULL; /* Just so it's initialized. Eliminates warning.*/
rc = mvl_get_va_asn1_data (net_info, va, alt_access_pres, alt_acc, asn1_start,
asn1_buf_left, &asn1_len);
if (rc == SD_SUCCESS)
{
ar->acc_rslt_tag = ACC_RSLT_SUCCESS;
ar->va_data.len = asn1_len;
ar->va_data.data = asn1_start;
asn1_buf_left -= asn1_len; /* adjust buffer control variables */
asn1_start += asn1_len;
}
else
{
ar->acc_rslt_tag = ACC_RSLT_FAILURE;
ar->failure = ARE_TYPE_INCONSISTENT;
}
}
/* Build a info request */
rc = mpl_info (aCtx, info_info);
/* Log the PDU, if enabled */
mpl_unsol_req_log (net_info, MMSOP_INFO_RPT, info_info);
M_FREE (MSMEM_ENC_OS_INFO, info_info);
M_FREE (MSMEM_ASN1_DATA_ENC, asn1_buf);
if (rc != SD_SUCCESS)
MVL_LOG_NERR1 ("mvl_encode_info_rpt error = %x", rc);
return (rc);
}