/************************************************************************/ /* 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); }