Previous PageTable Of ContentsIndexNext Page



Description

Sends a message to the ISDN protocol stack, with optional attached data.

Prototype

DWORD isdnSendMessage (CTAHD ctahd,
ISDN_MESSAGE
*message,
void
*pdata,
unsigned
size )

ctahd CTA context handle associated with a D channel, returned by ctaCreateContext or adiOpenPort.

message Pointer to the ISDN_MESSAGE structure, as follows:

typedef struct ISDN_MESSAGE
{
    nai_t nai;         /* Network access interface index              */
    ent_id_t from_ent; /* Message source                              */
    ent_id_t to_ent;   /* Message destination                         */
    sapi_t to_sapi;    /* Destination Service Access Point            */
    union {
    add_t conn_id; /* Connection identifier for the ACU layer         */
    add_t crv;     /* Call Reference value for NS layer               */
    add_t ces;     /* Connection Endpoint suffix (DL layer upper half)*/
    add_t tei;   /* Terminal Endpoint identifier (DL layer lower half)*/
    add_t chani;   /* Physical layer channel identifier               */
    } add;
    code_t code;   /* Primitive code unique only between two entities */
    WORD inf0;     /* Information location 0, not used                */
    WORD inf1;     /* Information location 1, not used                */
    WORD inf2;     /* Information location 2, not used                */
    WORD inf3;     /* Information location 3, not used                */
    WORD inf4;     /* Information location 4, not used                */
    WORD data_size; /* Size of data to follow                         */
    BYTE data_offset;  /* Use for LAPD data hole                      */
    BYTE pad[1];       /* 32 bit alignment                            */
    DWORD userid;
} ISDN_MESSAGE;

pdata Pointer to the message data (if any). The data is specific to the type of message specified in ISDN_MESSAGE.

size Size of data block referenced by pdata. size must match the data_size field in the ISDN_MESSAGE structure.

Return Values

SUCCESS

CTAERR_BAD_ARGUMENT
This return value means any of the following:

· The message argument is NULL.

· The pdata is NULL but size is non zero.

· The data_size in the message does not match the size parameter.

· The size of the data exceeds MAX_ISDN_BUFFER_SIZE.

CTAERR_INVALID_CTAHD
The CTA context handle is invalid.

Events

ISDNEVN_SEND_MESSAGE
The event
value field contains one of the following:

      SUCCESS

      ISDNERR_BAD_NAI
      The network access identifier (NAI) in the message structure is not valid. The NAI must be less than
      MAX_NAI.

      ISDNERR_BUFFER_TOO_BIG
      The size of the buffer is too large.

Details

This function sends a message with optional attached data to the ISDN subsystem. Any ISDN-specific command can be sent to any layer of the protocol stack using this function. The ISDN_MESSAGE structure contains the addressing information for the message.

The size field of the CTA event contains the user id for the message, as specified in the userid field in ISDN_MESSAGE. This value is sent to distinguish between multiple messages sent to the protocol stack. ISDN_ USERID_ASYNC is reserved for events initiated by the protocol stack.

See Also

isdnReleaseBuffer

Example

sample_send_message (CTAHD ctahd, int mycode)
{
CTA_EVENT event;
DWORD ret;
ISDN_MESSAGE imsg={0};
code_t code;
unsigned char idata[MAX_ISDN_BUFFER_SIZE];
unsigned datasize;
;
{
;
/*
** Protocol already started...
*/
imsg.nai = 0;

/*
** when using ACU, all messages should be directed
** to ENT_ACU and the ACU_SAPI within it.
** The from field should always be ENT_API.
*/
imsg.from_ent = ENT_API;
imsg.to_ent = ENT_CC;
imsg.to_sapi = ACU_SAPI;

/*
** The connection id is the logical connection number.
** For ACU, the lowest unused connection id value must be used.
*/
imsg.add.conn_id = myGetLowestConnectionId();

/*
** Build the contents of the message for place call, release call, etc.
** This should fill the idata with the message contents and return the
** used part of the data buffer in datasize argument and the code for the
** function requested (ACU_CONN_RQ, ACU_CLEAR_RQ, etc).
*/
myBuildMessage( mycode, idata, &datasize, &code);
imsg.datasize = datasize;
imsg.code = code;

/*
** Add an ISDN-specific user id to identify this message if it fails:
*/
imsg.userid = myGetNextMessageId();

ret = isdnSendMessage( ctahd, &imsg, idata, datasize);
if( ret != SUCCESS)
{
ctaGetText(ctahd, ret, errortext, 40;
printf("SEND_FAIL: %s mg id=%x\n", errortext, imsg.userid );
return MY_ERROR_SEND_FAILED;
}
myWaitForEvent( ctahd, &event)
if( event.value != SUCCESS)
{
ctaGetText(ctahd, event.value, errortext, 40);
printf("SEND_FAIL: %s mg id=%x\n", errortext, imsg.userid );
return MY_ERROR_SEND_FAILED;
}
...
}


Natural MicroSystems, Inc.
100 Crossing Boulevard
Framingham, MA 01702

Contact Developer Support

Previous PageTable Of ContentsIndexNext Page