266 lines
12 KiB
C
266 lines
12 KiB
C
|
|
/************************************************************************/
|
||
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||
|
|
/************************************************************************/
|
||
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
|
|
/* 1994 - 2002, All Rights Reserved */
|
||
|
|
/* */
|
||
|
|
/* MODULE NAME : s_getvaa.c */
|
||
|
|
/* PRODUCT(S) : MMSEASE-LITE */
|
||
|
|
/* */
|
||
|
|
/* MODULE DESCRIPTION : */
|
||
|
|
/* */
|
||
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||
|
|
/* NONE */
|
||
|
|
/* */
|
||
|
|
/* MODIFICATION LOG : */
|
||
|
|
/* Date Who Rev Comments */
|
||
|
|
/* -------- --- ------ ------------------------------------------- */
|
||
|
|
/* 04/09/07 MDE 22 Enhanced filtered logging */
|
||
|
|
/* 11/03/06 RKR 21 Added code to generate a misencoded typespec */
|
||
|
|
/* 11/02/06 JRB 20 mplas_err_resp: fix class/code for IEC 61850.*/
|
||
|
|
/* 10/30/06 JRB 19 Add args on call to _mvl_objname_to_va. */
|
||
|
|
/* Del MVL_DYN_ASN1_TYPES option (was enabled */
|
||
|
|
/* by default). Always do default behavior. */
|
||
|
|
/* Elim use of global var "_mvl_curr_net_info". */
|
||
|
|
/* 01/30/06 GLB 18 Integrated porting changes for VMS */
|
||
|
|
/* 06/29/04 JRB 17 Improve NERR log msg. */
|
||
|
|
/* 03/13/03 JRB 16 Use mvl_type_ctrl_find. */
|
||
|
|
/* 02/25/02 MDE 15 Now get max PDU size from mvl_cfg_info */
|
||
|
|
/* 01/02/02 JRB 14 Converted to use ASN1R (re-entrant ASN1) */
|
||
|
|
/* 09/21/01 JRB 13 Alloc global bufs only once at startup. */
|
||
|
|
/* 10/25/00 JRB 12 Del u_mvl funct ptrs. Call functs directly. */
|
||
|
|
/* Control with #ifdefs. */
|
||
|
|
/* 01/21/00 MDE 11 Now use MEM_SMEM for dynamic memory */
|
||
|
|
/* 09/13/99 MDE 10 Added SD_CONST modifiers */
|
||
|
|
/* 04/07/99 MDE 09 Logging improvements */
|
||
|
|
/* 12/11/98 MDE 08 Removed scope references from VA */
|
||
|
|
/* 12/11/98 MDE 07 Now use 'va_to_free' as manufactured flag */
|
||
|
|
/* 11/16/98 MDE 06 Renamed internal functions (prefix '_') */
|
||
|
|
/* 08/06/98 JRB 05 Use mmsl_max_msg_size to encode type_spec. */
|
||
|
|
/* 06/15/98 MDE 04 Changes to allow compile under C++ */
|
||
|
|
/* 05/14/98 JRB 03 Use MVL_IND_PEND. Add mplas resp function. */
|
||
|
|
/* 02/10/98 MDE 02 Removed NEST_RT_TYPES, use _mvl_call_get_va */
|
||
|
|
/* 09/10/97 MDE 01 MMS-LITE V4.0 Release */
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
#include "glbtypes.h"
|
||
|
|
#include "sysincs.h"
|
||
|
|
#include "mmsdefs.h"
|
||
|
|
#include "mms_pvmd.h"
|
||
|
|
#include "mvl_acse.h"
|
||
|
|
#include "mvl_log.h"
|
||
|
|
|
||
|
|
#if defined(_S_TEST_PROBES)
|
||
|
|
#include "stestprb.h"
|
||
|
|
ST_CHAR *misencodedPDU = "\xA2\x82\x05\x20\xA1\x82\x05\x1C\x30\x82\x01\x93\x80\x02\x53\x54\
|
||
|
|
\xA1\x82\x01\x8B\xA2\x82\x01\x87\xA1\x82\x01\x83\x30\x2C\x80\x03\
|
||
|
|
\x4D\x6F\x64\xA1\x25\xA2\x23\xA1\x21\x30\x0C\x80\x05\x73\x74\x56\
|
||
|
|
\x61\x6C\xA1\x03\x85\x01\x08\x30\x08\x80\x01\x71\xA1\x03\x84\x01\
|
||
|
|
\xF3\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\x2C\x80\x03\x42\x65\
|
||
|
|
\x68\xA1\x25\xA2\x23\xA1\x21\x30\x0C\x80\x05\x73\x74\x56\x61\x6C\
|
||
|
|
\xA1\x03\x85\x01\x08\x30\x08\x80\x01\x71\xA1\x03\x84\x01\xF3\x30\
|
||
|
|
\x07\x80\x01\x74\xA1\x02\x91\x00\x30\x2F\x80\x06\x48\x65\x61\x6C\
|
||
|
|
\x74\x68\xA1\x25\xA2\x23\xA1\x21\x30\x0C\x80\x05\x73\x74\x56\x61\
|
||
|
|
\x6C\xA1\x03\x85\x01\x08\x30\x08\x80\x01\x71\xA1\x03\x84\x01\xF3\
|
||
|
|
\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\x30\x80\x07\x4F\x70\x43\
|
||
|
|
\x6E\x74\x52\x73\xA1\x25\xA2\x23\xA1\x21\x30\x0C\x80\x05\x73\x74\
|
||
|
|
\x56\x61\x6C\xA1\x03\x85\x01\x20\x30\x08\x80\x01\x71\xA1\x03\x84\
|
||
|
|
\x01\xF3\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\x31\x80\x08\x4E\
|
||
|
|
\x75\x6D\x43\x6E\x74\x52\x73\xA1\x25\xA2\x23\xA1\x21\x30\x0C\x80\
|
||
|
|
\x05\x73\x74\x56\x61\x6C\xA1\x03\x85\x01\x20\x30\x08\x80\x01\x71\
|
||
|
|
\xA1\x03\x84\x01\xF3\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\x2F\
|
||
|
|
\x80\x06\x43\x68\x6B\x48\x64\x75\xA1\x25\xA2\x23\xA1\x21\x30\x0C\
|
||
|
|
\x80\x05\x73\x74\x56\x61\x6C\xA1\x03\x84\x01\xF8\x30\x08\x80\x01\
|
||
|
|
\x71\xA1\x03\x84\x01\xF3\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\
|
||
|
|
\x2D\x80\x05\x4D\x65\x6D\x4F\x76\xA1\x24\xA2\x22\xA1\x20\x30\x0B\
|
||
|
|
\x80\x05\x73\x74\x56\x61\x6C\xA1\x02\x83\x00\x30\x08\x80\x01\x71\
|
||
|
|
\xA1\x03\x84\x01\xF3\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\x2F\
|
||
|
|
\x80\x06\x4E\x75\x6D\x52\x63\x64\xA1\x25\xA2\x23\xA1\x21\x30\x0C\
|
||
|
|
\x80\x05\x73\x74\x56\x61\x6C\xA1\x03\x85\x01\x20\x30\x08\x80\x01\
|
||
|
|
\x71\xA1\x03\x84\x01\xF3\x30\x07\x80\x01\x74\xA1\x02\x91\x00\x30\
|
||
|
|
\x82\x01\xC0\x80\x02\x43\x4F\xA1\x82\x01\xB8\xA2\x82\x01\xB4\xA1\
|
||
|
|
\x82\x01\xB0\x30\x81\x8D\x80\x07\x4F\x70\x43\x6E\x74\x52\x73\xA1\
|
||
|
|
\x81\x81\xA2\x7F\xA1\x7D\x30\x7B\x80\x04\x4F\x70\x65\x72\xA1\x73\
|
||
|
|
\xA2\x71\xA1\x6F\x30\x0D\x80\x06\x63\x74\x6C\x56\x61\x6C\xA1\x03\
|
||
|
|
\x85\x01\x20\x30\x2C\x80\x06\x6F\x72\x69\x67\x69\x6E\xA1\x22\xA2\
|
||
|
|
\x20\xA1\x1E\x30\x0C\x80\x05\x6F\x72\x43\x61\x74\xA1\x03\x85\x01\
|
||
|
|
\x08\x30\x0E\x80\x07\x6F\x72\x49\x64\x65\x6E\x74\xA1\x03\x89\x01\
|
||
|
|
\xC0\x30\x0D\x80\x06\x63\x74\x6C\x4E\x75\x6D\xA1\x03\x86\x01\x08\
|
||
|
|
\x30\x07\x80\x01\x54\xA1\x02\x91\x00\x30\x0A\x80\x04\x54\x65\x73\
|
||
|
|
\x74\xA1\x02\x83\x00\x30\x0C\x80\x05\x43\x68\x65\x63\x6B\xA1\x03\
|
||
|
|
\x84\x01\xFE\x30\x81\x8E\x80\x08\x4E\x75\x6D\x43\x6E\x74\x52\x73\
|
||
|
|
\xA1\x81\x81\xA2\x7F\xA1\x7D\x30\x7B\x80\x04\x4F\x70\x65\x72\xA1\
|
||
|
|
\x73\xA2\x71\xA1\x6F\x30\x0D\x80\x06\x63\x74\x6C\x56\x61\x6C\xA1\
|
||
|
|
\x03\x85\x01\x20\x30\x2C\x80\x06\x6F\x72\x69\x67\x69\x6E\xA1\x22\
|
||
|
|
\xA2\x20\xA1\x1E\x30\x0C\x80\x05\x6F\x72\x43\x61\x74\xA1\x03\x85\
|
||
|
|
\x01\x08\x30\x0E\x80\x07\x6F\x72\x49\x64\x65\x6E\x74\xA1\x03\x89\
|
||
|
|
\x01\xC0\x30\x0D\x80\x06\x63\x74\x6C\x4E\x75\x6D\xA1\x03\x86\x01\
|
||
|
|
\x08\x30\x07\x80\x01\x54\xA1\x02\x91\x00\x30\x0A\x80\x04\x54\x65\
|
||
|
|
\x73\x74\xA1\x02\x83\x00\x30\x0C\x80\x05\x43\x68\x65\x63\x6B\xA1\
|
||
|
|
\x03\x84\x01\xFE\x30\x81\x8C\x80\x06\x43\x68\x6B\x48\x64\x75\xA1\
|
||
|
|
\x81\x81\xA2\x7F\xA1\x7D\x30\x7B\x80\x04\x4F\x70\x65\x72\xA1\x73\
|
||
|
|
\xA2\x71\xA1\x6F\x30\x0D\x80\x06\x63\x74\x6C\x56\x61\x6C\xA1\x03\
|
||
|
|
\x85\x01\xC0\x30\x2C\x80\x06\x6F\x72\x69\x67\x69\x6E\xA1\x22\xA2\
|
||
|
|
\x20\xA1\x1E\x30\x0C\x80\x05\x6F\x72\x43\x61\x74\xA1\x03\x85\x01\
|
||
|
|
\x08\x30\x0E\x80\x07\x6F\x72\x49\x64\x65\x6E\x74\xA1\x03\x89\x01\
|
||
|
|
\xC0\x30\x0D\x80\x06\x63\x74\x6C\x4E\x75\x6D\xA1\x03\x86\x01\x08\
|
||
|
|
\x30\x07\x80\x01\x54\xA1\x02\x91\x00\x30\x0A\x80\x04\x54\x65\x73\
|
||
|
|
\x74\xA1\x02\x83\x00\x30\x0C\x80\x05\x43\x68\x65\x63\x6B\xA1\x03\
|
||
|
|
\x84\x01\xFE\x30\x81\x91\x80\x02\x43\x46\xA1\x81\x8A\xA2\x81\x87\
|
||
|
|
\xA1\x81\x84\x30\x1C\x80\x03\x4D\x6F\x64\xA1\x15\xA2\x13\xA1\x11\
|
||
|
|
\x30\x0F\x80\x08\x63\x74\x6C\x4D\x6F\x64\x65\x6C\xA1\x03\x85\x01\
|
||
|
|
\x08\x30\x20\x80\x07\x4F\x70\x43\x6E\x74\x52\x73\xA1\x15\xA2\x13\
|
||
|
|
\xA1\x11\x30\x0F\x80\x08\x63\x74\x6C\x4D\x6F\x64\x65\x6C\xA1\x03\
|
||
|
|
\x85\x01\x08\x30\x21\x80\x08\x4E\x75\x6D\x43\x6E\x74\x52\x73\xA1\
|
||
|
|
\x15\xA2\x13\xA1\x11\x30\x0F\x80\x08\x63\x74\x6C\x4D\x6F\x64\x65\
|
||
|
|
\x6C\xA1\x03\x85\x01\x08\x30\x1F\x80\x06\x43\x68\x6B\x48\x64\x75\
|
||
|
|
\xA1\x15\xA2\x13\xA1\x11\x30\x0F\x80\x08\x63\x74\x6C\x4D\x6F\x64\
|
||
|
|
\x65\x6C\xA1\x03\x85\x01\x08\x30\x81\xFE\x80\x02\x44\x43\xA1\x81\
|
||
|
|
\xF7\xA2\x81\xF4\xA1\x81\xF1\x30\x19\x80\x06\x48\x65\x61\x6C\x74\
|
||
|
|
\x68\xA1\x0F\xA2\x0D\xA1\x0B\x30\x09\x80\x01\x64\xA1\x04\x8A\x02\
|
||
|
|
\xFF\x01\x30\x4B\x80\x06\x4E\x61\x6D\x50\x6C\x74\xA1\x41\xA2\x3F\
|
||
|
|
\xA1\x3D\x30\x0E\x80\x06\x76\x65\x6E\x64\x6F\x72\xA1\x04\x8A\x02\
|
||
|
|
\xFF\x01\x30\x0D\x80\x05\x73\x77\x52\x65\x76\xA1\x04\x8A\x02\xFF\
|
||
|
|
\x01\x30\x09\x80\x01\x64\xA1\x04\x8A\x02\xFF\x01\x30\x11\x80\x09\
|
||
|
|
\x63\x6F\x6E\x66\x69\x67\x52\x65\x76\xA1\x04\x8A\x02\xFF\x01\x30\
|
||
|
|
\x1A\x80\x07\x4F\x70\x43\x6E\x74\x52\x73\xA1\x0F\xA2\x0D\xA1\x0B\
|
||
|
|
\x30\x09\x80\x01\x64\xA1\x04\x8A\x02\xFF\x01\x30\x1B\x80\x08\x4E\
|
||
|
|
\x75\x6D\x43\x6E\x74\x52\x73\xA1\x0F\xA2\x0D\xA1\x0B\x30\x09\x80\
|
||
|
|
\x01\x64\xA1\x04\x8A\x02\xFF\x01\x30\x19\x80\x06\x43\x68\x6B\x48\
|
||
|
|
\x64\x75\xA1\x0F\xA2\x0D\xA1\x0B\x30\x09\x80\x01\x64\xA1\x04\x8A\
|
||
|
|
\x02\xFF\x01\x30\x18\x80\x05\x4D\x65\x6D\x4F\x76\xA1\x0F\xA2\x0D\
|
||
|
|
\xA1\x0B\x30\x09\x80\x01\x64\xA1\x04\x8A\x02\xFF\x01\x30\x19\x80\
|
||
|
|
\x06\x4E\x75\x6D\x52\x63\x64\xA1\x0F\xA2\x0D\xA1\x0B\x30\x09\x80\
|
||
|
|
\x01\x64\xA1\x04\x8A\x02\xFF\x01\x30\x2A\x80\x02\x45\x58\xA1\x24\
|
||
|
|
\xA2\x22\xA1\x20\x30\x1E\x80\x06\x43\x68\x6B\x48\x64\x75\xA1\x14\
|
||
|
|
\xA2\x12\xA1\x10\x30\x0E\x80\x06\x64\x61\x74\x61\x4E\x73\xA1\x04\
|
||
|
|
\x8A\x02\xFF\x01";
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/* 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
|
||
|
|
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/************************************************************************/
|
||
|
|
/* _mvl_process_getvaa_ind */
|
||
|
|
/* A 'Get Variable Access Attributes' indication has been received, */
|
||
|
|
/* process it and respond */
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
ST_VOID _mvl_process_getvaa_ind (MVL_IND_PEND *indCtrl)
|
||
|
|
{
|
||
|
|
indCtrl->u.getvar.req_info =
|
||
|
|
(GETVAR_REQ_INFO *) indCtrl->event->u.mms.dec_rslt.data_ptr;
|
||
|
|
|
||
|
|
u_mvl_getvar_ind (indCtrl);
|
||
|
|
}
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/* mvlas_getvar_resp */
|
||
|
|
/************************************************************************/
|
||
|
|
ST_VOID mvlas_getvar_resp (MVL_IND_PEND *indCtrl)
|
||
|
|
{
|
||
|
|
GETVAR_REQ_INFO *req_info;
|
||
|
|
GETVAR_RESP_INFO resp_info;
|
||
|
|
MVL_VAR_ASSOC *va;
|
||
|
|
ST_RET rc;
|
||
|
|
ST_UCHAR *asn1_buf;
|
||
|
|
ST_INT asn1_len;
|
||
|
|
ST_UCHAR *asn1_start;
|
||
|
|
ASN1_ENC_CTXT localEncCtx; /* For readability, use "aCtx" to access this.*/
|
||
|
|
ASN1_ENC_CTXT *aCtx = &localEncCtx;
|
||
|
|
MVL_TYPE_CTRL *type_ctrl;
|
||
|
|
|
||
|
|
req_info = indCtrl->u.getvar.req_info;
|
||
|
|
|
||
|
|
asn1_buf = (ST_UCHAR *) M_MALLOC (MSMEM_ASN1_DATA_ENC, mvl_cfg_info->max_msg_size);
|
||
|
|
|
||
|
|
rc = SD_FAILURE;
|
||
|
|
if (req_info->req_tag == 0) /* Object Name */
|
||
|
|
{
|
||
|
|
va = _mvl_objname_to_va (&mvl_vmd, indCtrl->event->net_info, MMSOP_GET_VAR, &req_info->name,
|
||
|
|
NULL,
|
||
|
|
SD_FALSE,
|
||
|
|
NULL,
|
||
|
|
NULL);
|
||
|
|
|
||
|
|
if (va)
|
||
|
|
{
|
||
|
|
resp_info.mms_deletable = SD_FALSE;
|
||
|
|
resp_info.address_pres = SD_FALSE;
|
||
|
|
|
||
|
|
/* We will derive the ASN.1 directly from the runtime type. */
|
||
|
|
/* This takes a bit more code, but if we have Lot's of types we can */
|
||
|
|
/* save space. */
|
||
|
|
|
||
|
|
type_ctrl = mvl_type_ctrl_find (va->type_id); /* find type */
|
||
|
|
|
||
|
|
asn1r_strt_asn1_bld (aCtx, asn1_buf, mvl_cfg_info->max_msg_size);
|
||
|
|
rc = ms_runtime_to_asn1 (aCtx, type_ctrl->rt, type_ctrl->num_rt);
|
||
|
|
if (rc == SD_SUCCESS)
|
||
|
|
{
|
||
|
|
asn1_start = aCtx->asn1r_field_ptr+1;
|
||
|
|
asn1_len = (asn1_buf + mvl_cfg_info->max_msg_size) - asn1_start;
|
||
|
|
|
||
|
|
resp_info.type_spec.len = asn1_len;
|
||
|
|
resp_info.type_spec.data = asn1_start;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
MVL_LOG_NERR1 ("GetVarAccAttrib : VarName='%s'. Could not create ASN.1 from RUNTIME. Probably MMS msgsize to small.",
|
||
|
|
req_info->name.obj_name.vmd_spec);
|
||
|
|
}
|
||
|
|
|
||
|
|
#if defined(MVL_UCA) || defined(USE_MANUFACTURED_OBJS)
|
||
|
|
if (va->va_to_free)
|
||
|
|
u_mvl_free_va (MMSOP_GET_VAR, va, indCtrl->event->net_info);
|
||
|
|
#endif /* defined(MVL_UCA) || defined(USE_MANUFACTURED_OBJS) */
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
MVL_LOG_NERR1 ("GetVarAccAttrib : Variable Association '%s' not found",
|
||
|
|
req_info->name.obj_name.vmd_spec);
|
||
|
|
}
|
||
|
|
} /* End 'if object (variable name) */
|
||
|
|
|
||
|
|
if (rc != SD_SUCCESS)
|
||
|
|
_mplas_err_resp (indCtrl,MMS_ERRCLASS_ACCESS,MMS_ERRCODE_OBJ_NON_EXISTENT);
|
||
|
|
else
|
||
|
|
{
|
||
|
|
#if defined(_S_TEST_PROBES)
|
||
|
|
if (_sTestProbeEnabled(_MVL_TEST_RETURN_BAD_TYPE))
|
||
|
|
{
|
||
|
|
SLOGALWAYS0 ("TEST: Sending bad type for getVaa");
|
||
|
|
resp_info.type_spec.data = misencodedPDU;
|
||
|
|
resp_info.type_spec.len = 1316; /* 0x524 in Hex */
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
indCtrl->u.getvar.resp_info = &resp_info;
|
||
|
|
mplas_getvar_resp (indCtrl);
|
||
|
|
}
|
||
|
|
|
||
|
|
M_FREE (MSMEM_ASN1_DATA_ENC, asn1_buf);
|
||
|
|
}
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/* mplas_getvar_resp */
|
||
|
|
/************************************************************************/
|
||
|
|
ST_VOID mplas_getvar_resp (MVL_IND_PEND *indCtrl)
|
||
|
|
{
|
||
|
|
ST_RET rc;
|
||
|
|
|
||
|
|
rc = mpl_getvar_resp (indCtrl->event->u.mms.dec_rslt.id,
|
||
|
|
indCtrl->u.getvar.resp_info);
|
||
|
|
if (rc == SD_SUCCESS)
|
||
|
|
mpl_resp_log (indCtrl, indCtrl->u.getvar.resp_info);
|
||
|
|
|
||
|
|
_mvl_send_resp_i (indCtrl, rc);
|
||
|
|
}
|