177 lines
6.2 KiB
C
177 lines
6.2 KiB
C
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1994 - 2002, All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : mvl_send.c */
|
|
/* PRODUCT(S) : MMSEASE-LITE */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* NONE */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 09/14/06 MDE 17 Log PDU when too large */
|
|
/* 05/01/03 MDE 16 Added buffer depletion logging _mvl_send_req */
|
|
/* 10/29/02 JRB 15 _mvl_send_req: on err, set done & result in */
|
|
/* req_pend. Helps if user doesn't chk return. */
|
|
/* 07/10/02 JRB 14 _mvl_send_req: call mvl_req_bufs_avail. */
|
|
/* 07/09/02 MDE 13 Add maxpend_ind support */
|
|
/* 01/30/02 JRB 12 Del use of stack_sel. */
|
|
/* 09/21/01 JRB 11 Alloc global bufs only once at startup. */
|
|
/* 05/15/00 MDE 10 Added MMS statistics */
|
|
/* 03/08/00 JRB 09 _mvl_send_req: chk conn_active, */
|
|
/* chk & set numpend_req, set invoke_id. */
|
|
/* 01/21/00 MDE 08 Now use MEM_SMEM for dynamic memory */
|
|
/* 10/28/99 RKR 07 Modified _mvl_send_resp_i */
|
|
/* 09/13/99 MDE 06 Added SD_CONST modifiers */
|
|
/* 12/09/98 JRB 05 Don't exceed negotiated PDU size. */
|
|
/* Change all NERR log macros to ERR. */
|
|
/* Free enc buf before _mvl_send_err_f. */
|
|
/* 11/16/98 MDE 04 Renamed internal functions (prefix '_') */
|
|
/* 11/16/98 MDE 03 Don't free request control if send error */
|
|
/* 05/14/98 JRB 02 Add _mvl_send_resp_i function. */
|
|
/* 09/10/97 MDE 01 MMS-LITE V4.0 Release */
|
|
/************************************************************************/
|
|
|
|
#include "glbtypes.h"
|
|
#include "sysincs.h"
|
|
#include "mmsdefs.h"
|
|
#include "mms_pvar.h"
|
|
#include "mms_vvar.h"
|
|
#include "mvl_defs.h"
|
|
#include "mvl_log.h"
|
|
|
|
|
|
/************************************************************************/
|
|
/* For debug version, use a static pointer to avoid duplication of */
|
|
/* __FILE__ strings. */
|
|
/************************************************************************/
|
|
|
|
#ifdef DEBUG_SISCO
|
|
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
|
|
#endif
|
|
|
|
/************************************************************************/
|
|
/* _mvl_send_resp_i */
|
|
/* This function sends a response and frees the MVL_IND_PEND. */
|
|
/************************************************************************/
|
|
|
|
ST_VOID _mvl_send_resp_i (MVL_IND_PEND *indCtrl, ST_RET build_rc)
|
|
{
|
|
MVL_NET_INFO *net_info;
|
|
|
|
net_info = indCtrl->event->net_info;
|
|
_mvl_send_resp (indCtrl->event, build_rc);
|
|
list_unlink(&(net_info->pend_ind),indCtrl);
|
|
--net_info->numpend_ind;
|
|
M_FREE (MSMEM_IND_CTRL, indCtrl);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* _mvl_send_resp */
|
|
/************************************************************************/
|
|
|
|
ST_VOID _mvl_send_resp (MVL_COMM_EVENT *event, ST_RET build_rc)
|
|
{
|
|
ST_RET rc;
|
|
|
|
if (build_rc != SD_SUCCESS)
|
|
{ /* Free encode buf before "_mvl_send_err_f" because it allocs new buf.*/
|
|
MVL_LOG_ERR1 ("Response build error: rc = 0x%X", build_rc);
|
|
_mvl_send_err_f (event,7,2);
|
|
++mvl_mms_statistics.serverRespErr;
|
|
}
|
|
else if (mmsl_msg_len > event->net_info->max_pdu_size)
|
|
{ /* Free encode buf before "_mvl_send_err_f" because it allocs new buf.*/
|
|
MVL_LOG_ERR2 ("Response build error: exceeds negotiated PDU size %d %d",mmsl_msg_len, event->net_info->max_pdu_size);
|
|
printf("Response build error: exceeds negotiated PDU size %d %d\n",mmsl_msg_len, event->net_info->max_pdu_size);
|
|
_mvl_send_err_f (event,4,3); /* Don't exceed negotiated PDU size. */
|
|
++mvl_mms_statistics.serverRespErr;
|
|
}
|
|
else
|
|
{
|
|
rc = _mvl_send_msg (mmsl_msg_start,mmsl_msg_len,event->net_info);
|
|
if (rc != SD_SUCCESS)
|
|
{
|
|
MVL_LOG_ERR1 ("_mvl_send_msg error, rc = %x", rc);
|
|
}
|
|
else
|
|
++mvl_mms_statistics.serverRespOk;
|
|
|
|
_mvl_free_comm_event (event); /* done with this event */
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* _mvl_send_req */
|
|
/************************************************************************/
|
|
|
|
ST_RET _mvl_send_req (MVL_NET_INFO *net_info,
|
|
MVL_REQ_PEND *req_pend, ST_RET build_rc)
|
|
{
|
|
ST_RET rc;
|
|
ST_INT bufsAvail;
|
|
|
|
if (build_rc != SD_SUCCESS)
|
|
{
|
|
MVL_LOG_ERR1 ("Request build error, rc = %x", build_rc);
|
|
rc = build_rc;
|
|
}
|
|
else if (net_info->conn_active == SD_FALSE)
|
|
{ /* Check conn_active before using net_info */
|
|
MVL_LOG_ERR0 ("Request send error: disconnected");
|
|
rc = MVL_ERR_CNF_DISCONNECTED;
|
|
}
|
|
else if (mmsl_msg_len > net_info->max_pdu_size)
|
|
{
|
|
MVL_LOG_ERR0 ("Request build error: exceeds negotiated PDU size");
|
|
printf("Request build error: exceeds negotiated PDU size");
|
|
rc = ASN1E_PDU_TOO_BIG;
|
|
}
|
|
#ifdef WIN32
|
|
else if (net_info->numpend_req >=(net_info->maxpend_req*4))
|
|
#else
|
|
else if (net_info->numpend_req >= net_info->maxpend_req)
|
|
#endif
|
|
{
|
|
MVL_LOG_ERR1 ("Too many requests outstanding (0x%08lx)", net_info);
|
|
rc = MVL_ERR_REQ_PEND_COUNT;
|
|
}
|
|
else if ((bufsAvail = mvl_req_bufs_avail (net_info)) <= 0)
|
|
{
|
|
MVL_LOG_ERR2 ("Not enough ACSE bufs to send confirmed request (%d, 0x%08lx)", bufsAvail, net_info);
|
|
rc = MVL_ERR_REQ_PEND_COUNT;
|
|
}
|
|
else
|
|
{
|
|
rc = _mvl_send_msg (mmsl_msg_start,mmsl_msg_len,net_info);
|
|
if (rc != SD_SUCCESS)
|
|
{
|
|
MVL_LOG_ERR1 ("_mvl_send_msg error, rc = %x", rc);
|
|
}
|
|
else
|
|
++mvl_mms_statistics.clientReq;
|
|
}
|
|
if (rc == SD_SUCCESS)
|
|
{
|
|
/* mmsl_invoke_id already incremented on encode, so subtract one. */
|
|
req_pend->invoke_id = mmsl_invoke_id - 1;
|
|
net_info->numpend_req++;
|
|
}
|
|
else
|
|
{
|
|
req_pend->done = SD_TRUE;
|
|
req_pend->result = rc;
|
|
}
|
|
return (rc);
|
|
}
|
|
|