]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
checkin q931/q932/q921 code.
authorMichael Jerris <mike@jerris.com>
Mon, 21 May 2007 18:25:36 +0000 (18:25 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 21 May 2007 18:25:36 +0000 (18:25 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@65 a93c3328-9c30-0410-af19-c9cd2b2d52af

15 files changed:
libs/openzap/src/isdn/EuroISDNStateNT.c [new file with mode: 0644]
libs/openzap/src/isdn/EuroISDNStateTE.c [new file with mode: 0644]
libs/openzap/src/isdn/Q921.c [new file with mode: 0644]
libs/openzap/src/isdn/Q931.c [new file with mode: 0644]
libs/openzap/src/isdn/Q931StateNT.c [new file with mode: 0644]
libs/openzap/src/isdn/Q931StateTE.c [new file with mode: 0644]
libs/openzap/src/isdn/Q931api.c [new file with mode: 0644]
libs/openzap/src/isdn/Q931ie.c [new file with mode: 0644]
libs/openzap/src/isdn/Q931mes.c [new file with mode: 0644]
libs/openzap/src/isdn/Q932mes.c [new file with mode: 0644]
libs/openzap/src/isdn/include/Q921.h [new file with mode: 0644]
libs/openzap/src/isdn/include/Q931.h [new file with mode: 0644]
libs/openzap/src/isdn/include/Q932.h [new file with mode: 0644]
libs/openzap/src/isdn/include/mfifo.h [new file with mode: 0644]
libs/openzap/src/isdn/mfifo.c [new file with mode: 0644]

diff --git a/libs/openzap/src/isdn/EuroISDNStateNT.c b/libs/openzap/src/isdn/EuroISDNStateNT.c
new file mode 100644 (file)
index 0000000..9c2fc45
--- /dev/null
@@ -0,0 +1,46 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/EuroISDNStateTE.c b/libs/openzap/src/isdn/EuroISDNStateTE.c
new file mode 100644 (file)
index 0000000..cf0631c
--- /dev/null
@@ -0,0 +1,57 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q921.c b/libs/openzap/src/isdn/Q921.c
new file mode 100644 (file)
index 0000000..c6be948
--- /dev/null
@@ -0,0 +1,477 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q931.c b/libs/openzap/src/isdn/Q931.c
new file mode 100644 (file)
index 0000000..42b76ec
--- /dev/null
@@ -0,0 +1,664 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q931StateNT.c b/libs/openzap/src/isdn/Q931StateNT.c
new file mode 100644 (file)
index 0000000..21adcfa
--- /dev/null
@@ -0,0 +1,1259 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q931StateTE.c b/libs/openzap/src/isdn/Q931StateTE.c
new file mode 100644 (file)
index 0000000..f2a3507
--- /dev/null
@@ -0,0 +1,1315 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q931api.c b/libs/openzap/src/isdn/Q931api.c
new file mode 100644 (file)
index 0000000..079ae83
--- /dev/null
@@ -0,0 +1,614 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q931ie.c b/libs/openzap/src/isdn/Q931ie.c
new file mode 100644 (file)
index 0000000..d9cddbb
--- /dev/null
@@ -0,0 +1,2951 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q931mes.c b/libs/openzap/src/isdn/Q931mes.c
new file mode 100644 (file)
index 0000000..d2066d0
--- /dev/null
@@ -0,0 +1,1931 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/Q932mes.c b/libs/openzap/src/isdn/Q932mes.c
new file mode 100644 (file)
index 0000000..0540fa8
--- /dev/null
@@ -0,0 +1,311 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/include/Q921.h b/libs/openzap/src/isdn/include/Q921.h
new file mode 100644 (file)
index 0000000..acb8303
--- /dev/null
@@ -0,0 +1,102 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/include/Q931.h b/libs/openzap/src/isdn/include/Q931.h
new file mode 100644 (file)
index 0000000..dd8261c
--- /dev/null
@@ -0,0 +1,2408 @@
+/******************************************************************************\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
diff --git a/libs/openzap/src/isdn/include/Q932.h b/libs/openzap/src/isdn/include/Q932.h
new file mode 100644 (file)
index 0000000..fa17e38
--- /dev/null
@@ -0,0 +1,191 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/include/mfifo.h b/libs/openzap/src/isdn/include/mfifo.h
new file mode 100644 (file)
index 0000000..21a0531
--- /dev/null
@@ -0,0 +1,83 @@
+/*****************************************************************************\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
diff --git a/libs/openzap/src/isdn/mfifo.c b/libs/openzap/src/isdn/mfifo.c
new file mode 100644 (file)
index 0000000..adf6bc9
--- /dev/null
@@ -0,0 +1,296 @@
+/*****************************************************************************\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