Files
microser/mmslib/ositcps/osicfgx.c
2026-06-15 15:48:16 +08:00

1823 lines
59 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 2000 - 2005, All Rights Reserved */
/* */
/* MODULE NAME : osicfgx.c */
/* PRODUCT(S) : */
/* */
/* MODULE DESCRIPTION : This routine parses the osicfg.xml */
/* configuration file for the Lean-T Stack */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 02/18/08 JRB 40 Parse Network_Device. */
/* 02/07/08 JRB 39 Chg strtok to thread-safe get_next_string. */
/* Ignore obsolete Max_Num_Connections & */
/* Rfc1006_Max_Num_Conns. */
/* 01/12/07 JRB 38 If RemoteAddress NetAddr Type is illegal, */
/* ignore addr, log error, but continue parsing.*/
/* 07/08/05 EJV 37 MMSEASE_MOSI: allow only TCP tp_type. */
/* _netAddr_EFun: re-arranged NSAP with IPADDR */
/* 05/23/05 JRB 36 Del CFLOW logging (sx_dec logs similar info).*/
/* 05/18/05 DWL 35 Move "SX_PUSH (networkAddr..)" inside "if". */
/* 05/05/05 EJV 34 Added Rfc1006_Listen_Port, remote Port */
/* 04/06/05 JRB 33 MMSEASE_MOSI: set def tp_type to TP_TYPE_TCP */
/* 09/20/04 JRB 32 Always allow session_cfg.disconnect_timeout */
/* to be configured (not just for TP4). */
/* 08/13/04 JRB 31 Use thread-safe sx_parseExx_mt. */
/* Del unneeded system includes. */
/* 04/31/04 MDE 30 Now use sx_parseExx */
/* 02/02/04 JRB 29 Set err flag if IPADDR entered & !TP0_ENABLED*/
/* OR NSAP entered & !TP4_ENABLED. Clarify logs.*/
/* 01/14/04 EJV 28 Added rfc1006MaxSpduOutstanding. */
/* 12/09/03 JRB 27 Init all 5 members of SX_ELEMENT structs. */
/* 10/24/03 JRB 26 Lint. */
/* 09/09/03 EJV 25 Use the XML element names in ERR, FLOW logs. */
/* 12/16/02 ASK 24 Wrap ifdef TP0_ENABLED around inet_ntoa calls*/
/* 07/18/02 JRB 23 Move ifdefs to skip more unneeded code. */
/* 06/27/02 JRB 22 Add tp0_sock.h. */
/* 06/20/02 JRB 21 Chg to use new netAddr union in PRES_ADDR. */
/* 05/03/02 MDE 20 Now set max_bind_ctrl */
/* 02/27/02 GLB 19 Changed ascii_t_.. to asciiTo.. */
/* 02/25/02 MDE 18 More changes to MVL_CFG_INFO */
/* 02/20/02 MDE 17 Changes for new MVL_CFG_INFO */
/* 02/11/02 JRB 16 Don't reparse w/ logging. Let user do it. */
/* 02/08/02 JRB 15 Add MVL_CFG.. arg & pass along to sx_parseEx.*/
/* 02/05/02 GLB 14 Made optional: Rfc1006_Max_Num_Conns, */
/* LocalAddressList, RemoteAddressList */
/* 01/22/02 JRB 13 Move mvl_set_num_connections call so it does */
/* not depend on order of params in XML file. */
/* 01/10/02 GLB 12 Update optional/mandatory flags */
/* Add sx_pop to allow check for mandatory */
/* elements */
/* Make Session optional */
/* 11/28/01 MDE 11 Use new mvl_acse functions */
/* 11/28/01 MDE 10 Allocate mmsl_enc_buf */
/* 11/06/01 GLB 09 Added MMS section */
/* 05/25/01 GLB 08 Removed getFileSize */
/* 05/11/01 JRB 07 Use new sx_parseEx. Del osiCfgParse & */
/* LOG_DEC_CTRL (not used for anything useful). */
/* Save "called" flag to use on 2nd pass so same*/
/* data parsed on 2nd pass. Chg MVL_LOG to */
/* SXLOG, mvl log mask not initialized yet. */
/* Use correct defines for SSEL TSEL len. */
/* 03/15/01 JRB 06 Added Session group w/ Disconnect_Timeout. */
/* 01/25/01 JRB 05 Use stricmp. */
/* Chg sx_deb.. again: do NOT set SX_LOG_DEBUG. */
/* 01/15/01 EJV 04 Chnaged sx_debug_sel in cfg parsing. */
/* 01/09/01 GLB 03 Changed logBufParse to osiCfgParse */
/* 01/03/01 EJV 02 Don't use O_TEXT in open() on non _WIN32 sys.*/
/* Changed _getFileSize to use stat(). */
/* Changed sx_debug_sel to 'or' flags. */
/* Deleted duplicate code in _netAddr_EFun. */
/* 08/31/00 GLB 01 Module created from existing lean_cfg.c */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "mem_chk.h"
#include "mvl_acse.h"
#include "sx_defs.h"
#include "sx_log.h"
#include "cfg_util.h"
#include "str_util.h"
#include "cfglog.h"
#include "slog.h"
#include "acse2log.h"
#include "lean_a.h"
#include "tp0_sock.h" /* portable "sockets" interface */
#if !defined(MMSEASE_MOSI)
#include "mmsldefs.h" /* for MMS section */
#include "mvl_defs.h" /* for MMS section */
#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
/************************************************************************/
#define REMOTE_DIB_TABLE 0
#define LOCAL_DIB_TABLE 1
#define CFG_MAX_AR_NAME 64
#define CFG_MAX_AP_TITLE 80
#define CFG_MAX_AE_QUAL 32
typedef struct _tagTransDevInfo
{
DBL_LNK l;
ST_CHAR name[CFG_MAX_AR_NAME +1];
ST_CHAR apTitle[CFG_MAX_AP_TITLE +1];
ST_CHAR aeQual[CFG_MAX_AE_QUAL +1];
PRES_ADDR pres_addr;
} TRANS_DEV_INFO;
static ST_BOOLEAN init_dirser_called;
static ST_BOOLEAN rem_section_flag;
/************************************************************************/
static ST_VOID _logStart_SEFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _mms_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxMmsPduLength_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxCallingConnections_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxCalledConnections_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _network_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _networkDevice_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _clnp_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _lifetime_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _lifetimeDecrement_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _cfgTimer_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _eshDelay_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _localNsap_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _transport_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _session_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _tp4_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxTpduLength_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxRemoteCdt_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _localCdt_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxNumConnections_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxSpduOutstanding_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _windowTime_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _inactivityTime_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _retransmissionTime_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _maxTransmissions_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _akDelay_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _tcp_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _rfc1006MaxTpduLen_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _rfc1006MaxNumConns_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _rfc1006MaxSpduOutstanding_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _rfc1006ListenPort_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _disconnectTimeout_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _networkAddressing_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _localAddresses_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _remoteAddresses_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _localArName_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _arname_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _apTitle_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _aeQualifier_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _psel_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _ssel_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _tsel_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _transportType_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _remoteArName_SFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _netAddr_EFun (SX_DEC_CTRL *sxDecCtrl);
static ST_VOID _port_EFun (SX_DEC_CTRL *sxDecCtrl);
static TRANS_DEV_INFO *localTransList;
static TRANS_DEV_INFO *remoteTransList;
static TRANS_DEV_INFO *currTransEl;
static ST_RET save_loc_rem_dib_tables (void);
static ST_VOID save_dib_table (TRANS_DEV_INFO *, DIB_ENTRY *);
static ST_RET parseObjId (MMS_OBJ_ID *o, ST_CHAR *buff);
static ST_VOID printDibEntry (ST_VOID);
static ST_VOID printDibStruct (DIB_ENTRY *de,ST_INT table_type);
/************************************************************************/
/************************************************************************/
/************************************************************************/
SX_ELEMENT cfgStartElements[] =
{
{"STACK_CFG", SX_ELF_CSTART | SX_ELF_CEND, _logStart_SEFun, NULL, 0}
};
SX_ELEMENT cfgElements[] =
{
{"MMS", SX_ELF_CSTART|SX_ELF_OPT, _mms_SFun, NULL, 0},
{"Network", SX_ELF_CSTART|SX_ELF_OPT, _network_SFun, NULL, 0},
{"Transport", SX_ELF_CSTART, _transport_SFun, NULL, 0},
{"Session", SX_ELF_CSTART|SX_ELF_OPT, _session_SFun, NULL, 0},
{"NetworkAddressing", SX_ELF_CSTARTEND, _networkAddressing_SFun, NULL, 0}
};
SX_ELEMENT mmsElements[] =
{
{"Max_Mms_Pdu_Length", SX_ELF_CEND, _maxMmsPduLength_EFun, NULL, 0},
{"Max_Calling_Connections", SX_ELF_CEND, _maxCallingConnections_EFun, NULL, 0},
{"Max_Called_Connections", SX_ELF_CEND, _maxCalledConnections_EFun, NULL, 0},
};
SX_ELEMENT networkElements[] =
{
{"Network_Device", SX_ELF_CEND|SX_ELF_OPT, _networkDevice_EFun, NULL, 0},
{"Clnp", SX_ELF_CSTART|SX_ELF_OPT, _clnp_SFun, NULL, 0}
};
SX_ELEMENT clnpElements[] =
{
{"Lifetime", SX_ELF_CEND|SX_ELF_OPT, _lifetime_EFun, NULL, 0},
{"Lifetime_Decrement", SX_ELF_CEND|SX_ELF_OPT, _lifetimeDecrement_EFun, NULL, 0},
{"Cfg_Timer", SX_ELF_CEND|SX_ELF_OPT, _cfgTimer_EFun, NULL, 0},
{"Esh_Delay", SX_ELF_CEND|SX_ELF_OPT, _eshDelay_EFun, NULL, 0},
{"Local_NSAP", SX_ELF_CEND|SX_ELF_OPT, _localNsap_EFun, NULL, 0}
};
SX_ELEMENT transportElements[] =
{
{"Tp4", SX_ELF_CSTART|SX_ELF_OPT, _tp4_SFun, NULL, 0},
{"Tcp", SX_ELF_CSTART|SX_ELF_OPT, _tcp_SFun, NULL, 0}
};
SX_ELEMENT Tp4Elements[] =
{
{"Max_Tpdu_Length", SX_ELF_CEND|SX_ELF_OPT, _maxTpduLength_EFun, NULL, 0},
{"Max_Remote_Cdt", SX_ELF_CEND|SX_ELF_OPT, _maxRemoteCdt_EFun, NULL, 0},
{"Local_Cdt", SX_ELF_CEND|SX_ELF_OPT, _localCdt_EFun, NULL, 0},
{"Max_Num_Connections", SX_ELF_CEND|SX_ELF_OPT, _maxNumConnections_EFun, NULL, 0},
{"Max_Spdu_Outstanding", SX_ELF_CEND|SX_ELF_OPT, _maxSpduOutstanding_EFun, NULL, 0},
{"Window_Time", SX_ELF_CEND|SX_ELF_OPT, _windowTime_EFun, NULL, 0},
{"Inactivity_Time", SX_ELF_CEND|SX_ELF_OPT, _inactivityTime_EFun, NULL, 0},
{"Retransmission_Time", SX_ELF_CEND|SX_ELF_OPT, _retransmissionTime_EFun, NULL, 0},
{"Max_Transmissions", SX_ELF_CEND|SX_ELF_OPT, _maxTransmissions_EFun, NULL, 0},
{"Ak_Delay", SX_ELF_CEND|SX_ELF_OPT, _akDelay_EFun, NULL, 0}
};
SX_ELEMENT TcpElements[] =
{
{"Rfc1006_Max_Tpdu_Len", SX_ELF_CEND|SX_ELF_OPT, _rfc1006MaxTpduLen_EFun, NULL, 0},
{"Rfc1006_Max_Num_Conns", SX_ELF_CEND|SX_ELF_OPT, _rfc1006MaxNumConns_EFun, NULL, 0},
{"Rfc1006_Max_Spdu_Outstanding", SX_ELF_CEND|SX_ELF_OPT, _rfc1006MaxSpduOutstanding_EFun, NULL, 0},
{"Rfc1006_Listen_Port", SX_ELF_CEND|SX_ELF_OPT, _rfc1006ListenPort_EFun, NULL, 0}
};
SX_ELEMENT sessionElements[] =
{
{"Disconnect_Timeout", SX_ELF_CEND|SX_ELF_OPT, _disconnectTimeout_EFun, NULL, 0}
};
SX_ELEMENT networkAddressingElements[] =
{
{"LocalAddressList", SX_ELF_CSTART|SX_ELF_OPT, _localAddresses_SFun, NULL, 0},
{"RemoteAddressList", SX_ELF_CSTART|SX_ELF_OPT, _remoteAddresses_SFun, NULL, 0}
};
SX_ELEMENT LocalAddressesElements[] =
{
{"LocalAddress", SX_ELF_CSTART|SX_ELF_RPT, _localArName_SFun, NULL, 0}
};
SX_ELEMENT LocalArNameElements[] =
{
{"AR_Name", SX_ELF_CEND, _arname_EFun, NULL, 0},
{"AP_Title", SX_ELF_CEND|SX_ELF_OPT, _apTitle_EFun, NULL, 0},
{"AE_Qualifier", SX_ELF_CEND|SX_ELF_OPT, _aeQualifier_EFun, NULL, 0},
{"Psel", SX_ELF_CEND, _psel_EFun, NULL, 0},
{"Ssel", SX_ELF_CEND, _ssel_EFun, NULL, 0},
{"Tsel", SX_ELF_CEND, _tsel_EFun, NULL, 0},
{"TransportType", SX_ELF_CEND, _transportType_EFun, NULL, 0}
};
SX_ELEMENT RemoteAddressesElements[] =
{
{"RemoteAddress", SX_ELF_CSTART | SX_ELF_RPT, _remoteArName_SFun, NULL, 0}
};
SX_ELEMENT RemoteArNameElements[] =
{
{"AR_Name", SX_ELF_CEND, _arname_EFun, NULL, 0},
{"AP_Title", SX_ELF_CEND|SX_ELF_OPT, _apTitle_EFun, NULL, 0},
{"AE_Qualifier", SX_ELF_CEND|SX_ELF_OPT, _aeQualifier_EFun, NULL, 0},
{"Psel", SX_ELF_CEND, _psel_EFun, NULL, 0},
{"Ssel", SX_ELF_CEND, _ssel_EFun, NULL, 0},
{"Tsel", SX_ELF_CEND, _tsel_EFun, NULL, 0},
{"NetAddr", SX_ELF_CEND, _netAddr_EFun, NULL, 0},
{"Port", SX_ELF_CEND|SX_ELF_OPT, _port_EFun, NULL, 0}
};
/************************************************************************/
/* osicfgx */
/************************************************************************/
ST_RET osicfgx (ST_CHAR *logFileName, MVL_CFG_INFO *mvlCfg)
{
ST_RET rc;
rc = sx_parseExx_mt (logFileName,
sizeof (cfgStartElements)/sizeof(SX_ELEMENT), cfgStartElements,
mvlCfg, NULL, NULL);
/* Here we save the bind information */
if (loc_dib_table != NULL)
{
#ifdef MAP30_ACSE /* Select bind mode */
mvlCfg->use_bind_ctrl = SD_TRUE;
mvlCfg->max_bind_ctrl = 1;
mvlCfg->num_bind_ctrl = 1;
mvlCfg->bind_ctrl = chk_calloc (1, sizeof (NET_BIND_CTRL));
mvlCfg->bind_ctrl[0].ar_name = loc_dib_table->name;
mvlCfg->bind_ctrl[0].tp_type = loc_dib_table->pres_addr.tp_type;
#else
strcpy (mvlCfg->local_ar_name, loc_dib_table->name);
#endif
}
if (rc == SD_SUCCESS)
init_dirser_called = SD_TRUE;
return (rc);
}
/************************************************************************/
/************************************************************************/
/* _logStart_SEFun */
/************************************************************************/
static ST_VOID _logStart_SEFun (SX_DEC_CTRL *sxDecCtrl)
{
if (sxDecCtrl->reason == SX_ELEMENT_START)
{
SX_PUSH (cfgElements);
}
else
{
while (sxDecCtrl->itemStackLevel > 0)
sx_pop (sxDecCtrl);
}
}
/************************************************************************/
/* _mms_SFun */
/************************************************************************/
static ST_VOID _mms_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (mmsElements);
}
/************************************************************************/
/* _maxMmsPduLength_EFun */
/************************************************************************/
static ST_VOID _maxMmsPduLength_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
MVL_CFG_INFO *mvlCfg = (MVL_CFG_INFO *) sxDecCtrl->usr;
ST_INT sInt;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
sInt = 0;
if (strlen(str) == 0)
{
SXLOG_ERR0 ("ERROR: Max_Mms_Pdu_Length required but not present ");
sxDecCtrl->errCode = SX_USER_ERROR;
}
else if ((asciiToSint(str,&sInt) != SD_SUCCESS) || (strchr(str,'-')) )
{
SXLOG_ERR1 ("ERROR: Max_Mms_Pdu_Length Data Conversion Error on value: %s", str);
sxDecCtrl->errCode = SX_USER_ERROR;
}
else
mvlCfg->max_msg_size = sInt;
}
}
/************************************************************************/
/* _maxCallingConnections_EFun */
/************************************************************************/
static ST_VOID _maxCallingConnections_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_INT sInt;
MVL_CFG_INFO *mvlCfg = (MVL_CFG_INFO *) sxDecCtrl->usr;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
sInt = 0;
if (strlen(str) == 0)
{
SXLOG_ERR0 ("ERROR: Max_Calling_Connections required but not present ");
sxDecCtrl->errCode = SX_USER_ERROR;
}
else if ((asciiToSint(str,&sInt) != SD_SUCCESS) || (strchr(str,'-')) )
{
SXLOG_ERR1 ("ERROR: Max_Calling_Connections Data Conversion Error on value: %s", str);
sxDecCtrl->errCode = SX_USER_ERROR;
}
else
{
mvlCfg->num_calling = sInt;
}
}
}
/************************************************************************/
/* _maxCalledConnections_EFun */
/************************************************************************/
static ST_VOID _maxCalledConnections_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_INT sInt;
MVL_CFG_INFO *mvlCfg = (MVL_CFG_INFO *) sxDecCtrl->usr;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
sInt = 0;
if (strlen(str) == 0)
{
SXLOG_ERR0 ("ERROR: Max_Called_Connections required but not present ");
sxDecCtrl->errCode = SX_USER_ERROR;
}
else if ((asciiToSint(str,&sInt) != SD_SUCCESS) || (strchr(str,'-')) )
{
SXLOG_ERR1 ("ERROR: Max_Called_Connections Data Conversion Error on value: %s", str);
sxDecCtrl->errCode = SX_USER_ERROR;
}
else
{
mvlCfg->num_called = sInt;
}
}
}
/************************************************************************/
/************************************************************************/
/* _network_SFun */
/************************************************************************/
static ST_VOID _network_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (networkElements);
}
/************************************************************************/
/* _networkDevice_EFun */
/************************************************************************/
static ST_VOID _networkDevice_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
clnp_param.network_device = chk_malloc (strLen + 1);
strcpy (clnp_param.network_device, str);
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/************************************************************************/
/* _clnp_SFun */
/************************************************************************/
static ST_VOID _clnp_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (clnpElements);
}
/************************************************************************/
/* _lifetime_EFun */
/************************************************************************/
static ST_VOID _lifetime_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Lifetime Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
clnp_param.pdu_lifetime = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _lifetimeDecrement_EFun */
/************************************************************************/
static ST_VOID _lifetimeDecrement_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Lifetime_Decrement Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
clnp_param.pdu_lifetime_dec = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _cfgTimer_EFun */
/************************************************************************/
static ST_VOID _cfgTimer_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Cfg_Timer Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
clnp_param.esh_cfg_timer = uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _eshDelay_EFun */
/************************************************************************/
static ST_VOID _eshDelay_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Esh_Delay Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
clnp_param.esh_delay = uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _localNsap_EFun */
/************************************************************************/
static ST_VOID _localNsap_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT hexStrLen = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (ascii_to_hex_str (&clnp_param.loc_nsap[1],&hexStrLen,CLNP_MAX_LEN_NSAP,str)
== SD_SUCCESS)
{
if (hexStrLen > 0)
clnp_param.loc_nsap[0] = (ST_UCHAR) hexStrLen;
}
else
{
/*cfg_set_config_err();*/
SXLOG_ERR0 ("ERROR: Clnp Local_NSAP Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/************************************************************************/
/* _transport_SFun */
/************************************************************************/
static ST_VOID _transport_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (transportElements);
}
/************************************************************************/
/************************************************************************/
/* _tp4_SFun */
/************************************************************************/
static ST_VOID _tp4_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (Tp4Elements);
}
/************************************************************************/
/* _maxTpduLength_EFun */
/************************************************************************/
static ST_VOID _maxTpduLength_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Max_Tpdu_Length Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.max_tpdu_len = uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _maxRemoteCdt_EFun */
/************************************************************************/
static ST_VOID _maxRemoteCdt_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Max_Remote_Cdt Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.max_rem_cdt = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _localCdt_EFun */
/************************************************************************/
static ST_VOID _localCdt_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Local_Cdt Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.loc_cdt = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _maxNumConnections_EFun */
/************************************************************************/
static ST_VOID _maxNumConnections_EFun (SX_DEC_CTRL *sxDecCtrl)
{
SXLOG_ERR0 ("Max_Num_Connections element is OBSOLETE. Ignored.");
return;
}
/************************************************************************/
/* _maxSpduOutstanding_EFun */
/************************************************************************/
static ST_VOID _maxSpduOutstanding_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Max_Spdu_Outstanding Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.max_spdu_outst = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _windowTime_EFun */
/************************************************************************/
static ST_VOID _windowTime_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Window_Time Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.window_time = uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _inactivityTime_EFun */
/************************************************************************/
static ST_VOID _inactivityTime_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Inactivity_Time Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.inact_time = uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _retransmissionTime_EFun */
/************************************************************************/
static ST_VOID _retransmissionTime_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Retransmission_Time Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.retrans_time = uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _maxTransmissions_EFun */
/************************************************************************/
static ST_VOID _maxTransmissions_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Max_Transmissions Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.max_trans = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/* _akDelay_EFun */
/************************************************************************/
static ST_VOID _akDelay_EFun (SX_DEC_CTRL *sxDecCtrl)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Ak_Delay Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp_cfg.ak_delay = (ST_UCHAR) uShortInt;
}
}
#endif /* TP4_ENABLED */
}
/************************************************************************/
/************************************************************************/
/* _tcp_SFun */
/************************************************************************/
static ST_VOID _tcp_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (TcpElements);
}
/************************************************************************/
/* _rfc1006MaxTpduLen_EFun */
/************************************************************************/
static ST_VOID _rfc1006MaxTpduLen_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
#if defined (TP0_ENABLED) /* Just ignore if disabled. */
if (!init_dirser_called)
{
ST_UINT16 uShortInt = 0;
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Rfc1006_Max_Tpdu_Len Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp0_cfg.max_tpdu_len = uShortInt;
}
}
#endif /* TP0_ENABLED */
}
/************************************************************************/
/* _rfc1006MaxNumConns_EFun */
/************************************************************************/
static ST_VOID _rfc1006MaxNumConns_EFun (SX_DEC_CTRL *sxDecCtrl)
{
SXLOG_ERR0 ("Rfc1006_Max_Num_Conns element is OBSOLETE. Ignored.");
return;
}
/************************************************************************/
/* _rfc1006MaxSpduOutstanding_EFun */
/************************************************************************/
static ST_VOID _rfc1006MaxSpduOutstanding_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
#if defined (TP0_ENABLED) /* Just ignore if disabled. */
if (!init_dirser_called)
{
ST_UINT uInt = 0;
if (asciiToUint(str,&uInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Rfc1006_Max_Spdu_Outstanding Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp0_cfg.max_spdu_outst = uInt;
}
}
#endif /* TP0_ENABLED */
}
/************************************************************************/
/* _rfc1006ListenPort_EFun */
/************************************************************************/
static ST_VOID _rfc1006ListenPort_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
#if defined (TP0_ENABLED) /* Just ignore if disabled. */
if (!init_dirser_called)
{
ST_UINT16 uShortInt = 0;
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Rfc1006_Listen_Port Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
tp0_cfg.rfc1006_listen_port = uShortInt;
}
}
#endif /* TP0_ENABLED */
}
/************************************************************************/
/************************************************************************/
/* _session_SFun */
/************************************************************************/
static ST_VOID _session_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (sessionElements);
}
/************************************************************************/
/* _disconnectTimeout_EFun */
/************************************************************************/
static ST_VOID _disconnectTimeout_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT16 uShortInt = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!init_dirser_called)
{
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Session Disconnect_Timeout Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
session_cfg.disconnect_timeout = uShortInt;
}
}
}
/************************************************************************/
/************************************************************************/
/* _networkAddressing_SFun */
/************************************************************************/
static ST_VOID _networkAddressing_SFun (SX_DEC_CTRL *sxDecCtrl)
{
if (sxDecCtrl->reason == SX_ELEMENT_START)
{
/* CRITICAL: Always start with empty temporary DIB Table linked lists */
/* (may be reconfiguring). */
localTransList = NULL;
remoteTransList = NULL;
SX_PUSH (networkAddressingElements);
}
if (sxDecCtrl->reason == SX_ELEMENT_END)
{
/* save link list data from configuartion file parse in tables */
save_loc_rem_dib_tables ();
printDibEntry ();
rem_section_flag = SD_FALSE;
init_dirser_called = SD_TRUE;
}
}
/************************************************************************/
/* _localAddresses_SFun */
/************************************************************************/
static ST_VOID _localAddresses_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (LocalAddressesElements);
}
/************************************************************************/
/************************************************************************/
/* _localArName_SFun */
/************************************************************************/
static ST_VOID _localArName_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (LocalArNameElements);
if (!init_dirser_called)
{ /* Don't alloc if reconfiguring. */
currTransEl = (TRANS_DEV_INFO *) chk_calloc (1, sizeof(TRANS_DEV_INFO));
#if defined(MMSEASE_MOSI)
currTransEl->pres_addr.tp_type = TP_TYPE_TCP; /* Default=TCP */
/* preset IP addr to be local system (used in loop back connection) */
if ((currTransEl->pres_addr.netAddr.ip = tp0_convert_ip ("127.0.0.1"))
== htonl(INADDR_NONE))
{
SXLOG_ERR1 ("NetAddr Type=IPADDR '%s' invalid", "127.0.0.1");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
#else
currTransEl->pres_addr.tp_type = TP_TYPE_TP4; /* Default=TP4 */
#endif
list_add_last (&localTransList, currTransEl);
}
}
/************************************************************************/
/* _arname_EFun */
/************************************************************************/
static ST_VOID _arname_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if ((!init_dirser_called) ||
(init_dirser_called && rem_section_flag == SD_TRUE))
{
if (!str)
{
SXLOG_ERR0 ("ERROR: AR_Name Error");
}
else if (strlen (str) > CFG_MAX_AR_NAME)
{
SXLOG_ERR0 ("ERROR: AR_Name Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
strcpy (currTransEl->name, str);
}
}
/************************************************************************/
/* _apTitle_EFun */
/************************************************************************/
static ST_VOID _apTitle_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if ((!init_dirser_called) ||
(init_dirser_called && rem_section_flag == SD_TRUE))
{
if (!str)
{
SXLOG_ERR0 ("ERROR: AP_Title Error");
}
else if (strlen (str) > CFG_MAX_AR_NAME)
{
SXLOG_ERR0 ("ERROR: AP_Title Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
strcpy (currTransEl->apTitle, str);
}
}
/************************************************************************/
/* _aeQualifier_EFun */
/************************************************************************/
static ST_VOID _aeQualifier_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if ((!init_dirser_called) ||
(init_dirser_called && rem_section_flag == SD_TRUE))
{
if (!str)
{
SXLOG_ERR0 ("ERROR: AE_Qualifier Error");
}
else if (strlen (str) > CFG_MAX_AR_NAME)
{
SXLOG_ERR0 ("ERROR: AE_Qualifier Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
strcpy (currTransEl->aeQual, str);
}
}
/************************************************************************/
/* _psel_EFun */
/************************************************************************/
static ST_VOID _psel_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT hexStrLen = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if ((!init_dirser_called) ||
(init_dirser_called && rem_section_flag == SD_TRUE))
{
if (ascii_to_hex_str (currTransEl->pres_addr.psel,&hexStrLen,MAX_PSEL_LEN,str)
== SD_SUCCESS)
{
currTransEl->pres_addr.psel_len = hexStrLen;
}
else
{
/*cfg_set_config_err();*/
SXLOG_ERR0 ("ERROR: Psel Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
}
/************************************************************************/
/* _ssel_EFun */
/************************************************************************/
static ST_VOID _ssel_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT hexStrLen = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if ((!init_dirser_called) ||
(init_dirser_called && rem_section_flag == SD_TRUE))
{
if (ascii_to_hex_str (currTransEl->pres_addr.ssel,&hexStrLen,MAX_SSEL_LEN,str)
== SD_SUCCESS)
{
currTransEl->pres_addr.ssel_len = hexStrLen;
}
else
{
SXLOG_ERR0 ("ERROR: Ssel Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
}
/************************************************************************/
/* _tsel_EFun */
/************************************************************************/
static ST_VOID _tsel_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
ST_UINT hexStrLen = 0;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if ((!init_dirser_called) ||
(init_dirser_called && rem_section_flag == SD_TRUE))
{
if (ascii_to_hex_str (currTransEl->pres_addr.tsel,&hexStrLen,MAX_TSEL_LEN,str)
== SD_SUCCESS)
{
currTransEl->pres_addr.tsel_len = hexStrLen;
}
else
{
SXLOG_ERR0 ("ERROR: Tsel Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
}
/************************************************************************/
/* _transportType_EFun */
/************************************************************************/
static ST_VOID _transportType_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (!str)
{
SXLOG_ERR0 ("ERROR: TransportType Data Conversion Error");
}
else
{
if (stricmp (str, "TCP") == 0)
currTransEl->pres_addr.tp_type = TP_TYPE_TCP;
#if !defined(MMSEASE_MOSI)
else if (stricmp (str, "TP4") == 0)
currTransEl->pres_addr.tp_type = TP_TYPE_TP4;
else if (stricmp (str, "TPX") == 0)
{
currTransEl->pres_addr.tp_type = TP_TYPE_TPX;
}
#endif /* !defined(MMSEASE_MOSI) */
else
{
SXLOG_ERR0 ("ERROR: Invalid TransportType Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
}
/************************************************************************/
/************************************************************************/
/* _remoteAddresses_SFun */
/************************************************************************/
static ST_VOID _remoteAddresses_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (RemoteAddressesElements);
}
/************************************************************************/
/* _remoteArName_SFun */
/************************************************************************/
static ST_VOID _remoteArName_SFun (SX_DEC_CTRL *sxDecCtrl)
{
SX_PUSH (RemoteArNameElements);
currTransEl = (TRANS_DEV_INFO *) chk_calloc (1, sizeof(TRANS_DEV_INFO));
#if defined(MMSEASE_MOSI)
currTransEl->pres_addr.tp_type = TP_TYPE_TCP; /* Default=TCP */
#else
currTransEl->pres_addr.tp_type = TP_TYPE_TP4; /* Default=TP4 */
#endif
list_add_last (&remoteTransList, currTransEl);
rem_section_flag = SD_TRUE;
}
/************************************************************************/
/* _netAddr_EFun */
/************************************************************************/
static ST_VOID _netAddr_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
if (stricmp(sxDecCtrl->sxDecElInfo.attr[0].value, "IPADDR")==0)
{
#if defined (TP0_ENABLED) /* Just ignore if disabled. */
if (!str)
{
SXLOG_ERR0 ("NetAddr Type=IPADDR Data Conversion Error: null string");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
currTransEl->pres_addr.tp_type = TP_TYPE_TCP;
if ((currTransEl->pres_addr.netAddr.ip = tp0_convert_ip (str))
== htonl(INADDR_NONE))
{
SXLOG_ERR1 ("NetAddr Type=IPADDR '%s' invalid", str);
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
#else
SXLOG_ERR1 ("NetAddr Type=IPADDR not allowed in RemoteAddress='%s' (TCP not supported). This entry ignored.", currTransEl->name);
list_unlink (&remoteTransList, currTransEl); /* discard this address*/
#endif
}
#if !defined(MMSEASE_MOSI)
else if (stricmp(sxDecCtrl->sxDecElInfo.attr[0].value, "NSAP")==0)
{
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
ST_UINT hexStrLen=0;
/* NSAP valid only for remote DIB */
/* NOTE: array size is MAX_IP_ADDR_LEN. Must be >= CLNP_MAX_LEN_NSAP.*/
if (ascii_to_hex_str (currTransEl->pres_addr.netAddr.nsap,&hexStrLen,CLNP_MAX_LEN_NSAP,str)
== SD_SUCCESS)
{
currTransEl->pres_addr.nsap_len = hexStrLen;
currTransEl->pres_addr.tp_type = TP_TYPE_TP4;
}
else
{
/*cfg_set_config_err();*/
SXLOG_ERR0 ("NetAddr Type=NSAP Data Conversion Error");
}
#else
SXLOG_ERR1 ("NetAddr Type=NSAP not allowed in RemoteAddress='%s' (OSI not supported). This entry ignored.", currTransEl->name);
list_unlink (&remoteTransList, currTransEl); /* discard this address*/
#endif
}
#endif /* !defined(MMSEASE_MOSI) */
else
{
SXLOG_ERR1 ("NetAddr Type='%s' invalid", sxDecCtrl->sxDecElInfo.attr[0].value);
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
}
/************************************************************************/
/* _port_EFun */
/************************************************************************/
static ST_VOID _port_EFun (SX_DEC_CTRL *sxDecCtrl)
{
ST_BOOLEAN rc;
ST_CHAR *str;
ST_INT strLen;
rc = sx_get_string_ptr (sxDecCtrl, &str, &strLen);
if (rc != SD_SUCCESS)
return;
#if defined (TP0_ENABLED) /* Just ignore if disabled. */
if (!init_dirser_called)
{
ST_UINT16 uShortInt = 0;
if (asciiToUint16(str,&uShortInt) != SD_SUCCESS)
{
SXLOG_ERR0 ("ERROR: Port Data Conversion Error");
sxDecCtrl->errCode = SX_ERR_CONVERT;
}
else
{
currTransEl->pres_addr.port = uShortInt;
}
}
#endif /* TP0_ENABLED */
}
/************************************************************************/
/* save_loc_rem_dib_tables */
/*----------------------------------------------------------------------*/
/* This function will initialize local and remote dib entries tables. */
/* */
/* Parameters: */
/* void none */
/* */
/* Return: */
/* SD_SUCCESS (0) if initialization successful. */
/* SD_FAILURE (1) otherwise */
/* NOTES: Does not allow reconfiguration of loc_dib_table. */
/* Allows reconfiguration of rem_dib_table, but only after */
/* freeing the old table. */
/************************************************************************/
static ST_RET save_loc_rem_dib_tables (void)
{
ST_RET ret;
ST_INT j;
ret = SD_SUCCESS;
if (!init_dirser_called) /* Don't allow reconfiguring. */
{
num_loc_dib_entries = list_get_sizeof (localTransList);
if (num_loc_dib_entries)
{
loc_dib_table = (DIB_ENTRY *) chk_calloc (num_loc_dib_entries, sizeof (DIB_ENTRY));
save_dib_table (localTransList, loc_dib_table);
}
}
/* If Remote DIB table already configured, FREE OLD BEFORE ALLOCATING NEW!*/
if (init_dirser_called)
{
for (j = 0; j < num_rem_dib_entries; j++)
chk_free (rem_dib_table [j].name);
chk_free (rem_dib_table);
}
num_rem_dib_entries = list_get_sizeof (remoteTransList);
if (num_rem_dib_entries)
{
rem_dib_table = (DIB_ENTRY *) chk_calloc (num_rem_dib_entries, sizeof (DIB_ENTRY));
save_dib_table (remoteTransList, rem_dib_table);
}
return (ret);
}
/************************************************************************/
/* save_dib_table */
/*----------------------------------------------------------------------*/
/* This function copies the temporary DIB Table to the permanent */
/* DIB Table. It may be used for the Local as well as the Remote DIB */
/* Tables. */
/* */
/* Parameters: */
/* TRANS_DEV_INFO * temporary table (linked list of structs) */
/* DIB_ENTRY * permanent table (array of structs) */
/* */
/************************************************************************/
static ST_VOID save_dib_table (TRANS_DEV_INFO *TransList, DIB_ENTRY *de)
{
TRANS_DEV_INFO *toFree;
TRANS_DEV_INFO *d;
d = TransList; /* Point to first in linked list */
while (d)
{
de->name = (ST_CHAR *) chk_malloc (strlen(d->name) + 1);
strcpy (de->name, d->name);
if (strlen (d->apTitle))
{
if (parseObjId (&de->AP_title, d->apTitle))
{
ACSELOG_ERR1 ("Invalid AP Title '%s'. Ignored.", d->apTitle);
}
else
de->AP_title_pres = SD_TRUE; /* defaults to FALSE */
}
if (strlen (d->aeQual))
{
de->AE_qual_pres = SD_TRUE; /* defaults to FALSE */
de->AE_qual = atol (d->aeQual);
}
de->AP_inv_id_pres = SD_FALSE;
de->AE_inv_id_pres = SD_FALSE;
memcpy (&de->pres_addr, &d->pres_addr, sizeof (PRES_ADDR));
toFree = d;
d = (TRANS_DEV_INFO *) list_get_next (TransList, d); /* Point to next TRANS_DEV_INFO */
chk_free (toFree);
++de; /* Point to next DIB_ENTRY */
} /* End "while" */
TransList = NULL; /* CRITICAL: clean up in case reconfigure later.*/
}
/************************************************************************/
/* parseObjId */
/*----------------------------------------------------------------------*/
/* Parses components of the 'ApTitle'. */
/************************************************************************/
static ST_RET parseObjId (MMS_OBJ_ID *objId, ST_CHAR *buff)
{
char *numStr;
ST_CHAR *seps = " \t"; /* delimiters to search for */
/* Found keyword 'ApTitle', read the components */
objId->num_comps = 0;
numStr = get_next_string (&buff, seps); /* "buff" ptr changes */
while (numStr && strlen (numStr) > 0)
{
if (objId->num_comps >= MAX_OBJID_COMPONENTS)
{
return (SD_FAILURE);
}
objId->comps[objId->num_comps] = (ST_INT16) atoi (numStr);
numStr = get_next_string (&buff, seps); /* "buff" ptr changes */
++objId->num_comps;
}
if (objId->num_comps == 0) /* couldn't parse anything */
return (SD_FAILURE);
return (SD_SUCCESS);
}
/************************************************************************/
/* printDibEntry */
/************************************************************************/
static ST_VOID printDibEntry (ST_VOID)
{
DIB_ENTRY *de;
ST_INT i;
ST_INT table_type;
SXLOG_DEBUG0 (" LOCAL DIB TABLE");
for (i = 0; i < num_loc_dib_entries; i++)
{
table_type = LOCAL_DIB_TABLE;
de = &loc_dib_table[i];
printDibStruct(de,table_type);
}
SXLOG_DEBUG0 (" REMOTE DIB TABLE");
for (i = 0; i < num_rem_dib_entries; i++)
{
table_type = REMOTE_DIB_TABLE;
de = &rem_dib_table[i];
printDibStruct(de,table_type);
}
}
/************************************************************************/
/* printDibStruct */
/************************************************************************/
static ST_VOID printDibStruct (DIB_ENTRY *de,ST_INT table_type)
{
ST_INT i;
ST_UINT k;
SXLOG_CDEBUG0 (" ");
SXLOG_CDEBUG1 (" Common_Name = %s",de->name);
SXLOG_CDEBUG1 (" local = %s ",de->local ? "SD_TRUE":"SD_FALSE");
SXLOG_CDEBUG1 (" AP_title_pres = %s", de->AP_title_pres ? "SD_TRUE":"SD_FALSE");
for (i = 0; i < de->AP_title.num_comps; ++i)
SXLOG_CDEBUG2 (" AP_title.comps[%d] = %d",i,de->AP_title.comps[i]);
SXLOG_CDEBUG2 (" AE_qual_pres = %s AE_qual = %ld",
de->AE_qual_pres ? "SD_TRUE":"SD_FALSE",de->AE_qual);
SXLOG_CDEBUG2 (" AP_inv_id_pres = %s AP_invoke_id = %ld",
de->AP_inv_id_pres ? "SD_TRUE":"SD_FALSE",de->AP_invoke_id);
SXLOG_CDEBUG2 (" AE_inv_id_pres = %s AE_invoke_id = %ld",
de->AE_inv_id_pres ? "SD_TRUE":"SD_FALSE",de->AE_invoke_id);
SXLOG_CDEBUG1 (" psel_len = %d psel =",de->pres_addr.psel_len);
for (k = 0; k < de->pres_addr.psel_len; k++)
SXLOG_CDEBUG1 (" %02x",de->pres_addr.psel[k]);
SXLOG_CDEBUG1 (" ssel_len = %d ssel =",de->pres_addr.ssel_len);
for (k = 0; k < de->pres_addr.ssel_len; k++)
SXLOG_CDEBUG1 (" %02x",de->pres_addr.ssel[k]);
SXLOG_CDEBUG1 (" tsel_len = %d tsel =",de->pres_addr.tsel_len);
for (k = 0; k < de->pres_addr.tsel_len; k++)
SXLOG_CDEBUG1 (" %02x",de->pres_addr.tsel[k]);
if (de->pres_addr.tp_type == TP_TYPE_TCP)
{
SXLOG_CDEBUG1 (" tp_type = %s ","TCP");
}
else if (de->pres_addr.tp_type == TP_TYPE_TP4)
{
SXLOG_CDEBUG1 (" tp_type = %s ","TP4");
}
else if (de->pres_addr.tp_type == TP_TYPE_TPX)
{
SXLOG_CDEBUG1 (" tp_type = %s ","TPX");
}
if (table_type == REMOTE_DIB_TABLE)
{
if (de->pres_addr.tp_type == TP_TYPE_TP4)
{
SXLOG_CDEBUG1 (" nsap_len = %d nsap =",de->pres_addr.nsap_len);
for (k = 0; k < de->pres_addr.nsap_len; k++)
SXLOG_CDEBUG1 (" %02x",de->pres_addr.netAddr.nsap[k]);
}
#if defined(TP0_ENABLED)
if (de->pres_addr.tp_type == TP_TYPE_TCP)
{
struct in_addr sin_addr; /* inet_ntoa needs this addr format*/
sin_addr.s_addr = de->pres_addr.netAddr.ip;
SXLOG_CDEBUG1 (" ip_addr (s) = %s",inet_ntoa (sin_addr));
SXLOG_CDEBUG1 (" port = %s",de->pres_addr.port);
}
#endif
}
}
/*#endif*/ /* if defined 0 */