--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: EuroISDNStateNT.c\r
+\r
+ Contents: EuroISDN State Engine for NT (Network Mode).\r
+\r
+ The controlling state engine for Q.931 is the state engine\r
+ on the NT side. The state engine on the TE side is a slave \r
+ of this. The TE side maintain it's own states as described in\r
+ ITU-T Q931, but will in raise conditions be overridden by \r
+ the NT side.\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: EuroISDNStateTE.c\r
+\r
+ Contents: EuroISDN State Engine for TE (User Mode).\r
+\r
+ The controlling state engine for Q.931 is the state engine\r
+ on the NT side. The state engine on the TE side is a slave \r
+ of this. The TE side maintain it's own states as described in\r
+ ITU-T Q931, but will in raise conditions be overridden by \r
+ the NT side.\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+/*\r
+ EuroISDN is a sub-set of Q.931. Q.931 is very generic as it embrase a lot,\r
+ while EuroISDN is more exact and make decitions on some of the \r
+ 'implementation options' in the original standard. EuroISDN will \r
+ however run smoothly under the generic space, so these functions are more \r
+ for show \r
+*/\r
+\r
+void EuroISDNCreateTE(L3UCHAR i)\r
+{\r
+ Q931CreateTE(i);\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: q921.c\r
+\r
+ Description: Contains the implementation of a Q.921 protocol on top of the\r
+ Comet Driver.\r
+\r
+ Most of the work required to execute a Q.921 protocol is \r
+ taken care of by the Comet ship and it's driver. This layer\r
+ will simply configure and make use of these features to \r
+ complete a Q.921 implementation.\r
+\r
+ Created: 27.dec.2000/JVB\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+\r
+*****************************************************************************/\r
+#include "q921.h"\r
+#include <stdlib.h>\r
+#include "mfifo.h"\r
+\r
+/*****************************************************************************\r
+ Global Tables & Variables.\r
+*****************************************************************************/\r
+Q921Data Q921DevSpace[Q921MAXTRUNK];\r
+int Q921HeaderSpace={0};\r
+\r
+int (*Q921Tx21Proc)(int dev, unsigned char *, int)={NULL};\r
+int (*Q921Tx23Proc)(int dev, unsigned char *, int)={NULL};\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921Init\r
+\r
+ Decription: Initialize the Q.921 stack so it is ready for use. This \r
+ function MUST be called as part of initializing the \r
+ application.\r
+\r
+*****************************************************************************/\r
+void Q921Init()\r
+{\r
+ int x;\r
+ for(x=0; x<Q921MAXTRUNK;x++)\r
+ {\r
+ MFIFOCreate(Q921DevSpace[x].HDLCInQueue, Q921MAXHDLCSPACE, 10);\r
+ Q921DevSpace[x].vr=0;\r
+ Q921DevSpace[x].vs=0;\r
+ Q921DevSpace[x].state=0;;\r
+ }\r
+}\r
+\r
+void Q921SetHeaderSpace(int hspace)\r
+{\r
+ Q921HeaderSpace=hspace;\r
+}\r
+\r
+void Q921SetTx21CB(int (*callback)(int dev, unsigned char *, int))\r
+{\r
+ Q921Tx21Proc = callback;\r
+}\r
+\r
+void Q921SetTx23CB(int (*callback)(int dev, unsigned char *, int))\r
+{\r
+ Q921Tx23Proc = callback;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921QueueHDLCFrame\r
+\r
+ Description: Called to receive and queue an incoming HDLC frame. Will\r
+ queue this in Q921HDLCInQueue. The called must either call\r
+ Q921Rx12 directly afterwards or signal Q921Rx12 to be called\r
+ later. Q921Rx12 will read from the same queue and process\r
+ the frame.\r
+\r
+ This function assumes that the message contains header \r
+ space. This is removed for internal Q921 processing, but \r
+ must be keept for I frames.\r
+\r
+ Parameters: trunk trunk #\r
+ b ptr to frame;\r
+ size size of frame in bytes\r
+\r
+*****************************************************************************/\r
+int Q921QueueHDLCFrame(int trunk, char *b, int size)\r
+{\r
+ return MFIFOWriteMes(Q921DevSpace[trunk].HDLCInQueue, b, size);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendI\r
+\r
+ Description: Compose and Send I Frame to layer. Will receive an I frame\r
+ with space for L2 header and fill out that header before\r
+ it call Q921Tx21Proc.\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P fiels octet 5\r
+ mes ptr to I frame message.\r
+ size size of message in bytes.\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendI(int trunk, unsigned char Sapi, char cr, unsigned char Tei, char pf, char *mes, int size)\r
+{\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = Q921DevSpace[trunk].vs<<1;\r
+ mes[Q921HeaderSpace+3] = (Q921DevSpace[trunk].vr<<1) | (pf & 0x01);\r
+ Q921DevSpace[trunk].vs++;\r
+\r
+ return Q921Tx21Proc(trunk, mes, size);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendRR\r
+\r
+ Description: Compose and send Receive Ready.\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P/F fiels octet 5\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+\r
+int Q921SendRR(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x01;\r
+ mes[Q921HeaderSpace+3] = (Q921DevSpace[trunk].vr<<1) | (pf & 0x01);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendRNR\r
+\r
+ Description: Compose and send Receive Nor Ready\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P/F fiels octet 5\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendRNR(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x05;\r
+ mes[Q921HeaderSpace+3] = (Q921DevSpace[trunk].vr<<1) | (pf & 0x01);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendREJ\r
+\r
+ Description: Compose and Send Reject.\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P/F fiels octet 5\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendREJ(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x09;\r
+ mes[Q921HeaderSpace+3] = (Q921DevSpace[trunk].vr<<1) | (pf & 0x01);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendSABME\r
+\r
+ Description: Compose and send SABME\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P fiels octet 4\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendSABME(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x6f | ((pf<<4)&0x10);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendDM\r
+\r
+ Description: Comose and Send DM (Disconnected Mode)\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf F fiels octet 4\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendDM(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x0f | ((pf<<4)&0x10);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921\r
+\r
+ Description:\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P fiels octet 4\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+//int Q921SendUI(...)\r
+//{\r
+//}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendDISC\r
+\r
+ Description: Compose and Send Disconnect\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P fiels octet 4\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendDISC(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x43 | ((pf<<4)&0x10);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921SendUA\r
+\r
+ Description: Compose and Send UA\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf F fiels octet 4\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+int Q921SendUA(int trunk, int Sapi, int cr, int Tei, int pf)\r
+{\r
+ char mes[400];\r
+\r
+ mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
+ mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
+ mes[Q921HeaderSpace+2] = 0x63 | ((pf<<4)&0x10);\r
+\r
+ return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921\r
+\r
+ Description:\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P fiels octet 5\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+//int Q921SendFRMR(...)\r
+//{\r
+//}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921\r
+\r
+ Description:\r
+\r
+ Parameters: trunk trunk #\r
+ Sapi Sapi\r
+ cr C/R field.\r
+ Tei Tei.\r
+ pf P fiels octet 5\r
+\r
+ Return Value: 0 if failed, 1 if Send.\r
+\r
+*****************************************************************************/\r
+//int Q921SendXID(...)\r
+//{\r
+//}\r
+\r
+int Q921ProcSABME(int trunk, char *mes, int size)\r
+{\r
+ Q921DevSpace[trunk].vr=0;\r
+ Q921DevSpace[trunk].vs=0;\r
+\r
+ return 1;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q921Rx12\r
+\r
+ Description: Called to process a message frame from layer 1. Will \r
+ identify the message and call the proper 'processor' for\r
+ layer 2 messages and forward I frames to the layer 3 entity.\r
+\r
+ Q921Rx12 will check the input fifo for a message, and if a \r
+ message exist process one message before it exits. The caller\r
+ must either call Q921Rx12 polling or keep track on # \r
+ messages in the queue.\r
+\r
+ Parameters: trunk trunk #.\r
+\r
+ Return Value: # messages processed (always 1 or 0).\r
+\r
+*****************************************************************************/\r
+int Q921Rx12(long trunk)\r
+{\r
+ char *mes;\r
+ int rs,size; /* receive size & Q921 frame size*/\r
+ char *smes = MFIFOGetMesPtr(Q921DevSpace[trunk].HDLCInQueue, &size);\r
+ if(smes != NULL)\r
+ {\r
+ rs = size - Q921HeaderSpace;\r
+ mes = &smes[Q921HeaderSpace];\r
+ /* check for I frame */\r
+ if((mes[2] & 0x01) == 0)\r
+ {\r
+ if(Q921Tx23Proc(trunk, smes, size-2)) /* -2 to clip away CRC */\r
+ {\r
+ Q921DevSpace[trunk].vr++;\r
+ Q921SendRR(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, mes[3]&0x01);\r
+ }\r
+ else\r
+ {\r
+ /* todo: whatever*/\r
+ }\r
+ }\r
+\r
+ /* check for RR */\r
+ else if(mes[2] ==0x01)\r
+ {\r
+ /* todo: check if RR is responce to I */\r
+ Q921SendRR(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, mes[2]&0x01);\r
+ }\r
+\r
+ /* check for RNR */\r
+ /* check for REJ */\r
+ /* check for SABME */\r
+ else if((mes[2] & 0xef) == 0x6f)\r
+ {\r
+ Q921ProcSABME(trunk, mes, rs);\r
+ Q921SendUA(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, (mes[2]&0x10)>>4);\r
+ }\r
+\r
+ /* check for DM */\r
+ /* check for UI */\r
+ /* check for DISC */\r
+ /* check for UA */\r
+ /* check for FRMR */\r
+ /* check for XID */\r
+\r
+ else\r
+ {\r
+ /* what the ? Issue an error */\r
+// Q921ErrorProc(trunk, Q921_UNKNOWNFRAME, mes, rs);\r
+ /* todo: REJ or FRMR */\r
+ }\r
+\r
+ MFIFOKillNext(Q921DevSpace[trunk].HDLCInQueue);\r
+\r
+ return 1;\r
+ }\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: Q931.c\r
+\r
+ Contents: Implementation of Q.931 stack main interface functions. \r
+ See q931.h for description. \r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+/*****************************************************************************\r
+\r
+ Dialect function pointers tables.\r
+\r
+ The following function pointer arrays define pack/unpack functions and \r
+ processing furnctions for the different Q.931 based dialects.\r
+\r
+ The arrays are initialized with pointers to dummy functions and later\r
+ overrided with pointers to actual functions as new dialects are added.\r
+\r
+ The initial Q.931 will as an example define 2 dielects as it treats User\r
+ and Network mode as separate ISDN dialects.\r
+\r
+ The API messages Q931AddProc, Q931AddMes, Q931AddIE are used to initialize\r
+ these table entries during system inititialization of a stack.\r
+\r
+*****************************************************************************/\r
+L3INT (*Q931Proc [Q931MAXDLCT][Q931MAXMES]) (Q931_TrunkInfo *pTrunk, L3UCHAR *,L3INT);\r
+\r
+L3INT (*Q931Umes [Q931MAXDLCT][Q931MAXMES]) (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size);\r
+L3INT (*Q931Pmes [Q931MAXDLCT][Q931MAXMES]) (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+\r
+L3INT (*Q931Uie [Q931MAXDLCT][Q931MAXIE]) (Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT (*Q931Pie [Q931MAXDLCT][Q931MAXIE]) (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+\r
+void (*Q931CreateDialectCB[Q931MAXDLCT]) (L3UCHAR iDialect)=\r
+{\r
+ NULL,\r
+ NULL\r
+};\r
+\r
+Q931State Q931st[Q931MAXSTATE];\r
+\r
+/*****************************************************************************\r
+\r
+ Core system tables and variables.\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931L4HeaderSpace={0}; /* header space to be ignoder/inserted */\r
+ /* at head of each message. */\r
+\r
+L3INT Q931L2HeaderSpace = {4}; /* Q921 header space, sapi, tei etc */\r
+\r
+/*****************************************************************************\r
+\r
+ Main interface callback functions. \r
+\r
+*****************************************************************************/\r
+\r
+L3INT (*Q931Tx34Proc)(Q931_TrunkInfo *pTrunk, L3UCHAR *,L3INT);\r
+ /* callback for messages to be send to */\r
+ /* layer 4. */\r
+\r
+L3INT (*Q931Tx32Proc)(Q931_TrunkInfo *pTrunk,L3UCHAR *,L3INT);\r
+ /* callback ptr for messages to be send */\r
+ /* to layer 2. */\r
+\r
+void (*Q931ErrorProc)(Q931_TrunkInfo *pTrunk, L3INT,L3INT,L3INT); \r
+ /* callback for error messages. */\r
+\r
+L3ULONG (*Q931GetTimeProc) ()=NULL; /* callback for func reading time in ms */\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931SetL4HeaderSpace\r
+\r
+ Description: Set the # of bytes to be inserted/ignored at the head of\r
+ each message. Q931 will issue a message with space for header\r
+ and the user will use this to fill in whatever header info\r
+ is required to support the architecture used.\r
+\r
+*****************************************************************************/\r
+void Q931SetL4HeaderSpace(L3INT space)\r
+{\r
+ Q931L4HeaderSpace = space;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931SetL2HeaderSpace\r
+\r
+ Description: Set the # of bytes to be inserted/ignored at the head of\r
+ each message. Q931 will issue a message with space for header\r
+ and the user will use this to fill in whatever header info\r
+ is required to support the architecture used.\r
+\r
+*****************************************************************************/\r
+void Q931SetL2HeaderSpace(L3INT space)\r
+{\r
+ Q931L2HeaderSpace = space;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931\r
+\r
+ Description: Dummy function for message processing.\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcDummy(Q931_TrunkInfo *pTrunk, L3UCHAR * b,L3INT c)\r
+{\r
+ return Q931E_INTERNAL;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931\r
+\r
+ Description: Dummy function for message processing\r
+\r
+*****************************************************************************/\r
+L3INT Q931UmesDummy(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ return Q931E_UNKNOWN_MESSAGE;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931\r
+\r
+ Description: Dummy function for message processing\r
+\r
+*****************************************************************************/\r
+L3INT Q931UieDummy(Q931_TrunkInfo *pTrunk,ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ return Q931E_UNKNOWN_IE;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931\r
+\r
+ Description: Dummy function for message processing\r
+\r
+*****************************************************************************/\r
+L3INT Q931PmesDummy(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ return Q931E_UNKNOWN_MESSAGE;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931PieDummy\r
+\r
+ Description: Dummy function for message processing\r
+\r
+*****************************************************************************/\r
+L3INT Q931PieDummy(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ return Q931E_UNKNOWN_IE;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931TxDummy\r
+\r
+ Description: Dummy function for message processing\r
+\r
+*****************************************************************************/\r
+L3INT Q931TxDummy(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT n)\r
+{\r
+ return Q931E_MISSING_CB;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ErrorDummy\r
+\r
+ Description: Dummy function for error processing\r
+\r
+*****************************************************************************/\r
+void Q931ErrorDummy(Q931_TrunkInfo *pTrunk,L3INT a, L3INT b, L3INT c)\r
+{\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Initialize\r
+\r
+ Description: This function Initialize the stack. \r
+ \r
+ Will set up the trunk array, channel\r
+ arrays and initialize Q931 function arrays before it finally\r
+ set up EuroISDN processing with User as diealect 0 and \r
+ Network as dialect 1.\r
+\r
+ Note: Initialization of other stacks should be inserted after\r
+ the initialization of EuroISDN.\r
+\r
+*****************************************************************************/\r
+void Q931Initialize()\r
+{\r
+ L3INT x,y;\r
+\r
+ /* Secure the callbacks to default procs */\r
+ Q931Tx34Proc = Q931TxDummy;\r
+ Q931Tx32Proc = Q931TxDummy;\r
+ Q931ErrorProc = Q931ErrorDummy;\r
+\r
+ /* The user will only add the message handlers and IE handlers he need, */\r
+ /* so we need to initialize every single entry to a default function */\r
+ /* that will throw an appropriate error if they are ever called. */\r
+ for(x=0;x< Q931MAXDLCT;x++)\r
+ {\r
+ for(y=0;y<Q931MAXMES;y++)\r
+ {\r
+ Q931Proc[x][y] = Q931ProcDummy;\r
+ Q931Umes[x][y] = Q931UmesDummy;\r
+ Q931Pmes[x][y] = Q931PmesDummy;\r
+ }\r
+ for(y=0;y<Q931MAXIE;y++)\r
+ {\r
+ Q931Pie[x][y] = Q931PieDummy;\r
+ Q931Uie[x][y] = Q931UieDummy;\r
+ }\r
+ }\r
+\r
+ if(Q931CreateDialectCB[0] == NULL)\r
+ Q931AddDialect(0, Q931CreateTE);\r
+\r
+ if(Q931CreateDialectCB[1] == NULL)\r
+ Q931AddDialect(1, Q931CreateNT);\r
+\r
+ /* The last step we do is to call the callbacks to create the dialects */\r
+ for(x=0; x< Q931MAXDLCT; x++)\r
+ {\r
+ if(Q931CreateDialectCB[x] != NULL)\r
+ {\r
+ Q931CreateDialectCB[x]((L3UCHAR)x);\r
+ }\r
+ }\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931TimeTick\r
+\r
+ Description: Called periodically from an external source to allow the \r
+ stack to process and maintain it's own timers.\r
+\r
+ Parameters: ms[IN] Milliseconds since last call.\r
+\r
+ Return Value: none\r
+\r
+*****************************************************************************/\r
+void Q931TimeTick(L3ULONG ms)\r
+{\r
+ ms=ms; // avoid warning for now.\r
+\r
+ // TODO: Loop through all active calls, check timers and call timour procs\r
+ // if timers are expired.\r
+ // Implement an function array so each dialect can deal with their own\r
+ // timeouts.\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Rx23\r
+\r
+ Description: Receive message from layer 2 (LAPD). Receiving a message \r
+ is always done in 2 steps. First the message must be \r
+ interpreted and translated to a static struct. Secondly\r
+ the message is processed and responded to.\r
+\r
+ The Q.931 message contains a static header that is \r
+ interpreated in his function. The rest is interpreted\r
+ in a sub function according to mestype.\r
+\r
+ Parameters: pTrunk [IN] Ptr to trunk info.\r
+ buf [IN] Ptr to buffer containing message.\r
+ Size [IN] Size of message.\r
+\r
+ Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning\r
+ see q931errors.h for details.\r
+\r
+*****************************************************************************/\r
+L3INT Q931Rx23(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT Size)\r
+{\r
+ L3UCHAR *Mes = &buf[Q931L2HeaderSpace];\r
+ L3INT RetCode = Q931E_NO_ERROR;\r
+\r
+ Q931mes_Alerting * m = (Q931mes_Alerting*)Mes;\r
+ L3INT ISize;\r
+ L3INT IOff = 0;\r
+\r
+ /* Protocol Discriminator */\r
+ m->ProtDisc = Mes[IOff++];\r
+\r
+ /* CRV */\r
+ m->CRV = Q931Uie_CRV(pTrunk, Mes,m->buf, &IOff, &ISize);\r
+\r
+ /* Message Type */\r
+ m->MesType = Mes[IOff++];\r
+\r
+ /* Call table proc to unpack codec message */\r
+ RetCode = Q931Umes[pTrunk->Dialect][m->MesType](pTrunk, Mes, pTrunk->L3Buf,Q931L4HeaderSpace,Size- Q931L4HeaderSpace);\r
+ if(RetCode >= Q931E_NO_ERROR)\r
+ {\r
+ RetCode=Q931Proc[pTrunk->Dialect][m->MesType](pTrunk, pTrunk->L3Buf, 2);\r
+ }\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Tx34\r
+\r
+ Description: Called from the stac to send a message to layer 4.\r
+\r
+ Parameters: Mes[IN] Ptr to message buffer.\r
+ Size[IN] Message size in bytes.\r
+\r
+ Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning\r
+ see q931errors.h for details.\r
+\r
+*****************************************************************************/\r
+L3INT Q931Tx34(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size)\r
+{\r
+ return Q931Tx34Proc(pTrunk, Mes, Size);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Rx43\r
+\r
+ Description: Receive message from Layer 4 (application).\r
+\r
+ Parameters: pTrunk[IN] Trunk #.\r
+ buf[IN] Message Pointer.\r
+ Size[IN] Message size in bytes.\r
+\r
+ Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning\r
+ see q931errors.h for details.\r
+\r
+*****************************************************************************/\r
+L3INT Q931Rx43(Q931_TrunkInfo *pTrunk,L3UCHAR * buf, L3INT Size)\r
+{\r
+ Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];\r
+ L3INT RetCode = Q931E_NO_ERROR;\r
+\r
+ RetCode=Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk,buf,4);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Tx32\r
+\r
+ Description: Called from the stack to send a message to L2. The input is \r
+ always a non-packed message so it will first make a proper\r
+ call to create a packed message before it transmits that\r
+ message to layer 2.\r
+\r
+ Parameters: pTrunk[IN] Trunk # \r
+ buf[IN] Ptr to message buffer.\r
+ Size[IN] Message size in bytes.\r
+\r
+ Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning\r
+ see q931errors.h for details.\r
+\r
+*****************************************************************************/\r
+L3INT Q931Tx32(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size)\r
+{\r
+ L3INT OSize;\r
+ Q931mes_Alerting *ptr = (Q931mes_Alerting*)Mes;\r
+ L3INT RetCode = Q931E_NO_ERROR;\r
+ L3INT iDialect = pTrunk->Dialect;\r
+\r
+ /* Call pack function through table. */\r
+ RetCode = Q931Pmes[iDialect][ptr->MesType](pTrunk,Mes,Size,&pTrunk->L2Buf[Q931L2HeaderSpace], &OSize);\r
+ if(RetCode >= Q931E_NO_ERROR)\r
+ {\r
+ RetCode = Q931Tx32Proc(pTrunk, pTrunk->L2Buf, Size);\r
+ }\r
+\r
+ return RetCode;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931SetError\r
+\r
+ Description: Called from the stack to indicate an error. \r
+\r
+ Parameters: ErrID ID of ie or message causing error.\r
+ ErrPar1 Error parameter 1\r
+ ErrPar2 Error parameter 2.\r
+\r
+\r
+*****************************************************************************/\r
+void Q931SetError(Q931_TrunkInfo *pTrunk,L3INT ErrID, L3INT ErrPar1, L3INT ErrPar2)\r
+{\r
+ Q931ErrorProc(pTrunk,ErrID, ErrPar1, ErrPar2);\r
+}\r
+\r
+void Q931SetTx34CB(L3INT (*Q931Tx34Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size))\r
+{\r
+ Q931Tx34Proc = Q931Tx34Par;\r
+}\r
+\r
+void Q931SetTx32CB(L3INT (*Q931Tx32Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size))\r
+{\r
+ Q931Tx32Proc = Q931Tx32Par;\r
+}\r
+\r
+void Q931SetErrorCB(L3INT (*Q931ErrorPar)(Q931_TrunkInfo *pTrunk,L3INT,L3INT,L3INT))\r
+{\r
+ Q931ErrorProc = Q931ErrorPar;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931CreateCRV\r
+\r
+ Description: Create a CRV entry and return it's index. The function will \r
+ locate a free entry in the call tables allocate it and \r
+ allocate a unique CRV value attached to it.\r
+\r
+ Parameters: pTrunk [IN] Trunk number\r
+ callindex [OUT] return call table index.\r
+\r
+ Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning\r
+ see q931errors.h for details.\r
+\r
+*****************************************************************************/\r
+L3INT Q931CreateCRV(Q931_TrunkInfo *pTrunk, L3INT * callIndex)\r
+{\r
+ L3INT CRV = Q931GetUniqueCRV(pTrunk);\r
+\r
+ return Q931AllocateCRV(pTrunk, CRV, callIndex);\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931AllocateCRV\r
+\r
+ Description: Allocate a call table entry and assigns the given CRV value\r
+ to it.\r
+\r
+ Parameters: pTrunk [IN] Trunk number\r
+ iCRV [IN] Call Reference Value.\r
+ callindex [OUT] return call table index.\r
+\r
+ Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning\r
+ see q931errors.h for details.\r
+\r
+*****************************************************************************/\r
+L3INT Q931AllocateCRV(Q931_TrunkInfo *pTrunk, L3INT iCRV, L3INT * callIndex)\r
+{\r
+ L3INT x;\r
+ for(x=0; x < Q931MAXCALLPERTRUNK; x++)\r
+ {\r
+ if(!pTrunk->call[x].InUse)\r
+ {\r
+ pTrunk->call[x].CRV = iCRV;\r
+ pTrunk->call[x].BChan = 255;\r
+ pTrunk->call[x].State = 0; /* null state - idle */\r
+ pTrunk->call[x].TimerID = 0; /* no timer running */\r
+ pTrunk->call[x].Timer = 0;\r
+ pTrunk->call[x].InUse = 1; /* mark as used */\r
+ *callIndex = x;\r
+ return Q931E_NO_ERROR;\r
+ }\r
+ }\r
+ return Q931E_TOMANYCALLS;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931GetCallState\r
+\r
+ Description: Look up CRV and return current call state. A non existing\r
+ CRV is the same as state zero (0).\r
+\r
+ Parameters: pTrunk [IN] Trunk number.\r
+ iCRV [IN] CRV\r
+\r
+ Return Value: Call State.\r
+\r
+*****************************************************************************/\r
+L3INT Q931GetCallState(Q931_TrunkInfo *pTrunk, L3INT iCRV)\r
+{\r
+ L3INT x;\r
+ for(x=0; x < Q931MAXCALLPERTRUNK; x++)\r
+ {\r
+ if(!pTrunk->call[x].InUse)\r
+ {\r
+ if(pTrunk->call[x].CRV == iCRV)\r
+ {\r
+ return pTrunk->call[x].State;\r
+ }\r
+ }\r
+ }\r
+ return 0; /* assume state zero for non existing CRV's */\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931StartTimer\r
+\r
+ Description: Start a timer.\r
+\r
+ Parameters: pTrunk Trunk number\r
+ callindex call index.\r
+ iTimer timer id\r
+*****************************************************************************/\r
+L3INT Q931StartTimer(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3INT iTimerID)\r
+{\r
+ pTrunk->call[callIndex].Timer = Q931GetTime(); \r
+ pTrunk->call[callIndex].TimerID = iTimerID;\r
+ return 0;\r
+}\r
+\r
+L3INT Q931StopTimer(Q931_TrunkInfo *pTrunk, L3INT callindex, L3INT iTimerID)\r
+{\r
+ if(pTrunk->call[callindex].TimerID == iTimerID)\r
+ pTrunk->call[callindex].TimerID = 0;\r
+ return 0;\r
+}\r
+\r
+L3INT Q931SetState(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3INT iState)\r
+{\r
+ pTrunk->call[callIndex].State = iState;\r
+\r
+ return 0;\r
+}\r
+\r
+L3ULONG Q931GetTime()\r
+{\r
+ L3ULONG tNow;\r
+ static L3ULONG tLast={0};\r
+ if(Q931GetTimeProc != NULL)\r
+ {\r
+ tNow = Q931GetTimeProc();\r
+ if(tNow < tLast) /* wrapped */\r
+ {\r
+ // todo\r
+ }\r
+ tLast = tNow;\r
+ }\r
+ return tNow;\r
+}\r
+\r
+void Q931SetGetTimeCB(L3ULONG (*callback)())\r
+{\r
+ Q931GetTimeProc = callback;\r
+}\r
+\r
+L3INT Q931FindCRV(Q931_TrunkInfo *pTrunk, L3INT crv, L3INT *callindex)\r
+{\r
+ L3INT x;\r
+ for(x=0; x < Q931MAXCALLPERTRUNK; x++)\r
+ {\r
+ if(!pTrunk->call[x].InUse)\r
+ {\r
+ if(pTrunk->call[x].CRV == crv)\r
+ {\r
+ *callindex = x;\r
+ return Q931E_NO_ERROR;\r
+ }\r
+ }\r
+ }\r
+ return Q931E_INVALID_CRV;\r
+}\r
+\r
+\r
+void Q931AddDialect(L3UCHAR i, void (*callback)(L3UCHAR iD ))\r
+{\r
+ if(i < Q931MAXDLCT)\r
+ {\r
+ Q931CreateDialectCB[i] = callback;\r
+ }\r
+}\r
+\r
+/*****************************************************************************\r
+ Function: Q931AddStateEntry\r
+\r
+ Description: Find an empty entry in the dialects state table and add this\r
+ entry.\r
+*****************************************************************************/\r
+void Q931AddStateEntry(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir)\r
+{\r
+ int x;\r
+ for(x=0; x < Q931MAXSTATE; x++)\r
+ {\r
+ if(Q931st[x].Message == 0)\r
+ {\r
+ Q931st[x].State = iState;\r
+ Q931st[x].Message = iMes;\r
+ Q931st[x].Direction = cDir;\r
+ // TODO Sort table and use bsearch\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+/*****************************************************************************\r
+ Function: Q931IsEventLegal\r
+\r
+ Description: Check state table for matching criteria to indicate if this\r
+ Message is legal in this state or not.\r
+\r
+ Note: Someone write a bsearch or invent something smart here\r
+ please - sequensial is ok for now.\r
+*****************************************************************************/\r
+L3BOOL Q931IsEventLegal(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir)\r
+{\r
+ int x;\r
+ // TODO Sort table and use bsearch\r
+ for(x=0; x < Q931MAXSTATE; x++)\r
+ {\r
+ if( Q931st[x].State == iState\r
+ && Q931st[x].Message == iMes\r
+ && Q931st[x].Direction == cDir)\r
+ {\r
+ return L3TRUE;\r
+ }\r
+ }\r
+ return L3FALSE; \r
+}\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: q931StateNT.c\r
+\r
+ Contents: Q.931 State Engine for NT (Network Mode).\r
+\r
+ The controlling state engine for Q.931 is the state engine\r
+ on the NT side. The state engine on the TE side is a slave \r
+ of this. The TE side maintain it's own states as described in\r
+ ITU-T Q931, but will in raise conditions be overridden by \r
+ the NT side.\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+extern L3INT Q931L4HeaderSpace;\r
+\r
+/*****************************************************************************\r
+ Function: Q931CreateNT\r
+\r
+ Description: Will create the Q931 NT as a Dialect in the stack. The first\r
+ bulk set up the message handlers, the second bulk the IE\r
+ encoders/coders, and the last bulk set up the state table.\r
+\r
+ Parameters: i Dialect index\r
+*****************************************************************************/\r
+void Q931CreateNT(L3UCHAR i)\r
+{\r
+ Q931SetMesProc(Q931mes_ALERTING, i,Q931ProcAlertingNT, Q931Umes_Alerting, Q931Pmes_Alerting);\r
+ Q931SetMesProc(Q931mes_CALL_PROCEEDING, i,Q931ProcCallProceedingNT, Q931Umes_CallProceeding, Q931Pmes_CallProceeding);\r
+ Q931SetMesProc(Q931mes_CONNECT, i,Q931ProcConnectNT, Q931Umes_Connect, Q931Pmes_Connect);\r
+ Q931SetMesProc(Q931mes_CONNECT_ACKNOWLEDGE, i,Q931ProcConnectAckNT, Q931Umes_ConnectAck, Q931Pmes_ConnectAck);\r
+ Q931SetMesProc(Q931mes_PROGRESS, i,Q931ProcProgressNT, Q931Umes_Progress, Q931Pmes_Progress);\r
+ Q931SetMesProc(Q931mes_SETUP, i,Q931ProcSetupNT, Q931Umes_Setup, Q931Pmes_Setup);\r
+ Q931SetMesProc(Q931mes_SETUP_ACKNOWLEDGE, i,Q931ProcSetupAckNT, Q931Umes_SetupAck, Q931Pmes_SetupAck);\r
+ Q931SetMesProc(Q931mes_RESUME, i,Q931ProcResumeNT, Q931Umes_Resume, Q931Pmes_Resume);\r
+ Q931SetMesProc(Q931mes_RESUME_ACKNOWLEDGE, i,Q931ProcResumeAckNT, Q931Umes_ResumeAck, Q931Pmes_ResumeAck);\r
+ Q931SetMesProc(Q931mes_RESUME_REJECT, i,Q931ProcResumeRejectNT, Q931Umes_ResumeReject, Q931Pmes_ResumeReject);\r
+ Q931SetMesProc(Q931mes_SUSPEND, i,Q931ProcSuspendNT, Q931Umes_Suspend, Q931Pmes_Suspend);\r
+ Q931SetMesProc(Q931mes_SUSPEND_ACKNOWLEDGE, i,Q931ProcSuspendAckNT, Q931Umes_SuspendAck, Q931Pmes_SuspendAck);\r
+ Q931SetMesProc(Q931mes_SUSPEND_REJECT, i,Q931ProcSuspendRejectNT, Q931Umes_SuspendReject, Q931Pmes_SuspendReject);\r
+ Q931SetMesProc(Q931mes_USER_INFORMATION, i,Q931ProcUserInformationNT, Q931Umes_UserInformation, Q931Pmes_UserInformation);\r
+ Q931SetMesProc(Q931mes_DISCONNECT, i,Q931ProcDisconnectNT, Q931Umes_Disconnect, Q931Pmes_Disconnect);\r
+ Q931SetMesProc(Q931mes_RELEASE, i,Q931ProcReleaseNT, Q931Umes_Release, Q931Pmes_Release);\r
+ Q931SetMesProc(Q931mes_RELEASE_COMPLETE, i,Q931ProcReleaseCompleteNT, Q931Umes_ReleaseComplete, Q931Pmes_ReleaseComplete);\r
+ Q931SetMesProc(Q931mes_RESTART, i,Q931ProcRestartNT, Q931Umes_Restart, Q931Pmes_Restart);\r
+ Q931SetMesProc(Q931mes_RESTART_ACKNOWLEDGE, i,Q931ProcRestartAckNT, Q931Umes_RestartAck, Q931Pmes_RestartAck);\r
+ Q931SetMesProc(Q931mes_CONGESTION_CONTROL, i,Q931ProcCongestionControlNT, Q931Umes_CongestionControl, Q931Pmes_CongestionControl);\r
+ Q931SetMesProc(Q931mes_INFORMATION, i,Q931ProcInformationNT, Q931Umes_Information, Q931Pmes_Information);\r
+ Q931SetMesProc(Q931mes_NOTIFY, i,Q931ProcNotifyNT, Q931Umes_Notify, Q931Pmes_Notify);\r
+ Q931SetMesProc(Q931mes_STATUS, i,Q931ProcStatusNT, Q931Umes_Status, Q931Pmes_Status);\r
+ Q931SetMesProc(Q931mes_STATUS_ENQUIRY, i,Q931ProcStatusEnquiryNT, Q931Umes_StatusEnquiry, Q931Pmes_StatusEnquiry);\r
+ Q931SetMesProc(Q931mes_SEGMENT, i,Q931ProcSegmentNT, Q931Umes_Segment, Q931Pmes_Segment);\r
+\r
+ Q931SetMesProc(Q932mes_FACILITY, i,Q932ProcFacilityNT, Q932Umes_Facility, Q932Pmes_Facility);\r
+ Q931SetMesProc(Q932mes_HOLD, i,Q932ProcHoldNT, Q932Umes_Hold, Q932Pmes_Hold);\r
+ Q931SetMesProc(Q932mes_HOLD_ACKNOWLEDGE, i,Q932ProcHoldAckNT, Q932Umes_HoldAck, Q932Pmes_HoldAck);\r
+ Q931SetMesProc(Q932mes_HOLD_REJECT, i,Q932ProcHoldRejectNT, Q932Umes_HoldReject, Q932Pmes_HoldReject);\r
+ Q931SetMesProc(Q932mes_REGISTER, i,Q932ProcRegisterNT, Q932Umes_Register, Q932Pmes_Register);\r
+ Q931SetMesProc(Q932mes_RETRIEVE, i,Q932ProcRetrieveNT, Q932Umes_Retrieve, Q932Pmes_Retrieve);\r
+ Q931SetMesProc(Q932mes_RETRIEVE_ACKNOWLEDGE,i,Q932ProcRetrieveAckNT, Q932Umes_RetrieveAck, Q932Pmes_RetrieveAck);\r
+ Q931SetMesProc(Q932mes_RETRIEVE_REJECT, i,Q932ProcRetrieveRejectNT, Q932Umes_RetrieveReject, Q932Pmes_RetrieveReject);\r
+\r
+ /* Set up the IE encoder/decoder handle table.*/ \r
+ Q931SetIEProc(Q931ie_SEGMENTED_MESSAGE, i,Q931Pie_Segment, Q931Uie_Segment);\r
+ Q931SetIEProc(Q931ie_BEARER_CAPABILITY, i,Q931Pie_BearerCap, Q931Uie_BearerCap);\r
+ Q931SetIEProc(Q931ie_CAUSE, i,Q931Pie_Cause, Q931Uie_Cause);\r
+ Q931SetIEProc(Q931ie_CALL_IDENTITY, i,Q931Pie_CallID, Q931Uie_CallID);\r
+ Q931SetIEProc(Q931ie_CALL_STATE, i,Q931Pie_CallState, Q931Uie_CallState);\r
+ Q931SetIEProc(Q931ie_CHANNEL_IDENTIFICATION, i,Q931Pie_ChanID, Q931Uie_ChanID);\r
+ Q931SetIEProc(Q931ie_PROGRESS_INDICATOR, i,Q931Pie_ProgInd, Q931Uie_ProgInd);\r
+ Q931SetIEProc(Q931ie_NETWORK_SPECIFIC_FACILITIES, i,Q931Pie_NetFac, Q931Uie_NetFac);\r
+ Q931SetIEProc(Q931ie_NOTIFICATION_INDICATOR, i,Q931Pie_NotifInd, Q931Uie_NotifInd);\r
+ Q931SetIEProc(Q931ie_DISPLAY, i,Q931Pie_Display, Q931Uie_Display);\r
+ Q931SetIEProc(Q931ie_DATETIME, i,Q931Pie_DateTime, Q931Uie_DateTime);\r
+ Q931SetIEProc(Q931ie_KEYPAD_FACILITY, i,Q931Pie_KeypadFac, Q931Uie_KeypadFac);\r
+ Q931SetIEProc(Q931ie_SIGNAL, i,Q931Pie_Signal, Q931Uie_Signal);\r
+ Q931SetIEProc(Q931ie_TRANSIT_DELAY_SELECTION_AND_IND, i,Q931Pie_TransNetSel, Q931Uie_TransNetSel);\r
+ Q931SetIEProc(Q931ie_CALLING_PARTY_NUMBER, i,Q931Pie_CallingNum, Q931Uie_CallingNum);\r
+ Q931SetIEProc(Q931ie_CALLING_PARTY_SUBADDRESS, i,Q931Pie_CallingSub, Q931Uie_CallingSub);\r
+ Q931SetIEProc(Q931ie_CALLED_PARTY_NUMBER, i,Q931Pie_CalledNum, Q931Uie_CalledNum);\r
+ Q931SetIEProc(Q931ie_CALLED_PARTY_SUBADDRESS, i,Q931Pie_CalledSub, Q931Uie_CalledSub);\r
+ Q931SetIEProc(Q931ie_TRANSIT_NETWORK_SELECTION, i,Q931Pie_TransNetSel, Q931Uie_TransNetSel);\r
+ Q931SetIEProc(Q931ie_RESTART_INDICATOR, i,Q931Pie_RestartInd, Q931Uie_RestartInd);\r
+ Q931SetIEProc(Q931ie_LOW_LAYER_COMPATIBILITY, i,Q931Pie_LLComp, Q931Uie_LLComp);\r
+ Q931SetIEProc(Q931ie_HIGH_LAYER_COMPATIBILITY, i,Q931Pie_HLComp, Q931Uie_HLComp);\r
+ Q931SetIEProc(Q931ie_USER_USER, i,Q931Pie_UserUser, Q931Uie_UserUser);\r
+\r
+ /* The following define a state machine. The point is that the Message */\r
+ /* procs can when search this to find out if the message/state */\r
+ /* combination is legale. If not, the proc for unexpected message apply.*/\r
+\r
+ // TODO define state table here\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcAlertingNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcAlertingNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* Reset 4 sec timer. */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcCallProceedingNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcCallProceedingNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcConnectNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcConnectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcConnectAckNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcConnectAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcProgressNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcProgressNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSetupNT\r
+\r
+ Description: Process a SETUP message.\r
+\r
+ *****************************************************************************/\r
+L3INT Q931ProcSetupNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT rc=0;\r
+ Q931mes_Setup *pMes = (Q931mes_Setup *)&buf[Q931L4HeaderSpace];\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+\r
+ /* Reject SETUP on existing calls */\r
+ if(Q931GetCallState(pTrunk, pMes->CRV) != Q931_U0)\r
+ {\r
+ Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);\r
+ return Q931E_UNEXPECTED_MESSAGE;\r
+ }\r
+\r
+ /* outgoing call */\r
+ if(iFrom == 4)\r
+ {\r
+ ret = Q931CreateCRV(pTrunk, &callIndex);\r
+ if(ret)\r
+ return ret;\r
+ pMes->CRV = pTrunk->call[callIndex].CRV;\r
+\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ if(ret)\r
+ return ret;\r
+\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+\r
+ Q931SetState(pTrunk, callIndex, Q931_U1);\r
+ }\r
+ /* incoming call */\r
+ else \r
+ {\r
+ /* Locate free CRV entry and store info */\r
+ ret = Q931AllocateCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ {\r
+ /* Not possible to allocate CRV entry, so must reject call */\r
+\r
+ Q931Disconnect(pTrunk, iFrom, pMes->CRV, 42);\r
+\r
+ return ret;\r
+ }\r
+\r
+ /* Send setup indication to user */\r
+ ret = Q931Tx34(pTrunk,(L3UCHAR*)pMes,pMes->Size);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+ else\r
+ {\r
+ /* Must be full queue, meaning we can't process the call */\r
+ /* so we must disconnect */\r
+ Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);\r
+ return ret;\r
+ }\r
+\r
+ /* Set state U6 */\r
+ Q931SetState(pTrunk, callIndex, Q931_U6);\r
+\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ }\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSetupAckNT\r
+\r
+ Description: Used to acknowedge a SETUP. Usually the first initial\r
+ response recevide back used to buy some time.\r
+\r
+ Note that ChanID (B Channel Assignment) might come here from\r
+ NT side.\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSetupAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcResumeNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcResumeNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcResumeAckNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcResumeAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcResumeRejectNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcResumeRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSuspendNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSuspendNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSuspendAckNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSuspendAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSuspendRejectNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSuspendRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcInformationNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcUserInformationNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcDisconnectNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcDisconnectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcReleaseNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcReleaseNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcReleaseCompleteNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcReleaseCompleteNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRestartNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcRestartNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRestartAckNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcRestartAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcCongestionControlNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcCongestionControlNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcInformationNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcInformationNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcNotifyNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcNotifyNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcStatusNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcStatusNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcStatusEnquiryNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcStatusEnquiryNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSegmentNT\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSegmentNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/****************************************************************************/\r
+/******************* Q.932 - Supplementary Services *************************/\r
+/****************************************************************************/\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcFacilityNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcFacilityNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcHoldNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcHoldNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcHoldAckNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcHoldAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcHoldRejectNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcHoldRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRegisterTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRegisterNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRetrieveNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRetrieveNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRetrieveAckNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRetrieveAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRetrieveRejectNT\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRetrieveRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: q931StateTE.c\r
+\r
+ Contents: Q.931 State Engine for TE (User Mode).\r
+\r
+ The controlling state engine for Q.931 is the state engine\r
+ on the NT side. The state engine on the TE side is a slave \r
+ of this. The TE side maintain it's own states as described in\r
+ ITU-T Q931, but will in raise conditions be overridden by \r
+ the NT side.\r
+\r
+ This reference implementation uses a process per message,\r
+ meaning that each message must check call states. This\r
+ is easier for dialect maintenance as each message proc\r
+ can be replaced individually. A new TE variant only\r
+ need to copy the Q931CreateTE and replace those procs or\r
+ need to override.\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+extern L3INT Q931L4HeaderSpace;\r
+\r
+/*****************************************************************************\r
+ Function: Q931CreateTE\r
+\r
+ Description: Will create the Q931 TE as a Dialect in the stack. The first\r
+ bulk set up the message handlers, the second bulk the IE\r
+ encoders/coders, and the last bulk set up the state table.\r
+\r
+ Parameters: i Dialect index\r
+*****************************************************************************/\r
+void Q931CreateTE(L3UCHAR i)\r
+{\r
+ Q931SetMesProc(Q931mes_ALERTING, i,Q931ProcAlertingTE, Q931Umes_Alerting, Q931Pmes_Alerting);\r
+ Q931SetMesProc(Q931mes_CALL_PROCEEDING, i,Q931ProcCallProceedingTE, Q931Umes_CallProceeding, Q931Pmes_CallProceeding);\r
+ Q931SetMesProc(Q931mes_CONNECT, i,Q931ProcConnectTE, Q931Umes_Connect, Q931Pmes_Connect);\r
+ Q931SetMesProc(Q931mes_CONNECT_ACKNOWLEDGE, i,Q931ProcConnectAckTE, Q931Umes_ConnectAck, Q931Pmes_ConnectAck);\r
+ Q931SetMesProc(Q931mes_PROGRESS, i,Q931ProcProgressTE, Q931Umes_Progress, Q931Pmes_Progress);\r
+ Q931SetMesProc(Q931mes_SETUP, i,Q931ProcSetupTE, Q931Umes_Setup, Q931Pmes_Setup);\r
+ Q931SetMesProc(Q931mes_SETUP_ACKNOWLEDGE, i,Q931ProcSetupAckTE, Q931Umes_SetupAck, Q931Pmes_SetupAck);\r
+ Q931SetMesProc(Q931mes_RESUME, i,Q931ProcResumeTE, Q931Umes_Resume, Q931Pmes_Resume);\r
+ Q931SetMesProc(Q931mes_RESUME_ACKNOWLEDGE, i,Q931ProcResumeAckTE, Q931Umes_ResumeAck, Q931Pmes_ResumeAck);\r
+ Q931SetMesProc(Q931mes_RESUME_REJECT, i,Q931ProcResumeRejectTE, Q931Umes_ResumeReject, Q931Pmes_ResumeReject);\r
+ Q931SetMesProc(Q931mes_SUSPEND, i,Q931ProcSuspendTE, Q931Umes_Suspend, Q931Pmes_Suspend);\r
+ Q931SetMesProc(Q931mes_SUSPEND_ACKNOWLEDGE, i,Q931ProcSuspendAckTE, Q931Umes_SuspendAck, Q931Pmes_SuspendAck);\r
+ Q931SetMesProc(Q931mes_SUSPEND_REJECT, i,Q931ProcSuspendRejectTE, Q931Umes_SuspendReject, Q931Pmes_SuspendReject);\r
+ Q931SetMesProc(Q931mes_USER_INFORMATION, i,Q931ProcUserInformationTE, Q931Umes_UserInformation, Q931Pmes_UserInformation);\r
+ Q931SetMesProc(Q931mes_DISCONNECT, i,Q931ProcDisconnectTE, Q931Umes_Disconnect, Q931Pmes_Disconnect);\r
+ Q931SetMesProc(Q931mes_RELEASE, i,Q931ProcReleaseTE, Q931Umes_Release, Q931Pmes_Release);\r
+ Q931SetMesProc(Q931mes_RELEASE_COMPLETE, i,Q931ProcReleaseCompleteTE, Q931Umes_ReleaseComplete, Q931Pmes_ReleaseComplete);\r
+ Q931SetMesProc(Q931mes_RESTART, i,Q931ProcRestartTE, Q931Umes_Restart, Q931Pmes_Restart);\r
+ Q931SetMesProc(Q931mes_RESTART_ACKNOWLEDGE, i,Q931ProcRestartAckTE, Q931Umes_RestartAck, Q931Pmes_RestartAck);\r
+ Q931SetMesProc(Q931mes_CONGESTION_CONTROL, i,Q931ProcCongestionControlTE, Q931Umes_CongestionControl, Q931Pmes_CongestionControl);\r
+ Q931SetMesProc(Q931mes_INFORMATION, i,Q931ProcInformationTE, Q931Umes_Information, Q931Pmes_Information);\r
+ Q931SetMesProc(Q931mes_NOTIFY, i,Q931ProcNotifyTE, Q931Umes_Notify, Q931Pmes_Notify);\r
+ Q931SetMesProc(Q931mes_STATUS, i,Q931ProcStatusTE, Q931Umes_Status, Q931Pmes_Status);\r
+ Q931SetMesProc(Q931mes_STATUS_ENQUIRY, i,Q931ProcStatusEnquiryTE, Q931Umes_StatusEnquiry, Q931Pmes_StatusEnquiry);\r
+ Q931SetMesProc(Q931mes_SEGMENT, i,Q931ProcSegmentTE, Q931Umes_Segment, Q931Pmes_Segment);\r
+\r
+ Q931SetMesProc(Q932mes_FACILITY, i,Q932ProcFacilityTE, Q932Umes_Facility, Q932Pmes_Facility);\r
+ Q931SetMesProc(Q932mes_HOLD, i,Q932ProcHoldTE, Q932Umes_Hold, Q932Pmes_Hold);\r
+ Q931SetMesProc(Q932mes_HOLD_ACKNOWLEDGE, i,Q932ProcHoldAckTE, Q932Umes_HoldAck, Q932Pmes_HoldAck);\r
+ Q931SetMesProc(Q932mes_HOLD_REJECT, i,Q932ProcHoldRejectTE, Q932Umes_HoldReject, Q932Pmes_HoldReject);\r
+ Q931SetMesProc(Q932mes_REGISTER, i,Q932ProcRegisterTE, Q932Umes_Register, Q932Pmes_Register);\r
+ Q931SetMesProc(Q932mes_RETRIEVE, i,Q932ProcRetrieveTE, Q932Umes_Retrieve, Q932Pmes_Retrieve);\r
+ Q931SetMesProc(Q932mes_RETRIEVE_ACKNOWLEDGE,i,Q932ProcRetrieveAckTE, Q932Umes_RetrieveAck, Q932Pmes_RetrieveAck);\r
+ Q931SetMesProc(Q932mes_RETRIEVE_REJECT, i,Q932ProcRetrieveRejectTE, Q932Umes_RetrieveReject, Q932Pmes_RetrieveReject);\r
+\r
+ /* Set up the IE encoder/decoder handle table.*/ \r
+ Q931SetIEProc(Q931ie_SEGMENTED_MESSAGE, i,Q931Pie_Segment, Q931Uie_Segment);\r
+ Q931SetIEProc(Q931ie_BEARER_CAPABILITY, i,Q931Pie_BearerCap, Q931Uie_BearerCap);\r
+ Q931SetIEProc(Q931ie_CAUSE, i,Q931Pie_Cause, Q931Uie_Cause);\r
+ Q931SetIEProc(Q931ie_CALL_IDENTITY, i,Q931Pie_CallID, Q931Uie_CallID);\r
+ Q931SetIEProc(Q931ie_CALL_STATE, i,Q931Pie_CallState, Q931Uie_CallState);\r
+ Q931SetIEProc(Q931ie_CHANNEL_IDENTIFICATION, i,Q931Pie_ChanID, Q931Uie_ChanID);\r
+ Q931SetIEProc(Q931ie_PROGRESS_INDICATOR, i,Q931Pie_ProgInd, Q931Uie_ProgInd);\r
+ Q931SetIEProc(Q931ie_NETWORK_SPECIFIC_FACILITIES, i,Q931Pie_NetFac, Q931Uie_NetFac);\r
+ Q931SetIEProc(Q931ie_NOTIFICATION_INDICATOR, i,Q931Pie_NotifInd, Q931Uie_NotifInd);\r
+ Q931SetIEProc(Q931ie_DISPLAY, i,Q931Pie_Display, Q931Uie_Display);\r
+ Q931SetIEProc(Q931ie_DATETIME, i,Q931Pie_DateTime, Q931Uie_DateTime);\r
+ Q931SetIEProc(Q931ie_KEYPAD_FACILITY, i,Q931Pie_KeypadFac, Q931Uie_KeypadFac);\r
+ Q931SetIEProc(Q931ie_SIGNAL, i,Q931Pie_Signal, Q931Uie_Signal);\r
+ Q931SetIEProc(Q931ie_TRANSIT_DELAY_SELECTION_AND_IND, i,Q931Pie_TransNetSel, Q931Uie_TransNetSel);\r
+ Q931SetIEProc(Q931ie_CALLING_PARTY_NUMBER, i,Q931Pie_CallingNum, Q931Uie_CallingNum);\r
+ Q931SetIEProc(Q931ie_CALLING_PARTY_SUBADDRESS, i,Q931Pie_CallingSub, Q931Uie_CallingSub);\r
+ Q931SetIEProc(Q931ie_CALLED_PARTY_NUMBER, i,Q931Pie_CalledNum, Q931Uie_CalledNum);\r
+ Q931SetIEProc(Q931ie_CALLED_PARTY_SUBADDRESS, i,Q931Pie_CalledSub, Q931Uie_CalledSub);\r
+ Q931SetIEProc(Q931ie_TRANSIT_NETWORK_SELECTION, i,Q931Pie_TransNetSel, Q931Uie_TransNetSel);\r
+ Q931SetIEProc(Q931ie_RESTART_INDICATOR, i,Q931Pie_RestartInd, Q931Uie_RestartInd);\r
+ Q931SetIEProc(Q931ie_LOW_LAYER_COMPATIBILITY, i,Q931Pie_LLComp, Q931Uie_LLComp);\r
+ Q931SetIEProc(Q931ie_HIGH_LAYER_COMPATIBILITY, i,Q931Pie_HLComp, Q931Uie_HLComp);\r
+ Q931SetIEProc(Q931ie_USER_USER, i,Q931Pie_UserUser, Q931Uie_UserUser);\r
+\r
+ /* The following define a state machine. The point is that the Message */\r
+ /* procs can when search this to find out if the message/state */\r
+ /* combination is legale. If not, the proc for unexpected message apply.*/\r
+\r
+ /* State 0 Idle */\r
+ Q931AddStateEntry(i,Q931_U0, Q931mes_RESUME, 2);\r
+ Q931AddStateEntry(i,Q931_U0, Q931mes_SETUP, 4);\r
+ Q931AddStateEntry(i,Q931_U0, Q931mes_SETUP, 2);\r
+ Q931AddStateEntry(i,Q931_U0, Q931mes_STATUS, 4);\r
+ Q931AddStateEntry(i,Q931_U0, Q931mes_RELEASE, 4);\r
+ Q931AddStateEntry(i,Q931_U0, Q931mes_RELEASE_COMPLETE,4);\r
+\r
+ /* State 1 Call Initiating */\r
+ Q931AddStateEntry(i,Q931_U1, Q931mes_DISCONNECT, 2);\r
+ Q931AddStateEntry(i,Q931_U1, Q931mes_SETUP_ACKNOWLEDGE, 4);\r
+ Q931AddStateEntry(i,Q931_U1, Q931mes_RELEASE_COMPLETE,4);\r
+ Q931AddStateEntry(i,Q931_U1, Q931mes_CALL_PROCEEDING, 4);\r
+ Q931AddStateEntry(i,Q931_U1, Q931mes_ALERTING, 4);\r
+ Q931AddStateEntry(i,Q931_U1, Q931mes_CONNECT, 4);\r
+\r
+ /* State 2 Overlap Sending */\r
+ Q931AddStateEntry(i,Q931_U2, Q931mes_INFORMATION, 2);\r
+ Q931AddStateEntry(i,Q931_U2, Q931mes_CALL_PROCEEDING, 4);\r
+ Q931AddStateEntry(i,Q931_U2, Q931mes_ALERTING, 4);\r
+ Q931AddStateEntry(i,Q931_U2, Q931mes_PROGRESS, 4);\r
+ Q931AddStateEntry(i,Q931_U2, Q931mes_CONNECT, 4);\r
+ Q931AddStateEntry(i,Q931_U2, Q931mes_RELEASE, 2);\r
+\r
+ /* State 3 Outgoing Call Proceeding */\r
+ Q931AddStateEntry(i,Q931_U3, Q931mes_PROGRESS, 4);\r
+ Q931AddStateEntry(i,Q931_U3, Q931mes_ALERTING, 4);\r
+ Q931AddStateEntry(i,Q931_U3, Q931mes_CONNECT, 4);\r
+ Q931AddStateEntry(i,Q931_U3, Q931mes_RELEASE, 2);\r
+\r
+ /* State 4 Call Delivered */\r
+ Q931AddStateEntry(i,Q931_U4, Q931mes_CONNECT, 4);\r
+\r
+ /* State 6 Call Precent */\r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_INFORMATION, 2); \r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_ALERTING, 2); \r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_CALL_PROCEEDING,2); \r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_CONNECT, 2); \r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_RELEASE_COMPLETE,2); \r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_RELEASE, 4); \r
+ Q931AddStateEntry(i,Q931_U6, Q931mes_DISCONNECT, 4); \r
+\r
+ /* State 7 Call Received */\r
+ Q931AddStateEntry(i,Q931_U7, Q931mes_CONNECT, 2);\r
+\r
+ /* State 8 Connect request */\r
+ Q931AddStateEntry(i,Q931_U8, Q931mes_CONNECT_ACKNOWLEDGE, 4);\r
+\r
+ /* State 9 Incoming Call Proceeding */\r
+ Q931AddStateEntry(i,Q931_U9, Q931mes_CONNECT, 2);\r
+ Q931AddStateEntry(i,Q931_U9, Q931mes_ALERTING, 2);\r
+ Q931AddStateEntry(i,Q931_U9, Q931mes_PROGRESS, 2);\r
+\r
+ /* State 10 Active */\r
+ Q931AddStateEntry(i,Q931_U10, Q931mes_SUSPEND, 2);\r
+ Q931AddStateEntry(i,Q931_U10, Q931mes_NOTIFY, 4);\r
+ Q931AddStateEntry(i,Q931_U10, Q931mes_NOTIFY, 2);\r
+\r
+ /* State 11 Disconnect Request */\r
+ Q931AddStateEntry(i,Q931_U11, Q931mes_RELEASE, 4);\r
+ Q931AddStateEntry(i,Q931_U11, Q931mes_DISCONNECT, 4);\r
+ Q931AddStateEntry(i,Q931_U11, Q931mes_NOTIFY, 4);\r
+\r
+ /* State 12 Disconnect Ind */\r
+ Q931AddStateEntry(i,Q931_U12, Q931mes_RELEASE, 4);\r
+ Q931AddStateEntry(i,Q931_U12, Q931mes_RELEASE, 2);\r
+\r
+ /* State 15 Suspend Request */\r
+ Q931AddStateEntry(i,Q931_U15, Q931mes_SUSPEND_ACKNOWLEDGE, 4);\r
+ Q931AddStateEntry(i,Q931_U15, Q931mes_SUSPEND_REJECT, 4);\r
+ Q931AddStateEntry(i,Q931_U15, Q931mes_DISCONNECT, 4);\r
+ Q931AddStateEntry(i,Q931_U15, Q931mes_RELEASE, 4);\r
+\r
+/* TODO\r
+ Q931AddStateEntry(i,Q931_U17,\r
+ Q931AddStateEntry(i,Q931_U19,\r
+ Q931AddStateEntry(i,Q931_U25,\r
+*/\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcAlertingTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcAlertingTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* Reset 4 sec timer. */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcCallProceedingTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcCallProceedingTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcConnectTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcConnectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcConnectAckTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcConnectAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcProgressTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcProgressTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSetupTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSetupTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT rc=0;\r
+ Q931mes_Setup *pMes = (Q931mes_Setup *)&buf[Q931L4HeaderSpace];\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+\r
+ /* Reject SETUP on existing calls */\r
+ if(Q931GetCallState(pTrunk, pMes->CRV) != Q931_U0)\r
+ {\r
+ Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);\r
+ return Q931E_UNEXPECTED_MESSAGE;\r
+ }\r
+\r
+ /* outgoing call */\r
+ if(iFrom == 4)\r
+ {\r
+ ret = Q931CreateCRV(pTrunk, &callIndex);\r
+ if(ret)\r
+ return ret;\r
+ pMes->CRV = pTrunk->call[callIndex].CRV;\r
+\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ if(ret)\r
+ return ret;\r
+\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+\r
+ Q931SetState(pTrunk, callIndex, Q931_U1);\r
+ }\r
+ /* incoming call */\r
+ else \r
+ {\r
+ /* Locate free CRV entry and store info */\r
+ ret = Q931AllocateCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ {\r
+ /* Not possible to allocate CRV entry, so must reject call */\r
+\r
+ Q931Disconnect(pTrunk, iFrom, pMes->CRV, 42);\r
+\r
+ return ret;\r
+ }\r
+\r
+ /* Send setup indication to user */\r
+ ret = Q931Tx34(pTrunk,(L3UCHAR*)pMes,pMes->Size);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+ else\r
+ {\r
+ /* Must be full queue, meaning we can't process the call */\r
+ /* so we must disconnect */\r
+ Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);\r
+ return ret;\r
+ }\r
+\r
+ /* Set state U6 */\r
+ Q931SetState(pTrunk, callIndex, Q931_U6);\r
+\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ }\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSetupAckTE\r
+\r
+ Description: Used to acknowedge a SETUP. Usually the first initial\r
+ response recevide back used to buy some time. L4 sending this\r
+ should only be passed on. L2 sending this means that we set\r
+ a new timer (and pass it to L4).\r
+\r
+ Note that ChanID (B Channel Assignment) might come here from\r
+ NT side.\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSetupAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcResumeTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcResumeTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ Q931mes_Resume * pMes = (Q931mes_Resume *)&buf[Q931L4HeaderSpace];\r
+// L3INT chanIndex;\r
+ L3INT callIndex;\r
+ L3INT ret = Q931E_NO_ERROR;\r
+\r
+ if(Q931GetCallState(pTrunk,pMes->CRV) == Q931_U0 && iFrom == 4)\r
+ {\r
+ /* Call reference selection */\r
+ ret = Q931CreateCRV(pTrunk, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+ pMes->CRV = pTrunk->call[callIndex].CRV;\r
+\r
+ /* Send RESUME to network */\r
+ ret=Q931Tx32(pTrunk,buf, pMes->Size);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* Start timer T318 */\r
+ Q931StartTimer(pTrunk, callIndex, 318);\r
+\r
+ /*set state U17 */\r
+ Q931SetState(pTrunk, callIndex, Q931_U17);\r
+ }\r
+ else\r
+ {\r
+ return Q931E_ILLEGAL_MESSAGE;\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcResumeAckTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcResumeAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcResumeRejectTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcResumeRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSuspendTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSuspendTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSuspendAckTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSuspendAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSuspendRejectTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSuspendRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcInformationTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcUserInformationTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcDisconnectTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcDisconnectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcReleaseTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcReleaseTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ Q931mes_Release *pMes = (Q931mes_Release *)&buf[Q931L4HeaderSpace];\r
+ L3INT state = Q931GetCallState(pTrunk, pMes->CRV);\r
+ L3INT ret = Q931E_NO_ERROR;\r
+ if(state == Q931_U0 && iFrom == 2)\r
+ {\r
+ ret = Q931ReleaseComplete(pTrunk, iFrom);\r
+ }\r
+ else\r
+ {\r
+ ret = Q931ProcUnexpectedMessage(pTrunk, buf, iFrom);\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcReleaseCompleteTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcReleaseCompleteTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ Q931mes_ReleaseComplete *pMes = (Q931mes_ReleaseComplete *)&buf[Q931L4HeaderSpace];\r
+ L3INT state = Q931GetCallState(pTrunk, pMes->CRV);\r
+ L3INT ret = Q931E_NO_ERROR;\r
+ if(state == Q931_U0 && iFrom == 2)\r
+ {\r
+ /* no action */\r
+ }\r
+ return 0;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRestartTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcRestartTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRestartAckTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcRestartAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcCongestionControlTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcCongestionControlTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcInformationTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcInformationTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcNotifyTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcNotifyTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcStatusTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcStatusTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcStatusEnquiryTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcStatusEnquiryTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcSegmentTE\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcSegmentTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/****************************************************************************/\r
+/******************* Q.932 - Supplementary Services *************************/\r
+/****************************************************************************/\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRetrieveTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcFacilityTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRetrieveTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcHoldTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRetrieveTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcHoldAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRetrieveTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcHoldRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRegisterTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRegisterTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932ProcRetrieveTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRetrieveTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRetrieveAckTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRetrieveAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ProcRetrieveRejectTE\r
+\r
+*****************************************************************************/\r
+L3INT Q932ProcRetrieveRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)\r
+{\r
+ L3INT callIndex;\r
+ L3INT ret=Q931E_NO_ERROR;\r
+ Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];\r
+\r
+ /* Find the call using CRV */\r
+ ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);\r
+ if(ret != Q931E_NO_ERROR)\r
+ return ret;\r
+\r
+ /* TODO chack against state table for illegal or unexpected message here*/\r
+\r
+ /* TODO - Set correct timer here */\r
+ Q931StartTimer(pTrunk, callIndex, 303);\r
+ if(iFrom == 4)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx32(pTrunk,buf,pMes->Size);\r
+ }\r
+ else if (iFrom ==2)\r
+ {\r
+ /* TODO Add proc here*/\r
+ ret = Q931Tx34(pTrunk,buf,pMes->Size);\r
+ }\r
+ return ret;\r
+}\r
+\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: Q931api.c\r
+\r
+ Contents: api (Application Programming Interface) functions.\r
+ See q931.h for description. \r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+#include "memory.h"\r
+\r
+/*\r
+L3INT Q931CreateMesIndex(L3INT mc)\r
+{\r
+ if(mc < 0 || mc > 127 )\r
+ return Q931E_INTERNAL;\r
+\r
+ if(Q931MesCount >127)\r
+ return Q931E_INTERNAL;\r
+\r
+ Q931MesIndex[mc] = Q931MesCount ++;\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+*/\r
+/*\r
+L3INT Q931CreateIEIndex(L3INT iec)\r
+{\r
+ if(iec < 0 || iec > 127 )\r
+ return Q931E_INTERNAL;\r
+\r
+ if(Q931IECount > 127)\r
+ return Q931E_INTERNAL;\r
+\r
+ Q931IEIndex[iec] = Q931IECount ++;\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+*/\r
+\r
+void Q931Api_InitTrunk(Q931_TrunkInfo *pTrunk)\r
+{\r
+ int y;\r
+ pTrunk->LastCRV = 0;\r
+ pTrunk->Dialect = 0; \r
+ pTrunk->Enabled = 0;\r
+ pTrunk->TrunkType = Q931_TrType_E1;\r
+ pTrunk->NetUser = Q931_TE;\r
+ pTrunk->TrunkState = 0;\r
+ for(y=0; y < Q931MAXCHPERTRUNK; y++)\r
+ {\r
+ pTrunk->ch[y].Available = 1;\r
+\r
+ /* Set up E1 scheme by default */\r
+ if(y==0)\r
+ {\r
+ pTrunk->ch[y].ChanType = Q931_ChType_Sync;\r
+ }\r
+ else if(y==16)\r
+ {\r
+ pTrunk->ch[y].ChanType = Q931_ChType_D;\r
+ }\r
+ else\r
+ {\r
+ pTrunk->ch[y].ChanType = Q931_ChType_B;\r
+ }\r
+ }\r
+\r
+ for(y=0; y < Q931MAXCALLPERTRUNK; y++)\r
+ {\r
+ pTrunk->call[y].InUse = 0;\r
+\r
+ }\r
+}\r
+\r
+void Q931SetMesProc(L3UCHAR mes, L3UCHAR dialect, \r
+ L3INT (*Q931ProcFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom),\r
+ L3INT (*Q931UmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size),\r
+ L3INT (*Q931PmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+)\r
+{\r
+ if(Q931ProcFunc != NULL)\r
+ Q931Proc[dialect][mes] = Q931ProcFunc;\r
+ if(Q931UmesFunc != NULL)\r
+ Q931Umes[dialect][mes] = Q931UmesFunc;\r
+ if(Q931PmesFunc != NULL)\r
+ Q931Pmes[dialect][mes] = Q931PmesFunc;\r
+}\r
+\r
+void Q931SetIEProc(L3UCHAR iec, L3UCHAR dialect, \r
+ L3INT (*Q931PieProc)(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet),\r
+ L3INT (*Q931UieProc)(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) \r
+)\r
+{\r
+ if(Q931PieProc != NULL)\r
+ Q931Pie[dialect][iec] = Q931PieProc;\r
+ if(Q931UieProc != NULL)\r
+ Q931Uie[dialect][iec] = Q931UieProc;\r
+}\r
+\r
+#define trampoline(x) {x * t = (x *)pm; s = &t->buf[0];}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931GetIEBuf\r
+\r
+ Description: Return a ptr to the buf used for IE in the message.\r
+\r
+*****************************************************************************/\r
+L3UCHAR * Q931GetIEBuf(L3UCHAR *pm)\r
+{\r
+ L3UCHAR * s=NULL;\r
+ Q931mes_Alerting * pMes= (Q931mes_Alerting *)pm;\r
+ switch(pMes->MesType)\r
+ {\r
+ case Q931mes_ALERTING :\r
+ trampoline(Q931mes_Alerting);\r
+ break;\r
+\r
+ case Q931mes_CALL_PROCEEDING :\r
+ trampoline(Q931mes_CallProceeding);\r
+ break;\r
+\r
+ case Q931mes_CONNECT : \r
+ trampoline(Q931mes_Connect);\r
+ break;\r
+\r
+ case Q931mes_CONNECT_ACKNOWLEDGE :\r
+ trampoline(Q931mes_ConnectAck);\r
+ break;\r
+\r
+ case Q931mes_PROGRESS :\r
+ trampoline(Q931mes_Progress);\r
+ break;\r
+\r
+ case Q931mes_SETUP :\r
+ trampoline(Q931mes_Setup);\r
+ break;\r
+\r
+ case Q931mes_SETUP_ACKNOWLEDGE :\r
+ trampoline(Q931mes_SetupAck);\r
+ break;\r
+\r
+ case Q931mes_RESUME :\r
+ trampoline(Q931mes_Resume);\r
+ break;\r
+\r
+ case Q931mes_RESUME_ACKNOWLEDGE :\r
+ trampoline(Q931mes_ResumeAck);\r
+ break;\r
+\r
+ case Q931mes_RESUME_REJECT :\r
+ trampoline(Q931mes_ResumeReject);\r
+ break;\r
+\r
+ case Q932mes_RETRIEVE :\r
+ trampoline(Q932mes_Retrieve);\r
+ break;\r
+\r
+ case Q932mes_RETRIEVE_ACKNOWLEDGE :\r
+ trampoline(Q932mes_RetrieveAck);\r
+ break;\r
+\r
+ case Q932mes_RETRIEVE_REJECT :\r
+ trampoline(Q932mes_RetrieveReject);\r
+ break;\r
+\r
+ case Q931mes_SUSPEND :\r
+ trampoline(Q931mes_Suspend);\r
+ break;\r
+\r
+ case Q931mes_SUSPEND_ACKNOWLEDGE :\r
+ trampoline(Q931mes_SuspendAck);\r
+ break;\r
+\r
+ case Q931mes_SUSPEND_REJECT :\r
+ trampoline(Q931mes_SuspendReject);\r
+ break;\r
+\r
+ case Q931mes_USER_INFORMATION :\r
+ trampoline(Q931mes_UserInformation);\r
+ break;\r
+\r
+ case Q931mes_DISCONNECT :\r
+ trampoline(Q931mes_Disconnect);\r
+ break;\r
+\r
+ case Q931mes_RELEASE :\r
+ trampoline(Q931mes_Release);\r
+ break;\r
+\r
+ case Q931mes_RELEASE_COMPLETE :\r
+ trampoline(Q931mes_ReleaseComplete);\r
+ break;\r
+\r
+ case Q931mes_RESTART :\r
+ trampoline(Q931mes_Restart);\r
+ break;\r
+\r
+ case Q931mes_RESTART_ACKNOWLEDGE :\r
+ trampoline(Q931mes_RestartAck);\r
+ break;\r
+\r
+ case Q931mes_CONGESTION_CONTROL :\r
+ trampoline(Q931mes_CongestionControl);\r
+ break;\r
+\r
+// case Q931mes_FACILITY :\r
+// trampoline(Q931mes_Facility);\r
+// break;\r
+\r
+ case Q931mes_INFORMATION :\r
+ trampoline(Q931mes_Information);\r
+ break;\r
+\r
+ case Q931mes_NOTIFY :\r
+ trampoline(Q931mes_Notify);\r
+ break;\r
+\r
+// case Q931mes_REGISTER :\r
+// trampoline(Q931mes_Register);\r
+// break;\r
+\r
+ case Q931mes_STATUS :\r
+ trampoline(Q931mes_Status);\r
+ break;\r
+\r
+ case Q931mes_STATUS_ENQUIRY :\r
+ trampoline(Q931mes_StatusEnquiry);\r
+ break;\r
+\r
+ case Q931mes_SEGMENT :\r
+ trampoline(Q931mes_Segment);\r
+ break;\r
+\r
+ default:\r
+ s = 0;\r
+ break;\r
+ }\r
+\r
+ return s;\r
+}\r
+\r
+L3INT Q931GetMesSize(L3UCHAR *pMes)\r
+{\r
+ \r
+ L3UCHAR *p = Q931GetIEBuf(pMes);\r
+ L3INT Size = (L3INT)(p - pMes);\r
+ return Size;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: q931AppendIE \r
+\r
+ Description: Append IE to the message.\r
+\r
+ Parameters: pm Ptr to message.\r
+ pi Ptr to information element\r
+\r
+ Return Value ie setting\r
+\r
+*****************************************************************************/\r
+\r
+ie Q931AppendIE( L3UCHAR *pm, L3UCHAR *pi)\r
+{\r
+ ie IE = 0;\r
+ Q931mes_Alerting * pMes= (Q931mes_Alerting *)pm;\r
+ Q931ie_BearerCap * pIE= (Q931ie_BearerCap *)pi;\r
+ L3INT iISize = pIE->Size;\r
+\r
+ L3UCHAR *pBuf = Q931GetIEBuf(pm);\r
+ L3INT Off = pMes->Size - (pBuf - pm);\r
+ IE = Off | 0x8000;\r
+\r
+ memcpy(&pm[pMes->Size], pi, iISize);\r
+\r
+ pMes->Size += iISize;\r
+\r
+ return IE;\r
+}\r
+\r
+/*****************************************************************************\r
+*****************************************************************************/\r
+L3INT Q931GetUniqueCRV(Q931_TrunkInfo *pTrunk)\r
+{\r
+ static L3INT crv={1};\r
+ return crv++;\r
+}\r
+\r
+L3INT Q931InitMesSetup(Q931mes_Setup *pMes)\r
+{\r
+ pMes->ProtDisc = 0x80;\r
+ pMes->CRV = 0; /* CRV to be allocated, might be receive*/\r
+ pMes->MesType = Q931mes_SETUP;\r
+\r
+ pMes->Size = Q931GetMesSize((L3UCHAR*)pMes);\r
+\r
+ pMes->SendComplete =0; /* Sending Complete */\r
+ pMes->RepeatInd =0; /* Repeat Indicator */\r
+ pMes->BearerCap =0; /* Bearer Capability */\r
+ pMes->ChanID =0; /* Channel ID */\r
+ pMes->ProgInd =0; /* Progress Indicator */\r
+ pMes->NetFac =0; /* Network-specific facilities */\r
+ pMes->Display =0; /* Display */\r
+ pMes->DateTime =0; /* Date/Time */\r
+ pMes->KeypadFac =0; /* Keypad Facility */\r
+ pMes->Signal =0; /* Signal */\r
+ pMes->CallingNum =0; /* Calling party number */\r
+ pMes->CallingSub =0; /* Calling party sub address */\r
+ pMes->CalledNum =0; /* Called party number */\r
+ pMes->CalledSub =0; /* Called party sub address */\r
+ pMes->TransNetSel =0; /* Transit network selection */\r
+ pMes->LLRepeatInd =0; /* Repeat Indicator 2 LLComp */\r
+ pMes->LLComp =0; /* Low layer compatibility */\r
+ pMes->HLComp =0; /* High layer compatibility */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitMesResume(Q931mes_Resume * pMes)\r
+{\r
+ pMes->ProtDisc = 0x80;\r
+ pMes->CRV = 0; /* CRV to be allocated, might be receive*/\r
+ pMes->MesType = Q931mes_RESUME;\r
+\r
+ pMes->Size = Q931GetMesSize((L3UCHAR*)pMes);\r
+ pMes->CallID = 0; /* Channel Identification */\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEBearerCap(Q931ie_BearerCap *pIE)\r
+{\r
+ pIE->IEId = Q931ie_BEARER_CAPABILITY;\r
+ pIE->Size = sizeof(Q931ie_BearerCap);\r
+ pIE->CodStand = 0;\r
+ pIE->ITC = 0;\r
+ pIE->TransMode = 0;\r
+ pIE->ITR = 0x10;\r
+ pIE->RateMul = 0;\r
+\r
+ pIE->Layer1Ident = 0;\r
+ pIE->UIL1Prot = 0; /* User Information Layer 1 Protocol */\r
+ pIE->SyncAsync = 0; /* Sync/Async */\r
+ pIE->Negot = 0; \r
+ pIE->UserRate = 0;\r
+ pIE->InterRate = 0; /* Intermediate Rate */\r
+ pIE->NIConTx = 0;\r
+ pIE->NIConRx = 0;\r
+ pIE->FlowCtlTx = 0; /* Flow control on Tx */\r
+ pIE->FlowCtlRx = 0; /* Flow control on Rx */\r
+ pIE->HDR = 0;\r
+ pIE->MultiFrame = 0; /* Multi frame support */\r
+ pIE->Mode = 0;\r
+ pIE->LLInegot = 0;\r
+ pIE->Assignor = 0; /* Assignor/assignee */\r
+ pIE->InBandNeg = 0; /* In-band/out-band negot. */\r
+ pIE->NumStopBits = 0; /* Number of stop bits */\r
+ pIE->NumDataBits = 0; /* Number of data bits. */\r
+ pIE->Parity = 0;\r
+ pIE->DuplexMode = 0;\r
+ pIE->ModemType = 0;\r
+ pIE->Layer2Ident = 0;\r
+ pIE->UIL2Prot = 0; /* User Information Layer 2 Protocol */\r
+ pIE->Layer3Ident = 0; \r
+ pIE->UIL3Prot = 0; /* User Information Layer 3 Protocol */\r
+ pIE->AL3Info1 = 0;\r
+ pIE->AL3Info2 = 0;\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEChanID(Q931ie_ChanID *pIE)\r
+{\r
+ pIE->IEId = Q931ie_CHANNEL_IDENTIFICATION;\r
+ pIE->Size = sizeof(Q931ie_ChanID);\r
+ pIE->IntIDPresent = 0; /* Int. id. present */\r
+ pIE->IntType = 0; /* Int. type */\r
+ pIE->PrefExcl = 0; /* Pref./Excl. */\r
+ pIE->DChanInd = 0; /* D-channel ind. */\r
+ pIE->InfoChanSel = 0; /* Info. channel selection */\r
+ pIE->InterfaceID = 0; /* Interface identifier */\r
+ pIE->CodStand = 0; /* Code standard */\r
+ pIE->NumMap = 0; /* Number/Map */\r
+ pIE->ChanMapType = 0; /* Channel type/Map element type */\r
+ pIE->ChanSlot = 0; /* Channel number/Slot map */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEProgInd(Q931ie_ProgInd * pIE)\r
+{\r
+ pIE->IEId = Q931ie_PROGRESS_INDICATOR;\r
+ pIE->Size = sizeof(Q931ie_ProgInd);\r
+ pIE->CodStand = 0; /* Coding standard */\r
+ pIE->Location = 0; /* Location */\r
+ pIE->ProgDesc = 0; /* Progress description */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIENetFac(Q931ie_NetFac * pIE)\r
+{\r
+ pIE->IEId = Q931ie_NETWORK_SPECIFIC_FACILITIES;\r
+ pIE->Size = sizeof(Q931ie_NetFac);\r
+ pIE->LenNetID = 0; /* Length of network facilities id. */\r
+ pIE->TypeNetID = 0; /* Type of network identification */\r
+ pIE->NetIDPlan = 0; /* Network identification plan. */\r
+ pIE->NetFac = 0; /* Network specific facility spec. */\r
+ pIE->NetID[0] = 0;\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEDisplay(Q931ie_Display * pIE)\r
+{\r
+ pIE->IEId = Q931ie_DISPLAY;\r
+ pIE->Size = sizeof(Q931ie_Display);\r
+ pIE->Display[0] = 0;\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEDateTime(Q931ie_DateTime * pIE)\r
+{\r
+ pIE->IEId = Q931ie_DATETIME;\r
+ pIE->Size = sizeof(Q931ie_DateTime);\r
+ pIE->Year = 0; /* Year */\r
+ pIE->Month = 0; /* Month */\r
+ pIE->Day = 0; /* Day */\r
+ pIE->Hour = 0; /* Hour */\r
+ pIE->Minute = 0; /* Minute */\r
+ pIE->Second = 0; /* Second */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEKeypadFac(Q931ie_KeypadFac * pIE)\r
+{\r
+ pIE->IEId = Q931ie_KEYPAD_FACILITY;\r
+ pIE->Size = sizeof(Q931ie_KeypadFac);\r
+ pIE->KeypadFac[0] = 0;\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIESignal(Q931ie_Signal * pIE)\r
+{\r
+ pIE->IEId = Q931ie_SIGNAL;\r
+ pIE->Size = sizeof(Q931ie_Signal);\r
+ pIE->Signal = 0;\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIECallingNum(Q931ie_CallingNum * pIE)\r
+{\r
+ pIE->IEId = Q931ie_CALLING_PARTY_NUMBER;\r
+ pIE->Size = sizeof(Q931ie_CallingNum);\r
+ pIE->TypNum = 0; /* Type of number */\r
+ pIE->NumPlanID = 0; /* Numbering plan identification */\r
+ pIE->PresInd = 0; /* Presentation indicator */\r
+ pIE->ScreenInd = 0; /* Screening indicator */\r
+ pIE->Digit[0] = 0; /* Number digits (IA5) */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIECallingSub(Q931ie_CallingSub * pIE)\r
+{\r
+ pIE->IEId = Q931ie_CALLING_PARTY_SUBADDRESS;\r
+ pIE->Size = sizeof(Q931ie_CallingSub);\r
+ pIE->TypNum = 0; /* Type of subaddress */\r
+ pIE->OddEvenInd = 0; /* Odd/Even indicator */\r
+ pIE->Digit[0] = 0; /* Digits */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIECalledNum(Q931ie_CalledNum * pIE)\r
+{\r
+ pIE->IEId = Q931ie_CALLED_PARTY_NUMBER;\r
+ pIE->Size = sizeof(Q931ie_CalledNum);\r
+ pIE->TypNum = 0; /* Type of Number */\r
+ pIE->NumPlanID = 0; /* Numbering plan identification */\r
+ pIE->Digit[0] = 0; /* Digit (IA5) */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIECalledSub(Q931ie_CalledSub * pIE)\r
+{\r
+ pIE->IEId = Q931ie_CALLED_PARTY_SUBADDRESS;\r
+ pIE->Size = sizeof(Q931ie_CalledSub);\r
+ pIE->TypNum = 0; /* Type of subaddress */\r
+ pIE->OddEvenInd = 0; /* Odd/Even indicator */\r
+ pIE->Digit[0] = 0; /* Digits */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIETransNetSel(Q931ie_TransNetSel * pIE)\r
+{\r
+ pIE->IEId = Q931ie_TRANSIT_NETWORK_SELECTION;\r
+ pIE->Size = sizeof(Q931ie_TransNetSel);\r
+ pIE->Type = 0; /* Type of network identifier */\r
+ pIE->NetIDPlan = 0; /* Network idetification plan */\r
+ pIE->NetID[0] = 0; /* Network identification(IA5) */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIELLComp(Q931ie_LLComp * pIE)\r
+{\r
+ pIE->IEId = Q931ie_LOW_LAYER_COMPATIBILITY;\r
+ pIE->Size = sizeof(Q931ie_LLComp);\r
+\r
+ pIE->CodStand = 0; /* Coding standard */\r
+ pIE->ITransCap = 0; /* Information transfer capability */\r
+ pIE->NegotInd = 0; /* Negot indic. */\r
+ pIE->TransMode = 0; /* Transfer Mode */\r
+ pIE->InfoRate = 0; /* Information transfer rate */\r
+ pIE->RateMul = 0; /* Rate multiplier */\r
+ pIE->Layer1Ident = 0; /* Layer 1 ident. */\r
+ pIE->UIL1Prot = 0; /* User information layer 1 protocol */\r
+ pIE->SyncAsync = 0; /* Synch/asynch */\r
+ pIE->Negot = 0; /* Negot */\r
+ pIE->UserRate = 0; /* User rate */\r
+ pIE->InterRate = 0; /* Intermediate rate */\r
+ pIE->NIConTx = 0; /* NIC on Tx */\r
+ pIE->NIConRx = 0; /* NIC on Rx */\r
+ pIE->FlowCtlTx = 0; /* Flow control on Tx */\r
+ pIE->FlowCtlRx = 0; /* Flow control on Rx */\r
+ pIE->HDR = 0; /* Hdr/no hdr */\r
+ pIE->MultiFrame = 0; /* Multiframe */\r
+ pIE->ModeL1 = 0; /* Mode L1 */\r
+ pIE->NegotLLI = 0; /* Negot. LLI */\r
+ pIE->Assignor = 0; /* Assignor/Assignor ee */\r
+ pIE->InBandNeg = 0; /* In-band negot. */\r
+ pIE->NumStopBits = 0; /* Number of stop bits */\r
+ pIE->NumDataBits = 0; /* Number of data bits */\r
+ pIE->Parity = 0; /* Parity */\r
+ pIE->DuplexMode = 0; /* Duplex Mode */\r
+ pIE->ModemType = 0; /* Modem type */\r
+ pIE->Layer2Ident = 0; /* Layer 2 ident. */\r
+ pIE->UIL2Prot = 0; /* User information layer 2 protocol */\r
+ pIE->ModeL2 = 0; /* ModeL2 */\r
+ pIE->Q933use = 0; /* Q.9333 use */\r
+ pIE->UsrSpcL2Prot = 0; /* User specified layer 2 protocol info */\r
+ pIE->WindowSize = 0; /* Window size (k) */\r
+ pIE->Layer3Ident = 0; /* Layer 3 ident */\r
+ pIE->OptL3Info = 0; /* Optional layer 3 protocol info. */\r
+ pIE->ModeL3 = 0; /* Mode of operation */\r
+// pIE->ModeX25op = 0; /* Mode of operation X.25 */\r
+ pIE->DefPackSize = 0; /* Default packet size */\r
+ pIE->PackWinSize = 0; /* Packet window size */\r
+ pIE->AddL3Info = 0; /* Additional Layer 3 protocol info */\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931InitIEHLComp(Q931ie_HLComp * pIE)\r
+{\r
+ pIE->IEId = Q931ie_HIGH_LAYER_COMPATIBILITY;\r
+ pIE->Size = sizeof(Q931ie_HLComp);\r
+\r
+ return 0;\r
+}\r
+\r
+L3INT Q931ProcUnknownMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom)\r
+{\r
+ return 0;\r
+}\r
+\r
+L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom)\r
+{\r
+ return 0;\r
+}\r
+\r
+L3INT Q931Disconnect(Q931_TrunkInfo *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause)\r
+{\r
+ return 0;\r
+}\r
+\r
+L3INT Q931ReleaseComplete(Q931_TrunkInfo *pTrunk, L3INT iTo)\r
+{\r
+ return 0;\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: Q931ie.c\r
+\r
+ Contents: Information Element Pack/Unpack functions. \r
+ \r
+ These functions will pack out a Q931 message from the bit \r
+ packed original format into structs that are easier to process \r
+ and pack the same structs back into bit fields when sending\r
+ messages out.\r
+\r
+ The messages contains a short for each possible IE. The MSB \r
+ bit flags the precense of an IE, while the remaining bits \r
+ are the offset into a buffer to find the actual IE.\r
+\r
+ Each IE are supported by 3 functions:\r
+\r
+ Q931Pie_XXX Pack struct into Q.931 IE\r
+ Q931Uie_XXX Unpack Q.931 IE into struct\r
+ Q931InitIEXXX Initialize IE (see Q931api.c).\r
+\r
+ Dialect Note: This file will only contain standard DSS1 IE. Other IE as \r
+ used in QSIG, NI2, Q.932 etc are located in separate files.\r
+\r
+ See q931.h for description. \r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: Q931MoreIE\r
+\r
+ Description: Local helper macro detecting if there is more IE space left\r
+ based on the 3 standard parameters Octet, Off and IESpace.\r
+ This can be used to test if the IE is completed to avoid\r
+ that the header of the next IE is interpreted as a part of\r
+ the current IE.\r
+\r
+*****************************************************************************/\r
+#define Q931MoreIE() (Octet+Off - 2 < IESize)\r
+\r
+#define Q931IESizeTest(x) {\\r
+ if(Octet+Off-2 != IESize)\\r
+ {\\r
+ Q931SetError(pTrunk,x, Octet, Off);\\r
+ return x;\\r
+ }\\r
+ }\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931ReadExt\r
+\r
+ Description: Many of the octets in the standard have an MSB 'ext.1'. This\r
+ means that the octet usually is the latest octet, but that a\r
+ futhure standard may extend the octet. A stack must be able \r
+ to handle such extensions by skipping the extension octets.\r
+\r
+ This function will increase the offset counter with 1 for \r
+ each octet with an MSB of zero. This will allow the stack to\r
+ skip extensions wihout knowing anything about them.\r
+\r
+ Parameters: IBuf ptr to octet array.\r
+ Off Starting offset counter\r
+\r
+ Return Value: New offset value.\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931ReadExt(L3UCHAR * IBuf, L3INT Off)\r
+{\r
+ L3INT c =0;\r
+ while((IBuf[c] & 0x80) == 0)\r
+ c++;\r
+\r
+ return Off + c;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_BearerCap\r
+\r
+ Description: Unpack a bearer capability ie.\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931Uie_BearerCap(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) \r
+{\r
+ Q931ie_BearerCap * pie = (Q931ie_BearerCap*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->CodStand = ieGetOctet((IBuf[Octet] & 0x60) >> 5);\r
+ pie->ITC = ieGetOctet(IBuf[Octet] & 0x1f);\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Octet++;\r
+\r
+ /* Octet 4 */\r
+ pie->TransMode = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);\r
+ pie->ITR = ieGetOctet(IBuf[Octet+Off] & 0x1f);\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Octet++;\r
+\r
+ /* Octet 4.1. Rate multiplier is only present if ITR = Multirate */\r
+ if(pie->ITR == 0x18)\r
+ {\r
+ pie->RateMul = ieGetOctet(IBuf[Octet+Off] & 0x7f);\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Off ++;\r
+ }\r
+\r
+ /* Octet 5 */\r
+ if((IBuf[Octet+Off] & 0x60) == 0x20 && Q931MoreIE())\r
+ {\r
+ pie->Layer1Ident = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);\r
+ pie->UIL1Prot = ieGetOctet(IBuf[Octet+Off] & 0x1f);\r
+ Octet++;\r
+\r
+ /* Octet 5a. The octet may be present if ITC is unrestrictd digital info*/\r
+ /* and UIL1Prot is either V.110, I.460 and X.30 or V.120. It may also */\r
+ /* be present if ITC = 3.1 kHz audio and UIL1Prot is G.711. */\r
+ /* Bit 8 of Octet 5 = 0 indicates that 5a is present. */\r
+\r
+ if(IsQ931Ext(IBuf[Octet+Off-1]))\r
+ {\r
+ if(((pie->ITC == 0x08) && (pie->UIL1Prot == 0x01 || pie->UIL1Prot == 0x08))\r
+ || ((pie->ITC == 0x10) && (pie->UIL1Prot == 0x02 || pie->UIL1Prot == 0x03)))\r
+ {\r
+ pie->SyncAsync = ieGetOctet((IBuf[Octet+Off] & 0x40) >> 6);\r
+ pie->Negot = ieGetOctet((IBuf[Octet+Off] & 0x20) >> 5);\r
+ pie->UserRate = ieGetOctet(IBuf[Octet+Off] & 0x1f);\r
+ Off ++;\r
+ }\r
+ else\r
+ {\r
+ /* We have detected bit 8 = 0, but no setting that require the */\r
+ /* additional octets ??? */\r
+ Q931SetError(pTrunk, Q931E_BEARERCAP, 5,Off);\r
+ return Q931E_BEARERCAP;\r
+ }\r
+\r
+ /* Octet 5b. Two different structures used. */\r
+ if(IsQ931Ext(IBuf[Octet+Off-1]))\r
+ {\r
+ if(pie->UIL1Prot == 0x01) /* ITU V.110, I.460 and X.30 */\r
+ {\r
+ pie->InterRate = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);\r
+ pie->NIConTx = ieGetOctet((IBuf[Octet+Off] & 0x10) >> 4);\r
+ pie->NIConRx = ieGetOctet((IBuf[Octet+Off] & 0x08) >> 3);\r
+ pie->FlowCtlTx = ieGetOctet((IBuf[Octet+Off] & 0x04) >> 2);\r
+ pie->FlowCtlRx = ieGetOctet((IBuf[Octet+Off] & 0x20) >> 1);\r
+ Off++;\r
+ }\r
+ else if(pie->UIL1Prot == 0x08) /* ITU V.120 */\r
+ {\r
+ pie->HDR = ieGetOctet((IBuf[Octet+Off] & 0x40) >> 6);\r
+ pie->MultiFrame = ieGetOctet((IBuf[Octet+Off] & 0x20) >> 5);\r
+ pie->Mode = ieGetOctet((IBuf[Octet+Off] & 0x10) >> 4);\r
+ pie->LLInegot = ieGetOctet((IBuf[Octet+Off] & 0x08) >> 3);\r
+ pie->Assignor = ieGetOctet((IBuf[Octet+Off] & 0x04) >> 2);\r
+ pie->InBandNeg = ieGetOctet((IBuf[Octet+Off] & 0x02) >> 1);\r
+ Off++;\r
+ }\r
+ else\r
+ {\r
+ Q931SetError(pTrunk,Q931E_BEARERCAP, 5,Off);\r
+ return Q931E_BEARERCAP;\r
+\r
+ }\r
+\r
+ /* Octet 5c */\r
+ if(IsQ931Ext(IBuf[Octet+Off-1]))\r
+ {\r
+\r
+ pie->NumStopBits = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);\r
+ pie->NumDataBits = ieGetOctet((IBuf[Octet+Off] & 0x18) >> 3);\r
+ pie->Parity = ieGetOctet(IBuf[Octet+Off] & 0x07);\r
+ Off++;\r
+\r
+ /* Octet 5d */\r
+ if(IsQ931Ext(IBuf[Octet+Off-1]))\r
+ {\r
+\r
+ pie->DuplexMode = ieGetOctet((IBuf[Octet+Off] & 0x40) >> 6);\r
+ pie->ModemType = ieGetOctet(IBuf[Octet+Off] & 0x3f);\r
+ Off ++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Octet 6 */\r
+ if((IBuf[Octet+Off] & 0x60) == 0x40 && Q931MoreIE())\r
+ {\r
+ pie->Layer2Ident = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);\r
+ pie->UIL2Prot = ieGetOctet(IBuf[Octet+Off] & 0x1f);\r
+\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Octet ++;\r
+ }\r
+\r
+ /* Octet 7 */\r
+ if((IBuf[Octet+Off] & 0x60) == 0x60 && Q931MoreIE()) \r
+ {\r
+ pie->Layer3Ident = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);\r
+ pie->UIL3Prot = ieGetOctet(IBuf[Octet+Off] & 0x1f);\r
+ Octet++;\r
+\r
+ /* Octet 7a */\r
+ if(IsQ931Ext(IBuf[Octet+Off-1]))\r
+ {\r
+ if(pie->UIL3Prot == 0x0c)\r
+ {\r
+ pie->AL3Info1 = ieGetOctet(IBuf[Octet+Off] & 0x0f);\r
+ Off++;\r
+\r
+ /* Octet 7b */\r
+ if(IsQ931Ext(IBuf[Octet+Off]))\r
+ {\r
+ pie->AL3Info2 = ieGetOctet(IBuf[Octet+Off] & 0x0f);\r
+ Off++;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Q931SetError(pTrunk,Q931E_BEARERCAP, 7, Off);\r
+ return Q931E_BEARERCAP;\r
+\r
+ }\r
+ }\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_BEARERCAP);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_BearerCap);\r
+ pie->Size = sizeof(Q931ie_BearerCap);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_BearerCap\r
+\r
+ Description: Packing a Q.931 Bearer Capability element from a generic \r
+ struct into a packed octet structure in accordance with the\r
+ standard.\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931Pie_BearerCap(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_BearerCap * pIE = (Q931ie_BearerCap*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;/* remember current offset */\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_BEARER_CAPABILITY ;\r
+ li=(*Octet)++; /* remember length position */\r
+\r
+ /* Octet 3 - Coding standard / Information transfer capability */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->CodStand<<5) | (pIE->ITR & 0x1f);\r
+\r
+ /* Octet 4 - Transfer mode / Information transfer rate */\r
+ if(pIE->ITR == 0x18)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TransMode<<5) | (pIE->ITR & 0x1f);\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)++] = 0x00 | (pIE->TransMode<<5) | (pIE->ITR & 0x1f);\r
+\r
+ /* Octet 4.1 - Rate Multiplier */\r
+ OBuf[(*Octet)++] = 0x80 | pIE->RateMul;\r
+ }\r
+\r
+ /* Octet 5 - Layer 1 Ident / User information layer 1 protocol*/\r
+ if(pIE->Layer1Ident == 0x01)\r
+ {\r
+ if(((pIE->ITC == 0x08) && (pIE->UIL1Prot == 0x01 || pIE->UIL1Prot == 0x08))\r
+ || ((pIE->ITC == 0x10) && (pIE->UIL1Prot == 0x02 || pIE->UIL1Prot == 0x03)))\r
+ {\r
+ OBuf[(*Octet)++] = 0x00 | (pIE->Layer1Ident<<5) | (pIE->UIL1Prot & 0x15);\r
+ \r
+ /* Octet 5a - SyncAsync/Negot/UserRate */\r
+ OBuf[(*Octet)++] = 0x00 | (pIE->SyncAsync<<6) | (pIE->Negot<<5) | (pIE->UserRate&0x1f);\r
+\r
+ /* Octet 5b - one of two types */\r
+ if(pIE->UIL1Prot == 0x01) /* ITU V.110, I.460 and X.30 */\r
+ {\r
+ /* Octet 5b - Intermed rate/ Nic on Tx/Nix on Rx/FlowCtlTx/FlowCtlRx */\r
+ OBuf[(*Octet)++] = 0x00 \r
+ | (pIE->InterRate<<6)\r
+ | (pIE->NIConTx << 4)\r
+ | (pIE->NIConRx << 3)\r
+ | (pIE->FlowCtlTx << 2)\r
+ | (pIE->FlowCtlRx << 1);\r
+ }\r
+ else if(pIE->UIL1Prot == 0x08) /* ITU V.120 */\r
+ {\r
+ /* Octet 5b - HDR/Multiframe/Mode/LLINegot/Assignor/Inbandneg*/\r
+ OBuf[(*Octet)++] = 0x00\r
+ | (pIE->InterRate << 6)\r
+ | (pIE->MultiFrame << 5)\r
+ | (pIE->Mode << 4)\r
+ | (pIE->LLInegot << 3)\r
+ | (pIE->Assignor << 2)\r
+ | (pIE->InBandNeg << 1);\r
+ }\r
+\r
+ /* Octet 5c - NumStopBits/NumStartBits/Parity */\r
+ OBuf[(*Octet)++] = 0x00 \r
+ | (pIE->NumStopBits << 5 )\r
+ | (pIE->NumDataBits << 3 )\r
+ | (pIE->Parity);\r
+\r
+ /* Octet 5d - Duplex Mode/Modem Type */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->DuplexMode<<6) | (pIE->ModemType);\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->Layer1Ident<<5) | (pIE->UIL1Prot & 0x15);\r
+ }\r
+ }\r
+\r
+ /* Octet 6 - Layer2Ident/User information layer 2 prtocol */\r
+ if(pIE->Layer2Ident == 0x02)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->Layer2Ident<<5) | (pIE->UIL2Prot);\r
+ }\r
+\r
+ /* Octet 7 - Layer 3 Ident/ User information layer 3 protocol */\r
+ if(pIE->Layer3Ident == 0x03)\r
+ {\r
+ if(pIE->UIL3Prot == 0x0c)\r
+ {\r
+ OBuf[(*Octet)++] = 0x00 | (pIE->Layer3Ident<<5) | (pIE->UIL3Prot);\r
+\r
+ /* Octet 7a - Additional information layer 3 msb */\r
+ OBuf[(*Octet)++] = 0x00 | (pIE->AL3Info1);\r
+\r
+ /* Octet 7b - Additional information layer 3 lsb */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->AL3Info2);\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->Layer3Ident<<5) | (pIE->UIL3Prot);\r
+ }\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CallID\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CallID(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_CallID * pie = (Q931ie_CallID*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x=0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ do{\r
+ pie->CallId[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ x++;\r
+ }while(IBuf[Octet+Off]&0x80 != 0 && x < 10);\r
+\r
+ Q931IESizeTest(Q931E_CALLID);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CallID) + x -1;\r
+ pie->Size = sizeof(Q931ie_CallID) + x -1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CallID\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931Pie_CallID(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CallID * pIE = (Q931ie_CallID*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;/* remember current offset */\r
+ L3INT li;\r
+ L3INT sCI = pIE->Size - sizeof(Q931ie_CallID) + 1;\r
+ L3INT x;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_CALL_IDENTITY ;\r
+ li=(*Octet)++; /* remember length position */\r
+\r
+ for(x=0;x < sCI; x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->CallId[x];\r
+ }\r
+\r
+ OBuf[(*Octet)-1] |= 0x80; /* set complete flag at last octet*/\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CallState\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CallState(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_CallState * pie = (Q931ie_CallState*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+\r
+ /* Octet 3 */\r
+ pie->CodStand = (IBuf[Octet+Off] >> 6) & 0x03;\r
+ pie->CallState= IBuf[Octet+Off] & 0x3f;\r
+\r
+ Octet++;\r
+\r
+ Q931IESizeTest(Q931E_CALLSTATE);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CallState);\r
+ pie->Size = sizeof(Q931ie_CallState);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CallState\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_CallState(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CallState * pIE = (Q931ie_CallState*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;/* remember current offset */\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_CALL_STATE;\r
+ li=(*Octet)++; /* remember length position */\r
+\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->CodStand<<6) | pIE->CallState;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CalledSub\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CalledSub(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_CalledSub * pie = (Q931ie_CalledSub*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;\r
+ pie->OddEvenInd = (IBuf[Octet+Off] >> 3) & 0x01;\r
+ Octet ++;\r
+ \r
+ /* Octet 4 */\r
+ x=0;\r
+ do{\r
+ pie->Digit[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ x++;\r
+ }while(IBuf[Octet+Off]&0x80 != 0 && x < 20);\r
+\r
+ Q931IESizeTest(Q931E_CALLEDSUB);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CalledSub) + x - 1;\r
+ pie->Size = sizeof(Q931ie_CalledSub) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CalledSub\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_CalledSub(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CalledSub * pIE = (Q931ie_CalledSub*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT sN = pIE->Size - sizeof(Q931ie_CalledSub) + 1;\r
+ L3INT x;\r
+\r
+ /* Octet 1 */\r
+ OBuf[(*Octet)++] = Q931ie_CALLED_PARTY_SUBADDRESS;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);\r
+ \r
+ /* Octet 4 */\r
+ for(x=0;x<sN;x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Digit[x];\r
+ }\r
+\r
+ OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CalledNum\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CalledNum(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_CalledNum * pie = (Q931ie_CalledNum*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x;\r
+ L3INT IESize; /* # digits in this case */\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;\r
+ pie->NumPlanID = IBuf[Octet+Off] & 0x0f;\r
+ Octet ++;\r
+ \r
+ /* Octet 4*/\r
+ for (x = 0; x < IESize && x < 20; x++)\r
+ {\r
+ pie->Digit[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CalledNum) + x - 1;\r
+ pie->Size = sizeof(Q931ie_CalledNum) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CalledNum\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_CalledNum(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CalledSub * pIE = (Q931ie_CalledSub*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT sN = pIE->Size - sizeof(Q931ie_CalledSub) + 1;\r
+ L3INT x;\r
+\r
+ /* Octet 1 */\r
+ OBuf[(*Octet)++] = Q931ie_CALLED_PARTY_NUMBER;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);\r
+ \r
+ /* Octet 4 */\r
+ for(x=0;x<sN;x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Digit[x];\r
+ }\r
+\r
+ OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CallingNum\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CallingNum(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_CallingNum * pie = (Q931ie_CallingNum*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;\r
+ pie->NumPlanID = IBuf[Octet+Off] & 0x0f;\r
+ \r
+ /* Octet 3a */\r
+ if(IBuf[Octet+Off] & 0x80 != 0)\r
+ {\r
+ Off++;\r
+ pie->PresInd = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->ScreenInd = IBuf[Octet+Off] & 0x03;\r
+ }\r
+ Octet++;\r
+\r
+ /* Octet 4a*/\r
+ x=0;\r
+ do{\r
+ pie->Digit[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ x++;\r
+ }while(IBuf[Octet+Off]&0x80 != 0 && x < 20);\r
+\r
+ Q931IESizeTest(Q931E_CALLINGNUM);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CallingNum) + x - 1;\r
+ pie->Size = sizeof(Q931ie_CallingNum) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CallingNum\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_CallingNum(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CallingSub * pIE = (Q931ie_CallingSub*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT sN = pIE->Size - sizeof(Q931ie_CalledSub) + 1;\r
+ L3INT x;\r
+\r
+ /* Octet 1 */\r
+ OBuf[(*Octet)++] = Q931ie_CALLING_PARTY_SUBADDRESS;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);\r
+ \r
+ /* Octet 3a */\r
+ /*\r
+\r
+ Details about the use and how to detect if Octet 3a is used\r
+ are very weak. Temp left out.\r
+\r
+ Octet 3 msb is set to 1 to indicate that this is not present\r
+\r
+ */\r
+\r
+ /* Octet 4 */\r
+ for(x=0;x<sN;x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Digit[x];\r
+ }\r
+\r
+ OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CallingSub\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CallingSub(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_CallingSub * pie = (Q931ie_CallingSub*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;\r
+ pie->OddEvenInd = (IBuf[Octet+Off] >> 3) & 0x01;\r
+ Octet ++;\r
+ \r
+ /* Octet 4*/\r
+ x=0;\r
+ do{\r
+ pie->Digit[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ x++;\r
+ }while(IBuf[Octet+Off]&0x80 != 0 && x < 20);\r
+\r
+ Q931IESizeTest(Q931E_CALLINGSUB);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CallingSub) + x -1;\r
+ pie->Size = sizeof(Q931ie_CallingSub) + x -1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CallingSub\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_CallingSub(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CallingSub * pIE = (Q931ie_CallingSub*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT sN = pIE->Size - sizeof(Q931ie_CallingSub) + 1;\r
+ L3INT x;\r
+\r
+ /* Octet 1 */\r
+ OBuf[(*Octet)++] = Q931ie_CALLING_PARTY_SUBADDRESS;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);\r
+ \r
+ /* Octet 4 */\r
+ for(x=0;x<sN;x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Digit[x];\r
+ }\r
+\r
+ OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_Cause\r
+ \r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_Cause(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) \r
+{\r
+ Q931ie_Cause * pie = (Q931ie_Cause*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2*/\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3*/\r
+ pie->CodStand = (IBuf[Octet+Off]>>5) & 0x03;\r
+ pie->Location = IBuf[Octet+Off] & 0x0f;\r
+\r
+ /* Octet 3a */\r
+ if(IBuf[Octet+Off] & 0x80 != 0)\r
+ {\r
+ Off++;\r
+ pie->Recom = IBuf[Octet+Off] & 0x7f;\r
+ }\r
+ Octet++;\r
+\r
+ /* Octet 4 */\r
+ pie->Value = IBuf[Octet+Off] & 0x7f;\r
+\r
+ Q931IESizeTest(Q931E_CAUSE);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_Cause);\r
+ pie->Size = sizeof(Q931ie_Cause);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_Cause\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_Cause(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_Cause * pIE = (Q931ie_Cause*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_CAUSE;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->CodStand<<5) | pIE->Location;\r
+\r
+ /* Octet 3a - currently not supported in send */\r
+\r
+ /* Octet 4 */\r
+ OBuf[(*Octet)++] = 0x80 | pIE->Value;\r
+\r
+ /* Octet 5 - diagnostics not supported in send */\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CongLevel\r
+ \r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_CongLevel(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) \r
+{\r
+ Q931ie_CongLevel *pie = (Q931ie_CongLevel*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet] & 0xf0;\r
+ pie->CongLevel = IBuf[Octet] & 0x0f;\r
+ Octet ++;\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_CongLevel);\r
+ pie->Size = sizeof(Q931ie_CongLevel);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_CongLevel\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_CongLevel(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_CongLevel * pIE = (Q931ie_CongLevel*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_CONGESTION_LEVEL | pIE->CongLevel;\r
+ \r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_ChanID\r
+\r
+ Parameters: IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_ChanID(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_ChanID * pie = (Q931ie_ChanID*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ /* Octet 1 */\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->IntIDPresent = (IBuf[Octet] >> 6) & 0x01;\r
+ pie->IntType = (IBuf[Octet] >> 5) & 0x01;\r
+ pie->PrefExcl = (IBuf[Octet] >> 3) & 0x01;\r
+ pie->DChanInd = (IBuf[Octet] >> 2) & 0x01;\r
+ pie->InfoChanSel = IBuf[Octet] & 0x03;\r
+\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Octet++;\r
+\r
+ /* Octet 3.1 */\r
+\r
+ if(pie->IntIDPresent)\r
+ {\r
+ pie->InterfaceID = IBuf[Octet+Off] & 0x7f;\r
+\r
+ /* Temp fix. Interface id can be extended using the extension bit */\r
+ /* this will read the octets, but do nothing with them. this is done */\r
+ /* because the usage of this field is a little unclear */\r
+ /* 30.jan.2001/JVB */\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Off++;\r
+ }\r
+ else\r
+ {\r
+ /* Octet 3.2 */\r
+ if(pie->IntType == 1) /* PRI etc */\r
+ {\r
+ pie->CodStand = (IBuf[Octet + Off] >> 5) & 0x03;\r
+ pie->NumMap = (IBuf[Octet + Off] >> 4) & 0x01;\r
+ pie->ChanMapType= IBuf[Octet + Off] & 0x0f;\r
+\r
+ Off ++;\r
+\r
+\r
+ /* Octet 3.3 */\r
+ /* Temp fix. Assume B channel. H channels not supported */\r
+ pie->ChanSlot = IBuf[Octet+Off] & 0x7f;\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Off++;\r
+ }\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_CHANID);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_BearerCap);\r
+ pie->Size = sizeof(Q931ie_BearerCap);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_ChanID\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_ChanID(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_ChanID * pIE = (Q931ie_ChanID*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;/* remember current offset */\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_CHANNEL_IDENTIFICATION;\r
+ li=(*Octet)++; /* remember length position */\r
+\r
+ /* Octet 3 flags & BRI chan # */\r
+ OBuf[(*Octet)++] = 0x80 \r
+ | (pIE->IntIDPresent << 6) \r
+ | (pIE->IntType<<5)\r
+ | (pIE->PrefExcl<<3) \r
+ | pIE->InfoChanSel;\r
+\r
+ /* Octet 3.1 - Interface Identifier */\r
+ if(pIE->IntIDPresent)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | pIE->InterfaceID;\r
+ }\r
+ else\r
+ {\r
+ /* Octet 3.2 & 3.3 - PRI */\r
+ if(pIE->IntType == 1)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80\r
+ | (pIE->CodStand << 5)\r
+ | (pIE->NumMap << 4)\r
+ | pIE->ChanMapType;\r
+\r
+ /* Octet 3.2 Channel number/slot map */\r
+ OBuf[(*Octet)++] = 0x80 | pIE->ChanSlot;\r
+ }\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_CRV\r
+\r
+ Description: Reading CRV. \r
+\r
+ The CRV is currently returned in the return value that \r
+ Q921Rx23 will assign to the CRV field in the unpacked\r
+ message. CRV is basically 2 bytes etc, but the spec allows\r
+ the use of longer CRV values.\r
+ \r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: CRV\r
+\r
+*****************************************************************************/\r
+L3USHORT Q931Uie_CRV(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ L3INT Octet = *IOff;\r
+ L3INT l = IBuf[Octet]; \r
+ L3USHORT CRV;\r
+ Octet++; /*Octet 2 is length indicator */\r
+\r
+ if(l == 1) /* One octet CRV */\r
+ {\r
+ CRV = IBuf[Octet];\r
+ Octet++;\r
+ }\r
+ else if(l==2) /* two octet CRV */\r
+ {\r
+ CRV = IBuf[Octet] << 8;\r
+ CRV += IBuf[Octet+1];\r
+ Octet += 2;\r
+ }\r
+ else\r
+ {\r
+ /* Long CRV is not used, so we skip this */\r
+ Octet+=l;\r
+ }\r
+\r
+ *IOff = Octet;\r
+ return CRV;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_DateTime\r
+\r
+ Parameters: pTrunk [IN] Ptr to trunk information.\r
+ pIE [OUT] ptr to Information Element id.\r
+ IBuf [IN] ptr to a packed ie.\r
+ OBuf [OUT] ptr to buffer for Unpacked ie.\r
+ IOff [IN\OUT] Input buffer offset\r
+ OOff [IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_DateTime(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_DateTime * pie = (Q931ie_DateTime*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize=0;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ IESize = IBuf[Octet ++];\r
+ \r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 - Year */\r
+ pie->Year = IBuf[Octet++];\r
+\r
+ /* Octet 4 - Month */\r
+ pie->Month = IBuf[Octet++];\r
+\r
+ /* Octet 5 - Day */\r
+ pie->Day = IBuf[Octet++];\r
+\r
+ /*******************************************************************\r
+ The remaining part of the IE are optioinal, but only the length \r
+ can now tell us wherever these fields are present or not\r
+ ********************************************************************/\r
+ pie->Format=0;\r
+\r
+ /* Octet 6 - Hour (optional)*/\r
+ if(IESize >= 6)\r
+ {\r
+ pie->Format = 1;\r
+ pie->Hour = IBuf[Octet++];\r
+\r
+ /* Octet 7 - Minute (optional)*/\r
+ if(IESize >= 7)\r
+ {\r
+ pie->Format = 2;\r
+ pie->Minute = IBuf[Octet++];\r
+\r
+ /* Octet 8 - Second (optional)*/\r
+ if(IESize >= 8)\r
+ {\r
+ pie->Format = 3;\r
+ pie->Second = IBuf[Octet++];\r
+ }\r
+ }\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_DATETIME);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_DateTime);\r
+ pie->Size = sizeof(Q931ie_DateTime);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_DateTime\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_DateTime(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_DateTime * pIE = (Q931ie_DateTime*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_DATETIME;\r
+ li=(*Octet)++;\r
+\r
+ OBuf[(*Octet)++] = pIE->Year;\r
+ OBuf[(*Octet)++] = pIE->Month;\r
+ OBuf[(*Octet)++] = pIE->Day;\r
+ if(pIE->Format >= 1)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Hour;\r
+ if(pIE->Format >= 2)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Minute;\r
+ if(pIE->Format >= 3)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->Second;\r
+ }\r
+ }\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_Display\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_Display(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_Display * pie = (Q931ie_Display*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+ L3INT x;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ for(x=0; x<IESize; x++)\r
+ {\r
+ pie->Display[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_DISPLAY);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_Display) + x - 1;\r
+ pie->Size = sizeof(Q931ie_Display) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_Display\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_Display(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_Display * pIE = (Q931ie_Display*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT DSize;\r
+ L3INT x;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_DISPLAY;\r
+ li=(*Octet)++;\r
+\r
+ DSize = pIE->Size - sizeof(Q931ie_Display) + 1;\r
+\r
+ for(x=0; x< DSize; x++)\r
+ {\r
+ \r
+ OBuf[(*Octet)++] = pIE->Display[x];\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_HLComp\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_HLComp(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) \r
+{\r
+ Q931ie_HLComp * pie = (Q931ie_HLComp*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3*/\r
+ pie->CodStand = (IBuf[Octet + Off] >>5) & 0x03;\r
+ pie->Interpret= (IBuf[Octet + Off] >>2) & 0x07;\r
+ pie->PresMeth = IBuf[Octet + Off] & 0x03;\r
+ \r
+ Octet++;\r
+\r
+ /* Octet 4 */\r
+ pie->HLCharID = IBuf[Octet+Off] & 0x7f;\r
+ \r
+ Octet++;\r
+ \r
+ /* Octet 4a*/\r
+ if((IBuf[Octet + Off-1] & 0x80) == 0 && Q931MoreIE())\r
+ {\r
+ if(pie->HLCharID == 0x5e || pie->HLCharID == 0x5f)\r
+ {\r
+ pie->EHLCharID = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+ else if( pie->HLCharID >= 0xc3 && pie->HLCharID <= 0xcf)\r
+ {\r
+ pie->EVideoTlfCharID = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+ else\r
+ {\r
+ // error Octet 4a indicated, but invalid value in Octet 4.\r
+ Q931SetError(pTrunk,Q931E_HLCOMP, 4, Off);\r
+ return Q931E_HLCOMP;\r
+ }\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_HLCOMP);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_HLComp);\r
+ pie->Size = sizeof(Q931ie_HLComp);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_HLComp\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_HLComp(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_HLComp * pIE = (Q931ie_HLComp*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_HIGH_LAYER_COMPATIBILITY;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->CodStand << 5) | (pIE->Interpret << 2) | pIE->PresMeth;\r
+\r
+ /* Octet 4 */\r
+ OBuf[(*Octet)++] = pIE->HLCharID;\r
+\r
+ /* Octet 4a */\r
+ if(pIE->HLCharID == 0x5e || pIE->HLCharID == 0x5f)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | pIE->EHLCharID;\r
+ }\r
+ else if( pIE->HLCharID >= 0xc3 && pIE->HLCharID <= 0xcf)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | pIE->EVideoTlfCharID;\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)-1] |= 0x80;\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_KeypadFac\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_KeypadFac(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_KeypadFac * pie = (Q931ie_KeypadFac*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+ L3INT x;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ for(x=0; x<IESize; x++)\r
+ {\r
+ pie->KeypadFac[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_KEYPADFAC);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_KeypadFac) + x - 1;\r
+ pie->Size = sizeof(Q931ie_KeypadFac) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_KeypadFac\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_KeypadFac(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_KeypadFac * pIE = (Q931ie_KeypadFac*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT DSize;\r
+ L3INT x;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_KEYPAD_FACILITY;\r
+ li=(*Octet)++;\r
+\r
+ DSize = pIE->Size - sizeof(Q931ie_KeypadFac) + 1;\r
+\r
+ for(x=0; x< DSize; x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->KeypadFac[x];\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_LLComp\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_LLComp(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_LLComp * pie = (Q931ie_LLComp*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3*/\r
+\r
+ pie->CodStand = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->ITransCap= IBuf[Octet+Off] & 0x1f;\r
+\r
+ Octet++;\r
+\r
+ /* Octet 3a*/\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->NegotInd = (IBuf[Octet+Off] >> 6) & 0x01;\r
+ Off++;\r
+ }\r
+\r
+ /* Octet 4 */\r
+ pie->TransMode = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->InfoRate = IBuf[Octet+Off] & 0x1f;\r
+\r
+ Octet++;\r
+\r
+ /* Octet 4.1 */\r
+ if(pie->InfoRate == 0x14 ) /* Mutirate */\r
+ {\r
+ pie->RateMul = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+\r
+ /* Octet 5 - Layer 1 Ident */\r
+ if(IBuf[Octet+Off] & 0x60 == 0x20) /* Layer 1 Ident ? */\r
+ {\r
+ pie->Layer1Ident = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->UIL1Prot = IBuf[Octet+Off] & 0x1f;\r
+\r
+ Octet++;\r
+\r
+ /* Octet 5a */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->SyncAsync = (IBuf[Octet+Off] >> 6) & 0x01;\r
+ pie->Negot = (IBuf[Octet+Off] >> 5) & 0x01;\r
+ pie->UserRate = IBuf[Octet+Off] & 0x1f;\r
+ Off++;\r
+\r
+ /* Octet 5b - 2 options */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ if(pie->UIL1Prot == 0x01) /* V.110, I.460 and X.30*/\r
+ {\r
+ pie->InterRate = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->NIConTx = (IBuf[Octet+Off] >> 4) & 0x01;\r
+ pie->NIConRx = (IBuf[Octet+Off] >> 3) & 0x01;\r
+ pie->FlowCtlTx = (IBuf[Octet+Off] >> 2) & 0x01;\r
+ pie->FlowCtlRx = (IBuf[Octet+Off] >> 1) & 0x01;\r
+ Off++;\r
+ }\r
+ else if(pie->UIL1Prot == 0x80)/* V.120 */\r
+ {\r
+ pie->HDR = (IBuf[Octet+Off] >> 6) & 0x01;\r
+ pie->MultiFrame = (IBuf[Octet+Off] >> 5) & 0x01;\r
+ pie->ModeL1 = (IBuf[Octet+Off] >> 4) & 0x01;\r
+ pie->NegotLLI = (IBuf[Octet+Off] >> 3) & 0x01;\r
+ pie->Assignor = (IBuf[Octet+Off] >> 2) & 0x01;\r
+ pie->InBandNeg = (IBuf[Octet+Off] >> 1) & 0x01;\r
+ Off++;\r
+ }\r
+ else if(pie->UIL1Prot == 0x07)/* non standard */\r
+ {\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Off++;\r
+ }\r
+ else\r
+ {\r
+ Q931SetError(pTrunk,Q931E_LLCOMP, 5,2);\r
+ return Q931E_LLCOMP;\r
+ }\r
+\r
+ /* Octet 5c */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->NumStopBits=(IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->NumDataBits=(IBuf[Octet+Off] >> 3) & 0x03;\r
+ pie->Parity =IBuf[Octet+Off] & 0x07;\r
+ Off++;\r
+\r
+ /* Octet 5d */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->DuplexMode = (IBuf[Octet+Off] >> 6) & 0x01;\r
+ pie->ModemType = IBuf[Octet+Off] & 0x3f;\r
+ Off = Q931ReadExt(&IBuf[Octet+Off], Off);\r
+ Off++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Octet 6 - Layer 2 Ident */\r
+ if(IBuf[Octet+Off] & 0x60 == 0x40) /* Layer 1 Ident ? */\r
+ {\r
+ pie->Layer2Ident= (IBuf[Octet+Off] >>5) & 0x03;\r
+ pie->UIL2Prot = IBuf[Octet+Off] & 0x1f;\r
+ Octet++;\r
+\r
+ /* Octet 6a */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ if(pie->UIL2Prot == 0x10) /* 2nd 6a */\r
+ {\r
+ pie->UsrSpcL2Prot = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+ else /* assume 1st 6a*/\r
+ {\r
+ pie->ModeL2 = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->Q933use=IBuf[Octet+Off] & 0x03;\r
+ Off++;\r
+ }\r
+ /* Octet 6b*/\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->WindowSize = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Octet 7 - layer 3 Ident */\r
+ if(IBuf[Octet+Off] & 0x60 == 0x60) /* Layer 3 Ident ? */\r
+ {\r
+ pie->Layer3Ident= (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->UIL3Prot = IBuf[Octet+Off] & 0x1f;\r
+ Octet++;\r
+\r
+ /* Octet 7a */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ \r
+ if(pie->UIL3Prot == 0x0b)\r
+ {\r
+ /* Octet 7a + 7b AddL3Info */\r
+ pie->AddL3Info = ((IBuf[Octet+Off] << 4) &0xf0)\r
+ |(IBuf[Octet+Off+1] & 0x0f);\r
+ Off+=2;\r
+ }\r
+ else\r
+ {\r
+ if(pie->UIL3Prot == 0x1f)\r
+ {\r
+ pie->ModeL3 = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ Off++;\r
+ }\r
+ else\r
+ {\r
+ pie->OptL3Info = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+\r
+ /* Octet 7b*/\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->DefPackSize = IBuf[Octet+Off] & 0x0f;\r
+ Off++;\r
+\r
+ /* Octet 7c */\r
+ if(IBuf[Octet+Off-1] & 0x80 != 0)\r
+ {\r
+ pie->PackWinSize= IBuf[Octet+Off] & 0x7f;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Q931SetError(pTrunk,Q931E_LLCOMP, 7,0);\r
+ return Q931E_LLCOMP;\r
+ }\r
+\r
+ Q931IESizeTest(Q931E_LLCOMP);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_LLComp);\r
+ pie->Size = sizeof(Q931ie_LLComp);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_LLComp\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_LLComp(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_LLComp * pIE = (Q931ie_LLComp*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_LOW_LAYER_COMPATIBILITY;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3*/\r
+ OBuf[(*Octet)++] = (pIE->CodStand << 6) | pIE->ITransCap;\r
+\r
+ /* Octet 3a*/\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->NegotInd << 6);\r
+\r
+ /* Octet 4 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TransMode << 5) | pIE->InfoRate;\r
+\r
+ /* Octet 4.1*/\r
+ if(pIE->InfoRate == 0x18)\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | pIE->RateMul;\r
+ }\r
+\r
+ /* Octet 5*/\r
+ if(pIE->Layer1Ident == 0x01)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->Layer1Ident << 5) | pIE->UIL1Prot;\r
+ \r
+ /* Octet 5a*/\r
+ if((pIE->ITransCap == 0x08 && (pIE->UIL1Prot == 0x01 || pIE->UIL1Prot == 0x08))\r
+ || (pIE->ITransCap == 0x10 && (pIE->UIL1Prot == 0x02 || pIE->UIL1Prot == 0x03)))\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->SyncAsync<<6) | (pIE->Negot<<5) | pIE->UserRate;\r
+ \r
+ /* Octet 5b*/\r
+ if(pIE->UIL1Prot == 0x01)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->InterRate << 5)\r
+ | (pIE->NIConTx << 4)\r
+ | (pIE->NIConTx << 3)\r
+ | (pIE->FlowCtlTx << 2)\r
+ | (pIE->FlowCtlRx << 1);\r
+ }\r
+ else if(pIE->UIL1Prot == 0x08)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->HDR << 6)\r
+ | (pIE->MultiFrame<< 5)\r
+ | (pIE->ModeL1 << 4)\r
+ | (pIE->NegotLLI << 3)\r
+ | (pIE->Assignor << 2)\r
+ | (pIE->InBandNeg << 1);\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)-1] |= 0x80;\r
+ }\r
+\r
+ /* How to detect wherever 5c and 5d is to present is not clear*/\r
+ /* but they have been inculded as 'standard'*/\r
+ /* Octet 5c*/\r
+ if(pIE->UIL1Prot == 0x01 || pIE->UIL1Prot == 0x08)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->NumStopBits<<5) | (pIE->NumDataBits<<3) | pIE->Parity ;\r
+\r
+ /* Octet 5d*/\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->DuplexMode<<6) | pIE->ModemType;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)-1] |= 0x80;\r
+ }\r
+ }\r
+\r
+ /* Octet 6*/\r
+ if(pIE->Layer2Ident == 0x02)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->Layer2Ident << 5) | pIE->UIL2Prot;\r
+\r
+ /* Octet 6a*/\r
+ if(pIE->UIL2Prot == 0x02 /* Q.921/I.441 */\r
+ || pIE->UIL2Prot == 0x06 /* X.25 link layer */\r
+ || pIE->UIL2Prot == 0x07 /* X.25 multilink */\r
+ || pIE->UIL2Prot == 0x09 /* HDLC ARM */\r
+ || pIE->UIL2Prot == 0x0a /* HDLC NRM */\r
+ || pIE->UIL2Prot == 0x0b /* HDLC ABM */\r
+ || pIE->UIL2Prot == 0x0d /* X.75 SLP */\r
+ || pIE->UIL2Prot == 0x0e /* Q.922 */\r
+ || pIE->UIL2Prot == 0x11)/* ISO/ECE 7776 DTE-DCE */\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->ModeL2 << 5) | pIE->Q933use;\r
+\r
+ /* Octet 6b*/\r
+ OBuf[(*Octet)++] = 0x80 | pIE->WindowSize;\r
+ }\r
+ else if(pIE->UIL2Prot == 0x10) /* User Specific */\r
+ {\r
+ OBuf[(*Octet)++] = 0x80 | pIE->UsrSpcL2Prot;\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)-1] |= 0x80;\r
+ }\r
+ }\r
+\r
+ /* Octet 7*/\r
+ if(pIE->Layer3Ident == 0x03)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->Layer3Ident<<5) | pIE->UIL3Prot;\r
+\r
+ /* Octet 7a - 3 different ones */\r
+ if(pIE->UIL3Prot == 0x10)\r
+ {\r
+ OBuf[(*Octet++)] = 0x80 | pIE->OptL3Info;\r
+ }\r
+ else if(pIE->UIL3Prot == 0x06\r
+ || pIE->UIL3Prot == 0x07\r
+ || pIE->UIL3Prot == 0x08)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->ModeL3 << 5;\r
+\r
+ /* Octet 7b note 7*/\r
+ OBuf[(*Octet)++] = pIE->DefPackSize;\r
+\r
+ /* Octet 7c note 7*/\r
+ OBuf[(*Octet)++] = 0x80 | pIE->PackWinSize;\r
+ }\r
+ else if(pIE->UIL3Prot == 0x0b)\r
+ {\r
+ OBuf[(*Octet)++] = (pIE->AddL3Info >> 4) & 0x0f;\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->AddL3Info & 0x0f);\r
+ }\r
+ else\r
+ {\r
+ OBuf[(*Octet)-1] |= 0x80;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Q931SetError(pTrunk,Q931E_LLCOMP, 7,0);\r
+ rc = Q931E_LLCOMP;\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_NetFac\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_NetFac(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_NetFac * pie = (Q931ie_NetFac*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x=0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ pie->LenNetID = IBuf[Octet+Off]; /* full octet is used */\r
+ Octet++;\r
+\r
+ if(pie->LenNetID > 0)\r
+ {\r
+ /* Octet 3.1 */\r
+ pie->TypeNetID = (IBuf[Octet+Off] >> 4) & 0x0f;\r
+ pie->NetIDPlan = IBuf[Octet+Off] & 0x0f;\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Off++;\r
+\r
+ /* Octet 3.2*/\r
+ for(x=0; x < pie->LenNetID; x++)\r
+ {\r
+ pie->NetID[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+ }\r
+\r
+ /* Octet 4*/\r
+ pie->NetFac = IBuf[Octet+Off]; /* Full Octet is used */\r
+ Octet++;\r
+\r
+ Q931IESizeTest(Q931E_NETFAC);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_NetFac) + x - 1;\r
+ pie->Size = sizeof(Q931ie_NetFac) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_NetFac\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_NetFac(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_NetFac * pIE = (Q931ie_NetFac*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT x;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_NETWORK_SPECIFIC_FACILITIES;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = pIE->LenNetID;\r
+\r
+ if(pIE->LenNetID > 0)\r
+ {\r
+ /* Octet 3.1 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->TypeNetID << 4) | pIE->NetIDPlan;\r
+\r
+ /* Octet 3.2 */\r
+ for(x=0; x <pIE->LenNetID; x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->NetID[x];\r
+ }\r
+ }\r
+\r
+ /* Octet 4*/\r
+ OBuf[(*Octet)++] = pIE->NetFac;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_NotifInd\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_NotifInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_NotifInd * pie = (Q931ie_NotifInd*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2*/\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->Notification = IBuf[Octet+Off] & 0x7f;\r
+\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Octet++;\r
+\r
+ Q931IESizeTest(Q931E_NOTIFIND);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_NotifInd);\r
+ pie->Size = sizeof(Q931ie_NotifInd);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_NotifInd\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_NotifInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_NotifInd * pIE = (Q931ie_NotifInd*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_NOTIFICATION_INDICATOR;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3*/\r
+ OBuf[(*Octet)++] = pIE->Notification;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_ProgInd\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_ProgInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_ProgInd * pie = (Q931ie_ProgInd*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2*/\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3*/\r
+ pie->CodStand = (IBuf[Octet+Off] >> 5) & 0x03;\r
+ pie->Location = IBuf[Octet+Off] & 0x0f;\r
+\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Octet++;\r
+\r
+ /* Octet 4*/\r
+ pie->ProgDesc = IBuf[Octet+Off] & 0x7f;\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Octet++;\r
+\r
+ Q931IESizeTest(Q931E_PROGIND);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_ProgInd);\r
+ pie->Size = sizeof(Q931ie_ProgInd);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_ProgInd\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset L3INTo OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_ProgInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_ProgInd * pIE = (Q931ie_ProgInd*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_PROGRESS_INDICATOR;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3*/\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->CodStand << 5) | pIE->Location;\r
+\r
+ /* Octet 4*/\r
+ OBuf[(*Octet)++] = 0x80 | pIE->ProgDesc;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_RepeatInd\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_RepeatInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_RepeatInd *pie = (Q931ie_RepeatInd*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet] & 0xf0;\r
+ pie->RepeatInd = IBuf[Octet] & 0x0f;\r
+ Octet ++;\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_RepeatInd);\r
+ pie->Size = sizeof(Q931ie_RepeatInd);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_RepeatInd\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_RepeatInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_RepeatInd * pIE = (Q931ie_RepeatInd*)IBuf;\r
+ L3INT rc=0;\r
+ L3INT Beg=*Octet;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_REPEAT_INDICATOR | pIE->RepeatInd;\r
+ \r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_RevChargeInd\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_RevChargeInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ ie iE;\r
+ Q931SetIE(iE, *OOff);\r
+\r
+ return iE;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_RevChargeInd\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_RevChargeInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_RestartInd\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_RestartInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_RestartInd * pie = (Q931ie_RestartInd*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2*/\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->Class = IBuf[Octet+Off] & 0x07;\r
+\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Octet++;\r
+\r
+ Q931IESizeTest(Q931E_RESTARTIND);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_RestartInd);\r
+ pie->Size = sizeof(Q931ie_RestartInd);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_RestartInd\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_RestartInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_RestartInd * pIE = (Q931ie_RestartInd*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_RESTART_INDICATOR;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3*/\r
+ OBuf[(*Octet)++] = 0x80 | pIE->Class ;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_Segment\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_Segment(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_Segment * pie = (Q931ie_Segment*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2*/\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->FSI = (IBuf[Octet+Off] & 0x80) >> 7;\r
+ pie->NumSegRem = IBuf[Octet+Off] & 0x7f;\r
+ Octet++;\r
+\r
+ /* Octet 4 */\r
+ pie->SegType = IBuf[Octet+Off] & 0x7f;\r
+ Octet++;\r
+ \r
+ Q931IESizeTest(Q931E_SEGMENT);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_Segment);\r
+ pie->Size = sizeof(Q931ie_Segment);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_Segment\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_Segment * pIE = (Q931ie_Segment*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_SEGMENTED_MESSAGE;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3*/\r
+ OBuf[(*Octet)++] = (pIE->FSI<<7) | pIE->NumSegRem;\r
+\r
+ /* Octet 4 */\r
+ OBuf[(*Octet)++] = pIE->SegType;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_SendComplete\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_SendComplete(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_SendComplete *pie = (Q931ie_SendComplete*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+\r
+ *pIE=0;\r
+\r
+ Octet ++;\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_SendComplete);\r
+ pie->Size = sizeof(Q931ie_SendComplete);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_ProgInd\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_SendComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_SendComplete * pIE = (Q931ie_SendComplete*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+// L3INT li;\r
+\r
+ OBuf[(*Octet)++] = 0x80 | (L3UCHAR)Q931ie_SENDING_COMPLETE;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_Signal\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_Signal(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_Signal * pie = (Q931ie_Signal*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT IESize;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2*/\r
+ IESize = IBuf[Octet ++]; \r
+\r
+ /* Octet 3 */\r
+ pie->Signal = IBuf[Octet+Off];\r
+ Octet++;\r
+\r
+ Q931IESizeTest(Q931E_SIGNAL);\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_Signal);\r
+ pie->Size = sizeof(Q931ie_Signal);\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_Signal\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_Signal(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_Signal * pIE = (Q931ie_Signal*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_SIGNAL;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3*/\r
+ OBuf[(*Octet)++] = pIE->Signal;\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_TransNetSel\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_TransNetSel(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_TransNetSel * pie = (Q931ie_TransNetSel*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x=0;\r
+ L3INT l;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ l = IBuf[Octet] - 3; \r
+ Octet++;\r
+\r
+ /* Octet 3*/\r
+ pie->Type = (IBuf[Octet+Off] >> 4) & 0x07;\r
+\r
+ Off = Q931ReadExt(&IBuf[Octet], Off);\r
+ Octet++;\r
+\r
+ for(x=0; x < l; x++)\r
+ {\r
+ pie->NetID[x] = IBuf[Octet+Off] & 0x7f;\r
+ Off++;\r
+ }\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_TransNetSel) + x - 1;\r
+ pie->Size = sizeof(Q931ie_TransNetSel) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_TransNetSel\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_TransNetSel(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_TransNetSel * pIE = (Q931ie_TransNetSel*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT x;\r
+ L3INT l;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_TRANSIT_NETWORK_SELECTION;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = 0x80 | (pIE->Type<<4) | pIE->NetIDPlan;\r
+\r
+ /* Octet 4 */\r
+ l = pIE->Size - sizeof(Q931ie_TransNetSel) + 1;\r
+ for(x=0;x<l;x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->NetID[x];\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Uie_UserUser\r
+\r
+ Parameters: pIE[OUT] ptr to Information Element id.\r
+ IBuf[IN] ptr to a packed ie.\r
+ OBuf[OUT] ptr to buffer for Unpacked ie.\r
+ IOff[IN\OUT] Input buffer offset\r
+ OOff[IN\OUT] Output buffer offset\r
+\r
+ Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+ must be updated, but are otherwise not used in the ie unpack.\r
+\r
+ Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_UserUser(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+ Q931ie_UserUser * pie = (Q931ie_UserUser*)OBuf;\r
+ L3INT Off = 0;\r
+ L3INT Octet = 0;\r
+ L3INT x=0;\r
+ L3INT l;\r
+\r
+ *pIE=0;\r
+\r
+ pie->IEId = IBuf[Octet];\r
+ Octet ++;\r
+\r
+ /* Octet 2 */\r
+ l = IBuf[Octet] - 3; \r
+ Octet++;\r
+\r
+ /* Octet 3*/\r
+ pie->ProtDisc = IBuf[Octet+Off];\r
+ Octet++;\r
+\r
+ for(x=0; x < l; x++)\r
+ {\r
+ pie->User[x] = IBuf[Octet+Off];\r
+ Off++;\r
+ }\r
+\r
+ *IOff = (*IOff) + Octet + Off;\r
+ *OOff = (*OOff) + sizeof(Q931ie_UserUser) + x - 1;\r
+ pie->Size = sizeof(Q931ie_UserUser) + x - 1;\r
+\r
+ Q931SetIE(*pIE, *OOff);\r
+\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pie_UserUser\r
+\r
+ Parameters: IBuf[IN] Ptr to struct.\r
+ OBuf[OUT] Ptr tp packed output buffer.\r
+ Octet[IN/OUT] Offset into OBuf.\r
+\r
+ Return Value: Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pie_UserUser(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+ Q931ie_UserUser * pIE = (Q931ie_UserUser*)IBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3INT Beg=*Octet;\r
+ L3INT li;\r
+ L3INT x;\r
+ L3INT l;\r
+\r
+ OBuf[(*Octet)++] = Q931ie_USER_USER;\r
+ li=(*Octet)++;\r
+\r
+ /* Octet 3 */\r
+ OBuf[(*Octet)++] = pIE->ProtDisc;\r
+\r
+ /* Octet 4 */\r
+ l = pIE->Size - sizeof(Q931ie_UserUser) + 1;\r
+ for(x=0;x<l;x++)\r
+ {\r
+ OBuf[(*Octet)++] = pIE->User[x];\r
+ }\r
+\r
+ OBuf[li] = (*Octet)-Beg;\r
+ return rc;\r
+}\r
+\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: Q931mes.c\r
+\r
+ Contents: Pack/Unpack functions. These functions will unpack a Q931 \r
+ message from the bit packed original format into structs\r
+ that contains variables sized by the user. It will also pack\r
+ the struct back into a Q.931 message as required.\r
+\r
+ See q931.h for description. \r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Alerting\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931Umes_Alerting(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Alerting *mes = (Q931mes_Alerting*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ L3UCHAR mescode = (L3UCHAR)IBuf[IOff];\r
+ while(IOff < Size)\r
+ {\r
+ switch(mescode)\r
+ {\r
+ case Q931ie_BEARER_CAPABILITY: \r
+ rc = Q931Uie[pTrunk->Dialect][mescode](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_HIGH_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Alerting) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Alerting\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Alerting(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Alerting *pMes = (Q931mes_Alerting *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Bearer capability */\r
+ if(Q931IsIEPresent(pMes->BearerCap))\r
+ {\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ }\r
+\r
+ /* Channel Identification */\r
+ if(Q931IsIEPresent(pMes->ChanID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* High Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->HLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_CallProceeding\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_CallProceeding(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_CallProceeding *mes = (Q931mes_CallProceeding*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_BEARER_CAPABILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_HIGH_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_CallProceeding) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_CallProceeding\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_CallProceeding(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_CallProceeding *pMes = (Q931mes_CallProceeding *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Bearer capability */\r
+ if(Q931IsIEPresent(pMes->BearerCap))\r
+ {\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ }\r
+\r
+ /* Channel Identification */\r
+ if(Q931IsIEPresent(pMes->ChanID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ \r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* High Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->HLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_CongestionControl\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_CongestionControl(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_CongestionControl\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_CongestionControl(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Connect\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Connect *mes = (Q931mes_Connect*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_BEARER_CAPABILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DATETIME:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->DateTime,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_LOW_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->LLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_HIGH_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Connect) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Connect\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Connect *pMes = (Q931mes_Connect *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Bearer capability */\r
+ if(Q931IsIEPresent(pMes->BearerCap))\r
+ {\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ }\r
+\r
+ /* Channel Identification */\r
+ if(Q931IsIEPresent(pMes->ChanID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ \r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Date/Time */\r
+ if(Q931IsIEPresent(pMes->DateTime))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ \r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Low Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->LLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* High Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->HLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_ConnectAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_ConnectAck *mes = (Q931mes_ConnectAck*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_ConnectAck) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_ConnectAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_ConnectAck *pMes = (Q931mes_ConnectAck *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Disconnect\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Disconnect *mes = (Q931mes_Disconnect*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Disconnect) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Disconnect\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Disconnect *pMes = (Q931mes_Disconnect *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ \r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ \r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Information\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Information *mes = (Q931mes_Information*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_SENDING_COMPLETE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->SendComplete,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ case Q931ie_KEYPAD_FACILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->KeypadFac,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ case Q931ie_CALLED_PARTY_NUMBER:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CalledNum,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Information) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Information\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Information *pMes = (Q931mes_Information *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Sending Complete */\r
+ if(Q931IsIEPresent(pMes->SendComplete))\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->SendComplete & 0x00ff);\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Keypad Facility */\r
+ if(Q931IsIEPresent(pMes->KeypadFac))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Called Party number */\r
+ if(Q931IsIEPresent(pMes->CalledNum))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Notify\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Notify *mes = (Q931mes_Notify*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_BEARER_CAPABILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ case Q931ie_NOTIFICATION_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->NotifInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Notify) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Notify\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Notify *pMes = (Q931mes_Notify *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Bearer capability */\r
+ if(Q931IsIEPresent(pMes->BearerCap))\r
+ {\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ }\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Progress\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Progress *mes = (Q931mes_Progress*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_BEARER_CAPABILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_HIGH_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Progress) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Progress\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Progress *pMes = (Q931mes_Progress *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Bearer capability */\r
+ if(Q931IsIEPresent(pMes->BearerCap))\r
+ {\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ }\r
+\r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* High Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->HLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Release\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Release *mes = (Q931mes_Release*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Release) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Release\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Release *pMes = (Q931mes_Release *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_ReleaseComplete\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_ReleaseComplete *mes = (Q931mes_ReleaseComplete*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_ReleaseComplete) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_ReleaseComplete\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_ReleaseComplete *pMes = (Q931mes_ReleaseComplete *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Restart\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Restart\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_RestartAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_RestartAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Resume\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Resume *mes = (Q931mes_Resume*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CALL_IDENTITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Resume) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Resume\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Resume *pMes = (Q931mes_Resume *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Call Identity */\r
+ if(Q931IsIEPresent(pMes->CallID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_ResumeAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_ResumeAck *mes = (Q931mes_ResumeAck*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_ResumeAck) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_ResumeAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_ResumeAck *pMes = (Q931mes_ResumeAck *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Channel Identification */\r
+ if(Q931IsIEPresent(pMes->ChanID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_ResumeReject\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_ResumeReject *mes = (Q931mes_ResumeReject*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_ResumeReject) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_ResumeReject\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_ResumeReject *pMes = (Q931mes_ResumeReject *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+\r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+L3INT Q931Umes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT OOff)\r
+{\r
+ L3INT i = IOff;\r
+\r
+ return IOff - i;\r
+}\r
+\r
+L3INT Q931Pmes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Setup\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Setup *mes = (Q931mes_Setup*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_SENDING_COMPLETE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->SendComplete,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_REPEAT_INDICATOR:\r
+ if(ir==0)\r
+ {\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->RepeatInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ ir++;\r
+ }\r
+ else if(ir==1)\r
+ {\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->LLRepeatInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ ir++;\r
+ }\r
+ else\r
+ {\r
+ return Q931E_ILLEGAL_IE;\r
+ }\r
+ break;\r
+ case Q931ie_BEARER_CAPABILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_NETWORK_SPECIFIC_FACILITIES:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->NetFac,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DATETIME:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->DateTime,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_KEYPAD_FACILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->KeypadFac,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CALLING_PARTY_NUMBER:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallingNum,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CALLING_PARTY_SUBADDRESS:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallingSub,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CALLED_PARTY_NUMBER:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CalledSub,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CALLED_PARTY_SUBADDRESS:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CalledSub,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_TRANSIT_NETWORK_SELECTION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->TransNetSel,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_LOW_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->LLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_HIGH_LAYER_COMPATIBILITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Setup) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Setup\r
+\r
+ Decription: Pack a Q931mes_Setup into a real Q.931 message. The user will\r
+ set up a SETUP message and issue this to the stack where it\r
+ is processed by Q931ProcSetup that processes and validates\r
+ it before it actually sends it out. This function is called\r
+ to compute the real Q.931 message.\r
+\r
+ Parameters: IBuf[IN] Ptr to un-packed struct\r
+ ISize[IN] Size of input buffer (unpacked message).\r
+ OBuf[OUT] Ptr to packed 'octet' wise message.\r
+ OSize[OUT] Size of packed message.\r
+\r
+ Called By: Q931ProcSetup\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Setup *pMes = (Q931mes_Setup *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Sending Complete */\r
+ if(Q931IsIEPresent(pMes->SendComplete))\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->SendComplete & 0x00ff);\r
+\r
+ /* Repeat Indicator */\r
+ if(Q931IsIEPresent(pMes->RepeatInd))\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->RepeatInd & 0x00ff); \r
+\r
+ /* Bearer capability */\r
+ if(Q931IsIEPresent(pMes->BearerCap))\r
+ {\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ }\r
+ else\r
+ {\r
+ rc=Q931E_BEARERCAP;\r
+ }\r
+\r
+ /* Channel Identification */\r
+ if(Q931IsIEPresent(pMes->ChanID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Network spesific facilities */\r
+ if(Q931IsIEPresent(pMes->NetFac))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->NetFac,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Date/Time */\r
+ if(Q931IsIEPresent(pMes->DateTime))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Keypad Facility */\r
+ if(Q931IsIEPresent(pMes->KeypadFac))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Calling Party Number */\r
+ if(Q931IsIEPresent(pMes->CallingNum))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallingNum,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Calling Party Subaddress */\r
+ if(Q931IsIEPresent(pMes->CallingSub))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallingSub,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Called Party number */\r
+ if(Q931IsIEPresent(pMes->CalledNum))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Called party subaddress */\r
+ if(Q931IsIEPresent(pMes->CalledSub))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CalledSub,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Transit network selection */\r
+ if(Q931IsIEPresent(pMes->TransNetSel))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->TransNetSel,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Repeat Indicator */\r
+ if(Q931IsIEPresent(pMes->LLRepeatInd))\r
+ ;//TODO\r
+\r
+ /* Low Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->LLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* High Layer Compatibility */\r
+ if(Q931IsIEPresent(pMes->HLComp))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_SetupAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_SetupAck *mes = (Q931mes_SetupAck*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_PROGRESS_INDICATOR:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_SIGNAL:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_SetupAck) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_SetupAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_SetupAck *pMes = (Q931mes_SetupAck *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Channel Identification */\r
+ if(Q931IsIEPresent(pMes->ChanID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Progress indicator */\r
+ if(Q931IsIEPresent(pMes->ProgInd))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Signal */\r
+ if(Q931IsIEPresent(pMes->Signal))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Status\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Status *mes = (Q931mes_Status*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_CALL_STATE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallState,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Status) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Status\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Status *pMes = (Q931mes_Status *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Call State */\r
+ if(Q931IsIEPresent(pMes->CallState))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallState,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_StatusEnquiry\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_StatusEnquiry *mes = (Q931mes_StatusEnquiry*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_StatusEnquiry) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_StatusEnquiry\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_StatusEnquiry *pMes = (Q931mes_StatusEnquiry *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_Suspend\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_Suspend *mes = (Q931mes_Suspend*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CALL_IDENTITY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_Suspend) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Suspend\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_Suspend *pMes = (Q931mes_Suspend *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Call Identity */\r
+ if(Q931IsIEPresent(pMes->CallID))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_SuspendAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_SuspendAck *mes = (Q931mes_SuspendAck*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_SuspendAck) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_SuspendAck\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_SuspendAck *pMes = (Q931mes_SuspendAck *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_SuspendReject\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q931mes_SuspendReject *mes = (Q931mes_SuspendReject*)OBuf;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ while(IOff < Size)\r
+ {\r
+ switch(IBuf[IOff])\r
+ {\r
+ case Q931ie_CAUSE:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ case Q931ie_DISPLAY:\r
+ rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);\r
+ if(rc != Q931E_NO_ERROR) \r
+ return rc;\r
+ break;\r
+ default:\r
+ return Q931E_ILLEGAL_IE;\r
+ break;\r
+ }\r
+ }\r
+ mes->Size = sizeof(Q931mes_SuspendReject) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_SuspendReject\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3INT rc = Q931E_NO_ERROR;\r
+ Q931mes_SuspendReject *pMes = (Q931mes_SuspendReject *)IBuf;\r
+ L3INT Octet = 0;\r
+\r
+ /* Q931 Message Header */\r
+\r
+ OBuf[Octet++] = pMes->ProtDisc; /* Protocol discriminator */\r
+ OBuf[Octet++] = 2; /* length is 2 octets */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV>>8); /* msb */\r
+ OBuf[Octet++] = (L3UCHAR)(pMes->CRV); /* lsb */\r
+ OBuf[Octet++] = pMes->MesType; /* message header */\r
+ \r
+ /* Cause */\r
+ if(Q931IsIEPresent(pMes->Cause))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ /* Display */\r
+ if(Q931IsIEPresent(pMes->Display))\r
+ if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)\r
+ return rc;\r
+\r
+ return rc;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Umes_UserInformation\r
+\r
+*****************************************************************************/\r
+L3INT Q931Umes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_UserInformation\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: Q932mes.c\r
+\r
+ Contents: Q.932 Message Encoders/Decoders\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "Q931.h"\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_Facility\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_Facility(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ L3INT rc=Q931E_NO_ERROR;\r
+ Q932mes_Facility *mes = (Q932mes_Facility*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_Facility) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Facility\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_Facility(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_Hold\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_Hold(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_Hold *mes = (Q932mes_Hold*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_Hold) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Hold\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_Hold(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_HoldAck\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_HoldAck(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_HoldAck *mes = (Q932mes_HoldAck*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_HoldAck) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_HoldAck\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_HoldAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_HoldReject\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_HoldReject(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_HoldReject *mes = (Q932mes_HoldReject*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_HoldReject) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_HoldReject\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_HoldReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_Register\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_Register(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_Register *mes = (Q932mes_Register*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_Register) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Register\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_Register(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_Retrieve\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_Retrieve(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_Retrieve *mes = (Q932mes_Retrieve*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_Retrieve) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_Retrieve\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_Retrieve(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_RetrieveAck\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_RetrieveAck(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_RetrieveAck *mes = (Q932mes_RetrieveAck*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_RetrieveAck) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_RetrieveAck\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_RetrieveAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q932Umes_RetrieveReject\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q932Umes_RetrieveReject(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)\r
+{\r
+ L3INT i = IOff;\r
+ L3INT ir=0;\r
+ L3INT OOff=0;\r
+ Q932mes_RetrieveReject *mes = (Q932mes_RetrieveReject*)IBuf;\r
+\r
+ //TODO\r
+\r
+ mes->Size = sizeof(Q932mes_RetrieveReject) - 1 + OOff;\r
+ return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: Q931Pmes_RetrieveReject\r
+\r
+*****************************************************************************/\r
+L3INT Q932Pmes_RetrieveReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)\r
+{\r
+ L3BOOL RetCode = L3FALSE;\r
+\r
+ NoWarning(OBuf);\r
+ NoWarning(IBuf);\r
+\r
+ return RetCode;\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: q921.h\r
+\r
+ Description: Contains headers of a Q.921 protocol on top of the Comet \r
+ Driver.\r
+\r
+ Most of the work required to execute a Q.921 protocol is \r
+ taken care of by the Comet ship and it's driver. This layer\r
+ will simply configure and make use of these features to \r
+ complete a Q.921 implementation.\r
+\r
+ Note: This header file is the only include file that should be \r
+ acessed by users of the Q.921 stack.\r
+\r
+ Interface: The Q.921 stack contains 2 layers. \r
+\r
+ - One interface layer.\r
+ - One driver layer.\r
+\r
+ The interface layer contains the interface functions required \r
+ for a layer 3 stack to be able to send and receive messages.\r
+\r
+ The driver layer will simply feed bytes into the ship as\r
+ required and queue messages received out from the ship.\r
+\r
+ Q921TimeTick The Q.921 like any other blackbox \r
+ modules contains no thread by it's own\r
+ and must therefore be called regularly \r
+ by an external 'thread' to do maintenance\r
+ etc.\r
+\r
+ Q921Rx32 Receive message from layer 3. Called by\r
+ the layer 3 stack to send a message.\r
+\r
+ Q921Tx23 Send a message to layer 3. \r
+\r
+ OnQ921Error Function called every if an error is \r
+ deteceted.\r
+\r
+ OnQ921Log Function called if logging is active.\r
+\r
+\r
+ <TODO> Maintenance/Configuration interface\r
+\r
+ Created: 27.dec.2000/JVB\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+\r
+*****************************************************************************/\r
+\r
+#ifndef _Q921\r
+#define _Q921\r
+\r
+#define Q921MAXTRUNK 4\r
+#define Q921MAXHDLCSPACE 3000\r
+\r
+typedef struct\r
+{\r
+ char HDLCInQueue[Q921MAXHDLCSPACE];\r
+ unsigned char vs;\r
+ unsigned char vr;\r
+ int state;\r
+}Q921Data;\r
+\r
+void Q921Init();\r
+void Q921SetHeaderSpace(int hspace);\r
+void Q921SetTx21CB(int (*callback)(int dev, unsigned char *, int));\r
+void Q921SetTx23CB(int (*callback)(int dev, unsigned char *, int));\r
+int Q921QueueHDLCFrame(int trunk, char *b, int size);\r
+int Q921Rx12(long trunk);\r
+\r
+#endif\r
+\r
--- /dev/null
+/******************************************************************************\r
+\r
+ FileName: Q931.h\r
+\r
+ Contents: Header and definition for the ITU-T Q.931 stack. The \r
+ header contents the following parts:\r
+\r
+ - Definition of codes\r
+ - Definition of information elements (Q931ie_).\r
+ - Definition of messages (Q931mes_).\r
+ - Definitian of variables (var_).\r
+ - Function prototypes.\r
+\r
+ Description: The Q.931 stack provided here covers ITU-T Q.931 w/Q.932\r
+ supplementary services for both PRI, BRI and variants. \r
+ The stack is generic and designed to deal with variants as\r
+ needed.\r
+\r
+ The stack uses the following interface functions:\r
+\r
+ - Q931Initialize Initialize the Q.931 stack.\r
+ - Q931Rx23 Receive a message from layer 2\r
+ - Q931Tx32 Send a message to layer 2\r
+ - Q931Rx43 Receive a message from layer 4 or above.\r
+ - Q931Tx34 Send a message to layer 4 or above.\r
+ - Q931TimeTick Periodical timer processing.\r
+ - Q931ErrorProc Callback for stack error message.\r
+\r
+ The protocol is a module with no external dependencies and\r
+ can easely be ported to any operating system like Windows,\r
+ Linux, rtos and others.\r
+\r
+ Related Files: Q931.h Q.931 Definitions\r
+ Q931.c Q.931 Interface Functions.\r
+ Q931api.c Low level L4 API functions.\r
+\r
+ Q932.h Q.932 Suplementary Services\r
+ Q932mes.c Q.932 encoders/coders\r
+\r
+ Q931mes.c Q.931 Message encoders/coders\r
+ Q931ie.c Q.931 IE encoders/coders\r
+ Q931StateTE.c Generic Q.931 TE State Engine\r
+ Q931StateNT.c Generic Q.931 NT State Engine\r
+\r
+ Design Note 1: For each variant please add separate files starting with \r
+ the variant short-name as follows:\r
+\r
+ <variant>.h Spesific headers needed.\r
+ <variant>mes.c Message encoders/decores.\r
+ <variant>ie.c IE encoders/decoders.\r
+ <variant>StateTE.c TE side state engine.\r
+ <variant>StateNT.c NT side state engine.\r
+\r
+ Design Note 2: The stack is deliberatly made non-threading. Use 1 \r
+ thread per Trunk, but lock access from the timertick\r
+ and rx, tx functions. And make sure the callbacks only\r
+ dump messages to a queue, no time-consuming processing\r
+ inside stack processing. \r
+\r
+ All stack processing is async 'fire and forget', meaning\r
+ that there are not, and should not be any time-consuming\r
+ processing within the stack-time. The best way to thread \r
+ a stack is to use one single thread that signal 5 queues.\r
+ \r
+ - Incoming L2 queue.\r
+ - Incoming L4 queue.\r
+ - Outgoing L2 queue.\r
+ - Outgoing L4 queue.\r
+ - Error/Trace queue.\r
+\r
+ Design Note 3: DSP optimization. The L3 (Rx23) can be called directly\r
+ from a hdlc receiver without usage of queues for optimized \r
+ processing. But keep in mind that Q.931 calls Tx34 or Tx32 \r
+ as part of receiving a message from Layer 2.\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+******************************************************************************/\r
+\r
+#ifndef _Q931_NL\r
+#define _Q931_NL\r
+\r
+/* uncomment the #define below to add x.25 support to the Q.931 */\r
+//#define Q931_X25_SUPPORT\r
+\r
+#include "stdio.h"\r
+\r
+/*****************************************************************************\r
+\r
+ Error Codes\r
+\r
+*****************************************************************************/\r
+#define Q931E_NO_ERROR 0\r
+#define Q931E_UNKNOWN_MESSAGE -3001\r
+#define Q931E_ILLEGAL_IE -3002\r
+#define Q931E_UNKNOWN_IE -3003\r
+#define Q931E_BEARERCAP -3004\r
+#define Q931E_HLCOMP -3005\r
+#define Q931E_LLCOMP -3006\r
+#define Q931E_INTERNAL -3007\r
+#define Q931E_MISSING_CB -3008\r
+#define Q931E_UNEXPECTED_MESSAGE -3009\r
+#define Q931E_ILLEGAL_MESSAGE -3010\r
+#define Q931E_TOMANYCALLS -3011\r
+#define Q931E_INVALID_CRV -3012\r
+#define Q931E_CALLID -3013\r
+#define Q931E_CALLSTATE -3014\r
+#define Q931E_CALLEDSUB -3015\r
+#define Q931E_CALLEDNUM -3016\r
+#define Q931E_CALLINGNUM -3017\r
+#define Q931E_CALLINGSUB -3018\r
+#define Q931E_CAUSE -3019\r
+#define Q931E_CHANID -3020\r
+#define Q931E_DATETIME -3021\r
+#define Q931E_DISPLAY -3022\r
+#define Q931E_KEYPADFAC -3023\r
+#define Q931E_NETFAC -3024\r
+#define Q931E_NOTIFIND -3025\r
+#define Q931E_PROGIND -3026\r
+#define Q931E_RESTARTIND -3027\r
+#define Q931E_SEGMENT -3028\r
+#define Q931E_SIGNAL -3029\r
+\r
+/*****************************************************************************\r
+\r
+ Some speed optimization can be achieved by changing all variables to the \r
+ word size of your processor. A 32 bit processor have to do a lot of extra \r
+ work to read a packed 8 bit integer. Changing all fields to 32 bit integer \r
+ will ressult in usage of some extra space, but speed up the stack.\r
+\r
+ The stack have been designed to allow L3UCHAR etc. to be any size of 8 bit\r
+ or larger.\r
+\r
+*****************************************************************************/\r
+\r
+#define L3UCHAR unsigned char /* Min 8 bit */\r
+#define L3USHORT unsigned short /* Min 16 bit unsigned */\r
+#define L3UINT unsigned int /* Min 16 bit unsigned */\r
+#define L3INT int /* Min 16 bit signed */\r
+#define L3ULONG unsigned long /* Min 32 bit */\r
+#define L3BOOL char /* Min 1 bit, valuse 0 & 1 only */\r
+\r
+#define L3TRUE 1\r
+#define L3FALSE 0 \r
+\r
+/*****************************************************************************\r
+ \r
+ MAXTRUNKS sets how many physical trunks this system might have. This \r
+ number should be keept at a minimum since it will use global space.\r
+\r
+ It is recommended that you leave MAXCHPERTRUNK as is\r
+\r
+*****************************************************************************/\r
+\r
+#define Q931L4BUF 1000 /* size of message buffer */\r
+\r
+#define Q931L2BUF 300 /* size of message buffer */\r
+\r
+#define Q931MAXTRUNKS 1 /* Total number of trunks that will be */\r
+ /* processed by this instance of the */\r
+ /* stack */\r
+\r
+#define Q931MAXCHPERTRUNK 32 /* Number of channels per trunk. The */\r
+ /* stack uses a static set of 32 */\r
+ /* channels regardless if it is E1, T1 */\r
+ /* or BRI that actually is used. */\r
+\r
+#define Q931MAXCALLPERTRUNK (Q931MAXCHPERTRUNK * 2)\r
+ /* Number of max active CRV per trunk. */\r
+ /* Q.931 can have more calls than there */\r
+ /* are channels. */\r
+\r
+/*****************************************************************************\r
+\r
+ The following defines control the dialect switch tables and should only be\r
+ changed when a new dialect needs to be inserted into the stack. \r
+\r
+ This stack uses an array of functions to know which function to call as \r
+ it receives a SETUP message etc. A new dialect can when schoose to use\r
+ the proc etc for standard Q.931 or insert a modified proc.\r
+\r
+ This technique has also been used to distinguish between user and network\r
+ mode to make the code as easy to read and maintainable as possible.\r
+\r
+ A message and IE index have been used to save space. These indexes allowes\r
+ the message or IE code to be used directly and will give back a new index\r
+ into the table.\r
+\r
+*****************************************************************************/\r
+\r
+/* WARNING! Initialize Q931CreateDialectCB[] will NULL when increasing the */\r
+/* Q931MAXDLCT value to avoid Q931Initialize from crashing if one entry is */\r
+/* not used. */\r
+#define Q931MAXDLCT 2 /* Max dialects included in this */\r
+ /* compile. User and Network count as */\r
+ /* one dialect each. */\r
+\r
+\r
+#define Q931MAXMES 255 /* Number of messages */\r
+\r
+#define Q931MAXIE 255 /* Number of IE */\r
+\r
+#define Q931MAXSTATE 100 /* Size of state tables */\r
+\r
+/*****************************************************************************\r
+\r
+ Call States for ITU-T Q.931 TE (User Mode)\r
+\r
+*****************************************************************************/\r
+\r
+#define Q931_U0 0\r
+#define Q931_U1 1\r
+#define Q931_U2 2\r
+#define Q931_U3 3\r
+#define Q931_U4 4\r
+#define Q931_U6 6\r
+#define Q931_U7 7\r
+#define Q931_U8 8\r
+#define Q931_U9 9\r
+#define Q931_U10 10\r
+#define Q931_U11 11\r
+#define Q931_U12 12\r
+#define Q931_U15 15\r
+#define Q931_U17 17\r
+#define Q931_U19 19\r
+#define Q931_U25 25\r
+\r
+/*****************************************************************************\r
+\r
+ Call States for ITU-T Q.931 NT (Network Mode)\r
+\r
+*****************************************************************************/\r
+#define Q931_N0 (0x0100 | 0)\r
+#define Q931_N1 (0x0100 | 1)\r
+#define Q931_N2 (0x0100 | 2)\r
+#define Q931_N3 (0x0100 | 3)\r
+#define Q931_N4 (0x0100 | 4)\r
+#define Q931_N6 (0x0100 | 6)\r
+#define Q931_N7 (0x0100 | 7)\r
+#define Q931_N8 (0x0100 | 8)\r
+#define Q931_N9 (0x0100 | 9)\r
+#define Q931_N10 (0x0100 | 11)\r
+#define Q931_N11 (0x0100 | 11)\r
+#define Q931_N12 (0x0100 | 12)\r
+#define Q931_N15 (0x0100 | 15)\r
+#define Q931_N17 (0x0100 | 17)\r
+#define Q931_N19 (0x0100 | 19)\r
+#define Q931_N22 (0x0100 | 22)\r
+#define Q931_N25 (0x0100 | 25)\r
+\r
+/*****************************************************************************\r
+\r
+ Q.931 Message codes\r
+ \r
+*****************************************************************************/\r
+\r
+#define Q931mes_ALERTING 0x01 /* 0000 0001 */ \r
+#define Q931mes_CALL_PROCEEDING 0x02 /* 0000 0010 */\r
+#define Q931mes_CONNECT 0x07 /* 0000 0111 */\r
+#define Q931mes_CONNECT_ACKNOWLEDGE 0x0f /* 0000 1111 */\r
+#define Q931mes_PROGRESS 0x03 /* 0000 0011 */\r
+#define Q931mes_SETUP 0x05 /* 0000 0101 */\r
+#define Q931mes_SETUP_ACKNOWLEDGE 0x0d /* 0000 1101 */\r
+#define Q931mes_RESUME 0x26 /* 0010 0110 */\r
+#define Q931mes_RESUME_ACKNOWLEDGE 0x2e /* 0010 1110 */\r
+#define Q931mes_RESUME_REJECT 0x22 /* 0010 0010 */\r
+#define Q931mes_SUSPEND 0x25 /* 0010 0101 */\r
+#define Q931mes_SUSPEND_ACKNOWLEDGE 0x2d /* 0010 1101 */\r
+#define Q931mes_SUSPEND_REJECT 0x21 /* 0010 0001 */\r
+#define Q931mes_USER_INFORMATION 0x20 /* 0010 0000 */\r
+#define Q931mes_DISCONNECT 0x45 /* 0100 0101 */\r
+#define Q931mes_RELEASE 0x4d /* 0100 1101 */\r
+#define Q931mes_RELEASE_COMPLETE 0x5a /* 0101 1010 */\r
+#define Q931mes_RESTART 0x46 /* 0100 0110 */\r
+#define Q931mes_RESTART_ACKNOWLEDGE 0x4e /* 0100 1110 */\r
+#define Q931mes_CONGESTION_CONTROL 0x79 /* 0111 1001 */\r
+#define Q931mes_INFORMATION 0x7a /* 0111 1011 */\r
+#define Q931mes_NOTIFY 0x6e /* 0110 1110 */\r
+#define Q931mes_STATUS 0x7d /* 0111 1101 */\r
+#define Q931mes_STATUS_ENQUIRY 0x75 /* 0111 0101 */\r
+#define Q931mes_SEGMENT 0x60 /* 0110 0000 */\r
+\r
+\r
+/* Single octet information elements */\r
+#define Q931ie_SHIFT 0x90 /* 1001 ---- */\r
+#define Q931ie_MORE_DATA 0xa0 /* 1010 ---- */\r
+#define Q931ie_SENDING_COMPLETE 0xa1 /* 1010 0000 */\r
+#define Q931ie_CONGESTION_LEVEL 0xb0 /* 1011 ---- */\r
+#define Q931ie_REPEAT_INDICATOR 0xd0 /* 1101 ---- */\r
+\r
+/* Variable Length Information Elements */\r
+#define Q931ie_SEGMENTED_MESSAGE 0x00 /* 0000 0000 */\r
+#define Q931ie_BEARER_CAPABILITY 0x04 /* 0000 0100 */\r
+#define Q931ie_CAUSE 0x08 /* 0000 1000 */\r
+#define Q931ie_CALL_IDENTITY 0x10 /* 0001 0000 */\r
+#define Q931ie_CALL_STATE 0x14 /* 0001 0100 */\r
+#define Q931ie_CHANNEL_IDENTIFICATION 0x18 /* 0001 1000 */\r
+#define Q931ie_PROGRESS_INDICATOR 0x1e /* 0001 1110 */\r
+#define Q931ie_NETWORK_SPECIFIC_FACILITIES 0x20 /* 0010 0000 */\r
+#define Q931ie_NOTIFICATION_INDICATOR 0x27 /* 0010 0111 */\r
+#define Q931ie_DISPLAY 0x28 /* 0010 1000 */\r
+#define Q931ie_DATETIME 0x29 /* 0010 1001 */\r
+#define Q931ie_KEYPAD_FACILITY 0x2c /* 0010 1100 */\r
+#define Q931ie_SIGNAL 0x34 /* 0011 0100 */\r
+#define Q931ie_SWITCHOOK 0x36 /* 0011 0110 */\r
+#define Q931ie_FEATURE_ACTIVATION 0x38 /* 0011 1000 */\r
+#define Q931ie_FEATURE_INDICATION 0x39 /* 0011 1001 */\r
+#define Q931ie_INFORMATION_RATE 0x40 /* 0100 0000 */\r
+#define Q931ie_END_TO_END_TRANSIT_DELAY 0x42 /* 0100 0010 */\r
+#define Q931ie_TRANSIT_DELAY_SELECTION_AND_IND 0x43 /* 0100 0011 */\r
+#define Q931ie_PACKED_LAYER_BIMARY_PARAMETERS 0x44 /* 0100 0100 */\r
+#define Q931ie_PACKED_LAYER_WINDOW_SIZE 0x45 /* 0100 0101 */\r
+#define Q931ie_PACKED_SIZE 0x46 /* 0100 0110 */\r
+#define Q931ie_CALLING_PARTY_NUMBER 0x6c /* 0110 1100 */\r
+#define Q931ie_CALLING_PARTY_SUBADDRESS 0x6d /* 0110 1101 */\r
+#define Q931ie_CALLED_PARTY_NUMBER 0x70 /* 0111 0000 */\r
+#define Q931ie_CALLED_PARTY_SUBADDRESS 0x71 /* 0111 0001 */\r
+#define Q931ie_REDIRECTING_NUMBER 0x74 /* 0111 0100 */\r
+#define Q931ie_TRANSIT_NETWORK_SELECTION 0x78 /* 0111 1000 */\r
+#define Q931ie_RESTART_INDICATOR 0x79 /* 0111 1001 */\r
+#define Q931ie_LOW_LAYER_COMPATIBILITY 0x7c /* 0111 1100 */\r
+#define Q931ie_HIGH_LAYER_COMPATIBILITY 0x7d /* 0111 1101 */\r
+#define Q931ie_USER_USER 0x7e /* 0111 1110 */\r
+#define Q931ie_ESCAPE_FOR_EX 0x7f /* 0111 1111 */\r
+\r
+/*****************************************************************************\r
+\r
+ Global defines.\r
+\r
+*****************************************************************************/\r
+\r
+typedef L3USHORT ie; /* Special data type to hold a dynamic */\r
+ /* or optional information element as */\r
+ /* part of a message struct. MSB = 1 */\r
+ /* indicate that the ie is present, the */\r
+ /* last 15 bits is an offset ( or the */\r
+ /* value for single octet ) to the */\r
+ /* struct holding the ie. Offset = 0 */\r
+ /* is buf[1] etc. */\r
+ /* ie == 0xffff indicate error */\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_BearerCap\r
+\r
+ Description: Bearer Capability Information Element.\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00000100 for Bearer Capability */\r
+ \r
+ L3UCHAR Size; /* Length of Information Element */\r
+\r
+ L3UCHAR CodStand; /* Coding Standard. */\r
+ /* 00 - ITU-T */\r
+ /* 01 - ISO/IEC */\r
+ /* 10 - National standard */\r
+ /* 11 - Network side spesific */\r
+\r
+ L3UCHAR ITC; /* Information Transfer Capability */\r
+ /* 00000 - Speech */\r
+ /* 01000 - Unrestricted digital info */\r
+ /* 01001 - Restricted digital info */\r
+ /* 10000 - 3.1 kHz audio */\r
+ /* 10001 - Unrestricted with tones */\r
+ /* 11000 - Video */\r
+\r
+ L3UCHAR TransMode; /* Transfer Mode. */\r
+ /* 00 - Circuit mode */\r
+ /* 10 - Packet mode */\r
+\r
+ L3UCHAR ITR; /* Information Transfer Rate. */\r
+ /* 00000 - Packed mode */\r
+ /* 10000 - 64 kbit/s */\r
+ /* 10001 - 2 x 64 kbit/s */\r
+ /* 10011 - 384 kbit/s */\r
+ /* 10101 - 1536 kbit/s */\r
+ /* 10111 - 1920 kbit/s */\r
+ /* 11000 - Multirat (64 kbit/s base) */\r
+\r
+ L3UCHAR RateMul; /* Rate Multiplier */\r
+\r
+ L3UCHAR Layer1Ident; /* Layer 1 Ident. */\r
+\r
+ L3UCHAR UIL1Prot; /* User Information Layer 1 Protocol */\r
+ /* 00001 : ITU-T V.110, I.460 and X.30 */\r
+ /* 00010 : G.711 my-law */\r
+ /* 00011 : G.711 A-law */\r
+ /* 00100 : G.721 */\r
+ /* 00101 : H.221 and H.242 */\r
+ /* 00110 : H.223 and H.245 */\r
+ /* 00111 : Non ITU-T Standard */\r
+ /* 01000 : ITU-T V.120 */\r
+ /* 01001 : ITU-T X.31 HDLC flag stuff. */\r
+\r
+ L3UCHAR SyncAsync; /* Sync/Async */\r
+ /* 0 : Syncronous data */\r
+ /* 1 : Asyncronous data */\r
+\r
+ L3UCHAR Negot; /* Negotiation */\r
+ /* 0 : In-band negotiation not possib. */\r
+ /* 1 : In-band negotiation possible */\r
+\r
+ L3UCHAR UserRate; /* User rate */\r
+ /* 00000 : I.460, V.110, X,30 */\r
+ /* 00001 : 0.6 kbit/s x.1 */\r
+ /* 00010 : 1.2 kbit/s */\r
+ /* 00011 : 2.4 kbit/s */\r
+ /* 00100 : 3.6 kbit/s */\r
+ /* 00101 : 4.8 kbit/s */\r
+ /* 00110 : 7.2 kbit/s */\r
+ /* 00111 : 8 kbit/s I.460 */\r
+ /* 01000 : 9.6 kbit/s */\r
+ /* 01001 : 14.4 kbit/s */\r
+ /* 01010 : 16 kbit/s */\r
+ /* 01011 : 19.2 kbit/s */\r
+ /* 01100 : 32 kbit/s */\r
+ /* 01101 : 38.4 kbit/s */\r
+ /* 01110 : 48 kbit/s */\r
+ /* 01111 : 56 kbit/s */\r
+ /* 10000 : 57.6 kbit/s */\r
+ /* 10010 : 28.8 kbit/s */\r
+ /* 10100 : 24 kbit/s */\r
+ /* 10101 : 0.1345 kbit/s */\r
+ /* 10110 : 0.100 kbit/s */\r
+ /* 10111 : 0.075/1.2 kbit/s */\r
+ /* 11000 : 1.2/0.075/kbit/s */\r
+ /* 11001 : 0.050 kbit/s */\r
+ /* 11010 : 0.075 kbit/s */\r
+ /* 11011 : 0.110 kbit/s */\r
+ /* 11100 : 0.150 kbit/s */\r
+ /* 11101 : 0.200 kbit/s */\r
+ /* 11110 : 0.300 kbit/s */\r
+ /* 11111 : 12 kbit/s */\r
+\r
+ L3UCHAR InterRate; /* Intermediate Rate */\r
+ /* 00 : Not used */\r
+ /* 01 : 8 kbit/s */\r
+ /* 10 : 16 kbit/s */\r
+ /* 11 : 32 kbit/s */\r
+\r
+ L3UCHAR NIConTx; /* Network Indepentend Clock on transmit*/\r
+ /* 0 : Not required to send data clc */\r
+ /* 1 : Send data w/NIC clc */\r
+\r
+ L3UCHAR NIConRx; /* NIC on Rx */\r
+ /* 0 : Cannot accept indep. clc */\r
+ /* 1 : data with indep. clc accepted */\r
+\r
+ L3UCHAR FlowCtlTx; /* Flow control on Tx */\r
+ /* 0 : Send Flow ctrl not required */\r
+ /* 1 : Send flow ctrl required */\r
+\r
+ L3UCHAR FlowCtlRx; /* Flow control on Rx */\r
+ /* 0 : cannot use receive flow ctrl */\r
+ /* 1 : Receive flow ctrl accepted */\r
+ L3UCHAR HDR; /* HDR/No HDR */\r
+ L3UCHAR MultiFrame; /* Multi frame support */\r
+ /* 0 : multiframe not supported */\r
+ /* 1 : multiframe supported */\r
+\r
+ L3UCHAR Mode; /* Mode of operation */\r
+ /* 0 : bit transparent mode of operat. */\r
+ /* 1 : protocol sesitive mode of op. */\r
+\r
+ L3UCHAR LLInegot; /* Logical link id negotiation (oct. 5b)*/\r
+ /* 0 : default LLI=256 only */\r
+ /* 1 : Full protocol negotiation */\r
+\r
+ L3UCHAR Assignor; /* Assignor/assignee */\r
+ /* 0 : Default Asignee */\r
+ /* 1 : Assignor only */\r
+\r
+ L3UCHAR InBandNeg; /* In-band/out-band negot. */\r
+ /* 0 : negot done w/ USER INFO mes */\r
+ /* 1 : negot done in-band w/link zero */\r
+\r
+ L3UCHAR NumStopBits; /* Number of stop bits */\r
+ /* 00 : Not used */\r
+ /* 01 : 1 bit */\r
+ /* 10 : 1.5 bits */\r
+ /* 11 : 2 bits */\r
+\r
+ L3UCHAR NumDataBits; /* Number of data bits. */\r
+ /* 00 : not used */\r
+ /* 01 : 5 bits */\r
+ /* 10 : 7 bits */\r
+ /* 11 : 8 bits */\r
+\r
+ L3UCHAR Parity; /* Parity Information */\r
+ /* 000 : Odd */\r
+ /* 010 : Even */\r
+ /* 011 : None */\r
+ /* 100 : Forced to 0 */\r
+ /* 101 : Forced to 1 */\r
+\r
+ L3UCHAR DuplexMode; /* Mode duplex */\r
+ /* 0 : Half duplex */\r
+ /* 1 : Full duplex */\r
+\r
+ L3UCHAR ModemType; /* Modem type, see Q.931 p 64 */\r
+\r
+ L3UCHAR Layer2Ident; /* Layer 2 Ident */\r
+\r
+ L3UCHAR UIL2Prot; /* User Information Layer 2 Protocol */\r
+ /* 00010 : Q.921/I.441 */\r
+ /* 00110 : X.25 */\r
+ /* 01100 : LAN logical link */\r
+\r
+ L3UCHAR Layer3Ident; /* Layer 3 ident. */\r
+\r
+ L3UCHAR UIL3Prot; /* User Information Layer 3 Protocol */\r
+ /* 00010 : Q.931 */\r
+ /* 00110 : X.25 */\r
+ /* 01011 : ISO/IEC TR 9577 */\r
+\r
+ L3UCHAR AL3Info1; /* additional layer 3 info 1 */\r
+\r
+ L3UCHAR AL3Info2; /* additional layer 3 info 2 */\r
+}Q931ie_BearerCap;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CallID\r
+\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00010000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CallId[1]; /* Call identity */\r
+}Q931ie_CallID;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CallState\r
+\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00010100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CodStand; /* Coding Standard */\r
+ L3UCHAR CallState; /* Call State Value */\r
+}Q931ie_CallState;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_Cause\r
+\r
+ Description: Cause IE as described in Q.850\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00010100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CodStand; /* Coding Standard */\r
+ L3UCHAR Location; /* Location */\r
+ L3UCHAR Recom; /* Recommendation */\r
+ L3UCHAR Value; /* Cause Value */\r
+ L3UCHAR Diag[1]; /* Optional Diagnostics Field */\r
+}Q931ie_Cause;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CalledNum\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01110000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR TypNum; /* Type of Number */\r
+ L3UCHAR NumPlanID; /* Numbering plan identification */\r
+ L3UCHAR Digit[1]; /* Digit (IA5) */\r
+}Q931ie_CalledNum;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CalledSub\r
+\r
+ Description: Called party subaddress\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01110001 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR TypNum; /* Type of subaddress */\r
+ L3UCHAR OddEvenInd; /* Odd/Even indicator */\r
+ L3UCHAR Digit[1]; /* digits */\r
+}Q931ie_CalledSub;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CallingNum\r
+\r
+ Description: Calling party number\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01101100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR TypNum; /* Type of number */\r
+ L3UCHAR NumPlanID; /* Numbering plan identification */\r
+ L3UCHAR PresInd; /* Presentation indicator */\r
+ L3UCHAR ScreenInd; /* Screening indicator */\r
+ L3UCHAR Digit[1]; /* Number digits (IA5) */\r
+}Q931ie_CallingNum;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CallingSub\r
+\r
+ Description: Calling party subaddress\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01101101 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR TypNum; /* Type of subaddress */\r
+ L3UCHAR OddEvenInd; /* Odd/Even indicator */\r
+ L3UCHAR Digit[1]; /* digits */\r
+}Q931ie_CallingSub;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_ChanID\r
+\r
+ Description: Channel identification\r
+\r
+ Channel Identificationis one of the IE elements that differ\r
+ between BRI and PRI. IntType = 1 = BRI and ChanSlot is used\r
+ for channel number, while InfoChanSel is used for BRI.\r
+\r
+ ChanID is one of the most important IE as it is passed \r
+ either though SETUP or CALL PROCEEDING to select the channel\r
+ to be used.\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00011000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR IntIDPresent; /* Int. id. present */\r
+ L3UCHAR IntType; /* Interface Type */\r
+ /* 0 : Basic Interface (BRI) */\r
+ /* 1 : Other interfaces, PRI etc. */\r
+\r
+ L3UCHAR PrefExcl; /* Pref./Excl. */\r
+ /* 0 : Indicated channel is preffered */\r
+ /* 1 : Exclusive, no other accepted */\r
+\r
+ L3UCHAR DChanInd; /* D-channel ind. */\r
+ /* 0 : chan is NOT D chan. */\r
+ /* 1 : chan is D chan */\r
+\r
+ L3UCHAR InfoChanSel; /* Info. channel selection */\r
+ /* 00 : No channel */\r
+ /* 01 : B1 channel */\r
+ /* 10 : B2 channel */\r
+ /* 11 : Any channel */\r
+\r
+ L3UCHAR InterfaceID; /* Interface identifier */\r
+\r
+ L3UCHAR CodStand; /* Code standard */\r
+ /* 00 : ITU-T standardization coding */\r
+ /* 01 : ISO/IEC Standard */\r
+ /* 10 : National Standard */\r
+ /* 11 : Standard def. by network. */\r
+\r
+ L3UCHAR NumMap; /* Number/Map */\r
+ /* 0 : chan is in following octet */\r
+ /* 1 : chan is indicated by slot map */\r
+\r
+ L3UCHAR ChanMapType; /* Channel type/Map element type */\r
+ /* 0011 : B Channel units */\r
+ /* 0110 : H0 channel units */\r
+ /* 1000 : H11 channel units */\r
+ /* 1001 : H12 channel units */\r
+\r
+ L3UCHAR ChanSlot; /* Channel number */\r
+}Q931ie_ChanID;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_DateTime\r
+\r
+ Description: Date/time\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00101001 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR Year; /* Year */\r
+ L3UCHAR Month; /* Month */\r
+ L3UCHAR Day; /* Day */\r
+ L3UCHAR Hour; /* Hour */\r
+ L3UCHAR Minute; /* Minute */\r
+ L3UCHAR Second; /* Second */\r
+ L3UCHAR Format; /* Indicate presense of Hour, Min & sec */\r
+ /* 0 : Only Date */\r
+ /* 1 : Hour present */\r
+ /* 2 : Hour and Minute present */\r
+ /* 3 : Hour, Minute and Second present */\r
+}Q931ie_DateTime;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_Display\r
+\r
+ Description: Display\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00101000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR Display[1]; /* Display information (IA5) */\r
+}Q931ie_Display;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_HLComp\r
+\r
+ Description: High layer compatibility\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01111101 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CodStand; /* Coding standard */\r
+ L3UCHAR Interpret; /* Interpretation */\r
+ L3UCHAR PresMeth; /* Presentation methor of prot. profile */\r
+ L3UCHAR HLCharID; /* High layer characteristics id. */\r
+ L3UCHAR EHLCharID; /* Extended high layer character. id. */\r
+ L3UCHAR EVideoTlfCharID; /* Ext. videotelephony char. id. */\r
+}Q931ie_HLComp;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_KeypadFac\r
+\r
+ Description: Keypad facility\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00101100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR KeypadFac[1]; /* dynamic buffer */\r
+}Q931ie_KeypadFac;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_LLComp\r
+\r
+ Description: Low layer compatibility\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01111100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CodStand; /* Coding standard */\r
+ /* 00 - ITU-T */\r
+ /* 01 - ISO/IEC */\r
+ /* 10 - National standard */\r
+ /* 11 - Network side spesific */\r
+\r
+ L3UCHAR ITransCap; /* Information transfer capability */\r
+ /* 00000 - Speech */\r
+ /* 01000 - Unrestricted digital info */\r
+ /* 01001 - Restricted digital info */\r
+ /* 10000 - 3.1 kHz audio */\r
+ /* 10001 - Unrestricted with tones */\r
+ /* 11000 - Video */\r
+\r
+ L3UCHAR NegotInd; /* Negot indic. */\r
+ /* 0 : Out-band neg. not possib. */\r
+ /* 1 : Out-band neg. possible */\r
+\r
+ L3UCHAR TransMode; /* Transfer Mode */\r
+ /* 00 : Circuit Mode */\r
+ /* 10 : Packed Mode */\r
+\r
+ L3UCHAR InfoRate; /* Information transfer rate */\r
+ /* 00000 - Packed mode */\r
+ /* 10000 - 64 kbit/s */\r
+ /* 10001 - 2 x 64 kbit/s */\r
+ /* 10011 - 384 kbit/s */\r
+ /* 10101 - 1536 kbit/s */\r
+ /* 10111 - 1920 kbit/s */\r
+ /* 11000 - Multirat (64 kbit/s base) */\r
+\r
+ L3UCHAR RateMul; /* Rate multiplier */\r
+ L3UCHAR Layer1Ident; /* Layer 1 ident. */\r
+ L3UCHAR UIL1Prot; /* User information layer 1 protocol */\r
+ /* 00001 : ITU-T V.110, I.460 and X.30 */\r
+ /* 00010 : G.711 my-law */\r
+ /* 00011 : G.711 A-law */\r
+ /* 00100 : G.721 */\r
+ /* 00101 : H.221 and H.242 */\r
+ /* 00110 : H.223 and H.245 */\r
+ /* 00111 : Non ITU-T Standard */\r
+ /* 01000 : ITU-T V.120 */\r
+ /* 01001 : ITU-T X.31 HDLC flag stuff. */\r
+\r
+ L3UCHAR SyncAsync; /* Synch/asynch */\r
+ /* 0 : Syncronous data */\r
+ /* 1 : Asyncronous data */\r
+\r
+ L3UCHAR Negot; /* Negot */\r
+ /* 0 : In-band negotiation not possib. */\r
+ /* 1 : In-band negotiation possible */\r
+\r
+ L3UCHAR UserRate; /* User rate */\r
+ /* 00000 : I.460, V.110, X,30 */\r
+ /* 00001 : 0.6 kbit/s x.1 */\r
+ /* 00010 : 1.2 kbit/s */\r
+ /* 00011 : 2.4 kbit/s */\r
+ /* 00100 : 3.6 kbit/s */\r
+ /* 00101 : 4.8 kbit/s */\r
+ /* 00110 : 7.2 kbit/s */\r
+ /* 00111 : 8 kbit/s I.460 */\r
+ /* 01000 : 9.6 kbit/s */\r
+ /* 01001 : 14.4 kbit/s */\r
+ /* 01010 : 16 kbit/s */\r
+ /* 01011 : 19.2 kbit/s */\r
+ /* 01100 : 32 kbit/s */\r
+ /* 01101 : 38.4 kbit/s */\r
+ /* 01110 : 48 kbit/s */\r
+ /* 01111 : 56 kbit/s */\r
+ /* 10000 : 57.6 kbit/s */\r
+ /* 10010 : 28.8 kbit/s */\r
+ /* 10100 : 24 kbit/s */\r
+ /* 10101 : 0.1345 kbit/s */\r
+ /* 10110 : 0.100 kbit/s */\r
+ /* 10111 : 0.075/1.2 kbit/s */\r
+ /* 11000 : 1.2/0.075/kbit/s */\r
+ /* 11001 : 0.050 kbit/s */\r
+ /* 11010 : 0.075 kbit/s */\r
+ /* 11011 : 0.110 kbit/s */\r
+ /* 11100 : 0.150 kbit/s */\r
+ /* 11101 : 0.200 kbit/s */\r
+ /* 11110 : 0.300 kbit/s */\r
+ /* 11111 : 12 kbit/s */\r
+\r
+ L3UCHAR InterRate; /* Intermediate rate */\r
+ /* 00 : Not used */\r
+ /* 01 : 8 kbit/s */\r
+ /* 10 : 16 kbit/s */\r
+ /* 11 : 32 kbit/s */\r
+\r
+ L3UCHAR NIConTx; /* Network Indepentend Clock on transmit*/\r
+ /* 0 : Not required to send data clc */\r
+ /* 1 : Send data w/NIC clc */\r
+\r
+ L3UCHAR NIConRx; /* NIC on Rx */\r
+ /* 0 : Cannot accept indep. clc */\r
+ /* 1 : data with indep. clc accepted */\r
+\r
+ L3UCHAR FlowCtlTx; /* Flow control on Tx */\r
+ /* 0 : Send Flow ctrl not required */\r
+ /* 1 : Send flow ctrl required */\r
+\r
+ L3UCHAR FlowCtlRx; /* Flow control on Rx */\r
+ /* 0 : cannot use receive flow ctrl */\r
+ /* 1 : Receive flow ctrl accepted */\r
+ L3UCHAR HDR; /* HDR/No HDR */\r
+ L3UCHAR MultiFrame; /* Multi frame support */\r
+ /* 0 : multiframe not supported */\r
+ /* 1 : multiframe supported */\r
+\r
+ L3UCHAR ModeL1; /* Mode L1 */\r
+ /* 0 : bit transparent mode of operat. */\r
+ /* 1 : protocol sesitive mode of op. */\r
+\r
+ L3UCHAR NegotLLI; /* Negot. LLI */\r
+ /* 0 : default LLI=256 only */\r
+ /* 1 : Full protocol negotiation */\r
+\r
+ L3UCHAR Assignor; /* Assignor/Assignor ee */\r
+ /* 0 : Default Asignee */\r
+ /* 1 : Assignor only */\r
+\r
+ L3UCHAR InBandNeg; /* In-band negot. */\r
+ /* 0 : negot done w/ USER INFO mes */\r
+ /* 1 : negot done in-band w/link zero */\r
+\r
+ L3UCHAR NumStopBits; /* Number of stop bits */\r
+ /* 00 : Not used */\r
+ /* 01 : 1 bit */\r
+ /* 10 : 1.5 bits */\r
+ /* 11 : 2 bits */\r
+\r
+ L3UCHAR NumDataBits; /* Number of data bits. */\r
+ /* 00 : not used */\r
+ /* 01 : 5 bits */\r
+ /* 10 : 7 bits */\r
+ /* 11 : 8 bits */\r
+\r
+ L3UCHAR Parity; /* Parity Information */\r
+ /* 000 : Odd */\r
+ /* 010 : Even */\r
+ /* 011 : None */\r
+ /* 100 : Forced to 0 */\r
+ /* 101 : Forced to 1 */\r
+\r
+ L3UCHAR DuplexMode; /* Mode duplex */\r
+ /* 0 : Half duplex */\r
+ /* 1 : Full duplex */\r
+\r
+ L3UCHAR ModemType; /* Modem type, see Q.931 p 89 */\r
+\r
+ L3UCHAR Layer2Ident; /* Layer 2 ident. */\r
+\r
+ L3UCHAR UIL2Prot; /* User information layer 2 protocol */\r
+ /* 00001 : Basic mode ISO 1745 */\r
+ /* 00010 : Q.921/I.441 */\r
+ /* 00110 : X.25 single link */\r
+ /* 00111 : X.25 multilink */\r
+ /* 01000 : Extended LAPB T.71 */\r
+ /* 01001 : HDLC ARM */\r
+ /* 01010 : HDLC NRM */\r
+ /* 01011 : HDLC ABM */\r
+ /* 01100 : LAN logical link */\r
+ /* 01101 : X.75 SLP */\r
+ /* 01110 : Q.922 */\r
+ /* 01111 : Q.922 core aspect */\r
+ /* 10000 : User specified */\r
+ /* 10001 : ISO/IEC 7776 DTE-DCE */\r
+\r
+ L3UCHAR ModeL2; /* Mode */\r
+ /* 01 : Normal Mode of operation */\r
+ /* 10 : Extended mode of operation */\r
+\r
+ L3UCHAR Q933use; /* Q.9333 use */\r
+\r
+ L3UCHAR UsrSpcL2Prot; /* User specified layer 2 protocol info */\r
+\r
+ L3UCHAR WindowSize; /* Window size (k) */\r
+\r
+ L3UCHAR Layer3Ident; /* Layer 3 ident */\r
+\r
+ L3UCHAR UIL3Prot; /* User Information Layer 3 protocol */\r
+ /* 00010 : Q.931 */\r
+ /* 00110 : X.25 */\r
+ /* 00111 : 8208 */\r
+ /* 01000 : X.233 ... */\r
+ /* 01001 : 6473 */\r
+ /* 01010 : T.70 */\r
+ /* 01011 : ISO/IEC TR 9577 */\r
+ /* 10000 : User specified */\r
+ L3UCHAR OptL3Info; /* Optional Leyer 3 info */\r
+\r
+ L3UCHAR ModeL3; /* Mode of operation */\r
+ /* 01 : Normal packed seq. numbering */\r
+ /* 10 : Extended packed seq. numbering */\r
+\r
+ L3UCHAR DefPackSize; /* Default packet size */\r
+\r
+ L3UCHAR PackWinSize; /* Packet window size */\r
+\r
+ L3UCHAR AddL3Info; /* Additional Layer 3 protocol info */\r
+}Q931ie_LLComp;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_NetFac;\r
+\r
+ Description: Network-specific facilities\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00100000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR LenNetID; /* Length of network facilities id. */\r
+ L3UCHAR TypeNetID; /* Type of network identification */\r
+ L3UCHAR NetIDPlan; /* Network identification plan. */\r
+ L3UCHAR NetFac; /* Network specific facility spec. */\r
+ L3UCHAR NetID[1]; /* Network id. (IA5) */\r
+}Q931ie_NetFac;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_NotifInd;\r
+\r
+ Description: Notification Indicator\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00100000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR Notification; /* Notification descriptor */\r
+}Q931ie_NotifInd;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_ProgInd\r
+\r
+ Description: Progress indicator\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00011110 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CodStand; /* Coding standard */\r
+ L3UCHAR Location; /* Location */\r
+ L3UCHAR ProgDesc; /* Progress description */\r
+}Q931ie_ProgInd;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct; Q931ie_Segment\r
+\r
+ Description: Segmented message\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00000000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR FSI; /* First segment indicator */\r
+ L3UCHAR NumSegRem; /* Number of segments remaining */\r
+ L3UCHAR SegType; /* Segment message type */\r
+}Q931ie_Segment;\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00000000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+}Q931ie_SendComplete;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_Signal\r
+\r
+ Description: Signal\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00000000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR Signal; /* Signal value */\r
+ /* 00000000 Dial tone on */\r
+ /* 00000001 Ring back tone on */\r
+ /* 00000010 Intercept tone on */\r
+ /* 00000011 Network congestion on */\r
+ /* 00000100 Busy tone on */\r
+ /* 00000101 Confirm tone on */\r
+ /* 00000110 Answer tone on */\r
+ /* 00000111 Call waiting tone */\r
+ /* 00001000 Off-hook warning tone */\r
+ /* 00001001 Pre-emption tone on */\r
+ /* 00111111 Tones off */\r
+ /* 01000000 Alerting on - pattern 0 */\r
+ /* 01000001 Alerting on - pattern 1 */\r
+ /* 01000010 Alerting on - pattern 2 */\r
+ /* 01000011 Alerting on - pattern 3 */\r
+ /* 01000100 Alerting on - pattern 4 */\r
+ /* 01000101 Alerting on - pattern 5 */\r
+ /* 01000110 Alerting on - pattern 6 */\r
+ /* 01000111 Alerting on - pattern 7 */\r
+ /* 01001111 Alerting off */\r
+}Q931ie_Signal;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_TransDelSelInd\r
+\r
+ description: Transit delay selection and indication\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 00000000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3ULONG TxDSIValue; /* Trans. delay sel. & ind. value */ \r
+}Q931ie_TransDelSelInd;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_TransNetSel\r
+\r
+ Description: Transit network selection\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01111000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR Type; /* Type of network identifier */\r
+ L3UCHAR NetIDPlan; /* Network idetification plan */\r
+ L3UCHAR NetID[1]; /* Network identification(IA5) */\r
+}Q931ie_TransNetSel;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_UserUser\r
+\r
+ Description: User-user\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01111110 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR ProtDisc; /* Protocol discriminator */\r
+ L3UCHAR User[1]; /* User information */\r
+}Q931ie_UserUser;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_ClosedUserGrp\r
+\r
+ Description: Closed user group\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01000111 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CUGInd; /* CUG indication */\r
+ L3UCHAR CUG[1]; /* CUG index code (IA5) */\r
+}Q931ie_ClosedUserGrp;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_CongLevel\r
+\r
+ Description: Congestion Level\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01000111 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR CongLevel; /* Conguestion Level */\r
+}Q931ie_CongLevel;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_EndEndTxDelay\r
+\r
+ Description: End to end transit delay\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01000010 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3ULONG CumTxDelay; /* Cumulative transit delay value */\r
+ L3ULONG ReqTxDelay; /* Requested end to end transit delay */\r
+ L3ULONG MaxTxDelay; /* Maximum transit delay */\r
+}Q931ie_EndEndTxDelay;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_InfoRate\r
+\r
+ Description: Information Rate\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01100000 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR InInfoRate; /* Incoming information rate */\r
+ L3UCHAR OutInfoRate; /* Outgoing information rate */\r
+ L3UCHAR MinInInfoRate; /* Minimum incoming information rate */\r
+ L3UCHAR MinOutInfoRate; /* Minimum outgoing information rate */\r
+}Q931ie_InfoRate;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_PackParam\r
+\r
+ Description: Packed layer binary parameters\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01000100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR FastSel; /* Fast selected */\r
+ L3UCHAR ExpData; /* Exp. data */\r
+ L3UCHAR DelConf; /* Delivery conf */\r
+ L3UCHAR Modulus; /* Modulus */\r
+}Q931ie_PackParam;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_PackWinSize\r
+\r
+ Description: Packed window size\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01000101 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR ForwardValue; /* Forward value */\r
+ L3UCHAR BackwardValue; /* Backward value */\r
+}Q931ie_PackWinSize;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_PackSize\r
+\r
+ Description: Packet size\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01000110 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR ForwardValue; /* Forward value */\r
+ L3UCHAR BackwardValue; /* Backward value */\r
+}Q931ie_PackSize;\r
+#endif\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931ie_RedirNum\r
+\r
+ Description: Redirecting number\r
+\r
+*****************************************************************************/\r
+#ifdef Q931_X25_SUPPORT\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01110100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR TypeNum; /* Type of number */\r
+ L3UCHAR NumPlanID; /* Number plan identification */\r
+ L3UCHAR PresInd; /* Presentation indicator */\r
+ L3UCHAR ScreenInd; /* Screening indicator */\r
+ L3UCHAR Reason; /* Reason for redirection */\r
+ L3UCHAR Digit[1]; /* Number digits (IA5) */\r
+}Q931ie_RedirNum;\r
+#endif\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01110100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR RepeatInd; /* 0010 Prioritized list for selecting */\r
+ /* one possible. */\r
+}Q931ie_RepeatInd;\r
+\r
+typedef struct\r
+{\r
+ L3UCHAR IEId; /* 01110100 */\r
+ L3UCHAR Size; /* Length of Information Element */\r
+ L3UCHAR Class; /* Class */\r
+ /* 000 Indicate channels */\r
+ /* 110 Single interface */\r
+ /* 111 All interfaces */\r
+}Q931ie_RestartInd;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Header\r
+\r
+ Description: Used to read the header & message code.\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+}Q931mes_Header;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Generic\r
+\r
+ Description: Generic header containing all IE's. This is not used, but is\r
+ provided in case a proprietary variant needs it.\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+\r
+ ie Shift;\r
+ ie MoreData;\r
+ ie SendComplete;\r
+ ie CongestionLevel;\r
+ ie RepeatInd;\r
+\r
+ ie Segment; /* Segmented message */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie Cause; /* Cause */\r
+ ie CallID; /* Call Identity */\r
+ ie ChanID; /* Channel Identification */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie NetFac; /* Network Spesific Facilities */\r
+ ie NotifInd; /* Notification Indicator */\r
+ ie Display; /* Display */\r
+ ie DateTime; /* Date/Time */\r
+ ie KeypadFac; /* Keypad Facility */\r
+ ie Signal; /* Signal */\r
+ ie InfoRate; /* Information rate */\r
+ ie EndEndTxDelay; /* End to End Transmit Delay */\r
+ ie TransDelSelInd; /* Transmit Delay Sel. and Ind. */\r
+ ie PackParam; /* Packed Layer Binary parameters */\r
+ ie PackWinSize; /* Packet Layer Window Size */\r
+ ie PackSize; /* Packed Size */\r
+ ie ClosedUserGrp; /* Closed User Group */\r
+ ie RevChargeInd; /* Reverse Charging Indicator */\r
+ ie CalledNum; /* Called Party Number */\r
+ ie CalledSub; /* Called Party subaddress */\r
+ ie CallingNum; /* Calling Party Number */\r
+ ie CallingSub; /* Calling Party Subaddress */\r
+ ie RedirNum; /* Redirection Number */\r
+ ie TransNetSel; /* Transmit Network Selection */\r
+ ie RestartInd; /* Restart Indicator */\r
+ ie LLComp; /* Low Layer Compatibility */\r
+ ie HLComp; /* High Layer Compatibility */\r
+ ie UserUser; /* User-user */\r
+ ie Escape; /* Escape for extension */\r
+ L3UCHAR buf[1]; /* Buffer for IE's */\r
+\r
+}Q931mes_Generic;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Alerting\r
+\r
+ Description: This message is send by the called party to indicate that\r
+ the phone is ringing.\r
+\r
+ The message consist of an header that MUST be identical with\r
+ Q931mes_Header, a fixed number of IE flags w/offset, and\r
+ a dynamic buffer storing normalized IE's.\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie ChanID; /* Channel Identification */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie Display; /* Display */\r
+ ie Signal; /* Signal */\r
+ ie HLComp; /* High Layer Compatibility */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Alerting;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_CallProceeding\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie ChanID; /* Channel Identification */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie Display; /* Display */\r
+ ie HLComp; /* High Layer Compatibility */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_CallProceeding;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Connect\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie ChanID; /* Channel Identification */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie Display; /* Display */\r
+ ie DateTime; /* Date/Time */\r
+ ie Signal; /* Signal */\r
+ ie LLComp; /* Low Layer Compatibility */\r
+ ie HLComp; /* High layer Compatibility */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Connect;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_ConnectAck\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Display; /* Display */\r
+ ie Signal; /* Signal */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_ConnectAck;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Disconnect\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Cause; /* Cause */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie Display; /* Display */\r
+ ie Signal; /* Signal */\r
+#ifdef Q931_X25_SUPPORT\r
+ ie UserUser; /* User - user. Packed Mode. */\r
+#endif\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Disconnect;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Information\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie SendComplete; /* Sending Complete */\r
+ ie Display; /* Display */\r
+ ie KeypadFac; /* Keypad facility */\r
+ ie Signal; /* Signal */\r
+ ie CalledNum; /* Called party number */\r
+#ifdef Q931_X25_SUPPORT\r
+ ie Cause; /* Cause (packed only) */\r
+#endif\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Information;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Notify\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie NotifInd; /* Notification Indicator */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Notify;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Progress\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie Cause; /* Cause */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie Display; /* Display */\r
+ ie HLComp; /* High Layer Compatibility */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Progress;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Release\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Cause; /* Cause */\r
+ ie Display; /* Display */\r
+ ie Signal; /* Signal */\r
+#ifdef Q931_X25_SUPPORT\r
+ ie UserUser; /* User-User packed mode */\r
+#endif\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Release;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_ReleaseComplete\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Cause; /* Cause */\r
+ ie Display; /* Display */\r
+ ie Signal; /* Signal */\r
+#ifdef Q931_X25_SUPPORT\r
+ ie UserUser; /* User-User packed mode */\r
+#endif\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_ReleaseComplete;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Resume\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie CallID; /* Call Identity */\r
+ L3UCHAR buf[1];\r
+}Q931mes_Resume;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_ResumeAck\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie ChanID; /* Channel ID */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_ResumeAck;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_ResumeReject\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Cause; /* Cause */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_ResumeReject;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Segment\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Segment;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Setup\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie SendComplete; /* Sending Complete */\r
+ ie RepeatInd; /* Repeat Indicator */\r
+ ie BearerCap; /* Bearer Capability */\r
+ ie ChanID; /* Channel ID */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie NetFac; /* Network-specific facilities */\r
+ /* Note: Up to 4 NetFac's may be */\r
+ /* included. */\r
+ ie Display; /* Display */\r
+ ie DateTime; /* Date/Time */\r
+ ie KeypadFac; /* Keypad Facility */\r
+ ie Signal; /* Signal */\r
+ ie CallingNum; /* Calling party number */\r
+ ie CallingSub; /* Calling party sub address */\r
+ ie CalledNum; /* Called party number */\r
+ ie CalledSub; /* Called party sub address */\r
+ ie TransNetSel; /* Transit network selection */\r
+ ie LLRepeatInd; /* Repeat Indicator 2 LLComp */\r
+ ie LLComp; /* Low layer compatibility */\r
+ ie HLComp; /* High layer compatibility */\r
+\r
+#ifdef Q931_X25_SUPPORT\r
+ /* Packed mode additions */\r
+ ie IndoRate; /* Information Rate */\r
+ ie EndEndDelay; /* End-end transit delay */\r
+ ie TransDelayInd; /* TRansit delay selection and ind. */\r
+ ie PackParam; /* Packed layer binary parameters */\r
+ ie PackWinSize; /* Packed layer window size */\r
+ ie PackSize; /* Packet Size */\r
+ ie ClosedUserGrp; /* Closed User Group */\r
+ ie RevChargInd; /* Reverse charhing indicator */\r
+ ie RedirNum; /* Redirection number */\r
+ ie UserUser; /* User-user. */\r
+#endif\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Setup;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_SetupAck\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie ChanID; /* Channel ID */\r
+ ie ProgInd; /* Progress Indicator */\r
+ ie Display; /* Display */\r
+ ie Signal; /* Signal */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_SetupAck;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Status\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Cause; /* Cause */\r
+ ie CallState; /* Call State */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Status;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_StatusEnquire\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_StatusEnquiry;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Suspend\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie CallID; /* Call Identity */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Suspend;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_SuspendAck\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_SuspendAck;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_SuspendReject\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie Cause; /* Cause */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_SuspendReject;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_CongestionControl\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie CongLevel; /* Congestion level */\r
+ ie Cause; /* Cause */\r
+ ie Display; /* Display */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_CongestionControl;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_UserInformation\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie MoreData; /* More data */\r
+ ie UserUser; /* User-user */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_UserInformation;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_Restart\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie ChanID; /* Channel identification */\r
+ ie Display; /* Display */\r
+ ie RestartInd; /* Restart indicator */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_Restart;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931mes_RestartAck\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ ie ChanID; /* Channel identification */\r
+ ie Display; /* Display */\r
+ ie RestartWin; /* Restart Window */\r
+ ie RestartInd; /* Restart Indicator */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q931mes_RestartAck;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: Q931_TrunkInfo\r
+\r
+ Description: TrunkInfo is the struct entry used to store Q.931 related \r
+ information and state for E1/T1/J1 trunks and assosiated \r
+ channels in the system. \r
+\r
+ The user should store this information outside this stack\r
+ and need to feed the interface functions with a pointer to\r
+ the trunk Info entry.\r
+\r
+*****************************************************************************/\r
+\r
+typedef struct\r
+{\r
+ enum _NetUser /* Network/User Mode. */\r
+ {\r
+ Q931_TE=0, /* 0 : User Mode */\r
+ Q931_NT=1 /* 1 : Network Mode */\r
+ }NetUser;\r
+\r
+ L3UCHAR Dialect; /* Q.931 Based dielact index. */\r
+\r
+ enum _TrunkType /* Trunk Line Type. */\r
+ {\r
+ Q931_TrType_E1=0, /* 0 : E1 Trunk */\r
+ Q931_TrType_T1=1, /* 1 : T1 Trunk */\r
+ Q931_TrType_J1=2, /* 2 : J1 Trunk */\r
+ Q931_TrType_BRI=3 /* 3 : BRI Trunk */\r
+ }TrunkType;\r
+\r
+ L3UCHAR Enabled; /* Enabled/Disabled */\r
+ /* 0 = Disabled */\r
+ /* 1 = Enabled */\r
+\r
+ enum _TrState /* Trunk State */\r
+ {\r
+ Q931_TrState_NoAlignment=0, /* Trunk not aligned */\r
+ Q931_TrState_Aligning=1, /* Aligning in progress */\r
+ Q931_TrState_Aligned=2, /* Trunk Aligned */\r
+ }TrunkState;\r
+\r
+ L3INT LastCRV; /* Last used crv for the trunk. */\r
+\r
+ L3UCHAR L3Buf[Q931L4BUF]; /* message buffer for messages to be */\r
+ /* send from Q.931 L4. */\r
+\r
+ L3UCHAR L2Buf[Q931L2BUF]; /* buffer for messages send to L2. */\r
+\r
+ /* The auto flags below switch on/off automatic Ack messages. SETUP ACK */\r
+ /* as an example can be send by the stack in response to SETUP to buy */\r
+ /* time in processing on L4. Setting this to true will cause the stack */\r
+ /* to automatically send this. */\r
+\r
+ L3BOOL autoSetupAck; /* Indicate if the stack should send */\r
+ /* SETUP ACK or not. 0=No, 1 = Yes. */\r
+\r
+ L3BOOL autoConnectAck; /* Indicate if the stack should send */\r
+ /* CONNECT ACT or not. 0=No, 1=Yes. */\r
+\r
+ L3BOOL autoRestartAck; /* Indicate if the stack should send */\r
+ /* RESTART ACK or not. 0=No, 1=Yes. */\r
+\r
+ /* channel array holding info per channel. Usually defined to 32 */\r
+ /* channels to fit an E1 since T1/J1 and BRI will fit inside a E1. */\r
+ struct _charray\r
+ {\r
+ enum _ChanType{\r
+ Q931_ChType_NotUsed=0, /* Unused Channel */\r
+ Q931_ChType_B=1, /* B Channel (Voice) */ \r
+ Q931_ChType_D=2, /* D Channel (Signalling) */\r
+ Q931_ChType_Sync=3 /* Sync Channel */\r
+ }ChanType;\r
+\r
+ L3UCHAR Available; /* Channel Available Flag */\r
+ /* 0 : Avaiabled */\r
+ /* 1 : Used */\r
+\r
+ L3INT CRV; /* Associated CRV */\r
+\r
+ }ch[Q931MAXCHPERTRUNK];\r
+\r
+ /* Active Call information indentified by CRV. See Q931AllocateCRV for */\r
+ /* initialization of call table. */\r
+ struct _ccarray\r
+ {\r
+ L3UCHAR InUse; /* Indicate if entry is in use. */\r
+ /* 0 = Not in Use */\r
+ /* 1 = Active Call. */\r
+\r
+ L3UCHAR BChan; /* Associated B Channel. */\r
+ /* 0 - 31 valid B chan */\r
+ /* 255 = Not allocated */\r
+\r
+ L3INT CRV; /* Associated CRV. */\r
+\r
+ L3UINT State; /* Call State. */\r
+ /* 0 is Idle, but other values are */\r
+ /* defined per dialect. */\r
+ /* Default usage is 1-99 for TE and */\r
+ /* 101 - 199 for NT. */\r
+ \r
+ L3ULONG Timer; /* Timer in ms. The TimeTick will check */\r
+ /* if this has exceeded the timeout, and*/\r
+ /* if so call the timers timeout proc. */\r
+\r
+ L3USHORT TimerID; /* Timer Identification/State */\r
+ /* actual values defined by dialect */\r
+ /* 0 : No timer running */\r
+ /* ITU-T Q.931:301 - 322 Timer running */\r
+\r
+ }call[Q931MAXCALLPERTRUNK];\r
+\r
+}Q931_TrunkInfo;\r
+\r
+/*****************************************************************************\r
+ \r
+ Struct: Q931State\r
+\r
+ Description: Define a Q931 State, legal events and next state for each\r
+ event. Used to simplify the state engine logic. Each state\r
+ engine define it's own state table and the logic only need\r
+ to call a helper function to check if the message is legal\r
+ at this stage.\r
+\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3INT State;\r
+ L3INT Message;\r
+ L3UCHAR Direction;\r
+}Q931State;\r
+\r
+/*****************************************************************************\r
+\r
+ Proc table external references. \r
+\r
+ The proc tables are defined in Q931.c and initialized in Q931Initialize.\r
+\r
+*****************************************************************************/\r
+extern L3INT (*Q931Proc [Q931MAXDLCT][Q931MAXMES]) (Q931_TrunkInfo *pTrunk, L3UCHAR *,L3INT);\r
+\r
+extern L3INT (*Q931Umes [Q931MAXDLCT][Q931MAXMES]) (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size);\r
+extern L3INT (*Q931Pmes [Q931MAXDLCT][Q931MAXMES]) (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+\r
+extern L3INT (*Q931Uie [Q931MAXDLCT][Q931MAXIE] ) (Q931_TrunkInfo *pTrunk,ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+extern L3INT (*Q931Pie [Q931MAXDLCT][Q931MAXIE] ) (Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+\r
+/*****************************************************************************\r
+ \r
+ Macro: GetIETotoSize\r
+\r
+ Syntax: L3INT GetIETotSize(InfoElem ie);\r
+\r
+ Description: Compute the total size in bytes of an info element including \r
+ size of 'header'. \r
+\r
+*****************************************************************************/\r
+#define Q931GetIETotSize(ie) (((ie.InfoID & 0x80) !=0) ? 1:ie.LenIE)+2)\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: IsIEPresent\r
+\r
+ Syntax: BOOL IsIEPresent(ie InfoElement);\r
+\r
+ Description: Return TRUE if the Information Element is included.\r
+\r
+*****************************************************************************/\r
+#define Q931IsIEPresent(x) ((x & 0x8000) != 0)\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: GetIEOffset and GetIEValue\r
+ \r
+ Syntax: L3INT GetIEOffset(ie InfoElement)\r
+ L3INT GetIEValue(ie InfoElement)\r
+\r
+ Description: Returns the offset (or the value )to the Information Element.\r
+\r
+ Note: GetIEValue assumes that the 15 lsb bit is the value of a \r
+ single octet information element. This macro can not be used\r
+ on a variable information element.\r
+\r
+*****************************************************************************/\r
+#define Q931GetIEOffset(x) (x & 0x7fff)\r
+#define Q931GetIEValue(x) (x & 0x7fff)\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: Q931GetIEPtr\r
+\r
+ Syntax: void * Q931GetIEPtr(ie InfoElement, L3UCHAR * Buf);\r
+\r
+ Description: Compute a Ptr to the information element.\r
+\r
+*****************************************************************************/\r
+#define Q931GetIEPtr(ie,buf) (&buf[Q931GetIEOffset(ie)])\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: SetIE\r
+\r
+ Syntax: void SetIE(ie InfoElement, L3INT Offset);\r
+\r
+ Description: Set an information element.\r
+\r
+*****************************************************************************/\r
+#define Q931SetIE(x,o) {x = (ie)(o) | 0x8000;}\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: IsQ931Ext\r
+\r
+ Syntax BOOL IsQ931Ext(L3UCHAR c)\r
+\r
+ Description: Return true Check if the msb (bit 8) is 0. This indicate\r
+ that the octet is extended.\r
+\r
+*****************************************************************************/\r
+#define IsQ931Ext(x) ((x&0x80)==0)\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: ieGetOctet\r
+\r
+ Syntax: unsigned L3UCHAR ieGetOctet(L3INT e)\r
+\r
+ Description: Macro to fetch one byte from an integer. Mostly used to \r
+ avoid warnings.\r
+\r
+*****************************************************************************/\r
+#define ieGetOctet(x) ((L3UCHAR)(x))\r
+\r
+/*****************************************************************************\r
+\r
+ Macro: NoWarning\r
+\r
+ Syntax: void NoWarning(x)\r
+\r
+ Description: Macro to suppress unreferenced formal parameter warnings\r
+\r
+ Used during creation of the stack since the stack is \r
+ developed for Warning Level 4 and this creates a lot of \r
+ warning for the initial empty functions.\r
+\r
+*****************************************************************************/\r
+#define NoWarning(x) (x=x)\r
+\r
+/*****************************************************************************\r
+\r
+ External references. See Q931.c for details.\r
+\r
+*****************************************************************************/\r
+\r
+extern Q931_TrunkInfo Q931Trunk[Q931MAXTRUNKS];\r
+\r
+#include "Q932.h"\r
+\r
+/*****************************************************************************\r
+\r
+ Q.931 Information Element Pack/Unpack functions. Implemented in Q931ie.c\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931Pie_BearerCap(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_ChanID(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_ProgInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_Display(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_Signal(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_HLComp(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_Segment(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_DateTime(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_Cause(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_SendComplete(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_KeypadFac(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_NotifInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CallID(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_RepeatInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_NetFac(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CallingNum(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CallingSub(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CalledNum(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CalledSub(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CalledNum(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_TransNetSel(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_LLComp(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_CallState(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_RestartInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+L3INT Q931Pie_UserUser(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);\r
+\r
+L3INT Q931Uie_BearerCap(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3USHORT Q931Uie_CRV(Q931_TrunkInfo *pTrunk,L3UCHAR * IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_ChanID(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_ProgInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_Display(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_Signal(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_HLComp(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_Segment(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_DateTime(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_Cause(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_SendComplete(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_KeypadFac(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_NotifInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_CallID(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_RepeatInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_NetFac(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_CallingNum(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_CallingSub(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_CalledNum(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_CalledSub(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_TransNetSel(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_LLComp(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_CallState(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_RestartInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+L3INT Q931Uie_UserUser(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);\r
+\r
+/*****************************************************************************\r
+\r
+ Q.931 Message Pack/Unpack functions. Implemented in Q931mes.c\r
+\r
+*****************************************************************************/\r
+L3INT Q931Pmes_Alerting(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_CallProceeding(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_CongestionControl(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q931Pmes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+\r
+L3INT Q931Umes_Alerting(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_CallProceeding(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_CongestionControl(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q931Umes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+\r
+/*****************************************************************************\r
+\r
+ Q.931 Process Function Prototyping. Implemented in Q931StateTE.c\r
+\r
+*****************************************************************************/\r
+L3INT Q931ProcAlertingTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcCallProceedingTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcConnectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcConnectAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcProgressTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSetupTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSetupAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcResumeTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcResumeAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcResumeRejectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSuspendTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSuspendAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSuspendRejectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcUserInformationTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcDisconnectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcReleaseTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcReleaseCompleteTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcRestartTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcRestartAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcCongestionControlTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcInformationTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcNotifyTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcStatusTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcStatusEnquiryTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSegmentTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+\r
+L3INT Q931ProcAlertingNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcCallProceedingNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcConnectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcConnectAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcProgressNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSetupNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSetupAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcResumeNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcResumeAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcResumeRejectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSuspendNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSuspendAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSuspendRejectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcUserInformationNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcDisconnectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcReleaseNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcReleaseCompleteNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcRestartNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcRestartAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcCongestionControlNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcInformationNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcNotifyNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcStatusNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcStatusEnquiryNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcSegmentNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+\r
+L3INT Q931ProcUnknownMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);\r
+\r
+/*****************************************************************************\r
+\r
+ Interface Function Prototypes. Implemented in Q931.c\r
+\r
+*****************************************************************************/\r
+void Q931TimeTick(L3ULONG ms);\r
+L3INT Q931Rx23(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);\r
+L3INT Q931Tx32(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);\r
+L3INT Q931Rx43(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);\r
+L3INT Q931Tx34(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);\r
+void Q931SetError(Q931_TrunkInfo *pTrunk,L3INT ErrID, L3INT ErrPar1, L3INT ErrPar2);\r
+void Q931SetTx34CB(L3INT (*Q931Tx34Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size));\r
+void Q931SetTx32CB(L3INT (*Q931Tx32Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size));\r
+void Q931SetErrorCB(L3INT (*Q931ErrorPar)(Q931_TrunkInfo *pTrunk,L3INT,L3INT,L3INT));\r
+void Q931CreateTE(L3UCHAR i);\r
+void Q931CreateNT(L3UCHAR i);\r
+void Q931SetMesCreateCB(L3INT (*callback)());\r
+void Q931SetDialectCreateCB(L3INT (*callback)(L3INT));\r
+void Q931SetHeaderSpace(L3INT space);\r
+void Q931SetMesProc(L3UCHAR mes, L3UCHAR dialect, \r
+ L3INT (*Q931ProcFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom),\r
+ L3INT (*Q931UmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size),\r
+ L3INT (*Q931PmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize));\r
+\r
+void Q931SetIEProc(L3UCHAR iec, L3UCHAR dialect, \r
+ L3INT (*Q931PieProc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet),\r
+ L3INT (*Q931UieProc)(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)); \r
+\r
+void Q931Initialize();\r
+void Q931AddDialect(L3UCHAR iDialect, void (*Q931CreateDialectCB)(L3UCHAR iDialect));\r
+L3INT Q931InitMesSetup(Q931mes_Setup *p);\r
+\r
+L3INT Q931CreateCRV(Q931_TrunkInfo *pTrunk, L3INT * callIndex);\r
+L3INT Q931AllocateCRV(Q931_TrunkInfo *pTrunk, L3INT iCRV, L3INT * callIndex);\r
+L3INT Q931FindCRV(Q931_TrunkInfo *pTrunk, L3INT crv, L3INT *callindex);\r
+L3INT Q931GetCallState(Q931_TrunkInfo *pTrunk, L3INT iCRV);\r
+L3INT Q931StartTimer(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3INT iTimer);\r
+L3INT Q931StopTimer(Q931_TrunkInfo *pTrunk, L3INT callindex, L3INT iTimer);\r
+L3INT Q931SetState(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3INT iState);\r
+L3ULONG Q931GetTime();\r
+void Q931AddStateEntry(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir);\r
+L3BOOL Q931IsEventLegal(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir);\r
+\r
+/*****************************************************************************\r
+\r
+ Q.931 Low Level API Function Prototyping. Implemented in Q931API.c\r
+\r
+*****************************************************************************/\r
+ie Q931AppendIE(L3UCHAR *pm, L3UCHAR *pi);\r
+L3INT Q931GetUniqueCRV(Q931_TrunkInfo *pTrunk);\r
+\r
+L3INT Q931InitIEBearerCap(Q931ie_BearerCap *p);\r
+L3INT Q931InitIEChanID(Q931ie_ChanID *p);\r
+L3INT Q931InitIEProgInd(Q931ie_ProgInd *p);\r
+L3INT Q931InitIENetFac(Q931ie_NetFac * pIE);\r
+L3INT Q931InitIEDisplay(Q931ie_Display * pIE);\r
+L3INT Q931InitIEDateTime(Q931ie_DateTime * pIE);\r
+L3INT Q931InitIEKeypadFac(Q931ie_KeypadFac * pIE);\r
+L3INT Q931InitIESignal(Q931ie_Signal * pIE);\r
+L3INT Q931InitIECallingNum(Q931ie_CallingNum * pIE);\r
+L3INT Q931InitIECallingSub(Q931ie_CallingSub * pIE);\r
+L3INT Q931InitIECalledNum(Q931ie_CalledNum * pIE);\r
+L3INT Q931InitIECalledSub(Q931ie_CalledSub * pIE);\r
+L3INT Q931InitIETransNetSel(Q931ie_TransNetSel * pIE);\r
+L3INT Q931InitIELLComp(Q931ie_LLComp * pIE);\r
+L3INT Q931InitIEHLComp(Q931ie_HLComp * pIE);\r
+\r
+L3INT Q931Disconnect(Q931_TrunkInfo *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause);\r
+L3INT Q931ReleaseComplete(Q931_TrunkInfo *pTrunk, L3INT iTo);\r
+\r
+#endif /* _Q931_NL */\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ FileName: Q932.h\r
+\r
+ Contents: Header w/structs for Q932 Suplementary Services.\r
+\r
+ NB: Do NOT include this header directly, include Q931.h\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+/*****************************************************************************\r
+ Q.932 Additional Message codes\r
+*****************************************************************************/\r
+\r
+#define Q932mes_HOLD 0x24 /* 0010 0100 */\r
+#define Q932mes_HOLD_ACKNOWLEDGE 0x28 /* 0010 1000 */\r
+#define Q932mes_HOLD_REJECT 0x30 /* 0011 0000 */\r
+#define Q932mes_RETRIEVE 0x31 /* 0011 0001 */\r
+#define Q932mes_RETRIEVE_ACKNOWLEDGE 0x33 /* 0011 0011 */\r
+#define Q932mes_RETRIEVE_REJECT 0x37 /* 0011 0111 */\r
+#define Q932mes_FACILITY 0x62 /* 0110 0010 */\r
+#define Q932mes_REGISTER 0x64 /* 0110 0100 */\r
+\r
+/*****************************************************************************\r
+ Q.932 Additional EI Codes\r
+*****************************************************************************/\r
+#define Q932ie_FACILITY 0x1c /* 0001 1100 */\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_Facility\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_Facility;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_Hold\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_Hold;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_HoldAck\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_HoldAck;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_HoldReject\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_HoldReject;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_Register\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_Register;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_Retrieve\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_Retrieve;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_RetrieveAck\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_RetrieveAck;\r
+\r
+/*****************************************************************************\r
+ Struct: Q932ie_RetrieveReject\r
+*****************************************************************************/\r
+typedef struct\r
+{\r
+ L3UINT Size; /* Size of message in bytes */\r
+ L3UCHAR ProtDisc; /* Protocol Discriminator */\r
+ L3UCHAR MesType; /* Message type */\r
+ L3USHORT CRV; /* Call reference value */\r
+ L3UCHAR buf[1]; /* Dynamic buffer */\r
+}Q932mes_RetrieveReject;\r
+\r
+/*****************************************************************************\r
+ Function Prototypes.\r
+*****************************************************************************/\r
+L3INT Q932ProcFacilityTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcHoldTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcHoldAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcHoldRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRegisterTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRetrieveTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRetrieveAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRetrieveRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+\r
+L3INT Q932ProcFacilityNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcHoldNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcHoldAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcHoldRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRegisterNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRetrieveNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRetrieveAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+L3INT Q932ProcRetrieveRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);\r
+\r
+L3INT Q932Pmes_Facility(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_Hold(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_HoldAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_HoldReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_Register(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_Retrieve(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_RetrieveAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+L3INT Q932Pmes_RetrieveReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);\r
+\r
+L3INT Q932Umes_Facility(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_Hold(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_HoldAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_HoldReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_Register(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_Retrieve(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_RetrieveAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
+L3INT Q932Umes_RetrieveReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ Filename: mfifo.h\r
+\r
+ Contents: header for MFIFO\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+#ifndef _MFIFO\r
+#define _MFIFO\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: MINDEX\r
+\r
+ Description: Message Index used to index a dynamic size Message FIFO.\r
+\r
+*****************************************************************************/\r
+typedef struct _mindex\r
+{\r
+ int offset; /* offset to message in buf */\r
+ int size; /* size of message in bytes */\r
+}MINDEX;\r
+\r
+/*****************************************************************************\r
+\r
+ Struct: MFIFO\r
+\r
+ Description: Message FIFO. Provides a dynamic sized message based FIFO\r
+ queue.\r
+\r
+*****************************************************************************/\r
+typedef struct _mfifo\r
+{\r
+ int first; /* first out */\r
+ int last; /* last in + 1 */\r
+ int bsize; /* buffer size */\r
+ char *buf; /* ptr to start of buffer */\r
+ int ixsize; /* index size */\r
+ MINDEX ix[1]; /* message index */\r
+}MFIFO;\r
+\r
+/*****************************************************************************\r
+ Function prototypes.\r
+*****************************************************************************/\r
+int MFIFOCreate(char *buf, int size, int index);\r
+void MFIFOClear(char * buf);\r
+int MFIFOGetLBOffset(char *buf);\r
+int MFIFOGetFBOffset(char *buf);\r
+void MFIFOWriteIX(char *buf, char *mes, int size, int ix, int off);\r
+int MFIFOWriteMes(char *buf, char *mes, int size);\r
+char * MFIFOGetMesPtr(char *buf, int *size);\r
+void MFIFOKillNext(char *buf);\r
+\r
+#endif\r
--- /dev/null
+/*****************************************************************************\r
+\r
+ Filename: mfifo.c\r
+\r
+ Description: mfifo is a message orriented fifo system with support of\r
+ both message and byte per byte retriaval of messages.\r
+\r
+ The fifo has been designed with two usages in mind:\r
+\r
+ - Queueing of frames for hdlc and feeding out byte per byte\r
+ with the possibility of re-sending of frames etc. \r
+\r
+ - fifo for messages of dynamic size.\r
+\r
+ The fifo is allocated on top of any buffer and creates an\r
+ index of message in the queue. The user can write/read\r
+ messages or write messages and read the message one byte\r
+ at the time.\r
+\r
+ Interface: \r
+ MFIFOCreate Create/reset/initialize fifo.\r
+ MFIFOClear Clear FIFO.\r
+ MFIFOWriteMes Write message into fifo\r
+ * MFIFOReadMes Read message from fifo.\r
+ MFIFOGetMesPtr Get ptr to next message.\r
+ MFIFOKillNext Kill next message.\r
+\r
+ * currently not implemented.\r
+\r
+ Note: The message will always be saved continuously. If there is not\r
+ sufficient space at the end of the buffer, the fifo will skip\r
+ the last bytes and save the message at the top of the buffer.\r
+\r
+ This is required to allow direct ptr access to messages \r
+ stored in the queue.\r
+\r
+ License/Copyright:\r
+\r
+ Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.\r
+ email:janvb@caselaboratories.com \r
+\r
+ Redistribution and use in source and binary forms, with or without \r
+ modification, are permitted provided that the following conditions are \r
+ met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice, \r
+ this list of conditions and the following disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice, \r
+ this list of conditions and the following disclaimer in the documentation \r
+ and/or other materials provided with the distribution.\r
+ * Neither the name of the Case Labs, Ltd nor the names of its contributors \r
+ may be used to endorse or promote products derived from this software \r
+ without specific prior written permission.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" \r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE \r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \r
+ POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include "mfifo.h"\r
+#include <memory.h>\r
+#include <stdlib.h>\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOCreate\r
+\r
+ Description: Creates a fifo on top of an existing buffer.\r
+\r
+ Parameters: buf ptr to buffer.\r
+ size size of buffer in bytes.\r
+ index size of index entries (max no messages).\r
+\r
+ Return value: 0 if failure, 1 if ok.\r
+\r
+*****************************************************************************/\r
+int MFIFOCreate(char *buf, int size, int index)\r
+{\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ \r
+ mf->first = mf->last = 0;\r
+ mf->ixsize = index;\r
+ mf->buf = &buf[sizeof(MFIFO) + (sizeof(MINDEX) * (index-1))];\r
+\r
+ if(mf->buf > & buf[size])\r
+ return 0;\r
+\r
+ mf->bsize = size - sizeof(MFIFO) - (sizeof(MINDEX) * (index-1));\r
+\r
+ return 1;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOClear\r
+\r
+ Description: Clear the FIFO\r
+\r
+ Paremeters: buf ptr to fifo\r
+\r
+ Return Value: none\r
+\r
+*****************************************************************************/\r
+void MFIFOClear(char * buf)\r
+{\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ mf->first = mf->last = 0;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOGetLBOffset\r
+\r
+ Description: Helper function caclulating offset to the 'first out' byte.\r
+\r
+ Paremeters: buf ptr to fifo\r
+\r
+ Return Value: offset.\r
+\r
+*****************************************************************************/\r
+int MFIFOGetLBOffset(char *buf)\r
+{\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ if(mf->last != mf->first)\r
+ return mf->ix[mf->last].offset;\r
+ \r
+ return 0;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOGetFBOffset\r
+\r
+ Description: Helper function calculating the offset to the 'first in' \r
+ byte in the buffer. This is the position the next byte\r
+ entering the fifo will occupy.\r
+\r
+ Paremeters: buf ptr to fifo\r
+\r
+ Return Value: offset\r
+\r
+*****************************************************************************/\r
+int MFIFOGetFBOffset(char *buf)\r
+{\r
+ int x;\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ if(mf->last == mf->first)\r
+ return 0;\r
+ x=mf->first;\r
+ x--;\r
+ if(x<0)\r
+ x=mf->ixsize;\r
+ return mf->ix[x].offset + mf->ix[x].size;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOWriteIX\r
+\r
+ Description: Helper function writing a calculated entry. The function\r
+ will perform a memcpy to move the message and set the index\r
+ values as well as increase the 'first in' index.\r
+\r
+ Paremeters: buf ptr to fifo\r
+ mes ptr to message\r
+ size size of message in bytes.\r
+ ix index to index entry.\r
+ off offset to position to receive the message\r
+\r
+ Return Value: none\r
+\r
+*****************************************************************************/\r
+void MFIFOWriteIX(char *buf, char *mes, int size, int ix, int off)\r
+{\r
+ int x;\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ memcpy(&mf->buf[off],mes,size);\r
+ mf->ix[ix].offset=off;\r
+ mf->ix[ix].size=size;\r
+ x = mf->first+1;\r
+ if(x > mf->ixsize)\r
+ x=0;\r
+ mf->first=x;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOWriteMes\r
+\r
+ Description: \r
+\r
+ Paremeters:\r
+\r
+ Return Value:\r
+\r
+*****************************************************************************/\r
+int MFIFOWriteMes(char *buf, char *mes, int size)\r
+{\r
+ int of,ol,x;\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+\r
+ x = mf->first+1;\r
+ if(x > mf->ixsize)\r
+ x=0;\r
+ if(x == mf->last)\r
+ return 0; /* full queue */\r
+\r
+ of = MFIFOGetFBOffset(buf);\r
+ ol = MFIFOGetLBOffset(buf);\r
+ if(mf->last == mf->first) /* empty queue */\r
+ {\r
+ mf->first = mf->last = 0; /* optimize */\r
+ MFIFOWriteIX(buf, mes, size, mf->first, 0);\r
+ return 1;\r
+ }\r
+ else if(of > ol)\r
+ {\r
+ if(mf->bsize - of >= size)\r
+ {\r
+ MFIFOWriteIX(buf,mes,size,mf->first,of);\r
+ return 1;\r
+ }\r
+ else if(ol > size)\r
+ {\r
+ MFIFOWriteIX(buf,mes,size,mf->first,ol);\r
+ return 1;\r
+ }\r
+ }\r
+ else if(ol - of > size)\r
+ {\r
+ MFIFOWriteIX(buf,mes,size,mf->first,of);\r
+ return 1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOGetMesPtr\r
+\r
+ Description: \r
+\r
+ Paremeters:\r
+\r
+ Return Value:\r
+\r
+*****************************************************************************/\r
+char * MFIFOGetMesPtr(char *buf, int *size)\r
+{\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ if(mf->first==mf->last)\r
+ return NULL;\r
+ *size = mf->ix[mf->last].size;\r
+ return &mf->buf[mf->ix[mf->last].offset];\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+ Function: MFIFOKillNext\r
+\r
+ Description: \r
+\r
+ Paremeters:\r
+\r
+ Return Value:\r
+\r
+*****************************************************************************/\r
+void MFIFOKillNext(char *buf)\r
+{\r
+ int x;\r
+ MFIFO * mf;\r
+ mf = (MFIFO*)buf;\r
+ if(mf->first!=mf->last)\r
+ {\r
+ x = mf->last+1;\r
+ if(x > mf->ixsize)\r
+ x=0;\r
+ mf->last=x;\r
+ }\r
+}\r