You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
780 lines
28 KiB
C
780 lines
28 KiB
C
|
|
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1994 - 2002, All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : mvl_uca.h */
|
|
/* PRODUCT(S) : MMSEASE-LITE */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* NONE */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 09/12/05 JRB 21 Add mvl61850_ctl_chk_sbow. */
|
|
/* 07/11/05 JRB 20 Add more "mvl61850_ctl_*" functions. */
|
|
/* 06/27/05 JRB 19 Del mvlu_rpt_nvl_add/destroy. */
|
|
/* 06/27/05 JRB 18 _mvlu_get_rd_rcb: add (MVLU_RPT_CLIENT **) arg.*/
|
|
/* MVL61850_BRCB_CTRL: Add lastSentEntryID. */
|
|
/* 05/27/05 CRM 17 Add mvlu_rpt_destroy_scan_ctrl. */
|
|
/* 05/09/05 JRB 16 Define MVLU_LEAF_FUN_LOOKUP_ENABLE by default*/
|
|
/* 12/09/04 JRB 15 Add "MVL61850_CTLMODEL_*" defines. */
|
|
/* Add MVL61850_LAST_APPL.. struct. */
|
|
/* Add mvlu_trim_branch_name, mvlu_find_comp_type,*/
|
|
/* mvlu_get_leaf_val_*. */
|
|
/* Add mvl61850_ctl_chk_sbo, mvl61850_ctl_chk_state.*/
|
|
/* Add initSboCtrl. */
|
|
/* 09/20/04 JRB 14 More SBO changes for IEC 61850. */
|
|
/* 08/30/04 JRB 13 Add mvlu_sbo_chk_* prototypes. */
|
|
/* 07/06/04 JRB 12 Add mvlu_rpt_create_scan_ctrl2 proto. */
|
|
/* 06/30/04 JRB 11 Add "prim_num", "prim_offset_base" to */
|
|
/* MVLU_RD_VA_CTRL, MVLU_WR_VA_CTRL. */
|
|
/* Del global var mvluUseStaticData. */
|
|
/* Del SCL parsing functions & related structs: */
|
|
/* mvl61850_ln_create_start, mvl61850_do_create,*/
|
|
/* mvl61850_da_create, mvl61850_ln_create_finish,*/
|
|
/* & mvl61850_ln_destroy. New SCL standard */
|
|
/* makes these obsolete. */
|
|
/* 05/13/04 JRB 10 Add SqNumInt16u to MVLU_BASRCB. */
|
|
/* Add define MVL61850_MAX_OBJREF_LEN. */
|
|
/* 04/20/04 JRB 09 Add TRGOPS_BITNUM_* defines. */
|
|
/* 12/17/03 JRB 08 61850-8-1 FDIS changes: */
|
|
/* MVLU_BASRCB: Add TimeofEntry for 61850 BRCB. */
|
|
/* Add OPTFLD_BITNUM_CONFREV = 8. */
|
|
/* Chg OPTFLD_BITNUM_SUBSEQNUM from 8 to 9. */
|
|
/* Increase MVLU_MAX_RPT_OPTS to 11. */
|
|
/* 04/22/03 JRB 07 Add comments to dynamic 61850 type functs. */
|
|
/* 04/17/03 JRB 06 Add mvlu_setup_scan_read. */
|
|
/* 04/04/03 JRB 05 Fix integrity/GI scan code so multiple */
|
|
/* concurrent scans don't corrupt one another. */
|
|
/* u_mvlu_rpt_scan_done deleted. */
|
|
/* 03/13/03 JRB 04 Add funcs for 61850 dynamic type creation. */
|
|
/* Add 61850 URCB support. */
|
|
/* MVLU_RPT_TYPEIDS: Use clearer member names. */
|
|
/* MVLU_RPT_CTRL: Del inclusion_data & all */
|
|
/* MVL_VAR_ASSOC vars. */
|
|
/* MVLU_BASRCB: Add "Resv". */
|
|
/* ucaName: Chg from ptr to array. */
|
|
/* mvlu_proc_rt_type: Chg to use RUNTIME_CTRL. */
|
|
/* TrgOps: Chg to Bvstring (variable len). */
|
|
/* MVLU_RPT_CLIENT: add/delete members. */
|
|
/* Add mvlu_integrity_timeout funct. */
|
|
/* 12/17/02 JRB 03 Chg prefix to "MVLU_STR:" */
|
|
/* Del all *typeId globals, use MVLU_RPT_TYPEIDS*/
|
|
/* 12/14/02 JRB 02 Chg mvlu_create_rpt_ctrl, mvlu_send_report args*/
|
|
/* Add mvlu_integrity_scan_* functions. */
|
|
/* Add callback funct u_mvlu_rpt_time_get. */
|
|
/* Chg OptFlds to BVstring9, add "bitnum" defines*/
|
|
/* Add defs, protos, etc. fof IEC-61850. */
|
|
/* Add ConfRev, EntryID to MVLU_BASRCB */
|
|
/* Add scan_read_ind to MVLU_RPT_CLIENT */
|
|
/* Add MVLU_RPT_TYPEIDS */
|
|
/* Del rptTim_data, rptTim_va, rptTim_typeId */
|
|
/* Del outDat_data, outDat_va, outDat_typeId */
|
|
/* 12/10/02 JRB 01 Created from defs moved here from mvl_defs.h */
|
|
/************************************************************************/
|
|
#ifndef MVL_UCA_INCLUDED
|
|
#define MVL_UCA_INCLUDED
|
|
|
|
#include "mvl_defs.h" /* This uses many common MVL definitions. */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Max number of mandatory and optional variables in IEC/UCA report.
|
|
* IEC & UCA share RPT code, so max must accomodate both.
|
|
* Includes RptID, OptFlds, SqNum, RptTim, OutDat (DataSetNa),
|
|
* & InclusionBitstring (plus BufOvfl, SubSeqNum, MoreSegmentsFollow,
|
|
* EntryId, & ConfRev for IEC only).
|
|
*/
|
|
#define MVLU_MAX_RPT_OPTS 11
|
|
|
|
#define MVL61850_MAX_OBJREF_LEN 65
|
|
|
|
/* Defines for IEC 61850 control model. */
|
|
#define MVL61850_CTLMODEL_STATUS_ONLY 0
|
|
#define MVL61850_CTLMODEL_DIRECT_NORMAL 1
|
|
#define MVL61850_CTLMODEL_SBO_NORMAL 2
|
|
#define MVL61850_CTLMODEL_DIRECT_ENHANCED 3
|
|
#define MVL61850_CTLMODEL_SBO_ENHANCED 4
|
|
|
|
/************************************************************************/
|
|
/* Type for IEC 61850 "LastApplError" var (sent in report when control fails).*/
|
|
/************************************************************************/
|
|
typedef struct
|
|
{
|
|
ST_CHAR CntrlObj [66];
|
|
ST_INT8 Error;
|
|
struct
|
|
{
|
|
ST_INT8 orCat;
|
|
struct
|
|
{
|
|
ST_INT16 len;
|
|
ST_UINT8 data[64];
|
|
} orIdent; /* OVstring64 */
|
|
} Origin;
|
|
ST_UINT8 ctlNum;
|
|
ST_INT8 AddCause;
|
|
} MVL61850_LAST_APPL_ERROR;
|
|
|
|
/************************************************************************/
|
|
/* UCA SPECIFIC DATA ELEMENTS */
|
|
/************************************************************************/
|
|
|
|
typedef struct mvlu_rd_va_ctrl
|
|
{
|
|
MVL_IND_PEND *indCtrl;
|
|
MVLAS_RD_VA_CTRL *rdVaCtrl;
|
|
RUNTIME_TYPE *rt;
|
|
#if defined(MVL_UCA)
|
|
#if defined(MVL_XNAME)
|
|
ST_CHAR xName[MAX_IDENT_LEN+1];
|
|
#endif
|
|
ST_CHAR *primData;
|
|
ST_RTREF primRef;
|
|
ST_UINT prim_num; /* index to data */
|
|
ST_UINT prim_offset_base; /* mem offset from start of "base" var */
|
|
#endif /* defined(MVL_UCA) */
|
|
} MVLU_RD_VA_CTRL;
|
|
|
|
typedef struct mvlu_wr_va_ctrl
|
|
{
|
|
MVL_IND_PEND *indCtrl;
|
|
MVLAS_WR_VA_CTRL *wrVaCtrl;
|
|
RUNTIME_TYPE *rt;
|
|
#if defined(MVL_UCA)
|
|
#if defined(MVL_XNAME)
|
|
ST_CHAR xName[MAX_IDENT_LEN+1];
|
|
#endif
|
|
ST_CHAR *primData;
|
|
ST_RTREF primRef;
|
|
ST_UINT prim_num; /* index to data */
|
|
ST_UINT prim_offset_base; /* mem offset from start of "base" var */
|
|
#endif /* defined(MVL_UCA) */
|
|
} MVLU_WR_VA_CTRL;
|
|
|
|
ST_VOID mvlu_wr_prim_done (MVLU_WR_VA_CTRL *mvluWrVaCtrl, ST_RET rc);
|
|
ST_VOID mvlu_rd_prim_done (MVLU_RD_VA_CTRL *mvluRdVaCtrl, ST_RET rc);
|
|
ST_VOID mvlu_read_ind (MVL_IND_PEND *indCtrl);
|
|
|
|
/* These function pointers are invoked to initialize the va->data */
|
|
/* element for each VariableAssociation required to handle the MMS */
|
|
/* indication. */
|
|
|
|
extern ST_VOID(*mvluAsyncWrIndFun)(struct mvlu_wr_va_ctrl *mvluWrVaCtrl);
|
|
|
|
/* Alternate leaf handler function pointers */
|
|
extern ST_VOID (*u_mvlu_leaf_rd_ind_fun)(MVLU_RD_VA_CTRL *mvluRdVaCtrl);
|
|
extern ST_VOID (*u_mvlu_leaf_wr_ind_fun)(MVLU_WR_VA_CTRL *mvluWrVaCtrl);
|
|
|
|
/* Finding and setting leaf access parameters */
|
|
RUNTIME_TYPE *mvlu_find_rt_leaf (ST_INT type_id, ST_CHAR *leafName);
|
|
|
|
#define MVLU_SET_RD_FUN 0x01
|
|
#define MVLU_SET_WR_FUN 0x02
|
|
#define MVLU_SET_REF 0x04
|
|
#define MVLU_SET_ALL (MVLU_SET_RD_FUN | MVLU_SET_WR_FUN | MVLU_SET_REF)
|
|
|
|
ST_RET mvlu_set_leaf_param (ST_INT setFlags, ST_CHAR *leafName,
|
|
ST_RTINT rdIndFunIndex, ST_RTINT wrIndFunIndex,
|
|
ST_RTREF ref);
|
|
|
|
|
|
/************************************************************************/
|
|
/************************************************************************/
|
|
/* Leaf Access Function Tables. To be supplied by the user. */
|
|
|
|
/* Comment the following line out to compile out the Foundry supplied */
|
|
/* Leaf Access function pointer tables, so custom tables can be used */
|
|
/*#define MVLU_USR_FUN_TBLS */
|
|
|
|
/* Remove this MVLU_LEAF_FUN_LOOKUP_ENABLE define to save memory,
|
|
* but ONLY IF NOT mapping leaf functions at run-time (i.e. not calling
|
|
* mvlu_set_leaf_param_name or mvlu_find_rd(wr)_ind_fun_index).
|
|
* NOTE: this define is required if SCL configuration is used.
|
|
*/
|
|
#define MVLU_LEAF_FUN_LOOKUP_ENABLE
|
|
|
|
typedef struct
|
|
{
|
|
#if defined MVLU_LEAF_FUN_LOOKUP_ENABLE
|
|
ST_CHAR *fun_name;
|
|
#endif
|
|
ST_VOID (*fun_ptr) (MVLU_RD_VA_CTRL *rdCtrl);
|
|
} MVLU_RD_FUN_INFO;
|
|
extern MVLU_RD_FUN_INFO mvluRdFunInfoTbl[];
|
|
extern ST_INT mvluNumRdFunEntries;
|
|
|
|
typedef struct
|
|
{
|
|
#if defined MVLU_LEAF_FUN_LOOKUP_ENABLE
|
|
ST_CHAR *fun_name;
|
|
#endif
|
|
ST_VOID (*fun_ptr) (MVLU_WR_VA_CTRL *wrCtrl);
|
|
} MVLU_WR_FUN_INFO;
|
|
extern MVLU_WR_FUN_INFO mvluWrFunInfoTbl[];
|
|
extern ST_INT mvluNumWrFunEntries;
|
|
|
|
/* Useful for flexible initialization of leaf function tables */
|
|
#if defined MVLU_LEAF_FUN_LOOKUP_ENABLE
|
|
#define _MVLU_LEAF_FUN_INIT(_funName) #_funName, _funName
|
|
#else
|
|
#define _MVLU_LEAF_FUN_INIT(_funName) _funName
|
|
#endif
|
|
ST_RTINT mvlu_find_rd_ind_fun_index (ST_CHAR *funName);
|
|
ST_RTINT mvlu_find_wr_ind_fun_index (ST_CHAR *funName);
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
ST_RET mvlu_set_leaf_param_name (ST_INT setFlags, ST_CHAR *leafName,
|
|
ST_CHAR *rdIndFunName, ST_CHAR *wrIndFunName,
|
|
ST_CHAR *refString);
|
|
ST_RET mvlu_load_xml_leaf_file (ST_CHAR *fileName);
|
|
ST_RET u_mvlu_resolve_leaf_ref (ST_CHAR *leafName, ST_INT *setFlags,
|
|
ST_CHAR *refText, ST_RTREF *refOut);
|
|
|
|
/* Prefix to use in XML LAP file, or when calling "mvlu_set_leaf_param_name"
|
|
* if you want a quoted string to be saved as the Reference.
|
|
* Following this is the string to be saved.
|
|
* This is used for SBO select, in which case the saved string must be
|
|
* the name of the protected element. Foundry and the sample "reference
|
|
* resolve leaf" function look for this prefix.
|
|
*/
|
|
#define MVLU_STRING_REF_PREFIX "MVLU_STR:"
|
|
|
|
/* Internal */
|
|
ST_VOID _mvlu_null_read_ind (MVLU_RD_VA_CTRL *mvluRdVaCtrl);
|
|
ST_VOID _mvlu_null_write_ind (MVLU_WR_VA_CTRL *mvluWrVaCtrl);
|
|
|
|
|
|
|
|
typedef struct
|
|
{
|
|
ST_CHAR ucaName [MAX_IDENT_LEN+1];
|
|
RUNTIME_TYPE *rt;
|
|
ST_INT sortedNum;
|
|
ST_INT rtIndex;
|
|
} MVLU_UCA_NAME_CTRL;
|
|
|
|
ST_RET mvlu_proc_rt_type (ST_CHAR *typeName, RUNTIME_CTRL *rtCtrl,
|
|
MVLU_UCA_NAME_CTRL **ucaNamesOut);
|
|
|
|
/************************************************************************/
|
|
/************************************************************************/
|
|
/* UCA REPORT CONTROL */
|
|
/************************************************************************/
|
|
|
|
#define MVLU_RPT_NUM_VA_DATA_BUF 3
|
|
|
|
/* TrgOpsvalues, also used as Reason values */
|
|
#define MVLU_TRGOPS_DATA 0x40
|
|
#define MVLU_TRGOPS_QUALITY 0x20
|
|
#define MVLU_TRGOPS_FREEZE 0x10
|
|
#define MVLU_TRGOPS_INTEGRITY 0x08 /* Bit 4 */
|
|
#define MVLU_TRGOPS_GI 0x04 /* Bit 5 */
|
|
|
|
/* OptFlds bit masks */
|
|
#define MVLU_SQNUM_MASK 0x40
|
|
#define MVLU_RPTTIM_MASK 0x20
|
|
#define MVLU_REASONS_MASK 0x10
|
|
#define MVLU_OUTDAT_MASK 0x08
|
|
|
|
/* TrgOps bit numbers for IEC-61850. */
|
|
/* Use "bit" macros (BSTR_BIT_*) to access each individual bit. */
|
|
#define TRGOPS_BITNUM_RESERVED 0
|
|
#define TRGOPS_BITNUM_DATA_CHANGE 1 /* "dchg" in some specs */
|
|
#define TRGOPS_BITNUM_QUALITY_CHANGE 2 /* "qchg" in some specs */
|
|
#define TRGOPS_BITNUM_DATA_UPDATE 3 /* "dupd" in some specs */
|
|
#define TRGOPS_BITNUM_INTEGRITY 4 /* "period" in 61850-6 */
|
|
#define TRGOPS_BITNUM_GENERAL_INTERROGATION 5
|
|
|
|
/* OptFlds bit numbers for IEC-61850. */
|
|
/* Use "bit" macros (BSTR_BIT_*) to access each individual bit. */
|
|
/* NOTE: DATSETNAME in IEC-61850 same as OUTDAT in UCA. */
|
|
/* NOTE: bit numbers 1 thru 4 correspond to the masks MVLU_SQNUM_MASK, */
|
|
/* MVLU_RPTTIM_MASK, MVLU_REASONS_MASK, MVLU_OUTDAT_MASK above. */
|
|
/* Bit masks don't work well beyond 8 bits. */
|
|
#define OPTFLD_BITNUM_RESERVED 0
|
|
#define OPTFLD_BITNUM_SQNUM 1
|
|
#define OPTFLD_BITNUM_TIMESTAMP 2
|
|
#define OPTFLD_BITNUM_REASON 3
|
|
#define OPTFLD_BITNUM_DATSETNAME 4
|
|
#define OPTFLD_BITNUM_DATAREF 5
|
|
#define OPTFLD_BITNUM_BUFOVFL 6
|
|
#define OPTFLD_BITNUM_ENTRYID 7
|
|
#define OPTFLD_BITNUM_CONFREV 8
|
|
#define OPTFLD_BITNUM_SUBSEQNUM 9 /* segmentation in 61850-8-1*/
|
|
|
|
/* Flags to pass as "rcb_type" arg to mvlu_create_rpt_ctrl. */
|
|
/* Saved in "rcb_type" parameter of MVLU_RPT_CTRL. */
|
|
#define RCB_TYPE_UCA 0
|
|
#define RCB_TYPE_IEC_BRCB 1
|
|
#define RCB_TYPE_IEC_URCB 2
|
|
|
|
/* Flags to pass as "buftim_action" arg to mvlu_create_rpt_ctrl. */
|
|
/* Saved in "buftim_action" parameter of MVLU_RPT_CTRL. */
|
|
#define MVLU_RPT_BUFTIM_REPLACE 0
|
|
#define MVLU_RPT_BUFTIM_SEND_NOW 1
|
|
|
|
/* Basic Report Control Block data */
|
|
typedef struct
|
|
{
|
|
ST_BOOLEAN RptEna;
|
|
ST_BOOLEAN Resv; /* Used only for 61850 URCB. */
|
|
ST_CHAR RptID[66];
|
|
ST_CHAR DatSetNa[66];
|
|
struct /* BVstring */
|
|
{
|
|
ST_INT16 len_1;
|
|
ST_UCHAR data_1[2]; /* BVstring9 - need 2 bytes */
|
|
} OptFlds;
|
|
ST_UINT32 BufTim;
|
|
ST_UINT16 Trgs;
|
|
ST_UINT8 SqNum; /* Used for UCA & 61850 URCB */
|
|
ST_UINT16 SqNumInt16u; /* Used for 61850 BRCB */
|
|
struct /* BVstring */
|
|
{
|
|
ST_INT16 len;
|
|
ST_UCHAR data[1]; /* BVstring8 - need 1 byte */
|
|
} TrgOps;
|
|
ST_UINT32 RBEPd;
|
|
ST_UINT32 IntgPd;
|
|
ST_UINT32 ConfRev; /* Used only for 61850 BRCB/URCB. */
|
|
ST_INT EntryID; /* Used only for 61850 BRCB. */
|
|
MMS_BTIME6 TimeofEntry; /* Used only for 61850 BRCB. */
|
|
} MVLU_BASRCB;
|
|
|
|
/* UCA Report Client control */
|
|
typedef struct
|
|
{
|
|
DBL_LNK l; /* Internal use */
|
|
MVL_NET_INFO *netInfo;
|
|
struct mvlu_rpt_ctrl *rpt_ctrl; /* report control */
|
|
MVLU_BASRCB basrcb; /* report data */
|
|
|
|
/* Transmit timing control */
|
|
ST_DOUBLE next_integ_rpt_time;
|
|
ST_DOUBLE next_rbe_rpt_time;
|
|
ST_DOUBLE buf_time_done;
|
|
ST_BOOLEAN integ_scan_in_progress;
|
|
|
|
/* Data state control */
|
|
ST_UINT16 numTrgs;
|
|
ST_UINT8 *reasons_data; /* array of reasons */
|
|
ST_UINT8 *changed_flags; /* bitstring */
|
|
ST_UINT8 *segmented_inclusion;/* inclusion bitstring for segmented rpt*/
|
|
MVL_IND_PEND *scan_read_ind; /* Indication to pass to u_mvl_read_ind for scan*/
|
|
} MVLU_RPT_CLIENT;
|
|
|
|
/* BUFLIST_ENTRY - general purpose linked list of buffers */
|
|
typedef struct
|
|
{
|
|
DBL_LNK link;
|
|
ST_INT EntryID; /* General purpose entry id. */
|
|
ST_INT data_len;
|
|
ST_UCHAR data_buf [1];
|
|
} BUFLIST_ENTRY;
|
|
|
|
/* MVL61850_BRCB_CTRL */
|
|
typedef struct
|
|
{
|
|
/* Optional parameters to send in rpt (if appropriate OptFlds bit set).*/
|
|
ST_BOOLEAN BufOvfl;
|
|
/* Internal parameters */
|
|
BUFLIST_ENTRY *rpts_queued_list; /* List of reports buffered */
|
|
ST_INT rpts_queued_count; /* count of entries in rpts_queued_list */
|
|
BUFLIST_ENTRY *rpts_sent_list; /* List of reports sent */
|
|
ST_INT rpts_sent_count; /* count of entries in rpts_sent_list */
|
|
ST_UINT rpts_lost_count; /* # rpts lost because of overflow */
|
|
ST_INT brcb_bufsize;
|
|
ST_INT cur_bufsize;
|
|
/* "max_pdu_size" is negotiated on Initiate, but need to use it when
|
|
* generating rpts (maybe NOT connected). This is set ONLY first time
|
|
* BRCB enabled. If != 0, then BRCB has been enabled at least ONCE,
|
|
* and this will be the PDU size used.
|
|
*/
|
|
ST_INT max_pdu_size; /* max MMS PDU size for building rpts. */
|
|
ST_INT lastSentEntryID;
|
|
} MVL61850_BRCB_CTRL;
|
|
|
|
/* TypeIDs for special report types created by mvlu_rpt_init_types. */
|
|
typedef struct
|
|
{
|
|
ST_INT mmsbool; /* named so not confused with C++ 'bool' type */
|
|
ST_INT int8u; /* for SqNum */
|
|
ST_INT int16u;
|
|
ST_INT int32u;
|
|
ST_INT vstring65; /* for RptID & ObjectReference */
|
|
ST_INT btime6; /* for EntryTime */
|
|
ST_INT ostring8; /* for EntryID */
|
|
ST_INT vstring32; /* for RptId */
|
|
ST_INT bvstring6; /* for TrgOps (IEC) */
|
|
ST_INT bvstring8; /* for OptFlds,TrgOps (UCA) */
|
|
ST_INT bvstring10; /* for OptFlds (IEC) */
|
|
ST_INT bstr6; /* for Reason (IEC) */
|
|
ST_INT bstr8; /* for Reason (UCA) */
|
|
} MVLU_RPT_TYPEIDS;
|
|
|
|
/* For backward compatibility ... do not use */
|
|
#define MVLU_SEQNUM_MASK MVLU_SQNUM_MASK
|
|
|
|
#define MVLU_MAX_RPTID_LEN 65
|
|
#define MVLU_MAX_OUTDAT_LEN 65
|
|
|
|
|
|
/* MVLU_RPT_CTRL */
|
|
typedef struct mvlu_rpt_ctrl
|
|
{
|
|
DBL_LNK l; /* Internal use */
|
|
|
|
/* Active clients */
|
|
ST_INT num_rpt_clients;
|
|
MVLU_RPT_CLIENT *rpt_client_list;
|
|
|
|
/* basrcb data for passive read clients */
|
|
MVLU_BASRCB common_basrcb;
|
|
ST_CHAR *basrcb_name;
|
|
|
|
/* Used in read/write indication functions in finding the report ctrl */
|
|
RUNTIME_TYPE *rcbRtHead;
|
|
MVL_VAR_ASSOC *base_va;
|
|
|
|
/* Used to support different report schemes */
|
|
ST_INT rcb_type; /* RCB_TYPE_UCA, RCB_TYPE_IEC_BRCB, etc. */
|
|
|
|
/* Action to be taken if var changes twice before buftim expires */
|
|
ST_INT buftim_action; /* MVLU_RPT_BUFTIM_REPLACE/SEND_NOW */
|
|
|
|
/* The information below is used internally by MVLU */
|
|
MVL_NVLIST_CTRL *dsNvl; /* The base dataSet for the report */
|
|
MVL_NVLIST_CTRL rptNvl; /* The NVL used to send the InfoRpt */
|
|
RUNTIME_TYPE incRt; /* Used in building the inclusion_va */
|
|
ST_INT maxNumRptVars; /* Max vars allowed in report. */
|
|
MVLU_RPT_TYPEIDS rpt_typeids; /* Types needed for reports. */
|
|
ST_INT inclusion_typeid; /* One more special type. */
|
|
MVL61850_BRCB_CTRL brcbCtrl; /* Used only for 61850 BRCB. */
|
|
} MVLU_RPT_CTRL;
|
|
|
|
extern MVLU_RPT_CTRL *mvlu_rpt_ctrl_list;
|
|
|
|
/* NOTE: ref_count is used to allow sharing of one VA for multiple reports.*/
|
|
typedef struct
|
|
{
|
|
ST_INT16 ref_count;
|
|
ST_VOID *last_data; /* to save last data value */
|
|
} MVLU_RPT_VA_CTRL;
|
|
|
|
|
|
/* UCA VA Scan Control */
|
|
typedef struct
|
|
{
|
|
DBL_LNK l; /* Internal use */
|
|
ST_BOOLEAN enable;
|
|
ST_DOUBLE scan_period;
|
|
ST_DOUBLE next_scan_start;
|
|
ST_BOOLEAN saturated;
|
|
ST_INT num_va_changes;
|
|
|
|
ST_INT num_scan_va;
|
|
MVL_VAR_ASSOC **scan_va;
|
|
ST_INT num_va_read_pend;
|
|
|
|
MVL_IND_PEND indCtrl;
|
|
MVL_COMM_EVENT commEvent;
|
|
MVL_SCOPE *scan_va_scope; /* ptr to array of structs. */
|
|
ST_VOID *usr; /* user assignable pointer to use in scan callbacks*/
|
|
} MVLU_RPT_SCAN_CTRL;
|
|
extern MVLU_RPT_SCAN_CTRL *mvlu_rpt_scan_list;
|
|
|
|
|
|
/* Report Service */
|
|
ST_VOID mvlu_rpt_service (ST_VOID);
|
|
|
|
/* Report Variable Scanning */
|
|
MVLU_RPT_SCAN_CTRL *mvlu_rpt_create_scan_ctrl (ST_INT numScanVa);
|
|
MVLU_RPT_SCAN_CTRL *mvlu_rpt_create_scan_ctrl2 (
|
|
MVL_NVLIST_CTRL *nvl,
|
|
ST_RET (*scan_done_fun) (struct mvl_ind_pend *ind_pend),
|
|
ST_UINT report_scan_rate); /* report scan rate (millisec) */
|
|
ST_VOID mvlu_rpt_destroy_scan_ctrl (MVLU_RPT_SCAN_CTRL *scanCtrl);
|
|
ST_VOID mvlu_rpt_va_scan (ST_VOID);
|
|
ST_VOID mvlu_rpt_scan_read (MVLU_RPT_SCAN_CTRL *scanCtrl);
|
|
|
|
/* Asynchronous Change Reporting */
|
|
ST_VOID mvlu_rpt_va_change (MVL_VAR_ASSOC *va,
|
|
ST_UCHAR reason,
|
|
ST_VOID *new_data);
|
|
|
|
/* Creating Report Dataset NVL's */
|
|
MVL_NVLIST_CTRL *mvlu_derive_rpt_ds (ST_CHAR *domName, ST_CHAR *nvlName,
|
|
ST_INT numNodes, ST_CHAR **nodeNames);
|
|
|
|
/* Structure Element name derivation */
|
|
ST_RET mvlu_derive_ds_va_names (ST_CHAR *domName,
|
|
ST_INT numNodes, ST_CHAR **nodeNames,
|
|
ST_INT *numObjNamesOut,
|
|
OBJECT_NAME **objNameTblOut,
|
|
ST_CHAR **nameBufOut);
|
|
|
|
|
|
/* Report Control Create/Free */
|
|
/* NOTE: The "buftim_action" arg may be set to
|
|
* MVLU_RPT_BUFTIM_REPLACE or MVLU_RPT_BUFTIM_SEND_NOW.
|
|
* This arg is only used in the case when buffer
|
|
* time (BufTim) is used, and a second data change is detected for the
|
|
* same "va", before the BufTim expires. To satisfy the requirements of
|
|
* IEC61850-7-2, the caller must set this flag to indicate whether to
|
|
* replace the buffered value with the new value and continue timing
|
|
* (MVLU_RPT_BUFTIM_REPLACE), OR to send a report immediately with the
|
|
* buffered value, save the new value in the buffer, and restart the timer
|
|
* (MVLU_RPT_BUFTIM_SEND_NOW).
|
|
*/
|
|
MVLU_RPT_CTRL *mvlu_create_rpt_ctrl (ST_CHAR *basrcbName,
|
|
MVL_NVLIST_CTRL *dsNvl,
|
|
MVL_VAR_ASSOC *base_va,
|
|
ST_INT rcb_type,
|
|
ST_INT buftim_action, /* MVLU_RPT_BUFTIM_* */
|
|
ST_INT brcb_bufsize, /* for BRCB only */
|
|
ST_UINT32 ConfRev); /* for BRCB/URCB only */
|
|
ST_VOID mvlu_free_rpt_ctrl (MVLU_RPT_CTRL *rptCtrl);
|
|
|
|
/************************************************************************/
|
|
/* mvlu_integrity_scan_destroy */
|
|
/* Free temporary MVL_IND_PEND allocated by mvlu_integrity_scan_read. */
|
|
/************************************************************************/
|
|
ST_VOID mvlu_integrity_scan_destroy (MVL_IND_PEND *indCtrl);
|
|
|
|
/*
|
|
* mvlu_integrity_scan_read
|
|
* This function "BEGINS" the scan of ALL data for one Report DataSet (NVL).
|
|
* It is called automatically when an Integrity Report or a
|
|
* General Interrogation Report needs to be sent. This is much more
|
|
* efficient than constantly scanning.
|
|
* - It allocates & initializes a temporary MVL_IND_PEND structure.
|
|
* - It calls "u_mvl_read_ind" to begin the scan.
|
|
* - The scan may complete synchronously or asynchronously.
|
|
* - When the scan completes, the funct pointed to by "scan_done_fun" arg
|
|
* is called to build the report and cleanup.
|
|
* CRITICAL: Function pointed to by "scan_done_fun" must call
|
|
* "mvlu_integrity_scan_destroy" to free temporary MVL_IND_PEND struct.
|
|
*/
|
|
|
|
ST_VOID mvlu_integrity_scan_read (MVLU_RPT_CLIENT *rptClient,
|
|
ST_VOID (*scan_va_done_fun)(MVL_IND_PEND *indCtrl,
|
|
MVL_VAR_ASSOC *va),
|
|
ST_RET (*scan_done_fun)(MVL_IND_PEND *indCtrl)
|
|
);
|
|
|
|
MVL_IND_PEND *mvlu_setup_scan_read (MVL_NVLIST_CTRL *nvl,
|
|
ST_VOID (*scan_va_done_fun)(MVL_IND_PEND *indCtrl,
|
|
MVL_VAR_ASSOC *va),
|
|
ST_RET (*scan_done_fun)(MVL_IND_PEND *indCtrl)
|
|
);
|
|
|
|
/************************************************************************/
|
|
/* mvlu_integrity_timeout */
|
|
/* Check for Integrity period timeout. If timeout occurred, start */
|
|
/* integrity scan. */
|
|
/* RETURNS: SD_TRUE if IntgPd is set and timeout occurred */
|
|
/* SD_FALSE otherwise */
|
|
/************************************************************************/
|
|
ST_RET mvlu_integrity_timeout (MVLU_RPT_CLIENT *rptClient, ST_DOUBLE timeNow);
|
|
|
|
/* Pointer to one of these functions passed to "mvlu_integrity_scan_read",
|
|
* saved in "usr_done_fun" in MVL_IND_PEND struct. Called when scan completes.
|
|
*/
|
|
ST_RET mvlu_integrity_scan_done (MVL_IND_PEND *indCtrl);
|
|
ST_RET mvlu_gi_scan_done (MVL_IND_PEND *indCtrl);
|
|
|
|
/* Pointer to one of these functions passed to "mvlu_integrity_scan_read",
|
|
* stored in global var. Called when each va read completes.
|
|
*/
|
|
ST_VOID mvlu_integrity_scan_va_done (MVL_IND_PEND *indCtrl, MVL_VAR_ASSOC *va);
|
|
ST_VOID mvlu_gi_scan_va_done (MVL_IND_PEND *indCtrl, MVL_VAR_ASSOC *va);
|
|
|
|
extern ST_VOID (*_mvlu_rpt_disconnect_rcvd_fun)(MVL_NET_INFO *netInfo);
|
|
|
|
MVL_NVLIST_CTRL *mvlu_resolve_uca_nvl (MVL_NVLIST_CTRL *ucaNvl,
|
|
OBJECT_NAME *scopeSel);
|
|
|
|
/* Defines for UCA/IEC report type, "rpt_type" arg to "mvlu_send_report"*/
|
|
#define MVLU_RPT_TYPE_INTEGRITY_OR_GI 0
|
|
#define MVLU_RPT_TYPE_RBE 1
|
|
|
|
ST_RET mvlu_send_report (MVLU_RPT_CLIENT *rptClient, ST_INT rpt_type);
|
|
|
|
/* u_mvlu_rpt_time_get - User callback function to set accurate time
|
|
* that UCA/IEC report is built, called by "mvlu_send_report" or
|
|
* "mvl61850_rcb_build" when report is being built.
|
|
*/
|
|
ST_VOID u_mvlu_rpt_time_get (MMS_BTIME6 *TimeOfEntry);
|
|
|
|
/* Misc. Helper Functions */
|
|
ST_INT mvlu_rpt_get_va_index (MVLU_RPT_CTRL *rptCtrl, MVL_VAR_ASSOC *va);
|
|
MVLU_BASRCB *_mvlu_get_rd_rcb (MVLU_RD_VA_CTRL *mvluRdVaCtrl,
|
|
MVLU_RPT_CLIENT **rptClientOut);
|
|
MVLU_BASRCB *_mvlu_get_wr_rcb (MVLU_WR_VA_CTRL *mvluWrVaCtrl,
|
|
MVLU_RPT_CLIENT **rptClientOut);
|
|
|
|
/* MVLU Internal Use */
|
|
#define MMSOP_MVLU_RPT_VA 200
|
|
#define MMSOP_MVLU_GOOSE_UPDATE 201
|
|
|
|
|
|
ST_RET mvlu_find_uca_var (RUNTIME_TYPE **rtIo, ST_INT *numRtIo,
|
|
ST_CHAR *varName);
|
|
|
|
ST_RET mvlu_find_struct_comp (ST_CHAR *compName,
|
|
RUNTIME_TYPE **rtIo, ST_INT *numRtIo);
|
|
|
|
/************************************************************************/
|
|
/************************************************************************/
|
|
/* SBO HANDLING ELEMENTS */
|
|
|
|
#define SBO_SELECT_TIMEOUT 30 /* seconds */
|
|
#define MAX_NUM_SBO_PEND 10 /* Number of SBOs to be pending */
|
|
#define MAX_SBO_NAME_SIZE 66
|
|
|
|
typedef struct mvl_sbo_ctrl
|
|
{
|
|
ST_BOOLEAN in_use; /* control element management */
|
|
ST_CHAR sbo_var[MAX_SBO_NAME_SIZE+1];
|
|
MVL_NET_INFO *net_info; /* Connection ID */
|
|
time_t expire_time; /* SELECT expiration time */
|
|
} MVL_SBO_CTRL;
|
|
|
|
|
|
ST_VOID u_mvl_sbo_operate (MVL_SBO_CTRL *sboSelect,
|
|
MVLU_WR_VA_CTRL *mvluWrVaCtrl);
|
|
|
|
ST_VOID mvlu_clr_pend_sbo (MVL_NET_INFO *net_info);
|
|
|
|
MVL_SBO_CTRL *mvlu_sbo_chk_state (ST_CHAR *sboName,
|
|
MVL_NET_INFO *net_info);
|
|
ST_VOID mvlu_sbo_chk_timers (ST_VOID);
|
|
ST_VOID mvlu_sbo_ctrl_free (MVL_SBO_CTRL *sboCtrl);
|
|
MVL_SBO_CTRL *initSboCtrl (MVL_NET_INFO *net_info, ST_CHAR *sbo_name, ST_UINT32 sboTimeout);
|
|
|
|
/************************************************************************/
|
|
/************************************************************************/
|
|
/* IEC-61850 functions */
|
|
/************************************************************************/
|
|
|
|
/*
|
|
* mvl61850_brcb_client_service
|
|
*
|
|
* Check the BRCB state and, if necessary,
|
|
* encode, queue, AND/OR send IEC "Buffered" reports.
|
|
*/
|
|
ST_VOID mvl61850_brcb_client_service (MVLU_RPT_CTRL *rptCtrl,
|
|
MVLU_RPT_CLIENT *rptClient,
|
|
ST_DOUBLE timeNow);
|
|
|
|
/**
|
|
* mvl61850_urcb_client_service
|
|
*
|
|
* Check the URCB state and, if necessary,
|
|
* encode AND send IEC "Unbuffered" reports.
|
|
*/
|
|
ST_VOID mvl61850_urcb_client_service (MVLU_RPT_CTRL *rptCtrl,
|
|
MVLU_RPT_CLIENT *rptClient,
|
|
ST_DOUBLE timeNow);
|
|
|
|
/*
|
|
* mvl61850_rcb_build
|
|
*
|
|
* Set up all info needed to build an Information Report
|
|
* for a BRCB or a URCB, then:
|
|
* For BRCB, call "mvl61850_brcb_rpt_enc" to encode/queue it.
|
|
* For URCB, call "mvl_info_variables" to encode/send it.
|
|
*/
|
|
ST_RET mvl61850_rcb_build (MVLU_RPT_CTRL *rptCtrl,
|
|
MVLU_RPT_CLIENT *rptClient,
|
|
ST_INT rpt_type);
|
|
|
|
/*
|
|
* mvl61850_brcb_rpt_enc
|
|
*
|
|
* Encodes an Information Report for an IEC BRCB, then saves it on a linked list.
|
|
* NOTE: Similar to "mvl_info_variables" but does NOT send.
|
|
*/
|
|
ST_RET mvl61850_brcb_rpt_enc (MVLU_RPT_CLIENT *rptClient);
|
|
|
|
/*
|
|
* mvl61850_brcb_rpt_send
|
|
*
|
|
* Sends Information Report for BRCB.
|
|
*/
|
|
ST_RET mvl61850_brcb_rpt_send (MVL_NET_INFO *net_info,
|
|
MVL61850_BRCB_CTRL *brcb_ctrl,
|
|
BUFLIST_ENTRY *entry);
|
|
|
|
ST_VOID mvl61850_brcb_rpt_lists_clean (MVL61850_BRCB_CTRL *brcbCtrl);
|
|
|
|
ST_INT mvl_enc_va_data (MVL_VAR_ASSOC *va, /* IN: variable to encode*/
|
|
ST_UCHAR *enc_buf, /* IN: encode buffer */
|
|
ST_INT enc_buf_len, /* IN: enc buffer len */
|
|
ST_UCHAR **enc_ptr); /* OUT: encoded data ptr*/
|
|
|
|
/*
|
|
* buflist_entry_create
|
|
*
|
|
* Allocates and initializes BUFLIST_ENTRY structure.
|
|
* Allocates (sizeof (BUFLIST_ENTRY) + buf_len) so there is room for the buffer.
|
|
* Then data is copied from "buf_ptr" to "data_buf" in the BUFLIST_ENTRY struct,
|
|
* so "data_buf" effectively extends beyond the end of the structure.
|
|
*/
|
|
BUFLIST_ENTRY *buflist_entry_create (ST_INT EntryID, ST_UCHAR *buf_ptr,
|
|
ST_INT buf_len);
|
|
ST_VOID buflist_entry_destroy (BUFLIST_ENTRY *entry);
|
|
|
|
/************************************************************************/
|
|
/* IEC 61850 "Control Model" functions. */
|
|
/************************************************************************/
|
|
ST_VOID mvl61850_sbo_create_sboname (MVL_VAR_ASSOC *va, MVL_SCOPE *va_scope,
|
|
ST_CHAR *sboName);
|
|
|
|
MVL_SBO_CTRL *mvl61850_ctl_chk_sbo (MVLU_RD_VA_CTRL *mvluRdVaCtrl);
|
|
MVL_SBO_CTRL *mvl61850_ctl_chk_sbow (MVLU_WR_VA_CTRL *mvluWrVaCtrl);
|
|
|
|
ST_RET mvl61850_ctl_chk_state (MVLU_WR_VA_CTRL *mvluWrVaCtrl);
|
|
|
|
ST_RET mvl61850_ctl_lastapplerror_create (ST_VOID);
|
|
ST_RET mvl61850_ctl_command_termination (MVL_NET_INFO *net_info, ST_CHAR *oper_ref,
|
|
ST_RET status, MVL61850_LAST_APPL_ERROR *last_appl_error);
|
|
|
|
/* These callback functions must be supplied by user. */
|
|
ST_VOID u_mvl61850_ctl_oper_begin (ST_CHAR *oper_ref);
|
|
ST_VOID u_mvl61850_ctl_oper_end (MVL_NET_INFO *net_info, ST_CHAR *oper_ref, MVL_VAR_ASSOC *base_var);
|
|
|
|
ST_RET mvl61850_mkname_ctlmodel (ST_CHAR *var_name, ST_CHAR *flatname, size_t flatname_len);
|
|
|
|
/************************************************************************/
|
|
/* Miscellaneous helper functions */
|
|
/************************************************************************/
|
|
ST_VOID mvlu_trim_branch_name (ST_CHAR *branch_name);
|
|
ST_RET mvlu_find_comp_type (ST_INT base_type_id, ST_CHAR *flat_name,
|
|
RUNTIME_TYPE **sub_rt_type, /* out */
|
|
ST_INT *sub_rt_num); /* out */
|
|
|
|
ST_RET mvlu_get_leaf_val_int8 (MVL_VAR_ASSOC *base_va, ST_CHAR *flatname, ST_INT8 *data);
|
|
ST_RET mvlu_get_leaf_val_int32 (MVL_VAR_ASSOC *base_va, ST_CHAR *flatname, ST_INT32 *data);
|
|
ST_RET mvlu_get_leaf_val_uint32 (MVL_VAR_ASSOC *base_va, ST_CHAR *flatname, ST_UINT32 *data);
|
|
ST_RET mvlu_get_leaf_val_boolean (MVL_VAR_ASSOC *base_va, ST_CHAR *flatname, ST_BOOLEAN *data);
|
|
|
|
/************************************************************************/
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* MVL_UCA_INCLUDED */
|
|
|