]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
change linefeeds
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 21 May 2007 23:29:33 +0000 (23:29 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 21 May 2007 23:29:33 +0000 (23:29 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@85 a93c3328-9c30-0410-af19-c9cd2b2d52af

15 files changed:
libs/openzap/src/isdn/EuroISDNStateNT.c
libs/openzap/src/isdn/EuroISDNStateTE.c
libs/openzap/src/isdn/Q921.c
libs/openzap/src/isdn/Q931.c
libs/openzap/src/isdn/Q931StateNT.c
libs/openzap/src/isdn/Q931StateTE.c
libs/openzap/src/isdn/Q931api.c
libs/openzap/src/isdn/Q931ie.c
libs/openzap/src/isdn/Q931mes.c
libs/openzap/src/isdn/Q932mes.c
libs/openzap/src/isdn/include/Q921.h
libs/openzap/src/isdn/include/Q931.h
libs/openzap/src/isdn/include/Q932.h
libs/openzap/src/isdn/include/mfifo.h
libs/openzap/src/isdn/mfifo.c

index 9c2fc4561672dfa60959546d70731d527673a624..ccfaba0d1664cc327a2119d9cab4b596c4922ebc 100644 (file)
@@ -1,46 +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
+/*****************************************************************************
+
+  FileName:            EuroISDNStateNT.c
+
+  Contents:            EuroISDN State Engine for NT (Network Mode).
+
+                               The controlling state engine for Q.931 is the state engine
+                               on the NT side. The state engine on the TE side is a slave 
+                               of this. The TE side maintain it's own states as described in
+                               ITU-T Q931, but will in raise conditions be overridden by 
+                               the NT side.
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+
index cf0631c92b149691df811167f7031b9aaa9d7d74..250d33ffd2dde32a3275eb2d3e1bd0b2f19a43a9 100644 (file)
@@ -1,57 +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
+/*****************************************************************************
+
+  FileName:            EuroISDNStateTE.c
+
+  Contents:            EuroISDN State Engine for TE (User Mode).
+
+                               The controlling state engine for Q.931 is the state engine
+                               on the NT side. The state engine on the TE side is a slave 
+                               of this. The TE side maintain it's own states as described in
+                               ITU-T Q931, but will in raise conditions be overridden by 
+                               the NT side.
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+/*
+  EuroISDN is a sub-set of Q.931. Q.931 is very generic as it embrase a lot,
+  while EuroISDN is more exact and make decitions on some of the 
+  'implementation options' in the original standard. EuroISDN will 
+  however run smoothly under the generic space, so these functions are more 
+  for show 
+*/
+
+void EuroISDNCreateTE(L3UCHAR i)
+{
+       Q931CreateTE(i);
+}
index b36c76965dc5446a7b2c070b7cf95a479689ca46..27802d877d9e88d607065b31553db9e5481dfa8f 100644 (file)
-/*****************************************************************************\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, L2UCHAR *, int)={NULL};\r
-int (*Q921Tx23Proc)(int dev, L2UCHAR *, 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, L2UCHAR *, int))\r
-{\r
-    Q921Tx21Proc = callback;\r
-}\r
-\r
-void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, 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, L2UCHAR *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, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR *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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)0x01;\r
-    mes[Q921HeaderSpace+3] = (L2UCHAR)((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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)0x05;\r
-    mes[Q921HeaderSpace+3] = (L2UCHAR)((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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)0x09;\r
-    mes[Q921HeaderSpace+3] = (L2UCHAR)((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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)(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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)(0x0f | ((pf<<4)&0x10));\r
-\r
-    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)(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
-    L2UCHAR mes[400];\r
-\r
-    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
-    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
-    mes[Q921HeaderSpace+2] = (L2UCHAR)(0x63 | ((pf<<4)&0x10));\r
-\r
-    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\r
-}\r
-\r
-int Q921ProcSABME(int trunk, L2UCHAR *mes, int size)\r
-{\r
-       /* TODO:  Do we need these paramaters? */\r
-       (void)mes;\r
-       (void)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
-    L2UCHAR *mes;\r
-    int rs,size;     /* receive size & Q921 frame size*/\r
-    L2UCHAR *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
+/*****************************************************************************
+
+  FileName:     q921.c
+
+  Description:  Contains the implementation of a Q.921 protocol on top of the
+                Comet Driver.
+
+                Most of the work required to execute a Q.921 protocol is 
+                taken care of by the Comet ship and it's driver. This layer
+                will simply configure and make use of these features to 
+                complete a Q.921 implementation.
+
+  Created:      27.dec.2000/JVB
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+
+*****************************************************************************/
+#include "Q921.h"
+#include <stdlib.h>
+#include "mfifo.h"
+
+/*****************************************************************************
+  Global Tables & Variables.
+*****************************************************************************/
+Q921Data Q921DevSpace[Q921MAXTRUNK];
+int Q921HeaderSpace={0};
+
+int (*Q921Tx21Proc)(int dev, L2UCHAR *, int)={NULL};
+int (*Q921Tx23Proc)(int dev, L2UCHAR *, int)={NULL};
+
+/*****************************************************************************
+
+  Function:     Q921Init
+
+  Decription:   Initialize the Q.921 stack so it is ready for use. This 
+                function MUST be called as part of initializing the 
+                application.
+
+*****************************************************************************/
+void Q921Init()
+{
+    int x;
+    for(x=0; x<Q921MAXTRUNK;x++)
+    {
+        MFIFOCreate(Q921DevSpace[x].HDLCInQueue, Q921MAXHDLCSPACE, 10);
+        Q921DevSpace[x].vr=0;
+        Q921DevSpace[x].vs=0;
+        Q921DevSpace[x].state=0;;
+    }
+}
+
+void Q921SetHeaderSpace(int hspace)
+{
+    Q921HeaderSpace=hspace;
+}
+
+void Q921SetTx21CB(int (*callback)(int dev, L2UCHAR *, int))
+{
+    Q921Tx21Proc = callback;
+}
+
+void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, int))
+{
+    Q921Tx23Proc = callback;
+}
+
+/*****************************************************************************
+
+  Function:     Q921QueueHDLCFrame
+
+  Description:  Called to receive and queue an incoming HDLC frame. Will
+                queue this in Q921HDLCInQueue. The called must either call
+                Q921Rx12 directly afterwards or signal Q921Rx12 to be called
+                later. Q921Rx12 will read from the same queue and process
+                the frame.
+
+                This function assumes that the message contains header 
+                space. This is removed for internal Q921 processing, but 
+                must be keept for I frames.
+
+  Parameters:   trunk   trunk #
+                b       ptr to frame;
+                size    size of frame in bytes
+
+*****************************************************************************/
+int Q921QueueHDLCFrame(int trunk, L2UCHAR *b, int size)
+{
+    return MFIFOWriteMes(Q921DevSpace[trunk].HDLCInQueue, b, size);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendI
+
+  Description:  Compose and Send I Frame to layer. Will receive an I frame
+                with space for L2 header and fill out that header before
+                it call Q921Tx21Proc.
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          P fiels octet 5
+                mes         ptr to I frame message.
+                size        size of message in bytes.
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendI(int trunk, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR *mes, int size)
+{
+    mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);
+    mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;
+    mes[Q921HeaderSpace+2] = Q921DevSpace[trunk].vs<<1;
+    mes[Q921HeaderSpace+3] = (Q921DevSpace[trunk].vr<<1) | (pf & 0x01);
+    Q921DevSpace[trunk].vs++;
+
+    return Q921Tx21Proc(trunk, mes, size);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendRR
+
+  Description:  Compose and send Receive Ready.
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          P/F fiels octet 5
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+
+int Q921SendRR(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)0x01;
+    mes[Q921HeaderSpace+3] = (L2UCHAR)((Q921DevSpace[trunk].vr<<1) | (pf & 0x01));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendRNR
+
+  Description:  Compose and send Receive Nor Ready
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          P/F fiels octet 5
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendRNR(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)0x05;
+    mes[Q921HeaderSpace+3] = (L2UCHAR)((Q921DevSpace[trunk].vr<<1) | (pf & 0x01));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendREJ
+
+  Description:  Compose and Send Reject.
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          P/F fiels octet 5
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendREJ(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)0x09;
+    mes[Q921HeaderSpace+3] = (L2UCHAR)((Q921DevSpace[trunk].vr<<1) | (pf & 0x01));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendSABME
+
+  Description:  Compose and send SABME
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          P fiels octet 4
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendSABME(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)(0x6f | ((pf<<4)&0x10));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendDM
+
+  Description:  Comose and Send DM (Disconnected Mode)
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          F fiels octet 4
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendDM(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)(0x0f | ((pf<<4)&0x10));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendDISC
+
+  Description:  Compose and Send Disconnect
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          P fiels octet 4
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendDISC(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)(0x43 | ((pf<<4)&0x10));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);
+}
+
+/*****************************************************************************
+
+  Function:     Q921SendUA
+
+  Description:  Compose and Send UA
+
+  Parameters:   trunk       trunk #
+                Sapi        Sapi
+                cr          C/R field.
+                Tei         Tei.
+                pf          F fiels octet 4
+
+  Return Value: 0 if failed, 1 if Send.
+
+*****************************************************************************/
+int Q921SendUA(int trunk, int Sapi, int cr, int Tei, int pf)
+{
+    L2UCHAR mes[400];
+
+    mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));
+    mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);
+    mes[Q921HeaderSpace+2] = (L2UCHAR)(0x63 | ((pf<<4)&0x10));
+
+    return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);
+}
+
+int Q921ProcSABME(int trunk, L2UCHAR *mes, int size)
+{
+       /* TODO:  Do we need these paramaters? */
+       (void)mes;
+       (void)size;
+
+    Q921DevSpace[trunk].vr=0;
+    Q921DevSpace[trunk].vs=0;
+
+    return 1;
+}
+
+/*****************************************************************************
+
+  Function:     Q921Rx12
+
+  Description:  Called to process a message frame from layer 1. Will 
+                identify the message and call the proper 'processor' for
+                layer 2 messages and forward I frames to the layer 3 entity.
+
+                Q921Rx12 will check the input fifo for a message, and if a 
+                message exist process one message before it exits. The caller
+                must either call Q921Rx12 polling or keep track on # 
+                messages in the queue.
+
+  Parameters:   trunk       trunk #.
+
+  Return Value: # messages processed (always 1 or 0).
+
+*****************************************************************************/
+int Q921Rx12(long trunk)
+{
+    L2UCHAR *mes;
+    int rs,size;     /* receive size & Q921 frame size*/
+    L2UCHAR *smes = MFIFOGetMesPtr(Q921DevSpace[trunk].HDLCInQueue, &size);
+    if(smes != NULL)
+    {
+        rs = size - Q921HeaderSpace;
+        mes = &smes[Q921HeaderSpace];
+        /* check for I frame */
+        if((mes[2] & 0x01) == 0)
+        {
+            if(Q921Tx23Proc(trunk, smes, size-2)) /* -2 to clip away CRC */
+            {
+                Q921DevSpace[trunk].vr++;
+                Q921SendRR(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, mes[3]&0x01);
+            }
+            else
+            {
+                /* todo: whatever*/
+            }
+        }
+
+        /* check for RR */
+        else if(mes[2] ==0x01)
+        {
+            /* todo: check if RR is responce to I */
+            Q921SendRR(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, mes[2]&0x01);
+        }
+
+        /* check for RNR */
+        /* check for REJ */
+        /* check for SABME */
+        else if((mes[2] & 0xef) == 0x6f)
+        {
+            Q921ProcSABME(trunk, mes, rs);
+            Q921SendUA(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, (mes[2]&0x10)>>4);
+        }
+
+        /* check for DM */
+        /* check for UI */
+        /* check for DISC */
+        /* check for UA */
+        /* check for FRMR */
+        /* check for XID */
+
+        else
+        {
+            /* what the ? Issue an error */
+                       /* Q921ErrorProc(trunk, Q921_UNKNOWNFRAME, mes, rs); */
+            /* todo: REJ or FRMR */
+        }
+
+        MFIFOKillNext(Q921DevSpace[trunk].HDLCInQueue);
+
+        return 1;
+    }
+    return 0;
+}
+
index ac22d79d25835af03d7a5208de839acb04474067..09cbaf0b76e3a11b51cb85af0418e333ffd66997 100644 (file)
-/*****************************************************************************\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
-L3INT (*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
-L3INT Q931ErrorDummy(Q931_TrunkInfo *pTrunk,L3INT a, L3INT b, L3INT c)\r
-{\r
-       return 0;\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
-\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, L3USHORT 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, L3USHORT 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 = 0;\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
+/*****************************************************************************
+
+  FileName:     Q931.c
+
+  Contents:     Implementation of Q.931 stack main interface functions. 
+                               See     q931.h for description. 
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+/*****************************************************************************
+
+  Dialect function pointers tables.
+
+  The following function pointer arrays define pack/unpack functions and 
+  processing furnctions for the different Q.931 based dialects.
+
+  The arrays are initialized with pointers to dummy functions and later
+  overrided with pointers to actual functions as new dialects are added.
+
+  The initial Q.931 will as an example define 2 dielects as it treats User
+  and Network mode as separate ISDN dialects.
+
+  The API messages Q931AddProc, Q931AddMes, Q931AddIE are used to initialize
+  these table entries during system inititialization of a stack.
+
+*****************************************************************************/
+L3INT (*Q931Proc  [Q931MAXDLCT][Q931MAXMES])   (Q931_TrunkInfo *pTrunk, L3UCHAR *,L3INT);
+
+L3INT (*Q931Umes  [Q931MAXDLCT][Q931MAXMES])   (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size);
+L3INT (*Q931Pmes  [Q931MAXDLCT][Q931MAXMES])   (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+
+L3INT (*Q931Uie   [Q931MAXDLCT][Q931MAXIE])            (Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT (*Q931Pie   [Q931MAXDLCT][Q931MAXIE])            (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+
+void  (*Q931CreateDialectCB[Q931MAXDLCT])       (L3UCHAR iDialect)=
+{
+       NULL,
+       NULL
+};
+
+Q931State Q931st[Q931MAXSTATE];
+
+/*****************************************************************************
+
+  Core system tables and variables.
+
+*****************************************************************************/
+
+L3INT Q931L4HeaderSpace={0};        /* header space to be ignoder/inserted  */
+                                    /* at head of each message.             */
+
+L3INT Q931L2HeaderSpace = {4};      /* Q921 header space, sapi, tei etc     */
+
+/*****************************************************************************
+
+  Main interface callback functions. 
+
+*****************************************************************************/
+
+L3INT (*Q931Tx34Proc)(Q931_TrunkInfo *pTrunk, L3UCHAR *,L3INT);
+                                                                       /* callback for messages to be send to  */
+                                    /* layer 4.                             */
+
+L3INT (*Q931Tx32Proc)(Q931_TrunkInfo *pTrunk,L3UCHAR *,L3INT);
+                                                                       /* callback ptr for messages to be send */
+                                    /* to layer 2.                          */
+
+L3INT (*Q931ErrorProc)(Q931_TrunkInfo *pTrunk, L3INT,L3INT,L3INT); 
+                                                                       /* callback for error messages.         */
+
+L3ULONG (*Q931GetTimeProc) ()=NULL; /* callback for func reading time in ms */
+
+/*****************************************************************************
+
+  Function:     Q931SetL4HeaderSpace
+
+  Description:  Set the # of bytes to be inserted/ignored at the head of
+                each message. Q931 will issue a message with space for header
+                and the user will use this to fill in whatever header info
+                is required to support the architecture used.
+
+*****************************************************************************/
+void Q931SetL4HeaderSpace(L3INT space)
+{
+    Q931L4HeaderSpace = space;
+}
+
+/*****************************************************************************
+
+  Function:     Q931SetL2HeaderSpace
+
+  Description:  Set the # of bytes to be inserted/ignored at the head of
+                each message. Q931 will issue a message with space for header
+                and the user will use this to fill in whatever header info
+                is required to support the architecture used.
+
+*****************************************************************************/
+void Q931SetL2HeaderSpace(L3INT space)
+{
+    Q931L2HeaderSpace = space;
+}
+
+/*****************************************************************************
+
+  Function:     Q931
+
+  Description:  Dummy function for message processing.
+
+*****************************************************************************/
+L3INT Q931ProcDummy(Q931_TrunkInfo *pTrunk, L3UCHAR * b,L3INT c)
+{
+    return Q931E_INTERNAL;
+}
+
+/*****************************************************************************
+
+  Function:     Q931
+
+  Description:  Dummy function for message processing
+
+*****************************************************************************/
+L3INT Q931UmesDummy(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    return Q931E_UNKNOWN_MESSAGE;
+}
+
+/*****************************************************************************
+
+  Function:     Q931
+
+  Description:  Dummy function for message processing
+
+*****************************************************************************/
+L3INT Q931UieDummy(Q931_TrunkInfo *pTrunk,ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    return Q931E_UNKNOWN_IE;
+}
+
+/*****************************************************************************
+
+  Function:     Q931
+
+  Description:  Dummy function for message processing
+
+*****************************************************************************/
+L3INT Q931PmesDummy(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    return Q931E_UNKNOWN_MESSAGE;
+}
+
+/*****************************************************************************
+
+  Function:     Q931PieDummy
+
+  Description:  Dummy function for message processing
+
+*****************************************************************************/
+L3INT Q931PieDummy(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    return Q931E_UNKNOWN_IE;
+}
+
+/*****************************************************************************
+
+  Function:     Q931TxDummy
+
+  Description:  Dummy function for message processing
+
+*****************************************************************************/
+L3INT Q931TxDummy(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT n)
+{
+    return Q931E_MISSING_CB;
+}
+
+/*****************************************************************************
+
+  Function:     Q931ErrorDummy
+
+  Description:  Dummy function for error processing
+
+*****************************************************************************/
+L3INT Q931ErrorDummy(Q931_TrunkInfo *pTrunk,L3INT a, L3INT b, L3INT c)
+{
+       return 0;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Initialize
+
+  Description:  This function Initialize the stack. 
+  
+                Will set up the trunk array, channel
+                arrays and initialize Q931 function arrays before it finally
+                set up EuroISDN processing with User as diealect 0 and 
+                Network as dialect 1.
+
+  Note:         Initialization of other stacks should be inserted after
+                the initialization of EuroISDN.
+
+*****************************************************************************/
+void Q931Initialize()
+{
+    L3INT x,y;
+
+       /* Secure the callbacks to default procs */
+    Q931Tx34Proc = Q931TxDummy;
+    Q931Tx32Proc = Q931TxDummy;
+    Q931ErrorProc = Q931ErrorDummy;
+
+       /* The user will only add the message handlers and IE handlers he need, */
+       /* so we need to initialize every single entry to a default function    */
+       /* that will throw an appropriate error if they are ever called.        */
+    for(x=0;x< Q931MAXDLCT;x++)
+    {
+        for(y=0;y<Q931MAXMES;y++)
+        {
+            Q931Proc[x][y] = Q931ProcDummy;
+            Q931Umes[x][y] = Q931UmesDummy;
+            Q931Pmes[x][y] = Q931PmesDummy;
+        }
+        for(y=0;y<Q931MAXIE;y++)
+        {
+            Q931Pie[x][y] = Q931PieDummy;
+            Q931Uie[x][y] = Q931UieDummy;
+        }
+    }
+
+       if(Q931CreateDialectCB[0] == NULL)
+               Q931AddDialect(0, Q931CreateTE);
+
+       if(Q931CreateDialectCB[1] == NULL)
+               Q931AddDialect(1, Q931CreateNT);
+
+       /* The last step we do is to call the callbacks to create the dialects  */
+       for(x=0; x< Q931MAXDLCT; x++)
+       {
+               if(Q931CreateDialectCB[x] != NULL)
+               {
+                       Q931CreateDialectCB[x]((L3UCHAR)x);
+               }
+       }
+}
+
+/*****************************************************************************
+
+  Function:     Q931TimeTick
+
+  Description:  Called periodically from an external source to allow the 
+                stack to process and maintain it's own timers.
+
+  Parameters:   ms[IN]        Milliseconds since last call.
+
+  Return Value: none
+
+*****************************************************************************/
+void Q931TimeTick(L3ULONG ms)
+{
+    ms=ms; /* avoid warning for now. */
+
+       /*  TODO: Loop through all active calls, check timers and call timour procs
+        *  if timers are expired.
+        *  Implement an function array so each dialect can deal with their own
+        *  timeouts.
+        */
+}
+
+/*****************************************************************************
+
+  Function:     Q931Rx23
+
+  Description:  Receive message from layer 2 (LAPD). Receiving a message 
+                is always done in 2 steps. First the message must be 
+                interpreted and translated to a static struct. Secondly
+                the message is processed and responded to.
+
+                               The Q.931 message contains a static header that is 
+                               interpreated in his function. The rest is interpreted
+                               in a sub function according to mestype.
+
+  Parameters:   pTrunk [IN]    Ptr to trunk info.
+                               buf             [IN]    Ptr to buffer containing message.
+                               Size    [IN]    Size of message.
+
+  Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning
+                               see q931errors.h for details.
+
+*****************************************************************************/
+L3INT Q931Rx23(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT Size)
+{
+    L3UCHAR *Mes = &buf[Q931L2HeaderSpace];
+       L3INT RetCode = Q931E_NO_ERROR;
+
+    Q931mes_Alerting * m = (Q931mes_Alerting*)Mes;
+    L3INT ISize;
+    L3INT IOff = 0;
+
+    /* Protocol Discriminator */
+    m->ProtDisc = Mes[IOff++];
+
+    /* CRV */
+    m->CRV = Q931Uie_CRV(pTrunk, Mes,m->buf, &IOff, &ISize);
+
+    /* Message Type */
+    m->MesType = Mes[IOff++];
+
+    /* Call table proc to unpack codec message */
+       RetCode = Q931Umes[pTrunk->Dialect][m->MesType](pTrunk, Mes, pTrunk->L3Buf,Q931L4HeaderSpace,Size- Q931L4HeaderSpace);
+       if(RetCode >= Q931E_NO_ERROR)
+       {
+               RetCode=Q931Proc[pTrunk->Dialect][m->MesType](pTrunk, pTrunk->L3Buf, 2);
+       }
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:            Q931Tx34
+
+  Description: Called from the stac to send a message to layer 4.
+
+  Parameters:  Mes[IN]         Ptr to message buffer.
+                               Size[IN]        Message size in bytes.
+
+  Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning
+                               see q931errors.h for details.
+
+*****************************************************************************/
+L3INT Q931Tx34(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size)
+{
+    return Q931Tx34Proc(pTrunk, Mes, Size);
+}
+
+/*****************************************************************************
+
+  Function:     Q931Rx43
+
+  Description:  Receive message from Layer 4 (application).
+
+  Parameters:   pTrunk[IN]  Trunk #.
+                buf[IN]     Message Pointer.
+                Size[IN]    Message size in bytes.
+
+  Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning
+                               see q931errors.h for details.
+
+*****************************************************************************/
+L3INT Q931Rx43(Q931_TrunkInfo *pTrunk,L3UCHAR * buf, L3INT Size)
+{
+    Q931mes_Header *ptr = (Q931mes_Header*)&buf[Q931L4HeaderSpace];
+       L3INT RetCode = Q931E_NO_ERROR;
+
+       RetCode=Q931Proc[pTrunk->Dialect][ptr->MesType](pTrunk,buf,4);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:            Q931Tx32
+
+  Description: Called from the stack to send a message to L2. The input is 
+                always a non-packed message so it will first make a proper
+                call to create a packed message before it transmits that
+                message to layer 2.
+
+  Parameters:  pTrunk[IN]  Trunk #  
+                buf[IN]                Ptr to message buffer.
+                               Size[IN]        Message size in bytes.
+
+  Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning
+                               see q931errors.h for details.
+
+*****************************************************************************/
+L3INT Q931Tx32(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size)
+{
+    L3INT     OSize;
+    Q931mes_Alerting *ptr = (Q931mes_Alerting*)Mes;
+       L3INT RetCode = Q931E_NO_ERROR;
+    L3INT iDialect = pTrunk->Dialect;
+
+    /* Call pack function through table. */
+    RetCode = Q931Pmes[iDialect][ptr->MesType](pTrunk,Mes,Size,&pTrunk->L2Buf[Q931L2HeaderSpace], &OSize);
+       if(RetCode >= Q931E_NO_ERROR)
+       {
+        RetCode = Q931Tx32Proc(pTrunk, pTrunk->L2Buf, Size);
+    }
+
+    return RetCode;
+}
+
+
+/*****************************************************************************
+
+  Function:            Q931SetError
+
+  Description: Called from the stack to indicate an error. 
+
+  Parameters:  ErrID       ID of ie or message causing error.
+                               ErrPar1     Error parameter 1
+                ErrPar2     Error parameter 2.
+
+
+*****************************************************************************/
+void Q931SetError(Q931_TrunkInfo *pTrunk,L3INT ErrID, L3INT ErrPar1, L3INT ErrPar2)
+{
+    Q931ErrorProc(pTrunk,ErrID, ErrPar1, ErrPar2);
+}
+
+void Q931SetTx34CB(L3INT (*Q931Tx34Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size))
+{
+    Q931Tx34Proc = Q931Tx34Par;
+}
+
+void Q931SetTx32CB(L3INT (*Q931Tx32Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size))
+{
+    Q931Tx32Proc = Q931Tx32Par;
+}
+
+void Q931SetErrorCB(L3INT (*Q931ErrorPar)(Q931_TrunkInfo *pTrunk,L3INT,L3INT,L3INT))
+{
+    Q931ErrorProc = Q931ErrorPar;
+}
+
+/*****************************************************************************
+
+  Function:            Q931CreateCRV
+
+  Description: Create a CRV entry and return it's index. The function will 
+                               locate a free entry in the call tables allocate it and 
+                               allocate a unique CRV value attached to it.
+
+  Parameters:  pTrunk          [IN]    Trunk number
+                               callindex       [OUT]   return call table index.
+
+  Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning
+                               see q931errors.h for details.
+
+*****************************************************************************/
+L3INT  Q931CreateCRV(Q931_TrunkInfo *pTrunk, L3INT * callIndex)
+{
+       L3INT CRV = Q931GetUniqueCRV(pTrunk);
+
+       return Q931AllocateCRV(pTrunk, CRV, callIndex);
+}
+
+/*****************************************************************************
+
+  Function:            Q931AllocateCRV
+
+  Description: Allocate a call table entry and assigns the given CRV value
+                               to it.
+
+  Parameters:  pTrunk          [IN]    Trunk number
+                               iCRV            [IN]    Call Reference Value.
+                               callindex       [OUT]   return call table index.
+
+  Return Value: Error Code. 0 = No Error, < 0 :error, > 0 : Warning
+                               see q931errors.h for details.
+
+*****************************************************************************/
+L3INT  Q931AllocateCRV(Q931_TrunkInfo *pTrunk, L3INT iCRV, L3INT * callIndex)
+{
+    L3INT x;
+       for(x=0; x < Q931MAXCALLPERTRUNK; x++)
+       {
+               if(!pTrunk->call[x].InUse)
+               {
+                       pTrunk->call[x].CRV     = iCRV;
+                       pTrunk->call[x].BChan = 255;
+                       pTrunk->call[x].State = 0;              /* null state - idle */
+                       pTrunk->call[x].TimerID = 0;    /* no timer running */
+                       pTrunk->call[x].Timer = 0;
+                       pTrunk->call[x].InUse = 1;              /* mark as used */
+            *callIndex = x;
+            return Q931E_NO_ERROR;
+               }
+       }
+    return Q931E_TOMANYCALLS;
+}
+
+/*****************************************************************************
+
+  Function:     Q931GetCallState
+
+  Description:  Look up CRV and return current call state. A non existing
+                CRV is the same as state zero (0).
+
+  Parameters:   pTrunk [IN]    Trunk number.
+                iCRV   [IN]    CRV
+
+  Return Value: Call State.
+
+*****************************************************************************/
+L3INT  Q931GetCallState(Q931_TrunkInfo *pTrunk, L3INT iCRV)
+{
+    L3INT x;
+       for(x=0; x < Q931MAXCALLPERTRUNK; x++)
+       {
+               if(!pTrunk->call[x].InUse)
+               {
+            if(pTrunk->call[x].CRV == iCRV)
+            {
+                return pTrunk->call[x].State;
+            }
+        }
+    }
+    return 0; /* assume state zero for non existing CRV's */
+}
+
+/*****************************************************************************
+
+  Function:     Q931StartTimer
+
+  Description:  Start a timer.
+
+  Parameters:   pTrunk      Trunk number
+                callindex   call index.
+                iTimer      timer id
+*****************************************************************************/
+L3INT Q931StartTimer(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3USHORT iTimerID)
+{
+    pTrunk->call[callIndex].Timer   = Q931GetTime();  
+    pTrunk->call[callIndex].TimerID = iTimerID;
+    return 0;
+}
+
+L3INT Q931StopTimer(Q931_TrunkInfo *pTrunk, L3INT callindex, L3USHORT iTimerID)
+{
+    if(pTrunk->call[callindex].TimerID == iTimerID)
+        pTrunk->call[callindex].TimerID = 0;
+    return 0;
+}
+
+L3INT Q931SetState(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3INT iState)
+{
+    pTrunk->call[callIndex].State = iState;
+
+    return 0;
+}
+
+L3ULONG Q931GetTime()
+{
+    L3ULONG tNow = 0;
+    static L3ULONG tLast={0};
+    if(Q931GetTimeProc != NULL)
+    {
+        tNow = Q931GetTimeProc();
+        if(tNow < tLast)    /* wrapped */
+        {
+                       /* TODO */
+        }
+               tLast = tNow;
+    }
+    return tNow;
+}
+
+void Q931SetGetTimeCB(L3ULONG (*callback)())
+{
+    Q931GetTimeProc = callback;
+}
+
+L3INT Q931FindCRV(Q931_TrunkInfo *pTrunk, L3INT crv, L3INT *callindex)
+{
+    L3INT x;
+       for(x=0; x < Q931MAXCALLPERTRUNK; x++)
+       {
+               if(!pTrunk->call[x].InUse)
+               {
+            if(pTrunk->call[x].CRV == crv)
+            {
+                *callindex = x;
+                return Q931E_NO_ERROR;
+            }
+        }
+    }
+    return Q931E_INVALID_CRV;
+}
+
+
+void Q931AddDialect(L3UCHAR i, void (*callback)(L3UCHAR iD ))
+{
+       if(i < Q931MAXDLCT)
+       {
+               Q931CreateDialectCB[i] = callback;
+       }
+}
+
+/*****************************************************************************
+  Function:            Q931AddStateEntry
+
+  Description: Find an empty entry in the dialects state table and add this
+                               entry.
+*****************************************************************************/
+void Q931AddStateEntry(L3UCHAR iD, L3INT iState,       L3INT iMes,     L3UCHAR cDir)
+{
+       int x;
+       for(x=0; x < Q931MAXSTATE; x++)
+       {
+               if(Q931st[x].Message == 0)
+               {
+                       Q931st[x].State = iState;
+                       Q931st[x].Message = iMes;
+                       Q931st[x].Direction = cDir;
+                       /* TODO Sort table and use bsearch */
+                       return;
+               }
+       }
+}
+
+/*****************************************************************************
+  Function:            Q931IsEventLegal
+
+  Description: Check state table for matching criteria to indicate if this
+                               Message is legal in this state or not.
+
+  Note:                        Someone write a bsearch or invent something smart here
+                               please - sequensial is ok for now.
+*****************************************************************************/
+L3BOOL Q931IsEventLegal(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir)
+{
+       int x;
+       /* TODO Sort table and use bsearch */
+       for(x=0; x < Q931MAXSTATE; x++)
+       {
+               if(             Q931st[x].State == iState
+                       &&  Q931st[x].Message == iMes
+                       &&  Q931st[x].Direction == cDir)
+               {
+                       return L3TRUE;
+               }
+       }
+       return L3FALSE; 
+}
index 0b0317056618f00469873154b8fd40c53ad9fe9a..2d2a3c5671529748ed2ad1a84c71c1c3c82bc0ed 100644 (file)
-/*****************************************************************************\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
-#if 0\r
-               /* TODO: Unreachable code??? */\r
-        /* Set state U6 */\r
-        Q931SetState(pTrunk, callIndex, Q931_U6);\r
-\r
-        Q931StartTimer(pTrunk, callIndex, 303);\r
-#endif\r
-\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
+/*****************************************************************************
+
+  FileName:            q931StateNT.c
+
+  Contents:            Q.931 State Engine for NT (Network Mode).
+
+                               The controlling state engine for Q.931 is the state engine
+                               on the NT side. The state engine on the TE side is a slave 
+                               of this. The TE side maintain it's own states as described in
+                               ITU-T Q931, but will in raise conditions be overridden by 
+                               the NT side.
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+extern L3INT Q931L4HeaderSpace;
+
+/*****************************************************************************
+  Function:            Q931CreateNT
+
+  Description: Will create the Q931 NT as a Dialect in the stack. The first
+                               bulk set up the message handlers, the second bulk the IE
+                               encoders/coders, and the last bulk set up the state table.
+
+  Parameters:  i               Dialect index
+*****************************************************************************/
+void Q931CreateNT(L3UCHAR i)
+{
+    Q931SetMesProc(Q931mes_ALERTING,            i,Q931ProcAlertingNT,          Q931Umes_Alerting,          Q931Pmes_Alerting);
+    Q931SetMesProc(Q931mes_CALL_PROCEEDING,     i,Q931ProcCallProceedingNT,    Q931Umes_CallProceeding,    Q931Pmes_CallProceeding);
+    Q931SetMesProc(Q931mes_CONNECT,             i,Q931ProcConnectNT,           Q931Umes_Connect,           Q931Pmes_Connect);
+    Q931SetMesProc(Q931mes_CONNECT_ACKNOWLEDGE, i,Q931ProcConnectAckNT,        Q931Umes_ConnectAck,        Q931Pmes_ConnectAck);
+    Q931SetMesProc(Q931mes_PROGRESS,            i,Q931ProcProgressNT,          Q931Umes_Progress,          Q931Pmes_Progress);
+    Q931SetMesProc(Q931mes_SETUP,               i,Q931ProcSetupNT,             Q931Umes_Setup,             Q931Pmes_Setup);
+    Q931SetMesProc(Q931mes_SETUP_ACKNOWLEDGE,   i,Q931ProcSetupAckNT,          Q931Umes_SetupAck,          Q931Pmes_SetupAck);
+    Q931SetMesProc(Q931mes_RESUME,              i,Q931ProcResumeNT,            Q931Umes_Resume,            Q931Pmes_Resume);
+    Q931SetMesProc(Q931mes_RESUME_ACKNOWLEDGE,  i,Q931ProcResumeAckNT,         Q931Umes_ResumeAck,         Q931Pmes_ResumeAck);
+    Q931SetMesProc(Q931mes_RESUME_REJECT,       i,Q931ProcResumeRejectNT,      Q931Umes_ResumeReject,      Q931Pmes_ResumeReject);
+    Q931SetMesProc(Q931mes_SUSPEND,             i,Q931ProcSuspendNT,           Q931Umes_Suspend,           Q931Pmes_Suspend);
+    Q931SetMesProc(Q931mes_SUSPEND_ACKNOWLEDGE, i,Q931ProcSuspendAckNT,        Q931Umes_SuspendAck,        Q931Pmes_SuspendAck);
+    Q931SetMesProc(Q931mes_SUSPEND_REJECT,      i,Q931ProcSuspendRejectNT,     Q931Umes_SuspendReject,     Q931Pmes_SuspendReject);
+    Q931SetMesProc(Q931mes_USER_INFORMATION,    i,Q931ProcUserInformationNT,   Q931Umes_UserInformation,   Q931Pmes_UserInformation);
+    Q931SetMesProc(Q931mes_DISCONNECT,          i,Q931ProcDisconnectNT,        Q931Umes_Disconnect,        Q931Pmes_Disconnect);
+    Q931SetMesProc(Q931mes_RELEASE,             i,Q931ProcReleaseNT,           Q931Umes_Release,           Q931Pmes_Release);
+    Q931SetMesProc(Q931mes_RELEASE_COMPLETE,    i,Q931ProcReleaseCompleteNT,   Q931Umes_ReleaseComplete,   Q931Pmes_ReleaseComplete);
+    Q931SetMesProc(Q931mes_RESTART,             i,Q931ProcRestartNT,           Q931Umes_Restart,           Q931Pmes_Restart);
+    Q931SetMesProc(Q931mes_RESTART_ACKNOWLEDGE, i,Q931ProcRestartAckNT,        Q931Umes_RestartAck,        Q931Pmes_RestartAck);
+    Q931SetMesProc(Q931mes_CONGESTION_CONTROL,  i,Q931ProcCongestionControlNT, Q931Umes_CongestionControl, Q931Pmes_CongestionControl);
+    Q931SetMesProc(Q931mes_INFORMATION,         i,Q931ProcInformationNT,       Q931Umes_Information,       Q931Pmes_Information);
+    Q931SetMesProc(Q931mes_NOTIFY,              i,Q931ProcNotifyNT,            Q931Umes_Notify,            Q931Pmes_Notify);
+    Q931SetMesProc(Q931mes_STATUS,              i,Q931ProcStatusNT,            Q931Umes_Status,            Q931Pmes_Status);
+    Q931SetMesProc(Q931mes_STATUS_ENQUIRY,      i,Q931ProcStatusEnquiryNT,     Q931Umes_StatusEnquiry,     Q931Pmes_StatusEnquiry);
+    Q931SetMesProc(Q931mes_SEGMENT,             i,Q931ProcSegmentNT,           Q931Umes_Segment,           Q931Pmes_Segment);
+
+    Q931SetMesProc(Q932mes_FACILITY,            i,Q932ProcFacilityNT,          Q932Umes_Facility,          Q932Pmes_Facility);
+    Q931SetMesProc(Q932mes_HOLD,                i,Q932ProcHoldNT,                     Q932Umes_Hold,              Q932Pmes_Hold);
+    Q931SetMesProc(Q932mes_HOLD_ACKNOWLEDGE,    i,Q932ProcHoldAckNT,           Q932Umes_HoldAck,           Q932Pmes_HoldAck);
+    Q931SetMesProc(Q932mes_HOLD_REJECT,         i,Q932ProcHoldRejectNT,        Q932Umes_HoldReject,        Q932Pmes_HoldReject);
+    Q931SetMesProc(Q932mes_REGISTER,            i,Q932ProcRegisterNT,          Q932Umes_Register,          Q932Pmes_Register);
+    Q931SetMesProc(Q932mes_RETRIEVE,            i,Q932ProcRetrieveNT,          Q932Umes_Retrieve,          Q932Pmes_Retrieve);
+    Q931SetMesProc(Q932mes_RETRIEVE_ACKNOWLEDGE,i,Q932ProcRetrieveAckNT,       Q932Umes_RetrieveAck,       Q932Pmes_RetrieveAck);
+    Q931SetMesProc(Q932mes_RETRIEVE_REJECT,     i,Q932ProcRetrieveRejectNT,    Q932Umes_RetrieveReject,    Q932Pmes_RetrieveReject);
+
+       /* Set up the IE encoder/decoder handle table.*/ 
+    Q931SetIEProc(Q931ie_SEGMENTED_MESSAGE,                i,Q931Pie_Segment,                  Q931Uie_Segment);
+    Q931SetIEProc(Q931ie_BEARER_CAPABILITY,                i,Q931Pie_BearerCap,                        Q931Uie_BearerCap);
+    Q931SetIEProc(Q931ie_CAUSE,                            i,Q931Pie_Cause,                            Q931Uie_Cause);
+    Q931SetIEProc(Q931ie_CALL_IDENTITY,                    i,Q931Pie_CallID,                   Q931Uie_CallID);
+    Q931SetIEProc(Q931ie_CALL_STATE,                       i,Q931Pie_CallState,                        Q931Uie_CallState);
+    Q931SetIEProc(Q931ie_CHANNEL_IDENTIFICATION,           i,Q931Pie_ChanID,                   Q931Uie_ChanID);
+    Q931SetIEProc(Q931ie_PROGRESS_INDICATOR,               i,Q931Pie_ProgInd,                  Q931Uie_ProgInd);
+    Q931SetIEProc(Q931ie_NETWORK_SPECIFIC_FACILITIES,      i,Q931Pie_NetFac,                   Q931Uie_NetFac);
+    Q931SetIEProc(Q931ie_NOTIFICATION_INDICATOR,           i,Q931Pie_NotifInd,                 Q931Uie_NotifInd);
+    Q931SetIEProc(Q931ie_DISPLAY,                          i,Q931Pie_Display,                  Q931Uie_Display);
+    Q931SetIEProc(Q931ie_DATETIME,                         i,Q931Pie_DateTime,                 Q931Uie_DateTime);
+    Q931SetIEProc(Q931ie_KEYPAD_FACILITY,                  i,Q931Pie_KeypadFac,                        Q931Uie_KeypadFac);
+    Q931SetIEProc(Q931ie_SIGNAL,                           i,Q931Pie_Signal,                   Q931Uie_Signal);
+    Q931SetIEProc(Q931ie_TRANSIT_DELAY_SELECTION_AND_IND,  i,Q931Pie_TransNetSel,              Q931Uie_TransNetSel);
+    Q931SetIEProc(Q931ie_CALLING_PARTY_NUMBER,             i,Q931Pie_CallingNum,               Q931Uie_CallingNum);
+    Q931SetIEProc(Q931ie_CALLING_PARTY_SUBADDRESS,         i,Q931Pie_CallingSub,               Q931Uie_CallingSub);
+    Q931SetIEProc(Q931ie_CALLED_PARTY_NUMBER,              i,Q931Pie_CalledNum,                        Q931Uie_CalledNum);
+    Q931SetIEProc(Q931ie_CALLED_PARTY_SUBADDRESS,          i,Q931Pie_CalledSub,                        Q931Uie_CalledSub);
+    Q931SetIEProc(Q931ie_TRANSIT_NETWORK_SELECTION,        i,Q931Pie_TransNetSel,              Q931Uie_TransNetSel);
+    Q931SetIEProc(Q931ie_RESTART_INDICATOR,                i,Q931Pie_RestartInd,               Q931Uie_RestartInd);
+    Q931SetIEProc(Q931ie_LOW_LAYER_COMPATIBILITY,          i,Q931Pie_LLComp,                   Q931Uie_LLComp);
+    Q931SetIEProc(Q931ie_HIGH_LAYER_COMPATIBILITY,         i,Q931Pie_HLComp,                   Q931Uie_HLComp);
+    Q931SetIEProc(Q931ie_USER_USER,                        i,Q931Pie_UserUser,                 Q931Uie_UserUser);
+
+       /* The following define a state machine. The point is that the Message  */
+       /* procs can when search this to find out if the message/state                  */
+       /* combination is legale. If not, the proc for unexpected message apply.*/
+
+       /* TODO define state table here */
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcAlertingNT
+
+*****************************************************************************/
+L3INT Q931ProcAlertingNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* Reset 4 sec timer. */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcCallProceedingNT
+
+*****************************************************************************/
+L3INT Q931ProcCallProceedingNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcConnectNT
+
+*****************************************************************************/
+L3INT Q931ProcConnectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcConnectAckNT
+
+*****************************************************************************/
+L3INT Q931ProcConnectAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcProgressNT
+
+*****************************************************************************/
+L3INT Q931ProcProgressNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSetupNT
+
+  Description: Process a SETUP message.
+
+ *****************************************************************************/
+L3INT Q931ProcSetupNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT rc=0;
+       Q931mes_Setup *pMes = (Q931mes_Setup *)&buf[Q931L4HeaderSpace];
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+
+    /* Reject SETUP on existing calls */
+    if(Q931GetCallState(pTrunk, pMes->CRV) != Q931_U0)
+    {
+        Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);
+        return Q931E_UNEXPECTED_MESSAGE;
+    }
+
+       /* outgoing call */
+    if(iFrom == 4)
+    {
+        ret = Q931CreateCRV(pTrunk, &callIndex);
+        if(ret)
+            return ret;
+        pMes->CRV = pTrunk->call[callIndex].CRV;
+
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+        if(ret)
+            return ret;
+
+        Q931StartTimer(pTrunk, callIndex, 303);
+
+        Q931SetState(pTrunk, callIndex, Q931_U1);
+    }
+       /* incoming call */
+    else 
+    {
+        /* Locate free CRV entry and store info */
+        ret = Q931AllocateCRV(pTrunk, pMes->CRV, &callIndex);
+        if(ret != Q931E_NO_ERROR)
+        {
+            /* Not possible to allocate CRV entry, so must reject call */
+
+            Q931Disconnect(pTrunk, iFrom, pMes->CRV, 42);
+
+            return ret;
+        }
+
+        /* Send setup indication to user */
+        ret = Q931Tx34(pTrunk,(L3UCHAR*)pMes,pMes->Size);
+        if(ret != Q931E_NO_ERROR)
+            return ret;
+               else
+               {
+                       /* Must be full queue, meaning we can't process the call */
+                       /* so we must disconnect */
+               Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);
+               return ret;
+               }
+
+#if 0
+               /* TODO: Unreachable code??? */
+        /* Set state U6 */
+        Q931SetState(pTrunk, callIndex, Q931_U6);
+
+        Q931StartTimer(pTrunk, callIndex, 303);
+#endif
+
+       }
+
+       return rc;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSetupAckNT
+
+  Description: Used to acknowedge a SETUP. Usually the first initial
+                               response recevide back used to buy some time.
+
+                               Note that ChanID (B Channel Assignment) might come here from
+                               NT side.
+
+*****************************************************************************/
+L3INT Q931ProcSetupAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcResumeNT
+
+*****************************************************************************/
+L3INT Q931ProcResumeNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcResumeAckNT
+
+*****************************************************************************/
+L3INT Q931ProcResumeAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcResumeRejectNT
+
+*****************************************************************************/
+L3INT Q931ProcResumeRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSuspendNT
+
+*****************************************************************************/
+L3INT Q931ProcSuspendNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSuspendAckNT
+
+*****************************************************************************/
+L3INT Q931ProcSuspendAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSuspendRejectNT
+
+*****************************************************************************/
+L3INT Q931ProcSuspendRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcInformationNT
+
+*****************************************************************************/
+L3INT Q931ProcUserInformationNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcDisconnectNT
+
+*****************************************************************************/
+L3INT Q931ProcDisconnectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcReleaseNT
+
+*****************************************************************************/
+L3INT Q931ProcReleaseNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcReleaseCompleteNT
+
+*****************************************************************************/
+L3INT Q931ProcReleaseCompleteNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRestartNT
+
+*****************************************************************************/
+L3INT Q931ProcRestartNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRestartAckNT
+
+*****************************************************************************/
+L3INT Q931ProcRestartAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcCongestionControlNT
+
+*****************************************************************************/
+L3INT Q931ProcCongestionControlNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcInformationNT
+
+*****************************************************************************/
+L3INT Q931ProcInformationNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcNotifyNT
+
+*****************************************************************************/
+L3INT Q931ProcNotifyNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcStatusNT
+
+*****************************************************************************/
+L3INT Q931ProcStatusNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcStatusEnquiryNT
+
+*****************************************************************************/
+L3INT Q931ProcStatusEnquiryNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSegmentNT
+
+*****************************************************************************/
+L3INT Q931ProcSegmentNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/****************************************************************************/
+/******************* Q.932 - Supplementary Services *************************/
+/****************************************************************************/
+
+/*****************************************************************************
+
+  Function:            Q932ProcFacilityNT
+
+*****************************************************************************/
+L3INT Q932ProcFacilityNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcHoldNT
+
+*****************************************************************************/
+L3INT Q932ProcHoldNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcHoldAckNT
+
+*****************************************************************************/
+L3INT Q932ProcHoldAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcHoldRejectNT
+
+*****************************************************************************/
+L3INT Q932ProcHoldRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRegisterTE
+
+*****************************************************************************/
+L3INT Q932ProcRegisterNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRetrieveNT
+
+*****************************************************************************/
+L3INT Q932ProcRetrieveNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRetrieveAckNT
+
+*****************************************************************************/
+L3INT Q932ProcRetrieveAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRetrieveRejectNT
+
+*****************************************************************************/
+L3INT Q932ProcRetrieveRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
index 7e870224a841cd37c08349b4cc62d6cb801152d3..7941326b052bb9b05926f1a9cbddcd53906c8c22 100644 (file)
-/*****************************************************************************\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
-#if 0\r
-               /* TODO: Unreachable code??? */\r
-        /* Set state U6 */\r
-        Q931SetState(pTrunk, callIndex, Q931_U6);\r
-\r
-        Q931StartTimer(pTrunk, callIndex, 303);\r
-#endif\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 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 ret;\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
+/*****************************************************************************
+
+  FileName:            q931StateTE.c
+
+  Contents:            Q.931 State Engine for TE (User Mode).
+
+                               The controlling state engine for Q.931 is the state engine
+                               on the NT side. The state engine on the TE side is a slave 
+                               of this. The TE side maintain it's own states as described in
+                               ITU-T Q931, but will in raise conditions be overridden by 
+                               the NT side.
+
+                               This reference implementation uses a process per message,
+                               meaning that each message must check call states. This
+                               is easier for dialect maintenance as each message proc
+                               can be replaced individually. A new TE variant only
+                               need to copy the Q931CreateTE and replace those procs or
+                               need to override.
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+extern L3INT Q931L4HeaderSpace;
+
+/*****************************************************************************
+  Function:            Q931CreateTE
+
+  Description: Will create the Q931 TE as a Dialect in the stack. The first
+                               bulk set up the message handlers, the second bulk the IE
+                               encoders/coders, and the last bulk set up the state table.
+
+  Parameters:  i               Dialect index
+*****************************************************************************/
+void Q931CreateTE(L3UCHAR i)
+{
+    Q931SetMesProc(Q931mes_ALERTING,            i,Q931ProcAlertingTE,          Q931Umes_Alerting,          Q931Pmes_Alerting);
+    Q931SetMesProc(Q931mes_CALL_PROCEEDING,     i,Q931ProcCallProceedingTE,    Q931Umes_CallProceeding,    Q931Pmes_CallProceeding);
+    Q931SetMesProc(Q931mes_CONNECT,             i,Q931ProcConnectTE,           Q931Umes_Connect,           Q931Pmes_Connect);
+    Q931SetMesProc(Q931mes_CONNECT_ACKNOWLEDGE, i,Q931ProcConnectAckTE,        Q931Umes_ConnectAck,        Q931Pmes_ConnectAck);
+    Q931SetMesProc(Q931mes_PROGRESS,            i,Q931ProcProgressTE,          Q931Umes_Progress,          Q931Pmes_Progress);
+    Q931SetMesProc(Q931mes_SETUP,               i,Q931ProcSetupTE,             Q931Umes_Setup,             Q931Pmes_Setup);
+    Q931SetMesProc(Q931mes_SETUP_ACKNOWLEDGE,   i,Q931ProcSetupAckTE,          Q931Umes_SetupAck,          Q931Pmes_SetupAck);
+    Q931SetMesProc(Q931mes_RESUME,              i,Q931ProcResumeTE,            Q931Umes_Resume,            Q931Pmes_Resume);
+    Q931SetMesProc(Q931mes_RESUME_ACKNOWLEDGE,  i,Q931ProcResumeAckTE,         Q931Umes_ResumeAck,         Q931Pmes_ResumeAck);
+    Q931SetMesProc(Q931mes_RESUME_REJECT,       i,Q931ProcResumeRejectTE,      Q931Umes_ResumeReject,      Q931Pmes_ResumeReject);
+    Q931SetMesProc(Q931mes_SUSPEND,             i,Q931ProcSuspendTE,           Q931Umes_Suspend,           Q931Pmes_Suspend);
+    Q931SetMesProc(Q931mes_SUSPEND_ACKNOWLEDGE, i,Q931ProcSuspendAckTE,        Q931Umes_SuspendAck,        Q931Pmes_SuspendAck);
+    Q931SetMesProc(Q931mes_SUSPEND_REJECT,      i,Q931ProcSuspendRejectTE,     Q931Umes_SuspendReject,     Q931Pmes_SuspendReject);
+    Q931SetMesProc(Q931mes_USER_INFORMATION,    i,Q931ProcUserInformationTE,   Q931Umes_UserInformation,   Q931Pmes_UserInformation);
+    Q931SetMesProc(Q931mes_DISCONNECT,          i,Q931ProcDisconnectTE,        Q931Umes_Disconnect,        Q931Pmes_Disconnect);
+    Q931SetMesProc(Q931mes_RELEASE,             i,Q931ProcReleaseTE,           Q931Umes_Release,           Q931Pmes_Release);
+    Q931SetMesProc(Q931mes_RELEASE_COMPLETE,    i,Q931ProcReleaseCompleteTE,   Q931Umes_ReleaseComplete,   Q931Pmes_ReleaseComplete);
+    Q931SetMesProc(Q931mes_RESTART,             i,Q931ProcRestartTE,           Q931Umes_Restart,           Q931Pmes_Restart);
+    Q931SetMesProc(Q931mes_RESTART_ACKNOWLEDGE, i,Q931ProcRestartAckTE,        Q931Umes_RestartAck,        Q931Pmes_RestartAck);
+    Q931SetMesProc(Q931mes_CONGESTION_CONTROL,  i,Q931ProcCongestionControlTE, Q931Umes_CongestionControl, Q931Pmes_CongestionControl);
+    Q931SetMesProc(Q931mes_INFORMATION,         i,Q931ProcInformationTE,       Q931Umes_Information,       Q931Pmes_Information);
+    Q931SetMesProc(Q931mes_NOTIFY,              i,Q931ProcNotifyTE,            Q931Umes_Notify,            Q931Pmes_Notify);
+    Q931SetMesProc(Q931mes_STATUS,              i,Q931ProcStatusTE,            Q931Umes_Status,            Q931Pmes_Status);
+    Q931SetMesProc(Q931mes_STATUS_ENQUIRY,      i,Q931ProcStatusEnquiryTE,     Q931Umes_StatusEnquiry,     Q931Pmes_StatusEnquiry);
+    Q931SetMesProc(Q931mes_SEGMENT,             i,Q931ProcSegmentTE,           Q931Umes_Segment,           Q931Pmes_Segment);
+
+    Q931SetMesProc(Q932mes_FACILITY,            i,Q932ProcFacilityTE,          Q932Umes_Facility,          Q932Pmes_Facility);
+    Q931SetMesProc(Q932mes_HOLD,                i,Q932ProcHoldTE,                     Q932Umes_Hold,              Q932Pmes_Hold);
+    Q931SetMesProc(Q932mes_HOLD_ACKNOWLEDGE,    i,Q932ProcHoldAckTE,           Q932Umes_HoldAck,           Q932Pmes_HoldAck);
+    Q931SetMesProc(Q932mes_HOLD_REJECT,         i,Q932ProcHoldRejectTE,        Q932Umes_HoldReject,        Q932Pmes_HoldReject);
+    Q931SetMesProc(Q932mes_REGISTER,            i,Q932ProcRegisterTE,          Q932Umes_Register,          Q932Pmes_Register);
+    Q931SetMesProc(Q932mes_RETRIEVE,            i,Q932ProcRetrieveTE,          Q932Umes_Retrieve,          Q932Pmes_Retrieve);
+    Q931SetMesProc(Q932mes_RETRIEVE_ACKNOWLEDGE,i,Q932ProcRetrieveAckTE,       Q932Umes_RetrieveAck,       Q932Pmes_RetrieveAck);
+    Q931SetMesProc(Q932mes_RETRIEVE_REJECT,     i,Q932ProcRetrieveRejectTE,    Q932Umes_RetrieveReject,    Q932Pmes_RetrieveReject);
+
+       /* Set up the IE encoder/decoder handle table.*/ 
+    Q931SetIEProc(Q931ie_SEGMENTED_MESSAGE,                i,Q931Pie_Segment,                  Q931Uie_Segment);
+    Q931SetIEProc(Q931ie_BEARER_CAPABILITY,                i,Q931Pie_BearerCap,                        Q931Uie_BearerCap);
+    Q931SetIEProc(Q931ie_CAUSE,                            i,Q931Pie_Cause,                            Q931Uie_Cause);
+    Q931SetIEProc(Q931ie_CALL_IDENTITY,                    i,Q931Pie_CallID,                   Q931Uie_CallID);
+    Q931SetIEProc(Q931ie_CALL_STATE,                       i,Q931Pie_CallState,                        Q931Uie_CallState);
+    Q931SetIEProc(Q931ie_CHANNEL_IDENTIFICATION,           i,Q931Pie_ChanID,                   Q931Uie_ChanID);
+    Q931SetIEProc(Q931ie_PROGRESS_INDICATOR,               i,Q931Pie_ProgInd,                  Q931Uie_ProgInd);
+    Q931SetIEProc(Q931ie_NETWORK_SPECIFIC_FACILITIES,      i,Q931Pie_NetFac,                   Q931Uie_NetFac);
+    Q931SetIEProc(Q931ie_NOTIFICATION_INDICATOR,           i,Q931Pie_NotifInd,                 Q931Uie_NotifInd);
+    Q931SetIEProc(Q931ie_DISPLAY,                          i,Q931Pie_Display,                  Q931Uie_Display);
+    Q931SetIEProc(Q931ie_DATETIME,                         i,Q931Pie_DateTime,                 Q931Uie_DateTime);
+    Q931SetIEProc(Q931ie_KEYPAD_FACILITY,                  i,Q931Pie_KeypadFac,                        Q931Uie_KeypadFac);
+    Q931SetIEProc(Q931ie_SIGNAL,                           i,Q931Pie_Signal,                   Q931Uie_Signal);
+    Q931SetIEProc(Q931ie_TRANSIT_DELAY_SELECTION_AND_IND,  i,Q931Pie_TransNetSel,              Q931Uie_TransNetSel);
+    Q931SetIEProc(Q931ie_CALLING_PARTY_NUMBER,             i,Q931Pie_CallingNum,               Q931Uie_CallingNum);
+    Q931SetIEProc(Q931ie_CALLING_PARTY_SUBADDRESS,         i,Q931Pie_CallingSub,               Q931Uie_CallingSub);
+    Q931SetIEProc(Q931ie_CALLED_PARTY_NUMBER,              i,Q931Pie_CalledNum,                        Q931Uie_CalledNum);
+    Q931SetIEProc(Q931ie_CALLED_PARTY_SUBADDRESS,          i,Q931Pie_CalledSub,                        Q931Uie_CalledSub);
+    Q931SetIEProc(Q931ie_TRANSIT_NETWORK_SELECTION,        i,Q931Pie_TransNetSel,              Q931Uie_TransNetSel);
+    Q931SetIEProc(Q931ie_RESTART_INDICATOR,                i,Q931Pie_RestartInd,               Q931Uie_RestartInd);
+    Q931SetIEProc(Q931ie_LOW_LAYER_COMPATIBILITY,          i,Q931Pie_LLComp,                   Q931Uie_LLComp);
+    Q931SetIEProc(Q931ie_HIGH_LAYER_COMPATIBILITY,         i,Q931Pie_HLComp,                   Q931Uie_HLComp);
+    Q931SetIEProc(Q931ie_USER_USER,                        i,Q931Pie_UserUser,                 Q931Uie_UserUser);
+
+       /* The following define a state machine. The point is that the Message  */
+       /* procs can when search this to find out if the message/state                  */
+       /* combination is legale. If not, the proc for unexpected message apply.*/
+
+       /* State 0 Idle */
+       Q931AddStateEntry(i,Q931_U0,    Q931mes_RESUME,                 2);
+       Q931AddStateEntry(i,Q931_U0,    Q931mes_SETUP,                  4);
+       Q931AddStateEntry(i,Q931_U0,    Q931mes_SETUP,                  2);
+       Q931AddStateEntry(i,Q931_U0,    Q931mes_STATUS,                 4);
+       Q931AddStateEntry(i,Q931_U0,    Q931mes_RELEASE,                4);
+       Q931AddStateEntry(i,Q931_U0,    Q931mes_RELEASE_COMPLETE,4);
+
+       /* State 1 Call Initiating */
+       Q931AddStateEntry(i,Q931_U1,    Q931mes_DISCONNECT,             2);
+       Q931AddStateEntry(i,Q931_U1,    Q931mes_SETUP_ACKNOWLEDGE,              4);
+       Q931AddStateEntry(i,Q931_U1,    Q931mes_RELEASE_COMPLETE,4);
+       Q931AddStateEntry(i,Q931_U1,    Q931mes_CALL_PROCEEDING,        4);
+       Q931AddStateEntry(i,Q931_U1,    Q931mes_ALERTING,               4);
+       Q931AddStateEntry(i,Q931_U1,    Q931mes_CONNECT,                4);
+
+       /* State 2 Overlap Sending */
+       Q931AddStateEntry(i,Q931_U2,    Q931mes_INFORMATION,    2);
+       Q931AddStateEntry(i,Q931_U2,    Q931mes_CALL_PROCEEDING,        4);
+       Q931AddStateEntry(i,Q931_U2,    Q931mes_ALERTING,               4);
+       Q931AddStateEntry(i,Q931_U2,    Q931mes_PROGRESS,               4);
+       Q931AddStateEntry(i,Q931_U2,    Q931mes_CONNECT,                4);
+       Q931AddStateEntry(i,Q931_U2,    Q931mes_RELEASE,                2);
+
+       /* State 3 Outgoing Call Proceeding */
+       Q931AddStateEntry(i,Q931_U3,    Q931mes_PROGRESS,               4);
+       Q931AddStateEntry(i,Q931_U3,    Q931mes_ALERTING,               4);
+       Q931AddStateEntry(i,Q931_U3,    Q931mes_CONNECT,                4);
+       Q931AddStateEntry(i,Q931_U3,    Q931mes_RELEASE,                2);
+
+       /* State 4 Call Delivered */
+       Q931AddStateEntry(i,Q931_U4,    Q931mes_CONNECT,                4);
+
+       /* State 6 Call Precent */
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_INFORMATION,    2);     
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_ALERTING,               2);     
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_CALL_PROCEEDING,2);     
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_CONNECT,                2);     
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_RELEASE_COMPLETE,2);    
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_RELEASE,                4);     
+       Q931AddStateEntry(i,Q931_U6,    Q931mes_DISCONNECT,             4);     
+
+       /* State 7 Call Received */
+       Q931AddStateEntry(i,Q931_U7,    Q931mes_CONNECT,                2);
+
+       /* State 8 Connect request */
+       Q931AddStateEntry(i,Q931_U8,    Q931mes_CONNECT_ACKNOWLEDGE,            4);
+
+       /* State 9 Incoming Call Proceeding */
+       Q931AddStateEntry(i,Q931_U9,    Q931mes_CONNECT,                2);
+       Q931AddStateEntry(i,Q931_U9,    Q931mes_ALERTING,               2);
+       Q931AddStateEntry(i,Q931_U9,    Q931mes_PROGRESS,               2);
+
+       /* State 10 Active */
+       Q931AddStateEntry(i,Q931_U10,   Q931mes_SUSPEND,                2);
+       Q931AddStateEntry(i,Q931_U10, Q931mes_NOTIFY,                   4);
+       Q931AddStateEntry(i,Q931_U10, Q931mes_NOTIFY,                   2);
+
+       /* State 11 Disconnect Request */
+       Q931AddStateEntry(i,Q931_U11,   Q931mes_RELEASE,                4);
+       Q931AddStateEntry(i,Q931_U11,   Q931mes_DISCONNECT,             4);
+       Q931AddStateEntry(i,Q931_U11,   Q931mes_NOTIFY,                 4);
+
+       /* State 12 Disconnect Ind */
+       Q931AddStateEntry(i,Q931_U12,   Q931mes_RELEASE,                4);
+       Q931AddStateEntry(i,Q931_U12, Q931mes_RELEASE,          2);
+
+       /* State 15 Suspend Request */
+       Q931AddStateEntry(i,Q931_U15,   Q931mes_SUSPEND_ACKNOWLEDGE,            4);
+       Q931AddStateEntry(i,Q931_U15,   Q931mes_SUSPEND_REJECT, 4);
+       Q931AddStateEntry(i,Q931_U15,   Q931mes_DISCONNECT,             4);
+       Q931AddStateEntry(i,Q931_U15,   Q931mes_RELEASE,                4);
+
+/* TODO
+       Q931AddStateEntry(i,Q931_U17,
+       Q931AddStateEntry(i,Q931_U19,
+       Q931AddStateEntry(i,Q931_U25,
+*/
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcAlertingTE
+
+*****************************************************************************/
+L3INT Q931ProcAlertingTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* Reset 4 sec timer. */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcCallProceedingTE
+
+*****************************************************************************/
+L3INT Q931ProcCallProceedingTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcConnectTE
+
+*****************************************************************************/
+L3INT Q931ProcConnectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcConnectAckTE
+
+*****************************************************************************/
+L3INT Q931ProcConnectAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcProgressTE
+
+*****************************************************************************/
+L3INT Q931ProcProgressTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSetupTE
+
+*****************************************************************************/
+L3INT Q931ProcSetupTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT rc=0;
+       Q931mes_Setup *pMes = (Q931mes_Setup *)&buf[Q931L4HeaderSpace];
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+
+    /* Reject SETUP on existing calls */
+    if(Q931GetCallState(pTrunk, pMes->CRV) != Q931_U0)
+    {
+        Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);
+        return Q931E_UNEXPECTED_MESSAGE;
+    }
+
+       /* outgoing call */
+    if(iFrom == 4)
+    {
+        ret = Q931CreateCRV(pTrunk, &callIndex);
+        if(ret)
+            return ret;
+        pMes->CRV = pTrunk->call[callIndex].CRV;
+
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+        if(ret)
+            return ret;
+
+        Q931StartTimer(pTrunk, callIndex, 303);
+
+        Q931SetState(pTrunk, callIndex, Q931_U1);
+    }
+       /* incoming call */
+    else 
+    {
+        /* Locate free CRV entry and store info */
+        ret = Q931AllocateCRV(pTrunk, pMes->CRV, &callIndex);
+        if(ret != Q931E_NO_ERROR)
+        {
+            /* Not possible to allocate CRV entry, so must reject call */
+
+            Q931Disconnect(pTrunk, iFrom, pMes->CRV, 42);
+
+            return ret;
+        }
+
+        /* Send setup indication to user */
+        ret = Q931Tx34(pTrunk,(L3UCHAR*)pMes,pMes->Size);
+        if(ret != Q931E_NO_ERROR)
+            return ret;
+               else
+               {
+                       /* Must be full queue, meaning we can't process the call */
+                       /* so we must disconnect */
+               Q931Disconnect(pTrunk, iFrom, pMes->CRV, 81);
+               return ret;
+               }
+#if 0
+               /* TODO: Unreachable code??? */
+        /* Set state U6 */
+        Q931SetState(pTrunk, callIndex, Q931_U6);
+
+        Q931StartTimer(pTrunk, callIndex, 303);
+#endif
+    }
+
+       return rc;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSetupAckTE
+
+  Description: Used to acknowedge a SETUP. Usually the first initial
+                               response recevide back used to buy some time. L4 sending this
+                               should only be passed on. L2 sending this means that we set
+                               a new timer (and pass it to L4).
+
+                               Note that ChanID (B Channel Assignment) might come here from
+                               NT side.
+
+*****************************************************************************/
+L3INT Q931ProcSetupAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+        Q931StartTimer(pTrunk, callIndex, 303);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcResumeTE
+
+*****************************************************************************/
+L3INT Q931ProcResumeTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    Q931mes_Resume * pMes = (Q931mes_Resume *)&buf[Q931L4HeaderSpace];
+    L3INT callIndex;
+    L3INT ret = Q931E_NO_ERROR;
+
+    if(Q931GetCallState(pTrunk,pMes->CRV) == Q931_U0 && iFrom == 4)
+    {
+        /* Call reference selection */
+        ret = Q931CreateCRV(pTrunk, &callIndex);
+        if(ret != Q931E_NO_ERROR)
+            return ret;
+        pMes->CRV = pTrunk->call[callIndex].CRV;
+
+        /* Send RESUME to network */
+        ret=Q931Tx32(pTrunk,buf, pMes->Size);
+        if(ret != Q931E_NO_ERROR)
+            return ret;
+
+        /* Start timer T318 */
+        Q931StartTimer(pTrunk, callIndex, 318);
+
+        /*set state U17 */
+        Q931SetState(pTrunk, callIndex, Q931_U17);
+    }
+    else
+    {
+        return Q931E_ILLEGAL_MESSAGE;
+    }
+    return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcResumeAckTE
+
+*****************************************************************************/
+L3INT Q931ProcResumeAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcResumeRejectTE
+
+*****************************************************************************/
+L3INT Q931ProcResumeRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSuspendTE
+
+*****************************************************************************/
+L3INT Q931ProcSuspendTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSuspendAckTE
+
+*****************************************************************************/
+L3INT Q931ProcSuspendAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSuspendRejectTE
+
+*****************************************************************************/
+L3INT Q931ProcSuspendRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcInformationTE
+
+*****************************************************************************/
+L3INT Q931ProcUserInformationTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcDisconnectTE
+
+*****************************************************************************/
+L3INT Q931ProcDisconnectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcReleaseTE
+
+*****************************************************************************/
+L3INT Q931ProcReleaseTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    Q931mes_Release *pMes = (Q931mes_Release *)&buf[Q931L4HeaderSpace];
+    L3INT state = Q931GetCallState(pTrunk, pMes->CRV);
+    L3INT ret = Q931E_NO_ERROR;
+    if(state == Q931_U0 && iFrom == 2)
+    {
+        ret = Q931ReleaseComplete(pTrunk, iFrom);
+    }
+    else
+    {
+        ret = Q931ProcUnexpectedMessage(pTrunk, buf, iFrom);
+    }
+
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcReleaseCompleteTE
+
+*****************************************************************************/
+L3INT Q931ProcReleaseCompleteTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    Q931mes_ReleaseComplete *pMes = (Q931mes_ReleaseComplete *)&buf[Q931L4HeaderSpace];
+    L3INT state = Q931GetCallState(pTrunk, pMes->CRV);
+    L3INT ret = Q931E_NO_ERROR;
+    if(state == Q931_U0 && iFrom == 2)
+    {
+        /* no action */
+    }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRestartTE
+
+*****************************************************************************/
+L3INT Q931ProcRestartTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRestartAckTE
+
+*****************************************************************************/
+L3INT Q931ProcRestartAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcCongestionControlTE
+
+*****************************************************************************/
+L3INT Q931ProcCongestionControlTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcInformationTE
+
+*****************************************************************************/
+L3INT Q931ProcInformationTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcNotifyTE
+
+*****************************************************************************/
+L3INT Q931ProcNotifyTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcStatusTE
+
+*****************************************************************************/
+L3INT Q931ProcStatusTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcStatusEnquiryTE
+
+*****************************************************************************/
+L3INT Q931ProcStatusEnquiryTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcSegmentTE
+
+*****************************************************************************/
+L3INT Q931ProcSegmentTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/****************************************************************************/
+/******************* Q.932 - Supplementary Services *************************/
+/****************************************************************************/
+
+/*****************************************************************************
+
+  Function:            Q932ProcRetrieveTE
+
+*****************************************************************************/
+L3INT Q932ProcFacilityTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRetrieveTE
+
+*****************************************************************************/
+L3INT Q932ProcHoldTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRetrieveTE
+
+*****************************************************************************/
+L3INT Q932ProcHoldAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRetrieveTE
+
+*****************************************************************************/
+L3INT Q932ProcHoldRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRegisterTE
+
+*****************************************************************************/
+L3INT Q932ProcRegisterTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q932ProcRetrieveTE
+
+*****************************************************************************/
+L3INT Q932ProcRetrieveTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRetrieveAckTE
+
+*****************************************************************************/
+L3INT Q932ProcRetrieveAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
+/*****************************************************************************
+
+  Function:            Q931ProcRetrieveRejectTE
+
+*****************************************************************************/
+L3INT Q932ProcRetrieveRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * buf, L3INT iFrom)
+{
+    L3INT callIndex;
+    L3INT ret=Q931E_NO_ERROR;
+       Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
+
+       /* Find the call using CRV */
+       ret = Q931FindCRV(pTrunk, pMes->CRV, &callIndex);
+       if(ret != Q931E_NO_ERROR)
+               return ret;
+
+       /* TODO chack against state table for illegal or unexpected message here*/
+
+       /* TODO - Set correct timer here */
+    Q931StartTimer(pTrunk, callIndex, 303);
+       if(iFrom == 4)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx32(pTrunk,buf,pMes->Size);
+       }
+       else if (iFrom ==2)
+       {
+               /* TODO Add proc here*/
+        ret = Q931Tx34(pTrunk,buf,pMes->Size);
+       }
+       return ret;
+}
+
index f1da2c9aa01c7cb46090b56aa04e3438e5c74a33..e93b43193be3a40d332518d09e449c8f82cda822 100644 (file)
-/*****************************************************************************\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
-#if 0\r
-    case Q931mes_FACILITY           :\r
-               trampoline(Q931mes_Facility);\r
-        break;\r
-#endif\r
-\r
-    case Q931mes_INFORMATION          :\r
-               trampoline(Q931mes_Information);\r
-        break;\r
-\r
-    case Q931mes_NOTIFY               :\r
-               trampoline(Q931mes_Notify);\r
-        break;\r
-\r
-#if 0\r
-    case Q931mes_REGISTER           :\r
-               trampoline(Q931mes_Register);\r
-        break;\r
-#endif\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 = (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
-#if 0\r
-       pIE->ModeX25op          = 0;        /* Mode of operation X.25               */\r
-#endif\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
-       /* TODO:  Unhandled paramaters */\r
-       (void)pTrunk;\r
-       (void)b;\r
-       (void)iFrom;\r
-\r
-    return 0;\r
-}\r
-\r
-L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom)\r
-{\r
-       /* TODO:  Unhandled paramaters */\r
-       (void)pTrunk;\r
-       (void)b;\r
-       (void)iFrom;\r
-\r
-    return 0;\r
-}\r
-\r
-L3INT Q931Disconnect(Q931_TrunkInfo *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause)\r
-{\r
-       /* TODO:  Unhandled paramaters */\r
-       (void)pTrunk;\r
-       (void)iTo;\r
-       (void)iCRV;\r
-       (void)iCause;\r
-\r
-    return 0;\r
-}\r
-\r
-L3INT Q931ReleaseComplete(Q931_TrunkInfo *pTrunk, L3INT iTo)\r
-{\r
-       /* TODO:  Unhandled paramaters */\r
-       (void)pTrunk;\r
-       (void)iTo;\r
-\r
-       return 0;\r
-}\r
+/*****************************************************************************
+
+  FileName:            Q931api.c
+
+  Contents:            api (Application Programming Interface) functions.
+                               See     q931.h for description. 
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+#include "memory.h"
+
+/*
+L3INT Q931CreateMesIndex(L3INT mc)
+{
+    if(mc < 0 || mc > 127 )
+        return Q931E_INTERNAL;
+
+    if(Q931MesCount >127)
+        return Q931E_INTERNAL;
+
+    Q931MesIndex[mc] = Q931MesCount ++;
+
+    return Q931E_NO_ERROR;
+}
+*/
+/*
+L3INT Q931CreateIEIndex(L3INT iec)
+{
+    if(iec < 0 || iec > 127 )
+        return Q931E_INTERNAL;
+
+    if(Q931IECount > 127)
+        return Q931E_INTERNAL;
+
+    Q931IEIndex[iec] = Q931IECount ++;
+
+    return Q931E_NO_ERROR;
+}
+*/
+
+void Q931Api_InitTrunk(Q931_TrunkInfo *pTrunk)
+{
+       int y;
+    pTrunk->LastCRV            = 0;
+    pTrunk->Dialect            = 0;       
+    pTrunk->Enabled            = 0;
+    pTrunk->TrunkType  = Q931_TrType_E1;
+    pTrunk->NetUser            = Q931_TE;
+    pTrunk->TrunkState = 0;
+    for(y=0; y < Q931MAXCHPERTRUNK; y++)
+    {
+        pTrunk->ch[y].Available = 1;
+
+        /* Set up E1 scheme by default */
+        if(y==0)
+        {
+            pTrunk->ch[y].ChanType = Q931_ChType_Sync;
+        }
+        else if(y==16)
+        {
+            pTrunk->ch[y].ChanType = Q931_ChType_D;
+        }
+        else
+        {
+                       pTrunk->ch[y].ChanType = Q931_ChType_B;
+        }
+    }
+
+    for(y=0; y < Q931MAXCALLPERTRUNK; y++)
+    {
+        pTrunk->call[y].InUse = 0;
+
+    }
+}
+
+void Q931SetMesProc(L3UCHAR mes, L3UCHAR dialect, 
+                L3INT (*Q931ProcFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom),
+                L3INT (*Q931UmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size),
+                L3INT (*Q931PmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+)
+{
+    if(Q931ProcFunc != NULL)
+        Q931Proc[dialect][mes] = Q931ProcFunc;
+    if(Q931UmesFunc != NULL)
+        Q931Umes[dialect][mes] = Q931UmesFunc;
+    if(Q931PmesFunc != NULL)
+        Q931Pmes[dialect][mes] = Q931PmesFunc;
+}
+
+void Q931SetIEProc(L3UCHAR iec, L3UCHAR dialect, 
+                          L3INT (*Q931PieProc)(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet),
+                          L3INT (*Q931UieProc)(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) 
+)
+{
+    if(Q931PieProc != NULL)
+        Q931Pie[dialect][iec] = Q931PieProc;
+    if(Q931UieProc != NULL)
+        Q931Uie[dialect][iec] = Q931UieProc;
+}
+
+#define trampoline(x) {x * t = (x *)pm; s = &t->buf[0];}
+
+/*****************************************************************************
+
+  Function:            Q931GetIEBuf
+
+  Description: Return a ptr to the buf used for IE in the message.
+
+*****************************************************************************/
+L3UCHAR * Q931GetIEBuf(L3UCHAR *pm)
+{
+       L3UCHAR * s=NULL;
+       Q931mes_Alerting * pMes= (Q931mes_Alerting *)pm;
+       switch(pMes->MesType)
+       {
+    case Q931mes_ALERTING             :
+               trampoline(Q931mes_Alerting);
+        break;
+
+    case Q931mes_CALL_PROCEEDING      :
+               trampoline(Q931mes_CallProceeding);
+        break;
+
+    case Q931mes_CONNECT              :      
+               trampoline(Q931mes_Connect);
+        break;
+
+    case Q931mes_CONNECT_ACKNOWLEDGE  :
+               trampoline(Q931mes_ConnectAck);
+        break;
+
+    case Q931mes_PROGRESS             :
+               trampoline(Q931mes_Progress);
+        break;
+
+    case Q931mes_SETUP                :
+               trampoline(Q931mes_Setup);
+        break;
+
+    case Q931mes_SETUP_ACKNOWLEDGE    :
+               trampoline(Q931mes_SetupAck);
+        break;
+
+    case Q931mes_RESUME               :
+               trampoline(Q931mes_Resume);
+        break;
+
+    case Q931mes_RESUME_ACKNOWLEDGE   :
+               trampoline(Q931mes_ResumeAck);
+        break;
+
+    case Q931mes_RESUME_REJECT        :
+               trampoline(Q931mes_ResumeReject);
+        break;
+
+    case Q932mes_RETRIEVE             :
+               trampoline(Q932mes_Retrieve);
+        break;
+
+    case Q932mes_RETRIEVE_ACKNOWLEDGE :
+               trampoline(Q932mes_RetrieveAck);
+        break;
+
+    case Q932mes_RETRIEVE_REJECT      :
+               trampoline(Q932mes_RetrieveReject);
+        break;
+
+    case Q931mes_SUSPEND              :
+               trampoline(Q931mes_Suspend);
+        break;
+
+    case Q931mes_SUSPEND_ACKNOWLEDGE  :
+               trampoline(Q931mes_SuspendAck);
+        break;
+
+    case Q931mes_SUSPEND_REJECT       :
+               trampoline(Q931mes_SuspendReject);
+        break;
+
+    case Q931mes_USER_INFORMATION     :
+               trampoline(Q931mes_UserInformation);
+        break;
+
+    case Q931mes_DISCONNECT           :
+               trampoline(Q931mes_Disconnect);
+        break;
+
+    case Q931mes_RELEASE              :
+               trampoline(Q931mes_Release);
+        break;
+
+    case Q931mes_RELEASE_COMPLETE     :
+               trampoline(Q931mes_ReleaseComplete);
+        break;
+
+    case Q931mes_RESTART              :
+               trampoline(Q931mes_Restart);
+        break;
+
+    case Q931mes_RESTART_ACKNOWLEDGE  :
+               trampoline(Q931mes_RestartAck);
+        break;
+
+    case Q931mes_CONGESTION_CONTROL   :
+               trampoline(Q931mes_CongestionControl);
+        break;
+#if 0
+    case Q931mes_FACILITY           :
+               trampoline(Q931mes_Facility);
+        break;
+#endif
+
+    case Q931mes_INFORMATION          :
+               trampoline(Q931mes_Information);
+        break;
+
+    case Q931mes_NOTIFY               :
+               trampoline(Q931mes_Notify);
+        break;
+
+#if 0
+    case Q931mes_REGISTER           :
+               trampoline(Q931mes_Register);
+        break;
+#endif
+
+    case Q931mes_STATUS               :
+               trampoline(Q931mes_Status);
+        break;
+
+    case Q931mes_STATUS_ENQUIRY       :
+               trampoline(Q931mes_StatusEnquiry);
+        break;
+
+    case Q931mes_SEGMENT              :
+               trampoline(Q931mes_Segment);
+        break;
+
+    default:
+               s = 0;
+        break;
+    }
+
+       return s;
+}
+
+L3INT Q931GetMesSize(L3UCHAR *pMes)
+{
+       
+    L3UCHAR *p = Q931GetIEBuf(pMes);
+    L3INT Size = (L3INT)(p - pMes);
+    return Size;
+}
+
+/*****************************************************************************
+
+  Function:     q931AppendIE    
+
+  Description:  Append IE to the message.
+
+  Parameters:   pm      Ptr to message.
+                pi      Ptr to information element
+
+  Return Value  ie setting
+
+*****************************************************************************/
+
+ie Q931AppendIE( L3UCHAR *pm, L3UCHAR *pi)
+{
+       ie IE = 0;
+       Q931mes_Alerting * pMes= (Q931mes_Alerting *)pm;
+       Q931ie_BearerCap * pIE= (Q931ie_BearerCap *)pi;
+       L3INT iISize = pIE->Size;
+
+       L3UCHAR *pBuf = Q931GetIEBuf(pm);
+       L3INT Off = pMes->Size - (pBuf - pm);
+       IE = (ie)(Off | 0x8000);
+
+       memcpy(&pm[pMes->Size], pi, iISize);
+
+       pMes->Size += iISize;
+
+       return IE;
+}
+
+/*****************************************************************************
+*****************************************************************************/
+L3INT Q931GetUniqueCRV(Q931_TrunkInfo *pTrunk)
+{
+       static L3INT crv={1};
+       return crv++;
+}
+
+L3INT Q931InitMesSetup(Q931mes_Setup *pMes)
+{
+       pMes->ProtDisc          = 0x80;
+       pMes->CRV                       = 0;            /* CRV to be allocated, might be receive*/
+       pMes->MesType           = Q931mes_SETUP;
+
+       pMes->Size                      = Q931GetMesSize((L3UCHAR*)pMes);
+
+    pMes->SendComplete =0;                     /* Sending Complete                     */
+    pMes->RepeatInd            =0;                     /* Repeat Indicator                     */
+    pMes->BearerCap            =0;                     /* Bearer Capability                    */
+    pMes->ChanID               =0;         /* Channel ID                           */
+    pMes->ProgInd              =0;                     /* Progress Indicator                   */
+    pMes->NetFac               =0;         /* Network-specific facilities          */
+    pMes->Display              =0;                     /* Display                              */
+    pMes->DateTime             =0;                     /* Date/Time                            */
+    pMes->KeypadFac            =0;                     /* Keypad Facility                      */
+    pMes->Signal               =0;         /* Signal                               */
+    pMes->CallingNum   =0;                     /* Calling party number                 */
+    pMes->CallingSub   =0;                     /* Calling party sub address            */
+    pMes->CalledNum            =0;                     /* Called party number                  */
+    pMes->CalledSub            =0;                     /* Called party sub address             */
+    pMes->TransNetSel  =0;                     /* Transit network selection            */
+    pMes->LLRepeatInd  =0;                     /* Repeat Indicator 2 LLComp            */
+    pMes->LLComp               =0;         /* Low layer compatibility              */
+    pMes->HLComp               =0;         /* High layer compatibility             */
+
+       return 0;
+}
+
+L3INT Q931InitMesResume(Q931mes_Resume * pMes)
+{
+       pMes->ProtDisc          = 0x80;
+       pMes->CRV                       = 0;            /* CRV to be allocated, might be receive*/
+       pMes->MesType           = Q931mes_RESUME;
+
+       pMes->Size                      = Q931GetMesSize((L3UCHAR*)pMes);
+    pMes->CallID        = 0;        /* Channel Identification               */
+       return 0;
+}
+
+L3INT Q931InitIEBearerCap(Q931ie_BearerCap *pIE)
+{
+       pIE->IEId                       = Q931ie_BEARER_CAPABILITY;
+       pIE->Size                       = sizeof(Q931ie_BearerCap);
+       pIE->CodStand           = 0;
+       pIE->ITC                        = 0;
+       pIE->TransMode          = 0;
+       pIE->ITR                        = 0x10;
+       pIE->RateMul            = 0;
+
+       pIE->Layer1Ident        = 0;
+       pIE->UIL1Prot           = 0;        /* User Information Layer 1 Protocol    */
+       pIE->SyncAsync          = 0;        /* Sync/Async                           */
+       pIE->Negot                      = 0;                
+       pIE->UserRate           = 0;
+       pIE->InterRate          = 0;        /* Intermediate Rate                    */
+       pIE->NIConTx            = 0;
+       pIE->NIConRx            = 0;
+       pIE->FlowCtlTx          = 0;        /* Flow control on Tx                   */
+       pIE->FlowCtlRx          = 0;        /* Flow control on Rx                   */
+       pIE->HDR                        = 0;
+       pIE->MultiFrame         = 0;        /* Multi frame support                  */
+       pIE->Mode                       = 0;
+       pIE->LLInegot           = 0;
+       pIE->Assignor           = 0;        /* Assignor/assignee                    */
+       pIE->InBandNeg          = 0;        /* In-band/out-band negot.              */
+       pIE->NumStopBits        = 0;        /* Number of stop bits                  */
+       pIE->NumDataBits        = 0;        /* Number of data bits.                 */
+       pIE->Parity                     = 0;
+       pIE->DuplexMode         = 0;
+       pIE->ModemType          = 0;
+       pIE->Layer2Ident        = 0;
+       pIE->UIL2Prot           = 0;        /* User Information Layer 2 Protocol    */
+       pIE->Layer3Ident        = 0;           
+       pIE->UIL3Prot           = 0;        /* User Information Layer 3 Protocol    */
+       pIE->AL3Info1           = 0;
+       pIE->AL3Info2           = 0;
+
+       return 0;
+}
+
+L3INT Q931InitIEChanID(Q931ie_ChanID *pIE)
+{
+       pIE->IEId                       = Q931ie_CHANNEL_IDENTIFICATION;
+       pIE->Size                       = sizeof(Q931ie_ChanID);
+       pIE->IntIDPresent       = 0;        /* Int. id. present                     */
+       pIE->IntType            = 0;        /* Int. type                            */
+       pIE->PrefExcl           = 0;        /* Pref./Excl.                          */
+       pIE->DChanInd           = 0;        /* D-channel ind.                       */
+       pIE->InfoChanSel        = 0;        /* Info. channel selection              */
+       pIE->InterfaceID        = 0;        /* Interface identifier                 */
+       pIE->CodStand           = 0;            /* Code standard                        */
+       pIE->NumMap                     = 0;        /* Number/Map                           */
+       pIE->ChanMapType        = 0;        /* Channel type/Map element type        */
+       pIE->ChanSlot           = 0;        /* Channel number/Slot map              */
+
+       return 0;
+}
+
+L3INT Q931InitIEProgInd(Q931ie_ProgInd * pIE)
+{
+       pIE->IEId                       = Q931ie_PROGRESS_INDICATOR;
+       pIE->Size                       = sizeof(Q931ie_ProgInd);
+       pIE->CodStand           = 0;        /* Coding standard                      */
+       pIE->Location           = 0;        /* Location                             */
+       pIE->ProgDesc           = 0;        /* Progress description                 */
+
+       return 0;
+}
+
+L3INT Q931InitIENetFac(Q931ie_NetFac * pIE)
+{
+       pIE->IEId                       = Q931ie_NETWORK_SPECIFIC_FACILITIES;
+       pIE->Size                       = sizeof(Q931ie_NetFac);
+       pIE->LenNetID           = 0;        /* Length of network facilities id.     */
+       pIE->TypeNetID          = 0;        /* Type of network identification       */
+       pIE->NetIDPlan          = 0;        /* Network identification plan.         */
+       pIE->NetFac                     = 0;        /* Network specific facility spec.      */
+       pIE->NetID[0]           = 0;
+       return 0;
+}
+
+L3INT Q931InitIEDisplay(Q931ie_Display * pIE)
+{
+       pIE->IEId                       = Q931ie_DISPLAY;
+       pIE->Size                       = sizeof(Q931ie_Display);
+       pIE->Display[0]         = 0;
+       return 0;
+}
+
+L3INT Q931InitIEDateTime(Q931ie_DateTime * pIE)
+{
+       pIE->IEId                       = Q931ie_DATETIME;
+       pIE->Size                       = sizeof(Q931ie_DateTime);
+       pIE->Year                       = 0;        /* Year                                 */
+       pIE->Month                      = 0;        /* Month                                */
+       pIE->Day                        = 0;        /* Day                                  */
+       pIE->Hour                       = 0;        /* Hour                                 */
+       pIE->Minute                     = 0;        /* Minute                               */
+       pIE->Second                     = 0;        /* Second                               */
+
+       return 0;
+}
+
+L3INT Q931InitIEKeypadFac(Q931ie_KeypadFac * pIE)
+{
+       pIE->IEId                       = Q931ie_KEYPAD_FACILITY;
+       pIE->Size                       = sizeof(Q931ie_KeypadFac);
+       pIE->KeypadFac[0]       = 0;
+       return 0;
+}
+
+L3INT Q931InitIESignal(Q931ie_Signal * pIE)
+{
+       pIE->IEId                       = Q931ie_SIGNAL;
+       pIE->Size                       = sizeof(Q931ie_Signal);
+       pIE->Signal                     = 0;
+       return 0;
+}
+
+L3INT Q931InitIECallingNum(Q931ie_CallingNum * pIE)
+{
+       pIE->IEId                       = Q931ie_CALLING_PARTY_NUMBER;
+       pIE->Size                       = sizeof(Q931ie_CallingNum);
+       pIE->TypNum                     = 0;        /* Type of number                       */
+       pIE->NumPlanID          = 0;        /* Numbering plan identification        */
+       pIE->PresInd            = 0;        /* Presentation indicator               */
+       pIE->ScreenInd          = 0;        /* Screening indicator                  */
+       pIE->Digit[0]           = 0;        /* Number digits (IA5)                  */
+
+       return 0;
+}
+
+L3INT Q931InitIECallingSub(Q931ie_CallingSub * pIE)
+{
+       pIE->IEId                       = Q931ie_CALLING_PARTY_SUBADDRESS;
+       pIE->Size                       = sizeof(Q931ie_CallingSub);
+       pIE->TypNum                     = 0;        /* Type of subaddress                   */
+       pIE->OddEvenInd         = 0;        /* Odd/Even indicator                   */
+       pIE->Digit[0]           = 0;        /* Digits                               */
+
+       return 0;
+}
+
+L3INT Q931InitIECalledNum(Q931ie_CalledNum * pIE)
+{
+       pIE->IEId                       = Q931ie_CALLED_PARTY_NUMBER;
+       pIE->Size                       = sizeof(Q931ie_CalledNum);
+       pIE->TypNum                     = 0;        /* Type of Number                       */
+       pIE->NumPlanID          = 0;        /* Numbering plan identification        */
+       pIE->Digit[0]           = 0;        /* Digit (IA5)                          */
+
+       return 0;
+}
+
+L3INT Q931InitIECalledSub(Q931ie_CalledSub * pIE)
+{
+       pIE->IEId                       = Q931ie_CALLED_PARTY_SUBADDRESS;
+       pIE->Size                       = sizeof(Q931ie_CalledSub);
+       pIE->TypNum                     = 0;        /* Type of subaddress                   */
+       pIE->OddEvenInd         = 0;        /* Odd/Even indicator                   */
+       pIE->Digit[0]           = 0;        /* Digits                               */
+
+       return 0;
+}
+
+L3INT Q931InitIETransNetSel(Q931ie_TransNetSel * pIE)
+{
+       pIE->IEId                       = Q931ie_TRANSIT_NETWORK_SELECTION;
+       pIE->Size                       = sizeof(Q931ie_TransNetSel);
+       pIE->Type                       = 0;        /* Type of network identifier           */
+       pIE->NetIDPlan          = 0;        /* Network idetification plan           */
+       pIE->NetID[0]           = 0;        /* Network identification(IA5)          */
+
+       return 0;
+}
+
+L3INT Q931InitIELLComp(Q931ie_LLComp * pIE)
+{
+       pIE->IEId                       = Q931ie_LOW_LAYER_COMPATIBILITY;
+       pIE->Size                       = sizeof(Q931ie_LLComp);
+
+       pIE->CodStand           = 0;        /* Coding standard                      */
+       pIE->ITransCap          = 0;        /* Information transfer capability      */
+       pIE->NegotInd           = 0;        /* Negot indic.                         */
+       pIE->TransMode          = 0;        /* Transfer Mode                        */
+       pIE->InfoRate           = 0;        /* Information transfer rate            */
+       pIE->RateMul            = 0;        /* Rate multiplier                      */
+       pIE->Layer1Ident        = 0;        /* Layer 1 ident.                       */
+       pIE->UIL1Prot           = 0;        /* User information layer 1 protocol    */
+       pIE->SyncAsync          = 0;        /* Synch/asynch                         */
+       pIE->Negot                      = 0;        /* Negot                                */
+       pIE->UserRate           = 0;        /* User rate                            */
+       pIE->InterRate          = 0;        /* Intermediate rate                    */
+       pIE->NIConTx            = 0;        /* NIC on Tx                            */
+       pIE->NIConRx            = 0;        /* NIC on Rx                            */
+       pIE->FlowCtlTx          = 0;        /* Flow control on Tx                   */
+       pIE->FlowCtlRx          = 0;        /* Flow control on Rx                   */
+       pIE->HDR                        = 0;        /* Hdr/no hdr                           */
+       pIE->MultiFrame         = 0;        /* Multiframe                           */
+       pIE->ModeL1                     = 0;            /* Mode L1                                                              */
+       pIE->NegotLLI           = 0;        /* Negot. LLI                           */
+       pIE->Assignor           = 0;        /* Assignor/Assignor ee                 */
+       pIE->InBandNeg          = 0;        /* In-band negot.                       */
+       pIE->NumStopBits        = 0;        /* Number of stop bits                  */
+       pIE->NumDataBits        = 0;        /* Number of data bits                  */
+       pIE->Parity                     = 0;        /* Parity                               */
+       pIE->DuplexMode         = 0;        /* Duplex Mode                          */
+       pIE->ModemType          = 0;        /* Modem type                           */
+       pIE->Layer2Ident        = 0;        /* Layer 2 ident.                       */
+       pIE->UIL2Prot           = 0;        /* User information layer 2 protocol    */
+       pIE->ModeL2                     = 0;        /* ModeL2                               */
+       pIE->Q933use            = 0;        /* Q.9333 use                           */
+       pIE->UsrSpcL2Prot       = 0;        /* User specified layer 2 protocol info */
+       pIE->WindowSize         = 0;        /* Window size (k)                      */
+       pIE->Layer3Ident        = 0;        /* Layer 3 ident                        */
+       pIE->OptL3Info          = 0;        /* Optional layer 3 protocol info.      */
+       pIE->ModeL3                     = 0;        /* Mode of operation                    */
+#if 0
+       pIE->ModeX25op          = 0;        /* Mode of operation X.25               */
+#endif
+       pIE->DefPackSize        = 0;        /* Default packet size                  */
+       pIE->PackWinSize        = 0;        /* Packet window size                   */
+       pIE->AddL3Info          = 0;        /* Additional Layer 3 protocol info     */
+
+       return 0;
+}
+
+L3INT Q931InitIEHLComp(Q931ie_HLComp * pIE)
+{
+       pIE->IEId                       = Q931ie_HIGH_LAYER_COMPATIBILITY;
+       pIE->Size                       = sizeof(Q931ie_HLComp);
+
+       return 0;
+}
+
+L3INT Q931ProcUnknownMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom)
+{
+       /* TODO:  Unhandled paramaters */
+       (void)pTrunk;
+       (void)b;
+       (void)iFrom;
+
+    return 0;
+}
+
+L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom)
+{
+       /* TODO:  Unhandled paramaters */
+       (void)pTrunk;
+       (void)b;
+       (void)iFrom;
+
+    return 0;
+}
+
+L3INT Q931Disconnect(Q931_TrunkInfo *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause)
+{
+       /* TODO:  Unhandled paramaters */
+       (void)pTrunk;
+       (void)iTo;
+       (void)iCRV;
+       (void)iCause;
+
+    return 0;
+}
+
+L3INT Q931ReleaseComplete(Q931_TrunkInfo *pTrunk, L3INT iTo)
+{
+       /* TODO:  Unhandled paramaters */
+       (void)pTrunk;
+       (void)iTo;
+
+       return 0;
+}
index 642783e75c8e34235b60fa99535e21c496156429..15e93bfee83712c6d02533ec4dc5d584bdd4cf47 100644 (file)
-/*****************************************************************************\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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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] = (L3UCHAR)((*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] = (L3UCHAR)((*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 = CRV + IBuf[Octet+1];\r
-        Octet += 2;\r
-    }\r
-    else\r
-    {\r
-               /* Long CRV is not used, so we skip this */\r
-               /* TODO: is it right to set to 0 here? */\r
-               CRV = 0;\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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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] = (L3UCHAR)((*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] = (L3UCHAR)((*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] = (L3UCHAR)((*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] = (L3UCHAR)((*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
-\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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*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 = (L3UCHAR)(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] = (L3UCHAR)((*Octet)-Beg);\r
-    return rc;\r
-}\r
-\r
+/*****************************************************************************
+
+  FileName:     Q931ie.c
+
+  Contents:     Information Element Pack/Unpack functions. 
+  
+                These functions will pack out a Q931 message from the bit 
+                packed original format into structs that are easier to process 
+                and pack the same structs back into bit fields when sending
+                messages out.
+
+                The messages contains a short for each possible IE. The MSB 
+                bit flags the precense of an IE, while the remaining bits 
+                are the offset into a buffer to find the actual IE.
+
+                Each IE are supported by 3 functions:
+
+                Q931Pie_XXX     Pack struct into Q.931 IE
+                Q931Uie_XXX     Unpack Q.931 IE into struct
+                Q931InitIEXXX   Initialize IE (see Q931api.c).
+
+  Dialect Note: This file will only contain standard DSS1 IE. Other IE as 
+                used in QSIG, NI2, Q.932 etc are located in separate files.
+
+                               See     q931.h for description. 
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+/*****************************************************************************
+
+  Macro:        Q931MoreIE
+
+  Description:  Local helper macro detecting if there is more IE space left
+                based on the 3 standard parameters Octet, Off and IESpace.
+                This can be used to test if the IE is completed to avoid
+                that the header of the next IE is interpreted as a part of
+                the current IE.
+
+*****************************************************************************/
+#define Q931MoreIE() (Octet+Off - 2 < IESize)
+
+#define Q931IESizeTest(x)   {\
+                            if(Octet+Off-2 != IESize)\
+                            {\
+                                Q931SetError(pTrunk,x, Octet, Off);\
+                                return x;\
+                            }\
+                            }
+
+/*****************************************************************************
+
+  Function:     Q931ReadExt
+
+  Description:  Many of the octets in the standard have an MSB 'ext.1'. This
+                means that the octet usually is the latest octet, but that a
+                futhure standard may extend the octet. A stack must be able 
+                to handle such extensions by skipping the extension octets.
+
+                This function will increase the offset counter with 1 for 
+                each octet with an MSB of zero. This will allow the stack to
+                skip extensions wihout knowing anything about them.
+
+  Parameters:   IBuf    ptr to octet array.
+                Off     Starting offset counter
+
+  Return Value: New offset value.
+
+*****************************************************************************/
+
+L3INT Q931ReadExt(L3UCHAR * IBuf, L3INT Off)
+{
+    L3INT c =0;
+    while((IBuf[c] & 0x80) == 0)
+        c++;
+
+    return Off + c;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_BearerCap
+
+  Description:  Unpack a bearer capability ie.
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+
+L3INT Q931Uie_BearerCap(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) 
+{
+    Q931ie_BearerCap * pie = (Q931ie_BearerCap*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->CodStand    = ieGetOctet((IBuf[Octet] & 0x60) >> 5);
+    pie->ITC         = ieGetOctet(IBuf[Octet] & 0x1f);
+    Off = Q931ReadExt(&IBuf[Octet], Off);
+    Octet++;
+
+    /* Octet 4 */
+    pie->TransMode   = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);
+    pie->ITR         = ieGetOctet(IBuf[Octet+Off] & 0x1f);
+    Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+    Octet++;
+
+    /* Octet 4.1. Rate multiplier is only present if ITR = Multirate        */
+    if(pie->ITR == 0x18)
+    {
+        pie->RateMul = ieGetOctet(IBuf[Octet+Off] & 0x7f);
+        Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+        Off ++;
+    }
+
+    /* Octet 5 */
+    if((IBuf[Octet+Off] & 0x60) == 0x20 && Q931MoreIE())
+    {
+        pie->Layer1Ident = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);
+        pie->UIL1Prot    = ieGetOctet(IBuf[Octet+Off] & 0x1f);
+        Octet++;
+
+        /* Octet 5a. The octet may be present if ITC is unrestrictd digital info*/
+        /* and UIL1Prot is either V.110, I.460 and X.30 or V.120. It may also   */
+        /* be present if ITC = 3.1 kHz audio and UIL1Prot is G.711.             */
+        /* Bit 8 of Octet 5 = 0 indicates that 5a is present.                   */
+
+        if(IsQ931Ext(IBuf[Octet+Off-1]))
+        {
+            if(((pie->ITC == 0x08) && (pie->UIL1Prot == 0x01 || pie->UIL1Prot == 0x08))
+            || ((pie->ITC == 0x10) && (pie->UIL1Prot == 0x02 || pie->UIL1Prot == 0x03)))
+            {
+                pie->SyncAsync   = ieGetOctet((IBuf[Octet+Off] & 0x40) >> 6);
+                pie->Negot       = ieGetOctet((IBuf[Octet+Off] & 0x20) >> 5);
+                pie->UserRate    = ieGetOctet(IBuf[Octet+Off] & 0x1f);
+                Off ++;
+            }
+            else
+            {
+                /* We have detected bit 8 = 0, but no setting that require the  */
+                /* additional octets ???                                        */
+                Q931SetError(pTrunk, Q931E_BEARERCAP, 5,Off);
+                return Q931E_BEARERCAP;
+            }
+
+            /* Octet 5b. Two different structures used.                         */
+            if(IsQ931Ext(IBuf[Octet+Off-1]))
+            {
+                if(pie->UIL1Prot == 0x01) /* ITU V.110, I.460 and X.30           */
+                {
+                    pie->InterRate   = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);
+                    pie->NIConTx     = ieGetOctet((IBuf[Octet+Off] & 0x10) >> 4);
+                    pie->NIConRx     = ieGetOctet((IBuf[Octet+Off] & 0x08) >> 3);
+                    pie->FlowCtlTx   = ieGetOctet((IBuf[Octet+Off] & 0x04) >> 2);
+                    pie->FlowCtlRx   = ieGetOctet((IBuf[Octet+Off] & 0x20) >> 1);
+                    Off++;
+                }
+                else if(pie->UIL1Prot == 0x08) /* ITU V.120                      */
+                {
+                    pie->HDR         = ieGetOctet((IBuf[Octet+Off] & 0x40) >> 6);
+                    pie->MultiFrame  = ieGetOctet((IBuf[Octet+Off] & 0x20) >> 5);
+                    pie->Mode        = ieGetOctet((IBuf[Octet+Off] & 0x10) >> 4);
+                    pie->LLInegot    = ieGetOctet((IBuf[Octet+Off] & 0x08) >> 3);
+                    pie->Assignor    = ieGetOctet((IBuf[Octet+Off] & 0x04) >> 2);
+                    pie->InBandNeg   = ieGetOctet((IBuf[Octet+Off] & 0x02) >> 1);
+                    Off++;
+                }
+                else
+                {
+                    Q931SetError(pTrunk,Q931E_BEARERCAP, 5,Off);
+                    return Q931E_BEARERCAP;
+
+                }
+
+                /* Octet 5c */
+                if(IsQ931Ext(IBuf[Octet+Off-1]))
+                {
+
+                    pie->NumStopBits = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);
+                    pie->NumDataBits = ieGetOctet((IBuf[Octet+Off] & 0x18) >> 3);
+                    pie->Parity      = ieGetOctet(IBuf[Octet+Off] & 0x07);
+                    Off++;
+
+                    /* Octet 5d */
+                    if(IsQ931Ext(IBuf[Octet+Off-1]))
+                    {
+
+                        pie->DuplexMode  = ieGetOctet((IBuf[Octet+Off] & 0x40) >> 6);
+                        pie->ModemType   = ieGetOctet(IBuf[Octet+Off] & 0x3f);
+                        Off ++;
+                    }
+                }
+            }
+        }
+    }
+
+    /* Octet 6 */
+    if((IBuf[Octet+Off] & 0x60) == 0x40 && Q931MoreIE())
+    {
+        pie->Layer2Ident = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);
+        pie->UIL2Prot    = ieGetOctet(IBuf[Octet+Off] & 0x1f);
+
+        Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+        Octet ++;
+    }
+
+    /* Octet 7 */
+    if((IBuf[Octet+Off] & 0x60) == 0x60 && Q931MoreIE()) 
+    {
+        pie->Layer3Ident = ieGetOctet((IBuf[Octet+Off] & 0x60) >> 5);
+        pie->UIL3Prot    = ieGetOctet(IBuf[Octet+Off] & 0x1f);
+        Octet++;
+
+        /* Octet 7a */
+        if(IsQ931Ext(IBuf[Octet+Off-1]))
+        {
+            if(pie->UIL3Prot == 0x0c)
+            {
+                pie->AL3Info1 = ieGetOctet(IBuf[Octet+Off] & 0x0f);
+                Off++;
+
+                /* Octet 7b */
+                if(IsQ931Ext(IBuf[Octet+Off]))
+                {
+                    pie->AL3Info2 = ieGetOctet(IBuf[Octet+Off] & 0x0f);
+                    Off++;
+                }
+            }
+            else
+            {
+                Q931SetError(pTrunk,Q931E_BEARERCAP, 7, Off);
+                return Q931E_BEARERCAP;
+
+            }
+        }
+    }
+
+    Q931IESizeTest(Q931E_BEARERCAP);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_BearerCap);
+    pie->Size = sizeof(Q931ie_BearerCap);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_BearerCap
+
+  Description:  Packing a Q.931 Bearer Capability element from a generic 
+                struct into a packed octet structure in accordance with the
+                standard.
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+
+L3INT Q931Pie_BearerCap(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_BearerCap * pIE = (Q931ie_BearerCap*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;/* remember current offset */
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_BEARER_CAPABILITY ;
+    li=(*Octet)++;    /* remember length position */
+
+    /* Octet 3 - Coding standard / Information transfer capability */
+    OBuf[(*Octet)++] = 0x80 | (pIE->CodStand<<5) | (pIE->ITR & 0x1f);
+
+    /* Octet 4 - Transfer mode / Information transfer rate */
+    if(pIE->ITR == 0x18)
+    {
+        OBuf[(*Octet)++] = 0x80 | (pIE->TransMode<<5) | (pIE->ITR & 0x1f);
+    }
+    else
+    {
+        OBuf[(*Octet)++] = 0x00 | (pIE->TransMode<<5) | (pIE->ITR & 0x1f);
+
+        /* Octet 4.1 - Rate Multiplier */
+        OBuf[(*Octet)++] = 0x80 | pIE->RateMul;
+    }
+
+    /* Octet 5 - Layer 1 Ident / User information layer 1 protocol*/
+    if(pIE->Layer1Ident == 0x01)
+    {
+        if(((pIE->ITC == 0x08) && (pIE->UIL1Prot == 0x01 || pIE->UIL1Prot == 0x08))
+        || ((pIE->ITC == 0x10) && (pIE->UIL1Prot == 0x02 || pIE->UIL1Prot == 0x03)))
+        {
+            OBuf[(*Octet)++] = 0x00 | (pIE->Layer1Ident<<5) | (pIE->UIL1Prot & 0x15);
+            
+            /* Octet 5a - SyncAsync/Negot/UserRate */
+            OBuf[(*Octet)++] = 0x00 | (pIE->SyncAsync<<6) | (pIE->Negot<<5) | (pIE->UserRate&0x1f);
+
+            /* Octet 5b - one of two types */
+            if(pIE->UIL1Prot == 0x01) /* ITU V.110, I.460 and X.30           */
+            {
+                /* Octet 5b - Intermed rate/ Nic on Tx/Nix on Rx/FlowCtlTx/FlowCtlRx */
+                OBuf[(*Octet)++] = 0x00 
+                                | (pIE->InterRate<<6)
+                                | (pIE->NIConTx << 4)
+                                | (pIE->NIConRx << 3)
+                                | (pIE->FlowCtlTx << 2)
+                                | (pIE->FlowCtlRx << 1);
+            }
+            else if(pIE->UIL1Prot == 0x08) /* ITU V.120                      */
+            {
+                /* Octet 5b - HDR/Multiframe/Mode/LLINegot/Assignor/Inbandneg*/
+                OBuf[(*Octet)++] = 0x00
+                                | (pIE->InterRate << 6)
+                                | (pIE->MultiFrame << 5)
+                                | (pIE->Mode << 4)
+                                | (pIE->LLInegot << 3)
+                                | (pIE->Assignor << 2)
+                                | (pIE->InBandNeg << 1);
+            }
+
+            /* Octet 5c - NumStopBits/NumStartBits/Parity                    */
+            OBuf[(*Octet)++] = 0x00 
+                            | (pIE->NumStopBits << 5 )
+                            | (pIE->NumDataBits << 3 )
+                            | (pIE->Parity);
+
+            /* Octet 5d - Duplex Mode/Modem Type */
+            OBuf[(*Octet)++] = 0x80 | (pIE->DuplexMode<<6) | (pIE->ModemType);
+        }
+        else
+        {
+            OBuf[(*Octet)++] = 0x80 | (pIE->Layer1Ident<<5) | (pIE->UIL1Prot & 0x15);
+        }
+    }
+
+    /* Octet 6 - Layer2Ident/User information layer 2 prtocol */
+    if(pIE->Layer2Ident == 0x02)
+    {
+        OBuf[(*Octet)++] = 0x80 | (pIE->Layer2Ident<<5) | (pIE->UIL2Prot);
+    }
+
+    /* Octet 7 - Layer 3 Ident/ User information layer 3 protocol */
+    if(pIE->Layer3Ident == 0x03)
+    {
+        if(pIE->UIL3Prot == 0x0c)
+        {
+            OBuf[(*Octet)++] = 0x00 | (pIE->Layer3Ident<<5) | (pIE->UIL3Prot);
+
+            /* Octet 7a - Additional information layer 3 msb */
+            OBuf[(*Octet)++] = 0x00 | (pIE->AL3Info1);
+
+            /* Octet 7b - Additional information layer 3 lsb */
+            OBuf[(*Octet)++] = 0x80 | (pIE->AL3Info2);
+        }
+        else
+        {
+            OBuf[(*Octet)++] = 0x80 | (pIE->Layer3Ident<<5) | (pIE->UIL3Prot);
+        }
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CallID
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CallID(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_CallID * pie = (Q931ie_CallID*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x=0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    do{
+        pie->CallId[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+        x++;
+    }while((IBuf[Octet+Off]&0x80) != 0 && x < 10);
+
+    Q931IESizeTest(Q931E_CALLID);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CallID) + x -1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_CallID) + x -1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CallID
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+
+L3INT Q931Pie_CallID(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CallID * pIE = (Q931ie_CallID*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;/* remember current offset */
+    L3INT li;
+    L3INT sCI = pIE->Size - sizeof(Q931ie_CallID) + 1;
+    L3INT x;
+
+    OBuf[(*Octet)++] = Q931ie_CALL_IDENTITY ;
+    li=(*Octet)++;    /* remember length position */
+
+    for(x=0;x < sCI; x++)
+    {
+        OBuf[(*Octet)++] = pIE->CallId[x];
+    }
+
+    OBuf[(*Octet)-1] |= 0x80; /* set complete flag at last octet*/
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CallState
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CallState(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_CallState * pie = (Q931ie_CallState*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+
+    /* Octet 3 */
+    pie->CodStand = (IBuf[Octet+Off] >> 6) & 0x03;
+    pie->CallState= IBuf[Octet+Off] & 0x3f;
+
+    Octet++;
+
+    Q931IESizeTest(Q931E_CALLSTATE);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CallState);
+    pie->Size = sizeof(Q931ie_CallState);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CallState
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value: Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_CallState(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CallState * pIE = (Q931ie_CallState*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;/* remember current offset */
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_CALL_STATE;
+    li=(*Octet)++;    /* remember length position */
+
+    OBuf[(*Octet)++] = 0x80 | (pIE->CodStand<<6) | pIE->CallState;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CalledSub
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CalledSub(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_CalledSub * pie = (Q931ie_CalledSub*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;
+    pie->OddEvenInd = (IBuf[Octet+Off] >> 3) & 0x01;
+    Octet ++;
+    
+    /* Octet 4 */
+    x=0;
+    do{
+        pie->Digit[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+        x++;
+    }while((IBuf[Octet+Off]&0x80) != 0 && x < 20);
+
+    Q931IESizeTest(Q931E_CALLEDSUB);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CalledSub) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_CalledSub) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CalledSub
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_CalledSub(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CalledSub * pIE = (Q931ie_CalledSub*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT sN = pIE->Size - sizeof(Q931ie_CalledSub) + 1;
+    L3INT x;
+
+    /* Octet 1 */
+    OBuf[(*Octet)++] = Q931ie_CALLED_PARTY_SUBADDRESS;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);
+    
+    /* Octet 4 */
+    for(x=0;x<sN;x++)
+    {
+        OBuf[(*Octet)++] = pIE->Digit[x];
+    }
+
+    OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CalledNum
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CalledNum(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_CalledNum * pie = (Q931ie_CalledNum*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x;
+    L3INT IESize; /* # digits in this case */
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;
+    pie->NumPlanID = IBuf[Octet+Off] & 0x0f;
+    Octet ++;
+    
+    /* Octet 4*/
+    for (x = 0; x < IESize && x < 20; x++)
+    {
+        pie->Digit[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+    }
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CalledNum) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_CalledNum) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CalledNum
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_CalledNum(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CalledSub * pIE = (Q931ie_CalledSub*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT sN = pIE->Size - sizeof(Q931ie_CalledSub) + 1;
+    L3INT x;
+
+    /* Octet 1 */
+    OBuf[(*Octet)++] = Q931ie_CALLED_PARTY_NUMBER;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);
+    
+    /* Octet 4 */
+    for(x=0;x<sN;x++)
+    {
+        OBuf[(*Octet)++] = pIE->Digit[x];
+    }
+
+    OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CallingNum
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CallingNum(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+     Q931ie_CallingNum * pie = (Q931ie_CallingNum*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId  = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;
+    pie->NumPlanID = IBuf[Octet+Off] & 0x0f;
+    
+    /* Octet 3a */
+    if((IBuf[Octet+Off] & 0x80) != 0)
+    {
+        Off++;
+        pie->PresInd = (IBuf[Octet+Off] >> 5) & 0x03;
+        pie->ScreenInd = IBuf[Octet+Off] & 0x03;
+    }
+    Octet++;
+
+    /* Octet 4a*/
+    x=0;
+    do{
+        pie->Digit[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+        x++;
+    }while((IBuf[Octet+Off]&0x80) != 0 && x < 20);
+
+    Q931IESizeTest(Q931E_CALLINGNUM);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CallingNum) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_CallingNum) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CallingNum
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_CallingNum(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CallingSub * pIE = (Q931ie_CallingSub*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT sN = pIE->Size - sizeof(Q931ie_CalledSub) + 1;
+    L3INT x;
+
+    /* Octet 1 */
+    OBuf[(*Octet)++] = Q931ie_CALLING_PARTY_SUBADDRESS;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);
+    
+    /* Octet 3a */
+    /*
+
+        Details about the use and how to detect if Octet 3a is used
+        are very weak. Temp left out.
+
+        Octet 3 msb is set to 1 to indicate that this is not present
+
+    */
+
+    /* Octet 4 */
+    for(x=0;x<sN;x++)
+    {
+        OBuf[(*Octet)++] = pIE->Digit[x];
+    }
+
+    OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CallingSub
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CallingSub(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_CallingSub * pie = (Q931ie_CallingSub*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->TypNum = (IBuf[Octet+Off] >> 4) & 0x07;
+    pie->OddEvenInd = (IBuf[Octet+Off] >> 3) & 0x01;
+    Octet ++;
+    
+    /* Octet 4*/
+    x=0;
+    do{
+        pie->Digit[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+        x++;
+    }while((IBuf[Octet+Off]&0x80) != 0 && x < 20);
+
+    Q931IESizeTest(Q931E_CALLINGSUB);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CallingSub) + x -1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_CallingSub) + x -1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CallingSub
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_CallingSub(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CallingSub * pIE = (Q931ie_CallingSub*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT sN = pIE->Size - sizeof(Q931ie_CallingSub) + 1;
+    L3INT x;
+
+    /* Octet 1 */
+    OBuf[(*Octet)++] = Q931ie_CALLING_PARTY_SUBADDRESS;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->TypNum << 4) | (pIE->OddEvenInd << 3);
+    
+    /* Octet 4 */
+    for(x=0;x<sN;x++)
+    {
+        OBuf[(*Octet)++] = pIE->Digit[x];
+    }
+
+    OBuf[(*Octet)-1] |= 0x80; /* Terminate bit */
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:        Q931Uie_Cause
+  
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_Cause(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) 
+{
+    Q931ie_Cause * pie = (Q931ie_Cause*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2*/
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3*/
+    pie->CodStand = (IBuf[Octet+Off]>>5) & 0x03;
+    pie->Location = IBuf[Octet+Off] & 0x0f;
+
+    /* Octet 3a */
+    if((IBuf[Octet+Off] & 0x80) != 0)
+    {
+        Off++;
+        pie->Recom = IBuf[Octet+Off] & 0x7f;
+    }
+    Octet++;
+
+    /* Octet 4 */
+    pie->Value = IBuf[Octet+Off] & 0x7f;
+
+    Q931IESizeTest(Q931E_CAUSE);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_Cause);
+    pie->Size = sizeof(Q931ie_Cause);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:        Q931Pie_Cause
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_Cause(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_Cause * pIE = (Q931ie_Cause*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_CAUSE;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->CodStand<<5) | pIE->Location;
+
+    /* Octet 3a - currently not supported in send */
+
+    /* Octet 4 */
+    OBuf[(*Octet)++] = 0x80 | pIE->Value;
+
+    /* Octet 5 - diagnostics not supported in send */
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CongLevel
+  
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_CongLevel(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) 
+{
+    Q931ie_CongLevel *pie = (Q931ie_CongLevel*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet] & 0xf0;
+    pie->CongLevel   = IBuf[Octet] & 0x0f;
+    Octet ++;
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CongLevel);
+    pie->Size = sizeof(Q931ie_CongLevel);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_CongLevel
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value: Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_CongLevel(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_CongLevel * pIE = (Q931ie_CongLevel*)IBuf;
+    L3INT rc=0;
+    /* L3INT Beg=*Octet; */
+
+    OBuf[(*Octet)++] = Q931ie_CONGESTION_LEVEL | pIE->CongLevel;
+    
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_ChanID
+
+  Parameters:   IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Uie_ChanID(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_ChanID * pie = (Q931ie_ChanID*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->IntIDPresent    = (IBuf[Octet] >> 6) & 0x01;
+    pie->IntType        = (IBuf[Octet] >> 5) & 0x01;
+    pie->PrefExcl        = (IBuf[Octet] >> 3) & 0x01;
+    pie->DChanInd        = (IBuf[Octet] >> 2) & 0x01;
+    pie->InfoChanSel    = IBuf[Octet] & 0x03;
+
+    Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+    Octet++;
+
+    /* Octet 3.1 */
+
+    if(pie->IntIDPresent)
+    {
+        pie->InterfaceID    = IBuf[Octet+Off] & 0x7f;
+
+        /* Temp fix. Interface id can be extended using the extension bit */
+        /* this will read the octets, but do nothing with them. this is done */
+        /* because the usage of this field is a little unclear */
+        /* 30.jan.2001/JVB */
+        Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+        Off++;
+    }
+    else
+    {
+        /* Octet 3.2 */
+        if(pie->IntType == 1)        /* PRI etc */
+        {
+            pie->CodStand    = (IBuf[Octet + Off] >> 5) & 0x03;
+            pie->NumMap        = (IBuf[Octet + Off] >> 4) & 0x01;
+            pie->ChanMapType= IBuf[Octet + Off] & 0x0f;
+
+            Off ++;
+
+
+            /* Octet 3.3 */
+            /* Temp fix. Assume B channel. H channels not supported */
+            pie->ChanSlot = IBuf[Octet+Off] & 0x7f;
+            Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+            Off++;
+        }
+    }
+
+    Q931IESizeTest(Q931E_CHANID);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_BearerCap);
+    pie->Size = sizeof(Q931ie_BearerCap);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_ChanID
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_ChanID(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_ChanID * pIE = (Q931ie_ChanID*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;/* remember current offset */
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_CHANNEL_IDENTIFICATION;
+    li=(*Octet)++;    /* remember length position */
+
+    /* Octet 3 flags & BRI chan # */
+    OBuf[(*Octet)++] = 0x80 
+                    | (pIE->IntIDPresent << 6) 
+                    | (pIE->IntType<<5)
+                    | (pIE->PrefExcl<<3) 
+                    | pIE->InfoChanSel;
+
+    /* Octet 3.1 - Interface Identifier */
+    if(pIE->IntIDPresent)
+    {
+        OBuf[(*Octet)++] = 0x80 | pIE->InterfaceID;
+    }
+    else
+    {
+        /* Octet 3.2 & 3.3 - PRI */
+        if(pIE->IntType == 1)
+        {
+            OBuf[(*Octet)++]  = 0x80
+                            | (pIE->CodStand << 5)
+                            | (pIE->NumMap << 4)
+                            | pIE->ChanMapType;
+
+            /* Octet 3.2 Channel number/slot map */
+            OBuf[(*Octet)++] = 0x80 | pIE->ChanSlot;
+        }
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+
+/*****************************************************************************
+
+  Function:     Q931Uie_CRV
+
+  Description:  Reading CRV. 
+
+                The CRV is currently returned in the return value that 
+                Q921Rx23 will assign to the CRV field in the unpacked
+                message. CRV is basically 2 bytes etc, but the spec allows
+                the use of longer CRV values.
+  
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: CRV
+
+*****************************************************************************/
+L3USHORT Q931Uie_CRV(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff)
+{
+    L3INT Octet = *IOff;
+    L3INT l = IBuf[Octet]; 
+    L3USHORT CRV;
+    Octet++; /*Octet 2 is length indicator */
+
+    if(l == 1) /* One octet CRV */
+    {
+        CRV = IBuf[Octet];
+        Octet++;
+    }
+    else if(l==2) /* two octet CRV */
+    {
+        CRV = IBuf[Octet] << 8;
+        CRV = CRV + IBuf[Octet+1];
+        Octet += 2;
+    }
+    else
+    {
+               /* Long CRV is not used, so we skip this */
+               /* TODO: is it right to set to 0 here? */
+               CRV = 0;
+        Octet+=l;
+    }
+
+    *IOff = Octet;
+    return CRV;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_DateTime
+
+  Parameters:   pTrunk         [IN]            Ptr to trunk information.
+                               pIE                     [OUT]       ptr to Information Element id.
+                IBuf           [IN]        ptr to a packed ie.
+                OBuf           [OUT]       ptr to buffer for Unpacked ie.
+                IOff           [IN\OUT]    Input buffer offset
+                OOff           [IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_DateTime(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_DateTime * pie = (Q931ie_DateTime*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize=0;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    IESize = IBuf[Octet ++];
+    
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 - Year */
+    pie->Year = IBuf[Octet++];
+
+    /* Octet 4 - Month */
+    pie->Month = IBuf[Octet++];
+
+    /* Octet 5 - Day */
+    pie->Day = IBuf[Octet++];
+
+    /*******************************************************************
+        The remaining part of the IE are optioinal, but only the length 
+        can now tell us wherever these fields are present or not
+    ********************************************************************/
+    pie->Format=0;
+
+    /* Octet 6 - Hour (optional)*/
+    if(IESize >= 6)
+    {
+        pie->Format = 1;
+        pie->Hour = IBuf[Octet++];
+
+        /* Octet 7 - Minute (optional)*/
+        if(IESize >= 7)
+        {
+            pie->Format = 2;
+            pie->Minute = IBuf[Octet++];
+
+            /* Octet 8 - Second (optional)*/
+            if(IESize >= 8)
+            {
+                pie->Format = 3;
+                pie->Second = IBuf[Octet++];
+            }
+        }
+    }
+
+    Q931IESizeTest(Q931E_DATETIME);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_DateTime);
+    pie->Size = sizeof(Q931ie_DateTime);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_DateTime
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_DateTime(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_DateTime * pIE = (Q931ie_DateTime*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_DATETIME;
+    li=(*Octet)++;
+
+    OBuf[(*Octet)++] = pIE->Year;
+    OBuf[(*Octet)++] = pIE->Month;
+    OBuf[(*Octet)++] = pIE->Day;
+    if(pIE->Format >= 1)
+    {
+        OBuf[(*Octet)++] = pIE->Hour;
+        if(pIE->Format >= 2)
+        {
+            OBuf[(*Octet)++] = pIE->Minute;
+            if(pIE->Format >= 3)
+            {
+            OBuf[(*Octet)++] = pIE->Second;
+            }
+        }
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_Display
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_Display(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_Display * pie = (Q931ie_Display*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+    L3INT x;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    IESize = IBuf[Octet ++]; 
+
+    for(x=0; x<IESize; x++)
+    {
+        pie->Display[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+    }
+
+    Q931IESizeTest(Q931E_DISPLAY);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_Display) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_Display) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_Display
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_Display(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_Display * pIE = (Q931ie_Display*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT DSize;
+    L3INT x;
+
+    OBuf[(*Octet)++] = Q931ie_DISPLAY;
+    li=(*Octet)++;
+
+    DSize = pIE->Size - sizeof(Q931ie_Display) + 1;
+
+    for(x=0; x< DSize; x++)
+    {
+        
+        OBuf[(*Octet)++] = pIE->Display[x];
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_HLComp
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_HLComp(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff) 
+{
+    Q931ie_HLComp * pie = (Q931ie_HLComp*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3*/
+    pie->CodStand = (IBuf[Octet + Off] >>5) & 0x03;
+    pie->Interpret= (IBuf[Octet + Off] >>2) & 0x07;
+    pie->PresMeth = IBuf[Octet + Off] & 0x03;
+    
+    Octet++;
+
+    /* Octet 4 */
+    pie->HLCharID = IBuf[Octet+Off] & 0x7f;
+    
+    Octet++;
+    
+    /* Octet 4a*/
+    if((IBuf[Octet + Off-1] & 0x80) == 0 && Q931MoreIE())
+    {
+        if(pie->HLCharID == 0x5e || pie->HLCharID == 0x5f)
+        {
+            pie->EHLCharID = IBuf[Octet+Off] & 0x7f;
+            Off++;
+        }
+        else if( pie->HLCharID >= 0xc3 && pie->HLCharID <= 0xcf)
+        {
+            pie->EVideoTlfCharID = IBuf[Octet+Off] & 0x7f;
+            Off++;
+        }
+        else
+        {
+            /* error Octet 4a indicated, but invalid value in Octet 4. */
+            Q931SetError(pTrunk,Q931E_HLCOMP, 4, Off);
+            return Q931E_HLCOMP;
+        }
+        Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+    }
+
+    Q931IESizeTest(Q931E_HLCOMP);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_HLComp);
+    pie->Size = sizeof(Q931ie_HLComp);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_HLComp
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_HLComp(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_HLComp * pIE = (Q931ie_HLComp*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_HIGH_LAYER_COMPATIBILITY;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->CodStand << 5) | (pIE->Interpret << 2) | pIE->PresMeth;
+
+    /* Octet 4 */
+    OBuf[(*Octet)++] = pIE->HLCharID;
+
+    /* Octet 4a */
+    if(pIE->HLCharID == 0x5e || pIE->HLCharID == 0x5f)
+    {
+        OBuf[(*Octet)++] = 0x80 | pIE->EHLCharID;
+    }
+    else if( pIE->HLCharID >= 0xc3 && pIE->HLCharID <= 0xcf)
+    {
+        OBuf[(*Octet)++] = 0x80 | pIE->EVideoTlfCharID;
+    }
+    else
+    {
+        OBuf[(*Octet)-1] |= 0x80;
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_KeypadFac
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_KeypadFac(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_KeypadFac * pie = (Q931ie_KeypadFac*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+    L3INT x;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    IESize = IBuf[Octet ++]; 
+
+    for(x=0; x<IESize; x++)
+    {
+        pie->KeypadFac[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+    }
+
+    Q931IESizeTest(Q931E_KEYPADFAC);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_KeypadFac) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_KeypadFac) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_KeypadFac
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_KeypadFac(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_KeypadFac * pIE = (Q931ie_KeypadFac*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT DSize;
+    L3INT x;
+
+    OBuf[(*Octet)++] = Q931ie_KEYPAD_FACILITY;
+    li=(*Octet)++;
+
+    DSize = pIE->Size - sizeof(Q931ie_KeypadFac) + 1;
+
+    for(x=0; x< DSize; x++)
+    {
+        OBuf[(*Octet)++] = pIE->KeypadFac[x];
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_LLComp
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_LLComp(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_LLComp * pie = (Q931ie_LLComp*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3*/
+
+    pie->CodStand = (IBuf[Octet+Off] >> 5) & 0x03;
+    pie->ITransCap= IBuf[Octet+Off] & 0x1f;
+
+    Octet++;
+
+    /* Octet 3a*/
+    if((IBuf[Octet+Off-1] & 0x80) != 0)
+    {
+        pie->NegotInd = (IBuf[Octet+Off] >> 6) & 0x01;
+        Off++;
+    }
+
+    /* Octet 4 */
+    pie->TransMode = (IBuf[Octet+Off] >> 5) & 0x03;
+    pie->InfoRate  = IBuf[Octet+Off] & 0x1f;
+
+    Octet++;
+
+    /* Octet 4.1 */
+    if(pie->InfoRate == 0x14 ) /* Mutirate */
+    {
+        pie->RateMul = IBuf[Octet+Off] & 0x7f;
+        Off++;
+    }
+
+    /* Octet 5 - Layer 1 Ident */
+    if((IBuf[Octet+Off] & 0x60) == 0x20) /* Layer 1 Ident ? */
+    {
+        pie->Layer1Ident = (IBuf[Octet+Off] >> 5) & 0x03;
+        pie->UIL1Prot = IBuf[Octet+Off] & 0x1f;
+
+        Octet++;
+
+        /* Octet 5a */
+        if((IBuf[Octet+Off-1] & 0x80) != 0)
+        {
+            pie->SyncAsync    = (IBuf[Octet+Off] >> 6) & 0x01;
+            pie->Negot        = (IBuf[Octet+Off] >> 5) & 0x01;
+            pie->UserRate    = IBuf[Octet+Off] & 0x1f;
+            Off++;
+
+            /* Octet 5b - 2 options */
+            if((IBuf[Octet+Off-1] & 0x80) != 0)
+            {
+                if(pie->UIL1Prot == 0x01) /* V.110, I.460 and X.30*/
+                {
+                    pie->InterRate    = (IBuf[Octet+Off] >> 5) & 0x03;
+                    pie->NIConTx    = (IBuf[Octet+Off] >> 4) & 0x01;
+                    pie->NIConRx    = (IBuf[Octet+Off] >> 3) & 0x01;
+                    pie->FlowCtlTx    = (IBuf[Octet+Off] >> 2) & 0x01;
+                    pie->FlowCtlRx    = (IBuf[Octet+Off] >> 1) & 0x01;
+                    Off++;
+                }
+                else if(pie->UIL1Prot == 0x80)/* V.120 */
+                {
+                    pie->HDR        = (IBuf[Octet+Off] >> 6) & 0x01;
+                    pie->MultiFrame = (IBuf[Octet+Off] >> 5) & 0x01;
+                    pie->ModeL1        = (IBuf[Octet+Off] >> 4) & 0x01;
+                    pie->NegotLLI    = (IBuf[Octet+Off] >> 3) & 0x01;
+                    pie->Assignor    = (IBuf[Octet+Off] >> 2) & 0x01;
+                    pie->InBandNeg    = (IBuf[Octet+Off] >> 1) & 0x01;
+                    Off++;
+                }
+                else if(pie->UIL1Prot == 0x07)/* non standard */
+                {
+                    Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+                    Off++;
+                }
+                else
+                {
+                    Q931SetError(pTrunk,Q931E_LLCOMP, 5,2);
+                    return Q931E_LLCOMP;
+                }
+
+                /* Octet 5c */
+                if((IBuf[Octet+Off-1] & 0x80) != 0)
+                {
+                    pie->NumStopBits=(IBuf[Octet+Off] >> 5) & 0x03;
+                    pie->NumDataBits=(IBuf[Octet+Off] >> 3) & 0x03;
+                    pie->Parity        =IBuf[Octet+Off] & 0x07;
+                    Off++;
+
+                    /* Octet 5d */
+                    if((IBuf[Octet+Off-1] & 0x80) != 0)
+                    {
+                        pie->DuplexMode    = (IBuf[Octet+Off] >> 6) & 0x01;
+                        pie->ModemType    = IBuf[Octet+Off] & 0x3f;
+                        Off = Q931ReadExt(&IBuf[Octet+Off], Off);
+                        Off++;
+                    }
+                }
+            }
+        }
+    }
+
+    /* Octet 6 - Layer 2 Ident */
+    if((IBuf[Octet+Off] & 0x60) == 0x40) /* Layer 1 Ident ? */
+    {
+        pie->Layer2Ident= (IBuf[Octet+Off] >>5) & 0x03;
+        pie->UIL2Prot    = IBuf[Octet+Off] & 0x1f;
+        Octet++;
+
+        /* Octet 6a */
+        if((IBuf[Octet+Off-1] & 0x80) != 0)
+        {
+            if(pie->UIL2Prot == 0x10) /* 2nd 6a */
+            {
+                pie->UsrSpcL2Prot = IBuf[Octet+Off] & 0x7f;
+                Off++;
+            }
+            else /* assume 1st 6a*/
+            {
+                pie->ModeL2 = (IBuf[Octet+Off] >> 5) & 0x03;
+                pie->Q933use=IBuf[Octet+Off] & 0x03;
+                Off++;
+            }
+            /* Octet 6b*/
+            if((IBuf[Octet+Off-1] & 0x80) != 0)
+            {
+                pie->WindowSize = IBuf[Octet+Off] & 0x7f;
+                Off++;
+            }
+        }
+    }
+
+    /* Octet 7 - layer 3 Ident */
+    if((IBuf[Octet+Off] & 0x60) == 0x60) /* Layer 3 Ident ? */
+    {
+        pie->Layer3Ident= (IBuf[Octet+Off] >> 5) & 0x03;
+        pie->UIL3Prot    = IBuf[Octet+Off] & 0x1f;
+        Octet++;
+
+        /* Octet 7a */
+        if((IBuf[Octet+Off-1] & 0x80) != 0)
+        {
+        
+            if(pie->UIL3Prot == 0x0b)
+            {
+                /* Octet 7a + 7b AddL3Info */
+                pie->AddL3Info = ((IBuf[Octet+Off] << 4) &0xf0)
+                                |(IBuf[Octet+Off+1] & 0x0f);
+                Off+=2;
+            }
+            else
+            {
+                if(pie->UIL3Prot == 0x1f)
+                {
+                    pie->ModeL3 = (IBuf[Octet+Off] >> 5) & 0x03;
+                    Off++;
+                }
+                else
+                {
+                    pie->OptL3Info = IBuf[Octet+Off] & 0x7f;
+                    Off++;
+                }
+
+                /* Octet 7b*/
+                if((IBuf[Octet+Off-1] & 0x80) != 0)
+                {
+                    pie->DefPackSize = IBuf[Octet+Off] & 0x0f;
+                    Off++;
+
+                    /* Octet 7c */
+                    if((IBuf[Octet+Off-1] & 0x80) != 0)
+                    {
+                        pie->PackWinSize= IBuf[Octet+Off] & 0x7f;
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        Q931SetError(pTrunk,Q931E_LLCOMP, 7,0);
+        return Q931E_LLCOMP;
+    }
+
+    Q931IESizeTest(Q931E_LLCOMP);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_LLComp);
+    pie->Size = sizeof(Q931ie_LLComp);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_LLComp
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value: Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_LLComp(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_LLComp * pIE = (Q931ie_LLComp*)IBuf;
+    L3INT rc=0;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_LOW_LAYER_COMPATIBILITY;
+    li=(*Octet)++;
+
+    /* Octet 3*/
+    OBuf[(*Octet)++] = (pIE->CodStand << 6) | pIE->ITransCap;
+
+    /* Octet 3a*/
+    OBuf[(*Octet)++] = 0x80 | (pIE->NegotInd << 6);
+
+    /* Octet 4 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->TransMode << 5) | pIE->InfoRate;
+
+    /* Octet 4.1*/
+    if(pIE->InfoRate == 0x18)
+    {
+        OBuf[(*Octet)++] = 0x80 | pIE->RateMul;
+    }
+
+    /* Octet 5*/
+    if(pIE->Layer1Ident == 0x01)
+    {
+        OBuf[(*Octet)++] = (pIE->Layer1Ident << 5) | pIE->UIL1Prot;
+        
+        /* Octet 5a*/
+        if((pIE->ITransCap == 0x08 && (pIE->UIL1Prot == 0x01 || pIE->UIL1Prot == 0x08))
+        || (pIE->ITransCap == 0x10 && (pIE->UIL1Prot == 0x02 || pIE->UIL1Prot == 0x03)))
+        {
+            OBuf[(*Octet)++] = (pIE->SyncAsync<<6) | (pIE->Negot<<5) | pIE->UserRate;
+            
+            /* Octet 5b*/
+            if(pIE->UIL1Prot == 0x01)
+            {
+                OBuf[(*Octet)++] =  (pIE->InterRate << 5)
+                                |   (pIE->NIConTx   << 4)
+                                |   (pIE->NIConTx   << 3)
+                                |   (pIE->FlowCtlTx << 2)
+                                |   (pIE->FlowCtlRx << 1);
+            }
+            else if(pIE->UIL1Prot == 0x08)
+            {
+                OBuf[(*Octet)++] =  (pIE->HDR       << 6)
+                                |   (pIE->MultiFrame<< 5)
+                                |   (pIE->ModeL1    << 4)
+                                |   (pIE->NegotLLI  << 3)
+                                |   (pIE->Assignor  << 2)
+                                |   (pIE->InBandNeg << 1);
+            }
+            else
+            {
+                OBuf[(*Octet)-1] |= 0x80;
+            }
+
+            /* How to detect wherever 5c and 5d is to present is not clear*/
+            /* but they have been inculded as 'standard'*/
+            /* Octet 5c*/
+            if(pIE->UIL1Prot == 0x01 || pIE->UIL1Prot == 0x08)
+            {
+                OBuf[(*Octet)++] = (pIE->NumStopBits<<5) | (pIE->NumDataBits<<3) | pIE->Parity ;
+
+                /* Octet 5d*/
+                OBuf[(*Octet)++] = 0x80 | (pIE->DuplexMode<<6) | pIE->ModemType;
+            }
+        }
+        else
+        {
+            OBuf[(*Octet)-1] |= 0x80;
+        }
+    }
+
+    /* Octet 6*/
+    if(pIE->Layer2Ident == 0x02)
+    {
+        OBuf[(*Octet)++] = (pIE->Layer2Ident << 5) | pIE->UIL2Prot;
+
+        /* Octet 6a*/
+        if(pIE->UIL2Prot == 0x02 /* Q.921/I.441 */
+        || pIE->UIL2Prot == 0x06 /* X.25 link layer */
+        || pIE->UIL2Prot == 0x07 /* X.25 multilink */
+        || pIE->UIL2Prot == 0x09 /* HDLC ARM */
+        || pIE->UIL2Prot == 0x0a /* HDLC NRM */
+        || pIE->UIL2Prot == 0x0b /* HDLC ABM */
+        || pIE->UIL2Prot == 0x0d /* X.75 SLP */
+        || pIE->UIL2Prot == 0x0e /* Q.922 */
+        || pIE->UIL2Prot == 0x11)/* ISO/ECE 7776 DTE-DCE */
+        {
+            OBuf[(*Octet)++] = (pIE->ModeL2 << 5) | pIE->Q933use;
+
+            /* Octet 6b*/
+            OBuf[(*Octet)++] = 0x80 | pIE->WindowSize;
+        }
+        else if(pIE->UIL2Prot == 0x10) /* User Specific */
+        {
+            OBuf[(*Octet)++] = 0x80 | pIE->UsrSpcL2Prot;
+        }
+        else
+        {
+            OBuf[(*Octet)-1] |= 0x80;
+        }
+    }
+
+    /* Octet 7*/
+    if(pIE->Layer3Ident == 0x03)
+    {
+        OBuf[(*Octet)++] = (pIE->Layer3Ident<<5) | pIE->UIL3Prot;
+
+        /* Octet 7a - 3 different ones */
+        if(pIE->UIL3Prot == 0x10)
+        {
+            OBuf[(*Octet++)] = 0x80 | pIE->OptL3Info;
+        }
+        else if(pIE->UIL3Prot == 0x06
+            ||  pIE->UIL3Prot == 0x07
+            ||  pIE->UIL3Prot == 0x08)
+        {
+            OBuf[(*Octet)++] = pIE->ModeL3 << 5;
+
+            /* Octet 7b note 7*/
+            OBuf[(*Octet)++] = pIE->DefPackSize;
+
+            /* Octet 7c note 7*/
+            OBuf[(*Octet)++] = 0x80 | pIE->PackWinSize;
+        }
+        else if(pIE->UIL3Prot == 0x0b)
+        {
+            OBuf[(*Octet)++] = (pIE->AddL3Info >> 4) & 0x0f;
+            OBuf[(*Octet)++] = 0x80 | (pIE->AddL3Info & 0x0f);
+        }
+        else
+        {
+            OBuf[(*Octet)-1] |= 0x80;
+        }
+    }
+    else
+    {
+        Q931SetError(pTrunk,Q931E_LLCOMP, 7,0);
+        rc = Q931E_LLCOMP;
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_NetFac
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_NetFac(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_NetFac * pie = (Q931ie_NetFac*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x=0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    pie->LenNetID = IBuf[Octet+Off]; /* full octet is used */
+    Octet++;
+
+    if(pie->LenNetID > 0)
+    {
+        /* Octet 3.1 */
+        pie->TypeNetID = (IBuf[Octet+Off] >> 4) & 0x0f;
+        pie->NetIDPlan = IBuf[Octet+Off] & 0x0f;
+        Off = Q931ReadExt(&IBuf[Octet], Off);
+        Off++;
+
+        /* Octet 3.2*/
+        for(x=0; x < pie->LenNetID; x++)
+        {
+           pie->NetID[x] = IBuf[Octet+Off] & 0x7f;
+           Off++;
+        }
+    }
+
+    /* Octet 4*/
+    pie->NetFac = IBuf[Octet+Off]; /* Full Octet is used */
+    Octet++;
+
+    Q931IESizeTest(Q931E_NETFAC);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_NetFac) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_NetFac) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_NetFac
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_NetFac(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_NetFac * pIE = (Q931ie_NetFac*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT x;
+
+    OBuf[(*Octet)++] = Q931ie_NETWORK_SPECIFIC_FACILITIES;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = pIE->LenNetID;
+
+    if(pIE->LenNetID > 0)
+    {
+        /* Octet 3.1 */
+        OBuf[(*Octet)++] = 0x80 | (pIE->TypeNetID << 4) | pIE->NetIDPlan;
+
+        /* Octet 3.2 */
+        for(x=0; x <pIE->LenNetID; x++)
+        {
+            OBuf[(*Octet)++] = pIE->NetID[x];
+        }
+    }
+
+    /* Octet 4*/
+    OBuf[(*Octet)++] = pIE->NetFac;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:        Q931Uie_NotifInd
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_NotifInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_NotifInd * pie = (Q931ie_NotifInd*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2*/
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->Notification = IBuf[Octet+Off] & 0x7f;
+
+    Off = Q931ReadExt(&IBuf[Octet], Off);
+    Octet++;
+
+    Q931IESizeTest(Q931E_NOTIFIND);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_NotifInd);
+    pie->Size = sizeof(Q931ie_NotifInd);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_NotifInd
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_NotifInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_NotifInd * pIE = (Q931ie_NotifInd*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_NOTIFICATION_INDICATOR;
+    li=(*Octet)++;
+
+    /* Octet 3*/
+    OBuf[(*Octet)++] = pIE->Notification;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_ProgInd
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_ProgInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_ProgInd * pie = (Q931ie_ProgInd*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2*/
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3*/
+    pie->CodStand = (IBuf[Octet+Off] >> 5) & 0x03;
+    pie->Location = IBuf[Octet+Off] & 0x0f;
+
+    Off = Q931ReadExt(&IBuf[Octet], Off);
+    Octet++;
+
+    /* Octet 4*/
+    pie->ProgDesc = IBuf[Octet+Off] & 0x7f;
+    Off = Q931ReadExt(&IBuf[Octet], Off);
+    Octet++;
+
+    Q931IESizeTest(Q931E_PROGIND);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_ProgInd);
+    pie->Size = sizeof(Q931ie_ProgInd);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_ProgInd
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]       Ptr tp packed output buffer.
+                Octet[IN/OUT]   Offset L3INTo OBuf.
+
+  Return Value: Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_ProgInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_ProgInd * pIE = (Q931ie_ProgInd*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_PROGRESS_INDICATOR;
+    li=(*Octet)++;
+
+    /* Octet 3*/
+    OBuf[(*Octet)++] = 0x80 | (pIE->CodStand << 5) | pIE->Location;
+
+    /* Octet 4*/
+    OBuf[(*Octet)++] = 0x80 | pIE->ProgDesc;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_RepeatInd
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_RepeatInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_RepeatInd *pie = (Q931ie_RepeatInd*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet] & 0xf0;
+    pie->RepeatInd   = IBuf[Octet] & 0x0f;
+    Octet ++;
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_RepeatInd);
+    pie->Size = sizeof(Q931ie_RepeatInd);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_RepeatInd
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_RepeatInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_RepeatInd * pIE = (Q931ie_RepeatInd*)IBuf;
+    L3INT rc=0;
+    /* L3INT Beg=*Octet; */
+
+    OBuf[(*Octet)++] = Q931ie_REPEAT_INDICATOR | pIE->RepeatInd;
+    
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_RevChargeInd
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_RevChargeInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    ie iE;
+    Q931SetIE(iE, *OOff);
+
+    return iE;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_RevChargeInd
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_RevChargeInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_RestartInd
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_RestartInd(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_RestartInd * pie = (Q931ie_RestartInd*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2*/
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->Class = IBuf[Octet+Off] & 0x07;
+
+    Off = Q931ReadExt(&IBuf[Octet], Off);
+    Octet++;
+
+    Q931IESizeTest(Q931E_RESTARTIND);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_RestartInd);
+    pie->Size = sizeof(Q931ie_RestartInd);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_RestartInd
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_RestartInd(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_RestartInd * pIE = (Q931ie_RestartInd*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_RESTART_INDICATOR;
+    li=(*Octet)++;
+
+    /* Octet 3*/
+    OBuf[(*Octet)++] = 0x80 | pIE->Class ;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_Segment
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_Segment(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_Segment * pie = (Q931ie_Segment*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2*/
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->FSI = (IBuf[Octet+Off] & 0x80) >> 7;
+    pie->NumSegRem = IBuf[Octet+Off] & 0x7f;
+    Octet++;
+
+    /* Octet 4 */
+    pie->SegType = IBuf[Octet+Off] & 0x7f;
+    Octet++;
+    
+    Q931IESizeTest(Q931E_SEGMENT);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_Segment);
+    pie->Size = sizeof(Q931ie_Segment);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_Segment
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_Segment * pIE = (Q931ie_Segment*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_SEGMENTED_MESSAGE;
+    li=(*Octet)++;
+
+    /* Octet 3*/
+    OBuf[(*Octet)++] = (pIE->FSI<<7) | pIE->NumSegRem;
+
+    /* Octet 4 */
+    OBuf[(*Octet)++] = pIE->SegType;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:        Q931Uie_SendComplete
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_SendComplete(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_SendComplete *pie = (Q931ie_SendComplete*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+
+    *pIE=0;
+
+    Octet ++;
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_SendComplete);
+    pie->Size = sizeof(Q931ie_SendComplete);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_ProgInd
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]       Ptr tp packed output buffer.
+                Octet[IN/OUT]   Offset into OBuf.
+
+  Return Value: Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_SendComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    /* Q931ie_SendComplete * pIE = (Q931ie_SendComplete*)IBuf; */
+    L3INT rc=Q931E_NO_ERROR;
+    /* L3INT Beg=*Octet; */
+
+    OBuf[(*Octet)++] = 0x80 | (L3UCHAR)Q931ie_SENDING_COMPLETE;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_Signal
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_Signal(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_Signal * pie = (Q931ie_Signal*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT IESize;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2*/
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->Signal = IBuf[Octet+Off];
+    Octet++;
+
+    Q931IESizeTest(Q931E_SIGNAL);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_Signal);
+    pie->Size = sizeof(Q931ie_Signal);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_Signal
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_Signal(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_Signal * pIE = (Q931ie_Signal*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+
+    OBuf[(*Octet)++] = Q931ie_SIGNAL;
+    li=(*Octet)++;
+
+    /* Octet 3*/
+    OBuf[(*Octet)++] = pIE->Signal;
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_TransNetSel
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_TransNetSel(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_TransNetSel * pie = (Q931ie_TransNetSel*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x=0;
+    L3INT l;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    l = IBuf[Octet] - 3; 
+    Octet++;
+
+    /* Octet 3*/
+    pie->Type = (IBuf[Octet+Off] >> 4) & 0x07;
+
+    Off = Q931ReadExt(&IBuf[Octet], Off);
+    Octet++;
+
+    for(x=0; x < l; x++)
+    {
+        pie->NetID[x] = IBuf[Octet+Off] & 0x7f;
+        Off++;
+    }
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_TransNetSel) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_TransNetSel) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_TransNetSel
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_TransNetSel(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_TransNetSel * pIE = (Q931ie_TransNetSel*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT x;
+    L3INT l;
+
+    OBuf[(*Octet)++] = Q931ie_TRANSIT_NETWORK_SELECTION;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = 0x80 | (pIE->Type<<4) | pIE->NetIDPlan;
+
+    /* Octet 4 */
+    l = pIE->Size - sizeof(Q931ie_TransNetSel) + 1;
+    for(x=0;x<l;x++)
+    {
+        OBuf[(*Octet)++] = pIE->NetID[x];
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Uie_UserUser
+
+  Parameters:   pIE[OUT]        ptr to Information Element id.
+                IBuf[IN]        ptr to a packed ie.
+                OBuf[OUT]       ptr to buffer for Unpacked ie.
+                IOff[IN\OUT]    Input buffer offset
+                OOff[IN\OUT]    Output buffer offset
+
+                Ibuf and OBuf points directly to buffers. The IOff and OOff
+                must be updated, but are otherwise not used in the ie unpack.
+
+  Return Value: Error Message
+
+*****************************************************************************/
+L3INT Q931Uie_UserUser(Q931_TrunkInfo *pTrunk, ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)
+{
+    Q931ie_UserUser * pie = (Q931ie_UserUser*)OBuf;
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x=0;
+    L3INT l;
+
+    *pIE=0;
+
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    l = IBuf[Octet] - 3; 
+    Octet++;
+
+    /* Octet 3*/
+    pie->ProtDisc = IBuf[Octet+Off];
+    Octet++;
+
+    for(x=0; x < l; x++)
+    {
+        pie->User[x] = IBuf[Octet+Off];
+        Off++;
+    }
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_UserUser) + x - 1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_UserUser) + x - 1);
+
+    Q931SetIE(*pIE, *OOff);
+
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pie_UserUser
+
+  Parameters:   IBuf[IN]        Ptr to struct.
+                OBuf[OUT]        Ptr tp packed output buffer.
+                Octet[IN/OUT]    Offset into OBuf.
+
+  Return Value:    Error code, 0 = OK
+
+*****************************************************************************/
+L3INT Q931Pie_UserUser(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)
+{
+    Q931ie_UserUser * pIE = (Q931ie_UserUser*)IBuf;
+    L3INT rc=Q931E_NO_ERROR;
+    L3INT Beg=*Octet;
+    L3INT li;
+    L3INT x;
+    L3INT l;
+
+    OBuf[(*Octet)++] = Q931ie_USER_USER;
+    li=(*Octet)++;
+
+    /* Octet 3 */
+    OBuf[(*Octet)++] = pIE->ProtDisc;
+
+    /* Octet 4 */
+    l = pIE->Size - sizeof(Q931ie_UserUser) + 1;
+    for(x=0;x<l;x++)
+    {
+        OBuf[(*Octet)++] = pIE->User[x];
+    }
+
+    OBuf[li] = (L3UCHAR)((*Octet)-Beg);
+    return rc;
+}
+
index 8451ff48d533e5663b6591cddec9f3b6d80249f9..d376f8d1768861f5130432e7f0f0b3c6de791af2 100644 (file)
-/*****************************************************************************\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
-               rc = Q931E_UNKNOWN_IE;/* 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
+/*****************************************************************************
+
+  FileName:            Q931mes.c
+
+  Contents:            Pack/Unpack functions. These functions will unpack a Q931 
+                               message from the bit packed original format into structs
+                               that contains variables sized by the user. It will also pack
+                               the struct back into a Q.931 message as required.
+
+                               See     q931.h for description. 
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+
+*****************************************************************************/
+
+#include "Q931.h"
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Alerting
+
+*****************************************************************************/
+
+L3INT Q931Umes_Alerting(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Alerting *mes = (Q931mes_Alerting*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       L3UCHAR mescode = (L3UCHAR)IBuf[IOff];
+       while(IOff < Size)
+       {
+               switch(mescode)
+               {
+               case Q931ie_BEARER_CAPABILITY: 
+                       rc = Q931Uie[pTrunk->Dialect][mescode](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CHANNEL_IDENTIFICATION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_HIGH_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Alerting) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Alerting
+
+*****************************************************************************/
+L3INT Q931Pmes_Alerting(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Alerting *pMes = (Q931mes_Alerting *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Bearer capability */
+       if(Q931IsIEPresent(pMes->BearerCap))
+       {
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       }
+
+       /* Channel Identification */
+       if(Q931IsIEPresent(pMes->ChanID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* High Layer Compatibility */
+       if(Q931IsIEPresent(pMes->HLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_CallProceeding
+
+*****************************************************************************/
+L3INT Q931Umes_CallProceeding(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_CallProceeding *mes = (Q931mes_CallProceeding*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_BEARER_CAPABILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CHANNEL_IDENTIFICATION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_HIGH_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_CallProceeding) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_CallProceeding
+
+*****************************************************************************/
+L3INT Q931Pmes_CallProceeding(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_CallProceeding *pMes = (Q931mes_CallProceeding *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Bearer capability */
+       if(Q931IsIEPresent(pMes->BearerCap))
+       {
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       }
+
+       /* Channel Identification */
+       if(Q931IsIEPresent(pMes->ChanID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* High Layer Compatibility */
+       if(Q931IsIEPresent(pMes->HLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_CongestionControl
+
+*****************************************************************************/
+L3INT Q931Umes_CongestionControl(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_CongestionControl
+
+*****************************************************************************/
+L3INT Q931Pmes_CongestionControl(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Connect
+
+*****************************************************************************/
+L3INT Q931Umes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Connect *mes = (Q931mes_Connect*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_BEARER_CAPABILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CHANNEL_IDENTIFICATION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DATETIME:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->DateTime,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_LOW_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->LLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_HIGH_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Connect) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Connect
+
+*****************************************************************************/
+L3INT Q931Pmes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Connect *pMes = (Q931mes_Connect *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Bearer capability */
+       if(Q931IsIEPresent(pMes->BearerCap))
+       {
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       }
+
+       /* Channel Identification */
+       if(Q931IsIEPresent(pMes->ChanID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Date/Time */
+       if(Q931IsIEPresent(pMes->DateTime))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Low Layer Compatibility */
+       if(Q931IsIEPresent(pMes->LLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* High Layer Compatibility */
+       if(Q931IsIEPresent(pMes->HLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_ConnectAck
+
+*****************************************************************************/
+L3INT Q931Umes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_ConnectAck *mes = (Q931mes_ConnectAck*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_ConnectAck) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_ConnectAck
+
+*****************************************************************************/
+L3INT Q931Pmes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_ConnectAck *pMes = (Q931mes_ConnectAck *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Disconnect
+
+*****************************************************************************/
+L3INT Q931Umes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Disconnect *mes = (Q931mes_Disconnect*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Disconnect) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Disconnect
+
+*****************************************************************************/
+L3INT Q931Pmes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Disconnect *pMes = (Q931mes_Disconnect *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Cause */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Information
+
+*****************************************************************************/
+L3INT Q931Umes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Information *mes = (Q931mes_Information*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_SENDING_COMPLETE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->SendComplete,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               case Q931ie_KEYPAD_FACILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->KeypadFac,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               case Q931ie_CALLED_PARTY_NUMBER:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CalledNum,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Information) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Information
+
+*****************************************************************************/
+L3INT Q931Pmes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Information *pMes = (Q931mes_Information *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Sending Complete                             */
+       if(Q931IsIEPresent(pMes->SendComplete))
+               OBuf[Octet++]   = (L3UCHAR)(pMes->SendComplete & 0x00ff);
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Keypad Facility */
+       if(Q931IsIEPresent(pMes->KeypadFac))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Called Party number */
+       if(Q931IsIEPresent(pMes->CalledNum))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Notify
+
+*****************************************************************************/
+L3INT Q931Umes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Notify *mes = (Q931mes_Notify*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_BEARER_CAPABILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               case Q931ie_NOTIFICATION_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->NotifInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Notify) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Notify
+
+*****************************************************************************/
+L3INT Q931Pmes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Notify *pMes = (Q931mes_Notify *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Bearer capability */
+       if(Q931IsIEPresent(pMes->BearerCap))
+       {
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       }
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Progress
+
+*****************************************************************************/
+L3INT Q931Umes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Progress *mes = (Q931mes_Progress*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_BEARER_CAPABILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_HIGH_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Progress) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Progress
+
+*****************************************************************************/
+L3INT Q931Pmes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Progress *pMes = (Q931mes_Progress *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Bearer capability */
+       if(Q931IsIEPresent(pMes->BearerCap))
+       {
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       }
+
+       /* Cause */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* High Layer Compatibility */
+       if(Q931IsIEPresent(pMes->HLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Release
+
+*****************************************************************************/
+L3INT Q931Umes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Release *mes = (Q931mes_Release*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Release) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Release
+
+*****************************************************************************/
+L3INT Q931Pmes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Release *pMes = (Q931mes_Release *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Cause */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_ReleaseComplete
+
+*****************************************************************************/
+L3INT Q931Umes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_ReleaseComplete *mes = (Q931mes_ReleaseComplete*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_ReleaseComplete) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_ReleaseComplete
+
+*****************************************************************************/
+L3INT Q931Pmes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_ReleaseComplete *pMes = (Q931mes_ReleaseComplete *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Cause */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Restart
+
+*****************************************************************************/
+L3INT Q931Umes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Restart
+
+*****************************************************************************/
+L3INT Q931Pmes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_RestartAck
+
+*****************************************************************************/
+L3INT Q931Umes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_RestartAck
+
+*****************************************************************************/
+L3INT Q931Pmes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Resume
+
+*****************************************************************************/
+L3INT Q931Umes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Resume *mes = (Q931mes_Resume*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CALL_IDENTITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Resume) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Resume
+
+*****************************************************************************/
+L3INT Q931Pmes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Resume *pMes = (Q931mes_Resume *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Call Identity */
+       if(Q931IsIEPresent(pMes->CallID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_ResumeAck
+
+*****************************************************************************/
+L3INT Q931Umes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_ResumeAck *mes = (Q931mes_ResumeAck*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CHANNEL_IDENTIFICATION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_ResumeAck) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_ResumeAck
+
+*****************************************************************************/
+L3INT Q931Pmes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_ResumeAck *pMes = (Q931mes_ResumeAck *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Channel Identification */
+       if(Q931IsIEPresent(pMes->ChanID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_ResumeReject
+
+*****************************************************************************/
+L3INT Q931Umes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_ResumeReject *mes = (Q931mes_ResumeReject*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_ResumeReject) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_ResumeReject
+
+*****************************************************************************/
+L3INT Q931Pmes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+       L3INT rc = Q931E_NO_ERROR;
+       Q931mes_ResumeReject *pMes = (Q931mes_ResumeReject *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header  */
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                          */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+
+       /* Cause                                */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display                              */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+L3INT Q931Umes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT OOff)
+{
+    L3INT i = IOff;
+
+    return IOff - i;
+}
+
+L3INT Q931Pmes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Setup
+
+*****************************************************************************/
+L3INT Q931Umes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       L3INT ir=0;
+       L3INT OOff=0;
+    Q931mes_Setup *mes = (Q931mes_Setup*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_SENDING_COMPLETE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->SendComplete,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_REPEAT_INDICATOR:
+                       if(ir==0)
+                       {
+                               rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->RepeatInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                               ir++;
+                       }
+                       else if(ir==1)
+                       {
+                               rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->LLRepeatInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                               ir++;
+                       }
+                       else
+                       {
+                               return Q931E_ILLEGAL_IE;
+                       }
+                       break;
+               case Q931ie_BEARER_CAPABILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->BearerCap,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CHANNEL_IDENTIFICATION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_NETWORK_SPECIFIC_FACILITIES:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->NetFac,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DATETIME:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->DateTime,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_KEYPAD_FACILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->KeypadFac,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CALLING_PARTY_NUMBER:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallingNum,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CALLING_PARTY_SUBADDRESS:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallingSub,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CALLED_PARTY_NUMBER:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CalledSub,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CALLED_PARTY_SUBADDRESS:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CalledSub,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_TRANSIT_NETWORK_SELECTION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->TransNetSel,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_LOW_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->LLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_HIGH_LAYER_COMPATIBILITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->HLComp,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Setup) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Setup
+
+  Decription:  Pack a Q931mes_Setup into a real Q.931 message. The user will
+                               set up a SETUP message and issue this to the stack where it
+                               is processed by Q931ProcSetup that processes and validates
+                               it before it actually sends it out. This function is called
+                               to compute the real Q.931 message.
+
+  Parameters:  IBuf[IN]        Ptr to un-packed struct
+                               ISize[IN]       Size of input buffer (unpacked message).
+                               OBuf[OUT]       Ptr to packed 'octet' wise message.
+                               OSize[OUT]      Size of packed message.
+
+  Called By:   Q931ProcSetup
+
+*****************************************************************************/
+L3INT Q931Pmes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Setup *pMes = (Q931mes_Setup *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                          */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Sending Complete                             */
+       if(Q931IsIEPresent(pMes->SendComplete))
+               OBuf[Octet++]   = (L3UCHAR)(pMes->SendComplete & 0x00ff);
+
+       /* Repeat Indicator */
+       if(Q931IsIEPresent(pMes->RepeatInd))
+               OBuf[Octet++]   = (L3UCHAR)(pMes->RepeatInd & 0x00ff);          
+
+       /* Bearer capability */
+       if(Q931IsIEPresent(pMes->BearerCap))
+       {
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       }
+       else
+       {
+               rc=Q931E_BEARERCAP;
+       }
+
+       /* Channel Identification */
+       if(Q931IsIEPresent(pMes->ChanID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Network spesific facilities */
+       if(Q931IsIEPresent(pMes->NetFac))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->NetFac,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Date/Time */
+       if(Q931IsIEPresent(pMes->DateTime))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Keypad Facility */
+       if(Q931IsIEPresent(pMes->KeypadFac))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Calling Party Number */
+       if(Q931IsIEPresent(pMes->CallingNum))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallingNum,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Calling Party Subaddress */
+       if(Q931IsIEPresent(pMes->CallingSub))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallingSub,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Called Party number */
+       if(Q931IsIEPresent(pMes->CalledNum))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Called party subaddress */
+       if(Q931IsIEPresent(pMes->CalledSub))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CalledSub,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Transit network selection */
+       if(Q931IsIEPresent(pMes->TransNetSel))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->TransNetSel,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Repeat Indicator */
+       if(Q931IsIEPresent(pMes->LLRepeatInd))
+               rc = Q931E_UNKNOWN_IE;/* TODO */
+
+       /* Low Layer Compatibility */
+       if(Q931IsIEPresent(pMes->LLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* High Layer Compatibility */
+       if(Q931IsIEPresent(pMes->HLComp))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_SetupAck
+
+*****************************************************************************/
+L3INT Q931Umes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_SetupAck *mes = (Q931mes_SetupAck*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CHANNEL_IDENTIFICATION:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ChanID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_PROGRESS_INDICATOR:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->ProgInd,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_SIGNAL:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Signal,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_SetupAck) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_SetupAck
+
+*****************************************************************************/
+L3INT Q931Pmes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_SetupAck *pMes = (Q931mes_SetupAck *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Channel Identification */
+       if(Q931IsIEPresent(pMes->ChanID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Progress indicator */
+       if(Q931IsIEPresent(pMes->ProgInd))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Signal */
+       if(Q931IsIEPresent(pMes->Signal))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Status
+
+*****************************************************************************/
+L3INT Q931Umes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Status *mes = (Q931mes_Status*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_CALL_STATE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallState,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Status) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Status
+
+*****************************************************************************/
+L3INT Q931Pmes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Status *pMes = (Q931mes_Status *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Cause */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Call State */
+       if(Q931IsIEPresent(pMes->CallState))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallState,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_StatusEnquiry
+
+*****************************************************************************/
+L3INT Q931Umes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_StatusEnquiry *mes = (Q931mes_StatusEnquiry*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_StatusEnquiry) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_StatusEnquiry
+
+*****************************************************************************/
+L3INT Q931Pmes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_StatusEnquiry *pMes = (Q931mes_StatusEnquiry *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_Suspend
+
+*****************************************************************************/
+L3INT Q931Umes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_Suspend *mes = (Q931mes_Suspend*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CALL_IDENTITY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->CallID,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_Suspend) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Suspend
+
+*****************************************************************************/
+L3INT Q931Pmes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_Suspend *pMes = (Q931mes_Suspend *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Call Identity */
+       if(Q931IsIEPresent(pMes->CallID))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_SuspendAck
+
+*****************************************************************************/
+L3INT Q931Umes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_SuspendAck *mes = (Q931mes_SuspendAck*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_SuspendAck) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_SuspendAck
+
+*****************************************************************************/
+L3INT Q931Pmes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_SuspendAck *pMes = (Q931mes_SuspendAck *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_SuspendReject
+
+*****************************************************************************/
+L3INT Q931Umes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+       /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+    Q931mes_SuspendReject *mes = (Q931mes_SuspendReject*)OBuf;
+       L3INT rc=Q931E_NO_ERROR;
+       while(IOff < Size)
+       {
+               switch(IBuf[IOff])
+               {
+               case Q931ie_CAUSE:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Cause,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               case Q931ie_DISPLAY:
+                       rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, &mes->Display,&IBuf[IOff], &OBuf[OOff], &IOff, &OOff);
+                       if(rc != Q931E_NO_ERROR) 
+                               return rc;
+                       break;
+               default:
+                       return Q931E_ILLEGAL_IE;
+                       break;
+               }
+       }
+    mes->Size = sizeof(Q931mes_SuspendReject) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_SuspendReject
+
+*****************************************************************************/
+L3INT Q931Pmes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3INT rc = Q931E_NO_ERROR;
+       Q931mes_SuspendReject *pMes = (Q931mes_SuspendReject *)IBuf;
+       L3INT Octet = 0;
+
+       /* Q931 Message Header */
+
+       OBuf[Octet++]   = pMes->ProtDisc;               /* Protocol discriminator               */
+       OBuf[Octet++]   = 2;                                    /* length is 2 octets                   */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV>>8);      /* msb                                                  */
+       OBuf[Octet++]   = (L3UCHAR)(pMes->CRV); /* lsb                                                  */
+       OBuf[Octet++]   = pMes->MesType;                /* message header                               */
+       
+       /* Cause */
+       if(Q931IsIEPresent(pMes->Cause))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+       /* Display */
+       if(Q931IsIEPresent(pMes->Display))
+               if((rc=Q931Pie[pTrunk->Dialect][pMes->MesType](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet))!=0)
+                       return rc;
+
+    return rc;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Umes_UserInformation
+
+*****************************************************************************/
+L3INT Q931Umes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_UserInformation
+
+*****************************************************************************/
+L3INT Q931Pmes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
index 97e4fe1a4267654c6146d130d8338a9b93862b48..c04d4f7ee4e523c0516dae392488d068705ed261 100644 (file)
-/*****************************************************************************\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
-       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
+/*****************************************************************************
+
+  FileName:            Q932mes.c
+
+  Contents:            Q.932 Message Encoders/Decoders
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "Q931.h"
+
+/*****************************************************************************
+
+  Function:     Q932Umes_Facility
+
+*****************************************************************************/
+
+L3INT Q932Umes_Facility(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_Facility *mes = (Q932mes_Facility*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_Facility) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Facility
+
+*****************************************************************************/
+L3INT Q932Pmes_Facility(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_Hold
+
+*****************************************************************************/
+
+L3INT Q932Umes_Hold(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_Hold *mes = (Q932mes_Hold*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_Hold) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Hold
+
+*****************************************************************************/
+L3INT Q932Pmes_Hold(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_HoldAck
+
+*****************************************************************************/
+
+L3INT Q932Umes_HoldAck(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_HoldAck *mes = (Q932mes_HoldAck*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_HoldAck) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_HoldAck
+
+*****************************************************************************/
+L3INT Q932Pmes_HoldAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_HoldReject
+
+*****************************************************************************/
+
+L3INT Q932Umes_HoldReject(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_HoldReject *mes = (Q932mes_HoldReject*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_HoldReject) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_HoldReject
+
+*****************************************************************************/
+L3INT Q932Pmes_HoldReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_Register
+
+*****************************************************************************/
+
+L3INT Q932Umes_Register(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_Register *mes = (Q932mes_Register*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_Register) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Register
+
+*****************************************************************************/
+L3INT Q932Pmes_Register(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_Retrieve
+
+*****************************************************************************/
+
+L3INT Q932Umes_Retrieve(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_Retrieve *mes = (Q932mes_Retrieve*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_Retrieve) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_Retrieve
+
+*****************************************************************************/
+L3INT Q932Pmes_Retrieve(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_RetrieveAck
+
+*****************************************************************************/
+
+L3INT Q932Umes_RetrieveAck(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_RetrieveAck *mes = (Q932mes_RetrieveAck*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_RetrieveAck) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_RetrieveAck
+
+*****************************************************************************/
+L3INT Q932Pmes_RetrieveAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
+
+/*****************************************************************************
+
+  Function:     Q932Umes_RetrieveReject
+
+*****************************************************************************/
+
+L3INT Q932Umes_RetrieveReject(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size)
+{
+    /* L3INT i = IOff; */
+       /* L3INT ir=0; */
+       L3INT OOff=0;
+       Q932mes_RetrieveReject *mes = (Q932mes_RetrieveReject*)IBuf;
+
+       /* TODO */
+
+    mes->Size = sizeof(Q932mes_RetrieveReject) - 1 + OOff;
+    return Q931E_NO_ERROR;
+}
+
+/*****************************************************************************
+
+  Function:     Q931Pmes_RetrieveReject
+
+*****************************************************************************/
+L3INT Q932Pmes_RetrieveReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
+{
+    L3BOOL RetCode = L3FALSE;
+
+    NoWarning(OBuf);
+    NoWarning(IBuf);
+
+    return RetCode;
+}
index 3a0e1b02ac79af22e1f13d3c3bee4a64345e23ea..26d4699c73f9a4618b0856e05a134a114e223a16 100644 (file)
-/*****************************************************************************\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
-/*****************************************************************************\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 L2UCHAR                unsigned char           /* Min 8 bit                                            */\r
-#define L2INT       int                 /* Min 16 bit signed                */\r
-\r
-typedef struct\r
-{\r
-    L2UCHAR HDLCInQueue[Q921MAXHDLCSPACE];\r
-    L2UCHAR vs;\r
-    L2UCHAR vr;\r
-    int state;\r
-}Q921Data;\r
-\r
-void Q921Init();\r
-void Q921SetHeaderSpace(int hspace);\r
-void Q921SetTx21CB(int (*callback)(int dev, L2UCHAR *, int));\r
-void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, int));\r
-int Q921QueueHDLCFrame(int trunk, L2UCHAR *b, int size);\r
-int Q921Rx12(long trunk);\r
-\r
-#endif\r
-\r
+/*****************************************************************************
+
+  FileName:     q921.h
+
+  Description:  Contains headers of a Q.921 protocol on top of the Comet 
+                Driver.
+
+                Most of the work required to execute a Q.921 protocol is 
+                taken care of by the Comet ship and it's driver. This layer
+                will simply configure and make use of these features to 
+                complete a Q.921 implementation.
+
+  Note:         This header file is the only include file that should be 
+                acessed by users of the Q.921 stack.
+
+  Interface:    The Q.921 stack contains 2 layers. 
+
+                -   One interface layer.
+                -   One driver layer.
+
+                The interface layer contains the interface functions required 
+                for a layer 3 stack to be able to send and receive messages.
+
+                The driver layer will simply feed bytes into the ship as
+                required and queue messages received out from the ship.
+
+                Q921TimeTick        The Q.921 like any other blackbox 
+                                    modules contains no thread by it's own
+                                    and must therefore be called regularly 
+                                    by an external 'thread' to do maintenance
+                                    etc.
+
+                Q921Rx32            Receive message from layer 3. Called by
+                                    the layer 3 stack to send a message.
+
+                Q921Tx23            Send a message to layer 3. 
+
+                OnQ921Error         Function called every if an error is 
+                                    deteceted.
+
+                OnQ921Log           Function called if logging is active.
+
+
+                <TODO> Maintenance/Configuration interface
+
+  Created:      27.dec.2000/JVB
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+
+*****************************************************************************/
+
+#ifndef _Q921
+#define _Q921
+
+#define Q921MAXTRUNK 4
+#define Q921MAXHDLCSPACE 3000
+
+/*****************************************************************************
+
+       Some speed optimization can be achieved by changing all variables to the 
+       word size of your processor. A 32 bit processor have to do a lot of extra 
+       work to read a packed 8 bit integer. Changing all fields to 32 bit integer 
+       will ressult in usage of some extra space, but speed up the stack.
+
+       The stack have been designed to allow L3UCHAR etc. to be any size of 8 bit
+       or larger.
+
+*****************************************************************************/
+
+#define L2UCHAR                unsigned char           /* Min 8 bit                                            */
+#define L2INT       int                 /* Min 16 bit signed                */
+
+typedef struct
+{
+    L2UCHAR HDLCInQueue[Q921MAXHDLCSPACE];
+    L2UCHAR vs;
+    L2UCHAR vr;
+    int state;
+}Q921Data;
+
+void Q921Init();
+void Q921SetHeaderSpace(int hspace);
+void Q921SetTx21CB(int (*callback)(int dev, L2UCHAR *, int));
+void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, int));
+int Q921QueueHDLCFrame(int trunk, L2UCHAR *b, int size);
+int Q921Rx12(long trunk);
+
+#endif
+
index 04697bedc512b4b0a28d1ba4da872a7aec5d501e..247937e97dcfe83fcea92a47dc0e335aee00152a 100644 (file)
-/******************************************************************************\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
-#ifdef _MSC_VER\r
-#pragma warning(disable:4100)\r
-#endif\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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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
-    L3INT           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, L3USHORT iTimer);\r
-L3INT  Q931StopTimer(Q931_TrunkInfo *pTrunk, L3INT callindex, L3USHORT 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
+/******************************************************************************
+
+  FileName:         Q931.h
+
+  Contents:         Header and definition for the ITU-T Q.931 stack. The 
+                                       header contents the following parts:
+
+                                       - Definition of codes
+                    - Definition of information elements (Q931ie_).
+                    - Definition of messages (Q931mes_).
+                    - Definitian of variables (var_).
+                                       - Function prototypes.
+
+  Description:         The Q.931 stack provided here covers ITU-T Q.931 w/Q.932
+                                       supplementary services for both PRI, BRI and variants. 
+                                       The stack is generic and designed to deal with variants as
+                                       needed.
+
+                                       The stack uses the following interface functions:
+
+                                       - Q931Initialize        Initialize the Q.931 stack.
+                                       - Q931Rx23                      Receive a message from layer 2
+                                       - Q931Tx32                      Send a message to layer 2
+                                       - Q931Rx43                      Receive a message from layer 4 or above.
+                                       - Q931Tx34                      Send a message to layer 4 or above.
+                                       - Q931TimeTick          Periodical timer processing.
+                                       - Q931ErrorProc         Callback for stack error message.
+
+                                       The protocol is a module with no external dependencies and
+                                       can easely be ported to any operating system like Windows,
+                                       Linux, rtos and others.
+
+  Related Files:       Q931.h                          Q.931 Definitions
+                                       Q931.c                          Q.931 Interface Functions.
+                                       Q931api.c                       Low level L4 API functions.
+
+                                       Q932.h                          Q.932 Suplementary Services
+                                       Q932mes.c                       Q.932 encoders/coders
+
+                                       Q931mes.c                       Q.931 Message encoders/coders
+                                       Q931ie.c                        Q.931 IE encoders/coders
+                                       Q931StateTE.c           Generic Q.931 TE State Engine
+                                       Q931StateNT.c           Generic Q.931 NT State Engine
+
+  Design Note 1:       For each variant please add separate files starting with 
+                                       the     variant short-name as follows:
+
+                                       <variant>.h                     Spesific headers needed.
+                                       <variant>mes.c          Message encoders/decores.
+                                       <variant>ie.c           IE encoders/decoders.
+                                       <variant>StateTE.c      TE side state engine.
+                                       <variant>StateNT.c      NT side state engine.
+
+  Design Note 2:       The stack is deliberatly made non-threading. Use 1 
+                                       thread per Trunk, but lock access from the timertick
+                                       and rx, tx functions. And make sure the callbacks only
+                                       dump messages to a queue, no time-consuming processing
+                                       inside stack processing. 
+
+                                       All stack processing is async 'fire and forget', meaning
+                                       that there are not, and should not be any time-consuming
+                                       processing within the stack-time. The best way to thread 
+                                       a stack is to use one single thread that signal 5 queues.
+                                       
+                                       - Incoming L2 queue.
+                                       - Incoming L4 queue.
+                                       - Outgoing L2 queue.
+                                       - Outgoing L4 queue.
+                                       - Error/Trace queue.
+
+  Design Note 3:       DSP optimization. The L3 (Rx23) can be called directly
+                                       from a hdlc receiver without usage of queues for optimized 
+                                       processing. But keep in mind that Q.931 calls Tx34 or Tx32 
+                                       as part of receiving a message from Layer 2.
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+******************************************************************************/
+
+#ifndef _Q931_NL
+#define _Q931_NL
+
+/* uncomment the #define below to add x.25 support to the Q.931                                */
+/* #define Q931_X25_SUPPORT */
+
+#include "stdio.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable:4100)
+#endif
+
+/*****************************************************************************
+
+  Error Codes
+
+*****************************************************************************/
+#define Q931E_NO_ERROR                                 0
+#define Q931E_UNKNOWN_MESSAGE                  -3001
+#define Q931E_ILLEGAL_IE                               -3002
+#define Q931E_UNKNOWN_IE                               -3003
+#define Q931E_BEARERCAP                                        -3004
+#define Q931E_HLCOMP                                   -3005
+#define Q931E_LLCOMP                                   -3006
+#define Q931E_INTERNAL                  -3007
+#define Q931E_MISSING_CB                -3008
+#define Q931E_UNEXPECTED_MESSAGE        -3009
+#define Q931E_ILLEGAL_MESSAGE                  -3010
+#define Q931E_TOMANYCALLS               -3011
+#define Q931E_INVALID_CRV               -3012
+#define Q931E_CALLID                    -3013
+#define Q931E_CALLSTATE                 -3014
+#define Q931E_CALLEDSUB                 -3015
+#define Q931E_CALLEDNUM                 -3016
+#define Q931E_CALLINGNUM                -3017
+#define Q931E_CALLINGSUB                -3018
+#define Q931E_CAUSE                     -3019
+#define Q931E_CHANID                    -3020
+#define Q931E_DATETIME                  -3021
+#define Q931E_DISPLAY                   -3022
+#define Q931E_KEYPADFAC                 -3023
+#define Q931E_NETFAC                    -3024
+#define Q931E_NOTIFIND                  -3025
+#define Q931E_PROGIND                   -3026
+#define Q931E_RESTARTIND                -3027
+#define Q931E_SEGMENT                   -3028
+#define Q931E_SIGNAL                    -3029
+
+/*****************************************************************************
+
+       Some speed optimization can be achieved by changing all variables to the 
+       word size of your processor. A 32 bit processor have to do a lot of extra 
+       work to read a packed 8 bit integer. Changing all fields to 32 bit integer 
+       will ressult in usage of some extra space, but speed up the stack.
+
+       The stack have been designed to allow L3UCHAR etc. to be any size of 8 bit
+       or larger.
+
+*****************************************************************************/
+
+#define L3UCHAR                unsigned char           /* Min 8 bit                                            */
+#define L3USHORT       unsigned short          /* Min 16 bit unsigned                          */
+#define L3UINT         unsigned int            /* Min 16 bit unsigned              */
+#define L3INT       int                 /* Min 16 bit signed                */
+#define L3ULONG                unsigned long           /* Min 32 bit                                           */
+#define L3BOOL      char                               /* Min 1 bit, valuse 0 & 1 only         */
+
+#define L3TRUE      1
+#define L3FALSE     0 
+
+/*****************************************************************************
+       
+       MAXTRUNKS sets how many physical trunks this system might have. This 
+       number should be keept at a minimum since it will use global space.
+
+       It is recommended that you leave MAXCHPERTRUNK as is
+
+*****************************************************************************/
+
+#define Q931L4BUF  1000             /* size of message buffer               */
+
+#define Q931L2BUF      300                             /* size of message buffer                               */
+
+#define Q931MAXTRUNKS  1                       /* Total number of trunks that will be  */
+                                                                       /* processed by this instance of the    */
+                                                                       /* stack                                                                */
+
+#define Q931MAXCHPERTRUNK      32              /* Number of channels per trunk. The    */
+                                                                       /* stack uses a static set of 32                */
+                                                                       /* channels regardless if it is E1, T1  */
+                                                                       /* or BRI that actually is used.                */
+
+#define Q931MAXCALLPERTRUNK (Q931MAXCHPERTRUNK * 2)
+                                    /* Number of max active CRV per trunk.  */
+                                                                       /* Q.931 can have more calls than there */
+                                                                       /* are channels.                                                */
+
+/*****************************************************************************
+
+  The following defines control the dialect switch tables and should only be
+  changed when a new dialect needs to be inserted into the stack.   
+
+  This stack uses an array of functions to know which function to call as   
+  it receives a SETUP message etc. A new dialect can when schoose to use
+  the proc etc for standard Q.931 or insert a modified proc.
+
+  This technique has also been used to distinguish between user and network
+  mode to make the code as easy to read and maintainable as possible.
+
+  A message and IE index have been used to save space. These indexes allowes
+  the message or IE code to be used directly and will give back a new index
+  into the table.
+
+*****************************************************************************/
+
+/* WARNING! Initialize Q931CreateDialectCB[] will NULL when increasing the  */
+/* Q931MAXDLCT value to avoid Q931Initialize from crashing if one entry is  */
+/* not used.                                                                                                                           */
+#define Q931MAXDLCT 2               /* Max dialects included in this        */
+                                    /* compile. User and Network count as   */
+                                    /* one dialect each.                    */
+
+
+#define Q931MAXMES  255             /* Number of messages                   */
+
+#define Q931MAXIE  255              /* Number of IE                         */
+
+#define Q931MAXSTATE 100                       /* Size of state tables                                 */
+
+/*****************************************************************************
+
+  Call States for ITU-T Q.931 TE (User Mode)
+
+*****************************************************************************/
+
+#define Q931_U0     0
+#define Q931_U1     1
+#define Q931_U2     2
+#define Q931_U3     3
+#define Q931_U4     4
+#define Q931_U6     6
+#define Q931_U7     7
+#define Q931_U8     8
+#define Q931_U9     9
+#define Q931_U10    10
+#define Q931_U11    11
+#define Q931_U12    12
+#define Q931_U15    15
+#define Q931_U17    17
+#define Q931_U19    19
+#define Q931_U25    25
+
+/*****************************************************************************
+
+  Call States for ITU-T Q.931 NT (Network Mode)
+
+*****************************************************************************/
+#define Q931_N0     (0x0100 | 0)
+#define Q931_N1     (0x0100 | 1)
+#define Q931_N2     (0x0100 | 2)
+#define Q931_N3     (0x0100 | 3)
+#define Q931_N4     (0x0100 | 4)
+#define Q931_N6     (0x0100 | 6)
+#define Q931_N7     (0x0100 | 7)
+#define Q931_N8     (0x0100 | 8)
+#define Q931_N9     (0x0100 | 9)
+#define Q931_N10     (0x0100 | 11)
+#define Q931_N11     (0x0100 | 11)
+#define Q931_N12     (0x0100 | 12)
+#define Q931_N15     (0x0100 | 15)
+#define Q931_N17     (0x0100 | 17)
+#define Q931_N19     (0x0100 | 19)
+#define Q931_N22     (0x0100 | 22)
+#define Q931_N25     (0x0100 | 25)
+
+/*****************************************************************************
+
+  Q.931 Message codes
+  
+*****************************************************************************/
+
+#define Q931mes_ALERTING             0x01 /* 0000 0001                   */        
+#define Q931mes_CALL_PROCEEDING      0x02 /* 0000 0010                   */
+#define Q931mes_CONNECT              0x07 /* 0000 0111                   */
+#define Q931mes_CONNECT_ACKNOWLEDGE  0x0f /* 0000 1111                   */
+#define Q931mes_PROGRESS             0x03 /* 0000 0011                   */
+#define Q931mes_SETUP                0x05 /* 0000 0101                   */
+#define Q931mes_SETUP_ACKNOWLEDGE    0x0d /* 0000 1101                   */
+#define Q931mes_RESUME               0x26 /* 0010 0110                   */
+#define Q931mes_RESUME_ACKNOWLEDGE   0x2e /* 0010 1110                   */
+#define Q931mes_RESUME_REJECT        0x22 /* 0010 0010                   */
+#define Q931mes_SUSPEND              0x25 /* 0010 0101                   */
+#define Q931mes_SUSPEND_ACKNOWLEDGE  0x2d /* 0010 1101                   */
+#define Q931mes_SUSPEND_REJECT       0x21 /* 0010 0001                   */
+#define Q931mes_USER_INFORMATION     0x20 /* 0010 0000                   */
+#define Q931mes_DISCONNECT           0x45 /* 0100 0101                   */
+#define Q931mes_RELEASE              0x4d /* 0100 1101                   */
+#define Q931mes_RELEASE_COMPLETE     0x5a /* 0101 1010                   */
+#define Q931mes_RESTART              0x46 /* 0100 0110                   */
+#define Q931mes_RESTART_ACKNOWLEDGE  0x4e /* 0100 1110                   */
+#define Q931mes_CONGESTION_CONTROL   0x79 /* 0111 1001                   */
+#define Q931mes_INFORMATION          0x7a /* 0111 1011                   */
+#define Q931mes_NOTIFY               0x6e /* 0110 1110                   */
+#define Q931mes_STATUS               0x7d /* 0111 1101                   */
+#define Q931mes_STATUS_ENQUIRY       0x75 /* 0111 0101                   */
+#define Q931mes_SEGMENT              0x60 /* 0110 0000                   */
+
+
+/* Single octet information elements                                */
+#define Q931ie_SHIFT                            0x90 /* 1001 ----       */
+#define Q931ie_MORE_DATA                        0xa0 /* 1010 ----       */
+#define Q931ie_SENDING_COMPLETE                 0xa1 /* 1010 0000       */
+#define Q931ie_CONGESTION_LEVEL                 0xb0 /* 1011 ----       */
+#define Q931ie_REPEAT_INDICATOR                 0xd0 /* 1101 ----       */
+
+/* Variable Length Information Elements */
+#define Q931ie_SEGMENTED_MESSAGE                0x00 /* 0000 0000       */
+#define Q931ie_BEARER_CAPABILITY                0x04 /* 0000 0100       */
+#define Q931ie_CAUSE                            0x08 /* 0000 1000       */
+#define Q931ie_CALL_IDENTITY                    0x10 /* 0001 0000       */
+#define Q931ie_CALL_STATE                       0x14 /* 0001 0100       */
+#define Q931ie_CHANNEL_IDENTIFICATION           0x18 /* 0001 1000       */
+#define Q931ie_PROGRESS_INDICATOR               0x1e /* 0001 1110       */
+#define Q931ie_NETWORK_SPECIFIC_FACILITIES      0x20 /* 0010 0000       */
+#define Q931ie_NOTIFICATION_INDICATOR           0x27 /* 0010 0111       */
+#define Q931ie_DISPLAY                          0x28 /* 0010 1000       */
+#define Q931ie_DATETIME                         0x29 /* 0010 1001       */
+#define Q931ie_KEYPAD_FACILITY                  0x2c /* 0010 1100       */
+#define Q931ie_SIGNAL                           0x34 /* 0011 0100       */
+#define Q931ie_SWITCHOOK                        0x36 /* 0011 0110       */
+#define Q931ie_FEATURE_ACTIVATION               0x38 /* 0011 1000       */
+#define Q931ie_FEATURE_INDICATION               0x39 /* 0011 1001       */
+#define Q931ie_INFORMATION_RATE                 0x40 /* 0100 0000       */
+#define Q931ie_END_TO_END_TRANSIT_DELAY         0x42 /* 0100 0010       */
+#define Q931ie_TRANSIT_DELAY_SELECTION_AND_IND  0x43 /* 0100 0011       */
+#define Q931ie_PACKED_LAYER_BIMARY_PARAMETERS   0x44 /* 0100 0100       */
+#define Q931ie_PACKED_LAYER_WINDOW_SIZE         0x45 /* 0100 0101       */
+#define Q931ie_PACKED_SIZE                      0x46 /* 0100 0110       */
+#define Q931ie_CALLING_PARTY_NUMBER             0x6c /* 0110 1100       */
+#define Q931ie_CALLING_PARTY_SUBADDRESS         0x6d /* 0110 1101       */
+#define Q931ie_CALLED_PARTY_NUMBER              0x70 /* 0111 0000       */
+#define Q931ie_CALLED_PARTY_SUBADDRESS          0x71 /* 0111 0001       */
+#define Q931ie_REDIRECTING_NUMBER               0x74 /* 0111 0100       */
+#define Q931ie_TRANSIT_NETWORK_SELECTION        0x78 /* 0111 1000       */
+#define Q931ie_RESTART_INDICATOR                0x79 /* 0111 1001       */
+#define Q931ie_LOW_LAYER_COMPATIBILITY          0x7c /* 0111 1100       */
+#define Q931ie_HIGH_LAYER_COMPATIBILITY         0x7d /* 0111 1101       */
+#define Q931ie_USER_USER                        0x7e /* 0111 1110       */
+#define Q931ie_ESCAPE_FOR_EX                    0x7f /* 0111 1111       */
+
+/*****************************************************************************
+
+  Global defines.
+
+*****************************************************************************/
+
+typedef L3USHORT ie;                /* Special data type to hold a dynamic  */
+                                    /* or optional information element as   */
+                                    /* part of a message struct. MSB = 1    */
+                                    /* indicate that the ie is present, the */
+                                    /* last 15 bits is an offset ( or the   */
+                                    /* value for single octet ) to the      */
+                                    /* struct holding the ie. Offset = 0    */
+                                    /* is buf[1] etc.                       */
+                                    /* ie == 0xffff indicate error          */
+
+/*****************************************************************************
+
+  Struct:        Q931ie_BearerCap
+
+  Description:   Bearer Capability Information Element.
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00000100 for Bearer Capability       */
+    L3UCHAR Size;                   /* Length of Information Element        */
+
+    L3UCHAR CodStand;               /* Coding Standard.                     */
+                                    /*  00 - ITU-T                          */
+                                    /*  01 - ISO/IEC                        */
+                                    /*  10 - National standard              */
+                                    /*  11 - Network side spesific          */
+
+    L3UCHAR ITC;                    /* Information Transfer Capability      */
+                                    /*  00000 - Speech                      */
+                                    /*  01000 - Unrestricted digital info   */
+                                    /*  01001 - Restricted digital info     */
+                                    /*  10000 - 3.1 kHz audio               */
+                                    /*  10001 - Unrestricted with tones     */
+                                    /*  11000 - Video                       */
+
+    L3UCHAR TransMode;              /* Transfer Mode.                       */
+                                    /*  00 - Circuit mode                   */
+                                    /*  10 - Packet mode                    */
+
+    L3UCHAR ITR;                    /* Information Transfer Rate.           */
+                                    /*  00000 - Packed mode                 */
+                                    /*  10000 - 64 kbit/s                   */
+                                    /*  10001 - 2 x 64 kbit/s               */
+                                    /*  10011 - 384 kbit/s                  */
+                                    /*  10101 - 1536 kbit/s                 */
+                                    /*  10111 - 1920 kbit/s                 */
+                                    /*  11000 - Multirat (64 kbit/s base)   */
+
+    L3UCHAR RateMul;                /* Rate Multiplier                      */
+
+    L3UCHAR Layer1Ident;                       /* Layer 1 Ident.                                               */
+
+    L3UCHAR UIL1Prot;               /* User Information Layer 1 Protocol    */
+                                                                       /*      00001 : ITU-T V.110, I.460 and X.30 */
+                                                                       /*  00010 : G.711 my-law                                */
+                                                                       /*  00011 : G.711 A-law                                 */
+                                                                       /*  00100 : G.721                                               */
+                                    /*  00101 : H.221 and H.242                                */
+                                                                       /*  00110 : H.223 and H.245                             */
+                                                                       /*  00111 : Non ITU-T Standard                  */
+                                                                       /*  01000 : ITU-T V.120                                 */
+                                                                       /*  01001 : ITU-T X.31 HDLC flag stuff. */
+
+    L3UCHAR SyncAsync;              /* Sync/Async                           */
+                                                                       /*      0 : Syncronous data                                     */
+                                                                       /*      1 : Asyncronous data                            */
+
+    L3UCHAR Negot;                                     /* Negotiation                                                  */
+                                                                       /*      0 : In-band negotiation not possib.     */
+                                                                       /*  1 : In-band negotiation possible    */
+
+    L3UCHAR UserRate;                          /* User rate                                                    */
+                                                                       /*      00000 : I.460, V.110, X,30                      */
+                                                                       /*  00001 : 0.6 kbit/s x.1                              */
+                                                                       /*  00010 : 1.2 kbit/s                                  */
+                                                                       /*  00011 : 2.4 kbit/s                                  */
+                                                                       /*  00100 : 3.6 kbit/s                                  */
+                                                                       /*  00101 : 4.8 kbit/s                                  */
+                                                                       /*  00110 : 7.2 kbit/s                                  */
+                                                                       /*  00111 : 8 kbit/s I.460                              */
+                                                                       /*  01000 : 9.6 kbit/s                                  */
+                                                                       /*  01001 : 14.4 kbit/s                                 */
+                                                                       /*  01010 : 16 kbit/s                                   */
+                                                                       /*  01011 :     19.2 kbit/s                                     */
+                                                                       /*  01100 : 32 kbit/s                                   */
+                                                                       /*  01101 : 38.4 kbit/s                                 */
+                                                                       /*  01110 : 48 kbit/s                                   */
+                                                                       /*  01111 : 56 kbit/s                                   */
+                                                                       /*  10000 : 57.6 kbit/s                                 */
+                                                                       /*  10010 : 28.8 kbit/s                                 */
+                                                                       /*  10100 : 24 kbit/s                                   */
+                                                                       /*  10101 : 0.1345 kbit/s                               */
+                                                                       /*  10110 : 0.100 kbit/s                                */
+                                                                       /*  10111 : 0.075/1.2 kbit/s                    */
+                                                                       /*  11000 : 1.2/0.075/kbit/s                    */
+                                                                       /*  11001 : 0.050 kbit/s                                */
+                                                                       /*  11010 : 0.075 kbit/s                                */
+                                                                       /*  11011 : 0.110 kbit/s                                */
+                                                                       /*  11100 : 0.150 kbit/s                                */
+                                                                       /*  11101 : 0.200 kbit/s                                */
+                                                                       /*  11110 : 0.300 kbit/s                                */
+                                                                       /*  11111 : 12 kbit/s                                   */
+
+    L3UCHAR InterRate;              /* Intermediate Rate                    */
+                                                                       /*      00 : Not used                                           */
+                                                                       /*  01 : 8 kbit/s                                               */
+                                                                       /*  10 : 16 kbit/s                                              */
+                                                                       /*  11 : 32 kbit/s                                              */
+
+    L3UCHAR NIConTx;                           /* Network Indepentend Clock on transmit*/
+                                                                       /*      0 : Not required to send data  clc  */
+                                                                       /*  1 : Send data w/NIC clc                             */
+
+    L3UCHAR NIConRx;                           /* NIC on Rx                                                    */
+                                                                       /*      0 : Cannot accept indep. clc            */
+                                                                       /*  1 : data with indep. clc accepted   */
+
+    L3UCHAR FlowCtlTx;              /* Flow control on Tx                   */
+                                                                       /*  0 : Send Flow ctrl not required             */
+                                                                       /*  1 : Send flow ctrl required                 */
+
+    L3UCHAR FlowCtlRx;              /* Flow control on Rx                   */
+                                                                       /*  0 : cannot use receive flow ctrl    */
+                                                                       /*  1 : Receive flow ctrl accepted              */
+    L3UCHAR HDR;                                       /* HDR/No HDR                                                   */
+    L3UCHAR MultiFrame;             /* Multi frame support                  */
+                                                                       /*  0 : multiframe not supported                */
+                                                                       /*  1 : multiframe supported                    */
+
+    L3UCHAR Mode;                                      /* Mode of operation                                    */
+                                                                       /*      0 : bit transparent mode of operat.     */
+                                                                       /*      1 : protocol sesitive mode of op.       */
+
+    L3UCHAR LLInegot;                          /* Logical link id negotiation (oct. 5b)*/
+                                                                       /*  0 : default LLI=256 only                    */
+                                                                       /*  1 : Full protocol negotiation               */
+
+    L3UCHAR Assignor;               /* Assignor/assignee                    */
+                                                                       /*  0 : Default Asignee                                 */
+                                                                       /*  1 : Assignor only                                   */
+
+    L3UCHAR InBandNeg;              /* In-band/out-band negot.              */
+                                                                       /*  0 : negot done w/ USER INFO mes             */
+                                                                       /*  1 : negot done in-band w/link zero  */
+
+    L3UCHAR NumStopBits;            /* Number of stop bits                                     */
+                                                                       /*  00 : Not used                                               */
+                                                                       /*  01 : 1 bit                                                  */
+                                                                       /*  10 : 1.5 bits                                               */
+                                                                       /*  11 : 2 bits                                                 */
+
+    L3UCHAR NumDataBits;            /* Number of data bits.                 */
+                                                                       /*  00 : not used                                               */
+                                                                       /*  01 : 5 bits                                                 */
+                                                                       /*  10 : 7 bits                                                 */
+                                                                       /*  11 : 8 bits                                                 */
+
+    L3UCHAR Parity;                                    /* Parity Information                                   */
+                                                                       /*      000 : Odd                                                       */
+                                                                       /*  010 : Even                                                  */
+                                                                       /*  011 : None                                                  */
+                                                                       /*  100 : Forced to 0                                   */
+                                                                       /*  101 : Forced to 1                                   */
+
+    L3UCHAR DuplexMode;                                /* Mode duplex                                                  */
+                                                                       /*  0 : Half duplex                                             */
+                                                                       /*  1 : Full duplex                                             */
+
+    L3UCHAR ModemType;                         /* Modem type, see Q.931 p 64                   */
+
+    L3UCHAR Layer2Ident;                       /* Layer 2 Ident                                                */
+
+    L3UCHAR UIL2Prot;               /* User Information Layer 2 Protocol    */
+                                                                       /*      00010 : Q.921/I.441                                     */
+                                                                       /*  00110 : X.25                                                */
+                                                                       /*  01100 : LAN logical link                    */
+
+    L3UCHAR Layer3Ident;            /* Layer 3 ident.                                          */
+
+    L3UCHAR UIL3Prot;               /* User Information Layer 3 Protocol    */
+                                                                       /*      00010 : Q.931                                           */
+                                                                       /*  00110 : X.25                                                */
+                                                                       /*  01011 : ISO/IEC TR 9577                             */
+
+    L3UCHAR AL3Info1;                          /* additional layer 3 info 1                    */
+
+    L3UCHAR AL3Info2;                          /* additional layer 3 info 2                    */
+}Q931ie_BearerCap;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_CallID
+
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00010000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CallId[1];                         /* Call identity                        */
+}Q931ie_CallID;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_CallState
+
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00010100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CodStand;               /* Coding Standard                      */
+    L3UCHAR CallState;              /* Call State Value                     */
+}Q931ie_CallState;
+
+/*****************************************************************************
+
+  Struct:              Q931ie_Cause
+
+  Description: Cause IE as described in Q.850
+
+*****************************************************************************/
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00010100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CodStand;               /* Coding Standard                      */
+       L3UCHAR Location;                               /* Location                                                             */
+       L3UCHAR Recom;                                  /* Recommendation                                               */
+       L3UCHAR Value;                                  /* Cause Value                                                  */
+       L3UCHAR Diag[1];                                /* Optional Diagnostics Field                   */
+}Q931ie_Cause;
+
+/*****************************************************************************
+
+  Struct:        Q931ie_CalledNum
+
+*****************************************************************************/
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01110000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR TypNum;                 /* Type of Number                       */
+    L3UCHAR NumPlanID;              /* Numbering plan identification        */
+    L3UCHAR Digit[1];                          /* Digit (IA5)                          */
+}Q931ie_CalledNum;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_CalledSub
+
+  Description:  Called party subaddress
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01110001                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR TypNum;                 /* Type of subaddress                   */
+    L3UCHAR OddEvenInd;             /* Odd/Even indicator                   */
+    L3UCHAR Digit[1];                          /* digits                               */
+}Q931ie_CalledSub;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_CallingNum
+
+  Description:  Calling party number
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01101100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR TypNum;                 /* Type of number                       */
+    L3UCHAR NumPlanID;              /* Numbering plan identification        */
+    L3UCHAR PresInd;                /* Presentation indicator               */
+    L3UCHAR ScreenInd;              /* Screening indicator                  */
+    L3UCHAR Digit[1];                          /* Number digits (IA5)                  */
+}Q931ie_CallingNum;
+
+/*****************************************************************************
+
+  Struct:        Q931ie_CallingSub
+
+  Description:   Calling party subaddress
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01101101                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR TypNum;                 /* Type of subaddress                   */
+    L3UCHAR OddEvenInd;             /* Odd/Even indicator                   */
+    L3UCHAR Digit[1];                          /* digits                               */
+}Q931ie_CallingSub;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_ChanID
+
+  Description:  Channel identification
+
+                               Channel Identificationis one of the IE elements that differ
+                               between BRI and PRI. IntType = 1 = BRI and ChanSlot is used
+                               for channel number, while InfoChanSel is used for BRI.
+
+                               ChanID is one of the most important IE as it is passed  
+                               either though SETUP or CALL PROCEEDING to select the channel
+                               to be used.
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00011000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR IntIDPresent;           /* Int. id. present                     */
+    L3UCHAR IntType;                /* Interface Type                       */
+                                                                       /*      0 : Basic Interface     (BRI)                   */
+                                                                       /*  1 : Other interfaces, PRI etc.              */
+
+    L3UCHAR PrefExcl;               /* Pref./Excl.                          */
+                                                                       /*      0 : Indicated channel is preffered      */
+                                                                       /*  1 : Exclusive, no other accepted    */
+
+    L3UCHAR DChanInd;               /* D-channel ind.                       */
+                                                                       /*  0 : chan is NOT D chan.                             */
+                                                                       /*  1 : chan is D chan                                  */
+
+    L3UCHAR InfoChanSel;            /* Info. channel selection              */
+                                                                       /*  00 : No channel                                             */
+                                                                       /*  01 : B1 channel                                             */
+                                                                       /*  10 : B2 channel                                             */
+                                                                       /*  11 : Any channel                                    */
+
+    L3UCHAR InterfaceID;            /* Interface identifier                 */
+
+    L3UCHAR CodStand;                  /* Code standard                        */
+                                                                       /*  00 : ITU-T standardization coding   */
+                                                                       /*  01 : ISO/IEC Standard                               */
+                                                                       /*  10 : National Standard                              */
+                                                                       /*  11 : Standard def. by network.              */
+
+    L3UCHAR NumMap;                 /* Number/Map                           */
+                                                                       /*  0 : chan is in following octet              */
+                                                                       /*  1 : chan is indicated by slot map   */
+
+    L3UCHAR ChanMapType;            /* Channel type/Map element type        */
+                                                                       /*  0011 : B Channel units                              */
+                                                                       /*  0110 : H0 channel units                             */
+                                                                       /*  1000 : H11 channel units                    */
+                                                                       /*  1001 : H12 channel units                    */
+
+    L3UCHAR ChanSlot;               /* Channel number                                          */
+}Q931ie_ChanID;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_DateTime
+
+  Description:  Date/time
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00101001                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR Year;                   /* Year                                 */
+    L3UCHAR Month;                  /* Month                                */
+    L3UCHAR Day;                    /* Day                                  */
+    L3UCHAR Hour;                   /* Hour                                 */
+    L3UCHAR Minute;                 /* Minute                               */
+    L3UCHAR Second;                 /* Second                               */
+       L3UCHAR Format;                                 /* Indicate presense of Hour, Min & sec */
+                                                                       /*      0 : Only Date                                           */
+                                                                       /*  1 : Hour present                                    */
+                                                                       /*  2 : Hour and Minute present                 */
+                                                                       /*  3 : Hour, Minute and Second present */
+}Q931ie_DateTime;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_Display
+
+  Description:  Display
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00101000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR Display[1];             /* Display information (IA5)            */
+}Q931ie_Display;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_HLComp
+
+  Description:  High layer compatibility
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01111101                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CodStand;               /* Coding standard                      */
+    L3UCHAR Interpret;              /* Interpretation                       */
+    L3UCHAR PresMeth;               /* Presentation methor of prot. profile */
+    L3UCHAR HLCharID;               /* High layer characteristics id.       */
+    L3UCHAR EHLCharID;              /* Extended high layer character. id.   */
+    L3UCHAR EVideoTlfCharID;        /* Ext. videotelephony char. id.        */
+}Q931ie_HLComp;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_KeypadFac
+
+  Description:  Keypad facility
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00101100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR KeypadFac[1];           /* dynamic buffer                       */
+}Q931ie_KeypadFac;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_LLComp
+
+  Description:  Low layer compatibility
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01111100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CodStand;               /* Coding standard                      */
+                                    /*  00 - ITU-T                          */
+                                    /*  01 - ISO/IEC                        */
+                                    /*  10 - National standard              */
+                                    /*  11 - Network side spesific          */
+
+    L3UCHAR ITransCap;              /* Information transfer capability      */
+                                    /*  00000 - Speech                      */
+                                    /*  01000 - Unrestricted digital info   */
+                                    /*  01001 - Restricted digital info     */
+                                    /*  10000 - 3.1 kHz audio               */
+                                    /*  10001 - Unrestricted with tones     */
+                                    /*  11000 - Video                       */
+
+    L3UCHAR NegotInd;               /* Negot indic.                         */
+                                                                       /*      0 : Out-band neg. not possib.       */
+                                                                       /*  1 : Out-band neg. possible          */
+
+    L3UCHAR TransMode;              /* Transfer Mode                        */
+                                    /*  00 : Circuit Mode                   */
+                                    /*  10 : Packed Mode                    */
+
+    L3UCHAR InfoRate;               /* Information transfer rate            */
+                                    /*  00000 - Packed mode                 */
+                                    /*  10000 - 64 kbit/s                   */
+                                    /*  10001 - 2 x 64 kbit/s               */
+                                    /*  10011 - 384 kbit/s                  */
+                                    /*  10101 - 1536 kbit/s                 */
+                                    /*  10111 - 1920 kbit/s                 */
+                                    /*  11000 - Multirat (64 kbit/s base)   */
+
+    L3UCHAR RateMul;                /* Rate multiplier                      */
+    L3UCHAR Layer1Ident;            /* Layer 1 ident.                       */
+    L3UCHAR UIL1Prot;               /* User information layer 1 protocol    */
+                                                                       /*      00001 : ITU-T V.110, I.460 and X.30 */
+                                                                       /*  00010 : G.711 my-law                                */
+                                                                       /*  00011 : G.711 A-law                                 */
+                                                                       /*  00100 : G.721                                               */
+                                    /*  00101 : H.221 and H.242                                */
+                                                                       /*  00110 : H.223 and H.245                             */
+                                                                       /*  00111 : Non ITU-T Standard                  */
+                                                                       /*  01000 : ITU-T V.120                                 */
+                                                                       /*  01001 : ITU-T X.31 HDLC flag stuff. */
+
+    L3UCHAR SyncAsync;              /* Synch/asynch                         */
+                                                                       /*      0 : Syncronous data                                     */
+                                                                       /*      1 : Asyncronous data                            */
+
+    L3UCHAR Negot;                  /* Negot                                */
+                                                                       /*      0 : In-band negotiation not possib.     */
+                                                                       /*  1 : In-band negotiation possible    */
+
+    L3UCHAR UserRate;               /* User rate                            */
+                                                                       /*      00000 : I.460, V.110, X,30                      */
+                                                                       /*  00001 : 0.6 kbit/s x.1                              */
+                                                                       /*  00010 : 1.2 kbit/s                                  */
+                                                                       /*  00011 : 2.4 kbit/s                                  */
+                                                                       /*  00100 : 3.6 kbit/s                                  */
+                                                                       /*  00101 : 4.8 kbit/s                                  */
+                                                                       /*  00110 : 7.2 kbit/s                                  */
+                                                                       /*  00111 : 8 kbit/s I.460                              */
+                                                                       /*  01000 : 9.6 kbit/s                                  */
+                                                                       /*  01001 : 14.4 kbit/s                                 */
+                                                                       /*  01010 : 16 kbit/s                                   */
+                                                                       /*  01011 :     19.2 kbit/s                                     */
+                                                                       /*  01100 : 32 kbit/s                                   */
+                                                                       /*  01101 : 38.4 kbit/s                                 */
+                                                                       /*  01110 : 48 kbit/s                                   */
+                                                                       /*  01111 : 56 kbit/s                                   */
+                                                                       /*  10000 : 57.6 kbit/s                                 */
+                                                                       /*  10010 : 28.8 kbit/s                                 */
+                                                                       /*  10100 : 24 kbit/s                                   */
+                                                                       /*  10101 : 0.1345 kbit/s                               */
+                                                                       /*  10110 : 0.100 kbit/s                                */
+                                                                       /*  10111 : 0.075/1.2 kbit/s                    */
+                                                                       /*  11000 : 1.2/0.075/kbit/s                    */
+                                                                       /*  11001 : 0.050 kbit/s                                */
+                                                                       /*  11010 : 0.075 kbit/s                                */
+                                                                       /*  11011 : 0.110 kbit/s                                */
+                                                                       /*  11100 : 0.150 kbit/s                                */
+                                                                       /*  11101 : 0.200 kbit/s                                */
+                                                                       /*  11110 : 0.300 kbit/s                                */
+                                                                       /*  11111 : 12 kbit/s                                   */
+
+    L3UCHAR InterRate;              /* Intermediate rate                    */
+                                                                       /*      00 : Not used                                           */
+                                                                       /*  01 : 8 kbit/s                                               */
+                                                                       /*  10 : 16 kbit/s                                              */
+                                                                       /*  11 : 32 kbit/s                                              */
+
+    L3UCHAR NIConTx;                           /* Network Indepentend Clock on transmit*/
+                                                                       /*      0 : Not required to send data  clc  */
+                                                                       /*  1 : Send data w/NIC clc                             */
+
+    L3UCHAR NIConRx;                           /* NIC on Rx                                                    */
+                                                                       /*      0 : Cannot accept indep. clc            */
+                                                                       /*  1 : data with indep. clc accepted   */
+
+    L3UCHAR FlowCtlTx;              /* Flow control on Tx                   */
+                                                                       /*  0 : Send Flow ctrl not required             */
+                                                                       /*  1 : Send flow ctrl required                 */
+
+    L3UCHAR FlowCtlRx;              /* Flow control on Rx                   */
+                                                                       /*  0 : cannot use receive flow ctrl    */
+                                                                       /*  1 : Receive flow ctrl accepted              */
+    L3UCHAR HDR;                                       /* HDR/No HDR                                                   */
+    L3UCHAR MultiFrame;             /* Multi frame support                  */
+                                                                       /*  0 : multiframe not supported                */
+                                                                       /*  1 : multiframe supported                    */
+
+       L3UCHAR ModeL1;                                 /* Mode L1                                                              */
+                                                                       /*      0 : bit transparent mode of operat.     */
+                                                                       /*      1 : protocol sesitive mode of op.       */
+
+    L3UCHAR NegotLLI;               /* Negot. LLI                           */
+                                                                       /*  0 : default LLI=256 only                    */
+                                                                       /*  1 : Full protocol negotiation               */
+
+    L3UCHAR Assignor;               /* Assignor/Assignor ee                 */
+                                                                       /*  0 : Default Asignee                                 */
+                                                                       /*  1 : Assignor only                                   */
+
+    L3UCHAR InBandNeg;              /* In-band negot.                       */
+                                                                       /*  0 : negot done w/ USER INFO mes             */
+                                                                       /*  1 : negot done in-band w/link zero  */
+
+    L3UCHAR NumStopBits;            /* Number of stop bits                                     */
+                                                                       /*  00 : Not used                                               */
+                                                                       /*  01 : 1 bit                                                  */
+                                                                       /*  10 : 1.5 bits                                               */
+                                                                       /*  11 : 2 bits                                                 */
+
+    L3UCHAR NumDataBits;            /* Number of data bits.                 */
+                                                                       /*  00 : not used                                               */
+                                                                       /*  01 : 5 bits                                                 */
+                                                                       /*  10 : 7 bits                                                 */
+                                                                       /*  11 : 8 bits                                                 */
+
+    L3UCHAR Parity;                                    /* Parity Information                                   */
+                                                                       /*      000 : Odd                                                       */
+                                                                       /*  010 : Even                                                  */
+                                                                       /*  011 : None                                                  */
+                                                                       /*  100 : Forced to 0                                   */
+                                                                       /*  101 : Forced to 1                                   */
+
+    L3UCHAR DuplexMode;                                /* Mode duplex                                                  */
+                                                                       /*  0 : Half duplex                                             */
+                                                                       /*  1 : Full duplex                                             */
+
+    L3UCHAR ModemType;                         /* Modem type, see Q.931 p 89                   */
+
+    L3UCHAR Layer2Ident;            /* Layer 2 ident.                       */
+
+    L3UCHAR UIL2Prot;               /* User information layer 2 protocol    */
+                                    /*  00001 : Basic mode ISO 1745         */
+                                                                       /*      00010 : Q.921/I.441                                     */
+                                                                       /*  00110 : X.25 single link                    */
+                                    /*  00111 : X.25 multilink              */
+                                    /*  01000 : Extended LAPB T.71          */
+                                    /*  01001 : HDLC ARM                    */
+                                    /*  01010 : HDLC NRM                    */
+                                    /*  01011 : HDLC ABM                    */
+                                                                       /*  01100 : LAN logical link                    */
+                                    /*  01101 : X.75 SLP                    */
+                                    /*  01110 : Q.922                       */
+                                    /*  01111 : Q.922 core aspect           */
+                                    /*  10000 : User specified              */
+                                    /*  10001 : ISO/IEC 7776 DTE-DCE        */
+
+    L3UCHAR ModeL2;                 /* Mode                                 */
+                                                                       /*      01 : Normal Mode of operation           */
+                                                                       /*      10 : Extended mode of operation         */
+
+    L3UCHAR Q933use;                /* Q.9333 use                           */
+
+    L3UCHAR UsrSpcL2Prot;           /* User specified layer 2 protocol info */
+
+    L3UCHAR WindowSize;             /* Window size (k)                      */
+
+    L3UCHAR Layer3Ident;            /* Layer 3 ident                        */
+
+    L3UCHAR UIL3Prot;                          /* User Information Layer 3 protocol    */
+                                                                       /*      00010 : Q.931                                           */
+                                                                       /*  00110 : X.25                                                */
+                                    /*  00111 : 8208                        */
+                                    /*  01000 : X.233 ...                   */
+                                    /*  01001 : 6473                        */
+                                    /*  01010 : T.70                        */
+                                                                       /*  01011 : ISO/IEC TR 9577                             */
+                                    /*  10000 : User specified              */
+    L3UCHAR OptL3Info;              /* Optional Leyer 3 info                */
+
+    L3UCHAR ModeL3;                 /* Mode of operation                    */
+                                    /*  01 : Normal packed seq. numbering   */
+                                    /*  10 : Extended packed seq. numbering */
+
+    L3UCHAR DefPackSize;            /* Default packet size                  */
+
+    L3UCHAR PackWinSize;            /* Packet window size                   */
+
+    L3UCHAR AddL3Info;              /* Additional Layer 3 protocol info     */
+}Q931ie_LLComp;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_NetFac;
+
+  Description:  Network-specific facilities
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00100000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR LenNetID;               /* Length of network facilities id.     */
+    L3UCHAR TypeNetID;              /* Type of network identification       */
+    L3UCHAR NetIDPlan;              /* Network identification plan.         */
+    L3UCHAR NetFac;                 /* Network specific facility spec.      */
+    L3UCHAR NetID[1];               /* Network id. (IA5)                    */
+}Q931ie_NetFac;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_NotifInd;
+
+  Description:  Notification Indicator
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00100000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+       L3UCHAR Notification;                   /* Notification descriptor                              */
+}Q931ie_NotifInd;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_ProgInd
+
+  Description:  Progress indicator
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00011110                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CodStand;               /* Coding standard                      */
+    L3UCHAR Location;               /* Location                             */
+    L3UCHAR ProgDesc;               /* Progress description                 */
+}Q931ie_ProgInd;
+
+/*****************************************************************************
+
+  Struct;       Q931ie_Segment
+
+  Description:  Segmented message
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00000000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR FSI;                    /* First segment indicator              */
+    L3UCHAR NumSegRem;              /* Number of segments remaining         */
+    L3UCHAR SegType;                /* Segment message type                 */
+}Q931ie_Segment;
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00000000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+}Q931ie_SendComplete;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_Signal
+
+  Description:  Signal
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00000000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR Signal;                 /* Signal value                         */
+                                    /*  00000000    Dial tone on            */
+                                    /*  00000001    Ring back tone on       */
+                                    /*  00000010    Intercept tone on       */
+                                    /*  00000011    Network congestion on   */
+                                    /*  00000100    Busy tone on            */
+                                    /*  00000101    Confirm tone on         */
+                                    /*  00000110    Answer tone on          */
+                                    /*  00000111    Call waiting tone       */
+                                    /*  00001000    Off-hook warning tone   */
+                                    /*  00001001    Pre-emption tone on     */
+                                    /*  00111111    Tones off               */
+                                    /*  01000000    Alerting on - pattern 0 */
+                                    /*  01000001    Alerting on - pattern 1 */
+                                    /*  01000010    Alerting on - pattern 2 */
+                                    /*  01000011    Alerting on - pattern 3 */
+                                    /*  01000100    Alerting on - pattern 4 */
+                                    /*  01000101    Alerting on - pattern 5 */
+                                    /*  01000110    Alerting on - pattern 6 */
+                                    /*  01000111    Alerting on - pattern 7 */
+                                    /*  01001111    Alerting off            */
+}Q931ie_Signal;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_TransDelSelInd
+
+  description:  Transit delay selection and indication
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 00000000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3ULONG TxDSIValue;             /* Trans. delay sel. & ind. value       */ 
+}Q931ie_TransDelSelInd;
+#endif
+
+/*****************************************************************************
+
+  Struct:       Q931ie_TransNetSel
+
+  Description:  Transit network selection
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01111000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR Type;                   /* Type of network identifier           */
+    L3UCHAR NetIDPlan;              /* Network idetification plan           */
+    L3UCHAR NetID[1];               /* Network identification(IA5)          */
+}Q931ie_TransNetSel;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_UserUser
+
+  Description:  User-user
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01111110                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR ProtDisc;               /* Protocol discriminator               */
+    L3UCHAR User[1];                /* User information                     */
+}Q931ie_UserUser;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_ClosedUserGrp
+
+  Description:  Closed user group
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01000111                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR CUGInd;                 /* CUG indication                       */
+    L3UCHAR CUG[1];                 /* CUG index code (IA5)                 */
+}Q931ie_ClosedUserGrp;
+#endif
+
+/*****************************************************************************
+
+  Struct:              Q931ie_CongLevel
+
+  Description: Congestion Level
+
+*****************************************************************************/
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01000111                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+       L3UCHAR CongLevel;                              /* Conguestion Level                                    */
+}Q931ie_CongLevel;
+
+/*****************************************************************************
+
+  Struct:       Q931ie_EndEndTxDelay
+
+  Description:  End to end transit delay
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01000010                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3ULONG CumTxDelay;             /* Cumulative transit delay value       */
+    L3ULONG ReqTxDelay;             /* Requested end to end transit delay   */
+    L3ULONG MaxTxDelay;             /* Maximum transit delay                */
+}Q931ie_EndEndTxDelay;
+#endif
+
+/*****************************************************************************
+
+  Struct:       Q931ie_InfoRate
+
+  Description:  Information Rate
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01100000                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR InInfoRate;             /* Incoming information rate            */
+    L3UCHAR OutInfoRate;            /* Outgoing information rate            */
+    L3UCHAR MinInInfoRate;          /* Minimum incoming information rate    */
+    L3UCHAR MinOutInfoRate;         /* Minimum outgoing information rate    */
+}Q931ie_InfoRate;
+#endif
+
+/*****************************************************************************
+
+  Struct:       Q931ie_PackParam
+
+  Description:  Packed layer binary parameters
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01000100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR FastSel;                /* Fast selected                        */
+    L3UCHAR ExpData;                /* Exp. data                            */
+    L3UCHAR DelConf;                /* Delivery conf                        */
+    L3UCHAR Modulus;                /* Modulus                              */
+}Q931ie_PackParam;
+#endif
+
+/*****************************************************************************
+
+  Struct:       Q931ie_PackWinSize
+
+  Description:  Packed window size
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01000101                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR ForwardValue;           /* Forward value                        */
+    L3UCHAR BackwardValue;          /* Backward value                       */
+}Q931ie_PackWinSize;
+#endif
+
+/*****************************************************************************
+
+  Struct:       Q931ie_PackSize
+
+  Description:  Packet size
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01000110                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR ForwardValue;           /* Forward value                        */
+    L3UCHAR BackwardValue;          /* Backward value                       */
+}Q931ie_PackSize;
+#endif
+
+/*****************************************************************************
+
+  Struct:       Q931ie_RedirNum
+
+  Description:  Redirecting number
+
+*****************************************************************************/
+#ifdef Q931_X25_SUPPORT
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01110100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR TypeNum;                /* Type of number                       */
+    L3UCHAR NumPlanID;              /* Number plan identification           */
+    L3UCHAR PresInd;                /* Presentation indicator               */
+    L3UCHAR ScreenInd;              /* Screening indicator                  */
+    L3UCHAR Reason;                 /* Reason for redirection               */
+    L3UCHAR Digit[1];               /* Number digits (IA5)                  */
+}Q931ie_RedirNum;
+#endif
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01110100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR RepeatInd;              /* 0010 Prioritized list for selecting  */
+                                    /* one possible.                        */
+}Q931ie_RepeatInd;
+
+typedef struct
+{
+    L3UCHAR IEId;                   /* 01110100                             */
+    L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR Class;                  /* Class                                */
+                                    /*  000 Indicate channels               */
+                                    /*  110 Single interface                */
+                                    /*  111 All interfaces                  */
+}Q931ie_RestartInd;
+
+/*****************************************************************************
+
+  Struct:       Q931mes_Header
+
+  Description:  Used to read the header & message code.
+
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+}Q931mes_Header;
+
+/*****************************************************************************
+
+  Struct:       Q931mes_Generic
+
+  Description:  Generic header containing all IE's. This is not used, but is
+                               provided in case a proprietary variant needs it.
+
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+
+    ie              Shift;
+    ie              MoreData;
+    ie              SendComplete;
+    ie              CongestionLevel;
+    ie              RepeatInd;
+
+    ie              Segment;        /* Segmented message                    */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              Cause;          /* Cause                                */
+    ie              CallID;                    /* Call Identity                        */
+    ie              ChanID;         /* Channel Identification               */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              NetFac;         /* Network Spesific Facilities          */
+    ie              NotifInd;       /* Notification Indicator               */
+    ie              Display;        /* Display                              */
+    ie              DateTime;       /* Date/Time                            */
+    ie              KeypadFac;      /* Keypad Facility                      */
+    ie              Signal;         /* Signal                               */
+    ie              InfoRate;       /* Information rate                     */
+    ie              EndEndTxDelay;  /* End to End Transmit Delay            */
+    ie              TransDelSelInd; /* Transmit Delay Sel. and Ind.         */
+    ie              PackParam;      /* Packed Layer Binary parameters       */
+    ie              PackWinSize;    /* Packet Layer Window Size             */
+    ie              PackSize;       /* Packed Size                          */
+    ie              ClosedUserGrp;  /* Closed User Group                    */
+    ie              RevChargeInd;   /* Reverse Charging Indicator           */
+    ie              CalledNum;      /* Called Party Number                  */
+    ie              CalledSub;      /* Called Party subaddress              */
+    ie              CallingNum;     /* Calling Party Number                 */
+    ie              CallingSub;     /* Calling Party Subaddress             */
+    ie              RedirNum;       /* Redirection Number                   */
+    ie              TransNetSel;    /* Transmit Network Selection           */
+    ie              RestartInd;     /* Restart Indicator                    */
+    ie              LLComp;         /* Low Layer Compatibility              */
+    ie              HLComp;         /* High Layer Compatibility             */
+    ie              UserUser;       /* User-user                            */
+    ie              Escape;         /* Escape for extension                 */
+       L3UCHAR                 buf[1];                 /* Buffer for IE's                                              */
+
+}Q931mes_Generic;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Alerting
+
+  Description:   This message is send by the called party to indicate that
+                 the phone is ringing.
+
+                                The message consist of an header that MUST be identical with
+                                Q931mes_Header, a fixed number of IE flags w/offset, and
+                                a dynamic buffer storing normalized IE's.
+
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              ChanID;         /* Channel Identification               */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              Display;        /* Display                              */
+    ie              Signal;         /* Signal                               */
+    ie              HLComp;         /* High Layer Compatibility             */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Alerting;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_CallProceeding
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              ChanID;         /* Channel Identification               */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              Display;        /* Display                              */
+    ie              HLComp;         /* High Layer Compatibility             */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_CallProceeding;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Connect
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              ChanID;         /* Channel Identification               */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              Display;        /* Display                              */
+    ie              DateTime;       /* Date/Time                            */
+    ie              Signal;         /* Signal                               */
+    ie              LLComp;         /* Low Layer Compatibility              */
+    ie              HLComp;         /* High layer Compatibility             */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Connect;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_ConnectAck
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Display;        /* Display                              */
+    ie              Signal;         /* Signal                               */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_ConnectAck;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Disconnect
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Cause;          /* Cause                                */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              Display;        /* Display                              */
+    ie              Signal;         /* Signal                               */
+#ifdef Q931_X25_SUPPORT
+       ie              UserUser;       /* User - user. Packed Mode.            */
+#endif
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Disconnect;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Information
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              SendComplete;   /* Sending Complete                     */
+    ie              Display;        /* Display                              */
+    ie              KeypadFac;      /* Keypad facility                      */
+    ie              Signal;         /* Signal                               */
+    ie              CalledNum;      /* Called party number                  */
+#ifdef Q931_X25_SUPPORT
+    ie              Cause;          /* Cause (packed only)                  */
+#endif
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Information;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Notify
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              NotifInd;       /* Notification Indicator               */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Notify;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Progress
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              Cause;          /* Cause                                */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              Display;        /* Display                              */
+    ie              HLComp;         /* High Layer Compatibility             */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Progress;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Release
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Cause;          /* Cause                                */
+    ie              Display;        /* Display                              */
+    ie              Signal;         /* Signal                               */
+#ifdef Q931_X25_SUPPORT
+    ie              UserUser;       /* User-User packed mode                */
+#endif
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Release;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_ReleaseComplete
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Cause;          /* Cause                                */
+    ie              Display;        /* Display                              */
+    ie              Signal;         /* Signal                               */
+#ifdef Q931_X25_SUPPORT
+    ie              UserUser;       /* User-User packed mode                */
+#endif
+    L3UCHAR          buf[1];         /* Dynamic buffer                       */
+}Q931mes_ReleaseComplete;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Resume
+
+*****************************************************************************/
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              CallID;         /* Call Identity                        */
+       L3UCHAR                 buf[1];
+}Q931mes_Resume;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_ResumeAck
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              ChanID;         /* Channel ID                           */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_ResumeAck;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_ResumeReject
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Cause;          /* Cause                                */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_ResumeReject;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Segment
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Segment;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Setup
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              SendComplete;   /* Sending Complete                     */
+    ie              RepeatInd;      /* Repeat Indicator                     */
+    ie              BearerCap;      /* Bearer Capability                    */
+    ie              ChanID;         /* Channel ID                           */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              NetFac;         /* Network-specific facilities          */
+                                    /* Note:    Up to 4 NetFac's may be     */
+                                    /*          included.                   */
+    ie              Display;        /* Display                              */
+    ie              DateTime;       /* Date/Time                            */
+    ie              KeypadFac;      /* Keypad Facility                      */
+    ie              Signal;         /* Signal                               */
+    ie              CallingNum;     /* Calling party number                 */
+    ie              CallingSub;     /* Calling party sub address            */
+    ie              CalledNum;      /* Called party number                  */
+    ie              CalledSub;      /* Called party sub address             */
+    ie              TransNetSel;    /* Transit network selection            */
+    ie              LLRepeatInd;    /* Repeat Indicator 2 LLComp            */
+    ie              LLComp;         /* Low layer compatibility              */
+    ie              HLComp;         /* High layer compatibility             */
+
+#ifdef Q931_X25_SUPPORT
+    /* Packed mode additions */
+    ie              IndoRate;       /* Information Rate                     */
+    ie              EndEndDelay;    /* End-end transit delay                */
+    ie              TransDelayInd;  /* TRansit delay selection and ind.     */
+    ie              PackParam;      /* Packed layer binary parameters       */
+    ie              PackWinSize;    /* Packed layer window size             */
+    ie              PackSize;       /* Packet Size                          */
+    ie              ClosedUserGrp;  /* Closed User Group                    */
+    ie              RevChargInd;    /* Reverse charhing indicator           */
+    ie              RedirNum;       /* Redirection number                   */
+    ie              UserUser;       /* User-user.                           */
+#endif
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Setup;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_SetupAck
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              ChanID;         /* Channel ID                           */
+    ie              ProgInd;        /* Progress Indicator                   */
+    ie              Display;        /* Display                              */
+    ie              Signal;         /* Signal                               */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_SetupAck;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Status
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Cause;          /* Cause                                */
+    ie              CallState;      /* Call State                           */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Status;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_StatusEnquire
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_StatusEnquiry;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Suspend
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              CallID;         /* Call Identity                        */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Suspend;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_SuspendAck
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_SuspendAck;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_SuspendReject
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              Cause;          /* Cause                                */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_SuspendReject;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_CongestionControl
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              CongLevel;      /* Congestion level                     */
+    ie              Cause;          /* Cause                                */
+    ie              Display;        /* Display                              */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_CongestionControl;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_UserInformation
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              MoreData;       /* More data                            */
+    ie              UserUser;       /* User-user                            */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_UserInformation;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_Restart
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              ChanID;         /* Channel identification               */
+    ie              Display;        /* Display                              */
+    ie              RestartInd;     /* Restart indicator                    */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_Restart;
+
+/*****************************************************************************
+
+  Struct:        Q931mes_RestartAck
+
+*****************************************************************************/
+
+typedef struct
+{
+    L3UINT          Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3INT           CRV;            /* Call reference value                 */
+    ie              ChanID;         /* Channel identification               */
+    ie              Display;        /* Display                              */
+    ie              RestartWin;     /* Restart Window                       */
+    ie              RestartInd;     /* Restart Indicator                    */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q931mes_RestartAck;
+
+/*****************************************************************************
+
+  Struct:       Q931_TrunkInfo
+
+  Description:  TrunkInfo is the struct entry used to store Q.931 related 
+                information and state for E1/T1/J1 trunks and assosiated 
+                channels in the system. 
+
+                               The user should store this information outside this stack
+                               and need to feed the interface functions with a pointer to
+                               the trunk Info entry.
+
+*****************************************************************************/
+
+typedef struct
+{
+       enum _NetUser                                   /* Network/User Mode.                   */
+       {
+               Q931_TE=0,                  /*  0 : User Mode                       */
+        Q931_NT=1                   /*  1 : Network Mode                    */
+       }NetUser;
+
+    L3UCHAR     Dialect;            /* Q.931 Based dielact index.           */
+
+       enum _TrunkType                                 /* Trunk Line Type.                     */
+       {
+               Q931_TrType_E1=0,           /*  0 : E1 Trunk                        */
+        Q931_TrType_T1=1,           /*  1 : T1 Trunk                        */
+        Q931_TrType_J1=2,           /*  2 : J1 Trunk                        */
+        Q931_TrType_BRI=3           /*  3 : BRI Trunk                       */
+       }TrunkType;
+
+    L3UCHAR     Enabled;            /* Enabled/Disabled                     */
+                                    /*  0 = Disabled                        */
+                                    /*  1 = Enabled                         */
+
+       enum _TrState                                   /* Trunk State                                                  */
+       {
+               Q931_TrState_NoAlignment=0,     /* Trunk not aligned                                    */
+               Q931_TrState_Aligning=1,        /* Aligning in progress                                 */
+               Q931_TrState_Aligned=2          /* Trunk Aligned                                                */
+       }TrunkState;
+
+    L3INT       LastCRV;            /* Last used crv for the trunk.         */
+
+    L3UCHAR L3Buf[Q931L4BUF];          /* message buffer for messages to be    */
+                                    /* send from Q.931 L4.                  */
+
+    L3UCHAR L2Buf[Q931L2BUF];          /* buffer for messages send to L2.      */
+
+       /* The auto flags below switch on/off automatic Ack messages. SETUP ACK */
+       /* as an example can be send by the stack in response to SETUP to buy   */
+       /* time in processing on L4. Setting this to true will cause the stack  */
+       /* to automatically send this.                                                                                  */
+
+       L3BOOL  autoSetupAck;                   /* Indicate if the stack should send    */
+                                                                       /* SETUP ACK or not. 0=No, 1 = Yes.             */
+
+       L3BOOL  autoConnectAck;                 /* Indicate if the stack should send    */
+                                                                       /* CONNECT ACT or not. 0=No, 1=Yes.             */
+
+       L3BOOL  autoRestartAck;                 /* Indicate if the stack should send    */
+                                                                       /* RESTART ACK or not. 0=No, 1=Yes.             */
+
+    /* channel array holding info per channel. Usually defined to 32           */
+       /* channels to fit an E1 since T1/J1 and BRI will fit inside a E1.              */
+    struct _charray
+    {
+               enum _ChanType{
+                       Q931_ChType_NotUsed=0,  /* Unused Channel                                               */
+                       Q931_ChType_B=1,                /* B Channel (Voice)                                    */              
+                       Q931_ChType_D=2,                /* D Channel (Signalling)                               */
+                       Q931_ChType_Sync=3              /* Sync Channel                                                 */
+               }ChanType;
+
+        L3UCHAR Available;          /* Channel Available Flag               */
+                                    /*  0 : Avaiabled                       */
+                                    /*  1 : Used                            */
+
+        L3INT   CRV;                /* Associated CRV                       */
+
+    }ch[Q931MAXCHPERTRUNK];
+
+    /* Active Call information indentified by CRV. See Q931AllocateCRV for  */
+       /* initialization of call table.                                                                                */
+    struct _ccarray
+    {
+        L3UCHAR InUse;              /* Indicate if entry is in use.         */
+                                    /*  0 = Not in Use                      */
+                                    /*  1 = Active Call.                    */
+
+        L3UCHAR BChan;              /* Associated B Channel.                */
+                                                                       /* 0 - 31 valid B chan                                  */
+                                                                       /* 255 = Not allocated                                  */
+
+        L3INT   CRV;                /* Associated CRV.                      */
+
+        L3UINT  State;              /* Call State.                          */
+                                                                       /*  0 is Idle, but other values are             */
+                                                                       /*  defined per dialect.                                */
+                                                                       /*  Default usage is 1-99 for TE and    */
+                                                                       /*  101 - 199 for NT.                                   */
+        
+        L3ULONG Timer;              /* Timer in ms. The TimeTick will check */
+                                                                       /* if this has exceeded the timeout, and*/
+                                                                       /* if so call the timers timeout proc.  */
+
+        L3USHORT TimerID;           /* Timer Identification/State           */
+                                                                       /* actual values defined by dialect             */
+                                    /*  0 : No timer running                */
+                                    /*  ITU-T Q.931:301 - 322 Timer running */
+
+    }call[Q931MAXCALLPERTRUNK];
+
+}Q931_TrunkInfo;
+
+/*****************************************************************************
+  
+  Struct:              Q931State
+
+  Description: Define a Q931 State, legal events and next state for each
+                               event. Used to simplify the state engine logic. Each state
+                               engine define it's own state table and the logic only need
+                               to call a helper function to check if the message is legal
+                               at this stage.
+
+*****************************************************************************/
+typedef struct
+{
+       L3INT           State;
+       L3INT           Message;
+       L3UCHAR         Direction;
+}Q931State;
+
+/*****************************************************************************
+
+  Proc table external references. 
+
+  The proc tables are defined in Q931.c and initialized in Q931Initialize.
+
+*****************************************************************************/
+extern L3INT (*Q931Proc  [Q931MAXDLCT][Q931MAXMES])   (Q931_TrunkInfo *pTrunk, L3UCHAR *,L3INT);
+
+extern L3INT (*Q931Umes  [Q931MAXDLCT][Q931MAXMES])   (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size);
+extern L3INT (*Q931Pmes  [Q931MAXDLCT][Q931MAXMES])   (Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+
+extern L3INT (*Q931Uie   [Q931MAXDLCT][Q931MAXIE] )   (Q931_TrunkInfo *pTrunk,ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+extern L3INT (*Q931Pie   [Q931MAXDLCT][Q931MAXIE] )   (Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+
+/*****************************************************************************
+    
+  Macro:        GetIETotoSize
+
+  Syntax:       L3INT GetIETotSize(InfoElem ie);
+
+  Description:  Compute the total size in bytes of an info element including 
+                size of 'header'.    
+
+*****************************************************************************/
+#define Q931GetIETotSize(ie)    (((ie.InfoID & 0x80) !=0) ? 1:ie.LenIE)+2)
+
+/*****************************************************************************
+
+  Macro:        IsIEPresent
+
+  Syntax:       BOOL IsIEPresent(ie InfoElement);
+
+  Description:  Return TRUE if the Information Element is included.
+
+*****************************************************************************/
+#define Q931IsIEPresent(x)    ((x & 0x8000) != 0)
+
+/*****************************************************************************
+
+  Macro:        GetIEOffset and GetIEValue
+    
+  Syntax:       L3INT GetIEOffset(ie InfoElement)
+                L3INT GetIEValue(ie InfoElement)
+
+  Description:  Returns the offset (or the value )to the Information Element.
+
+  Note:         GetIEValue assumes that the 15 lsb bit is the value of a 
+                single octet information element. This macro can not be used
+                on a variable information element.
+
+*****************************************************************************/
+#define Q931GetIEOffset(x) (x & 0x7fff)
+#define Q931GetIEValue(x) (x & 0x7fff)
+
+/*****************************************************************************
+
+  Macro:        Q931GetIEPtr
+
+  Syntax:       void * Q931GetIEPtr(ie InfoElement, L3UCHAR * Buf);
+
+  Description:  Compute a Ptr to the information element.
+
+*****************************************************************************/
+#define Q931GetIEPtr(ie,buf) (&buf[Q931GetIEOffset(ie)])
+
+/*****************************************************************************
+
+  Macro:        SetIE
+
+  Syntax:       void SetIE(ie InfoElement, L3INT Offset);
+
+  Description:  Set an information element.
+
+*****************************************************************************/
+#define Q931SetIE(x,o) {x = (ie)(o) | 0x8000;}
+
+/*****************************************************************************
+
+  Macro:        IsQ931Ext
+
+  Syntax        BOOL IsQ931Ext(L3UCHAR c)
+
+  Description:  Return true Check if the msb (bit 8) is 0. This indicate
+                that the octet is extended.
+
+*****************************************************************************/
+#define IsQ931Ext(x) ((x&0x80)==0)
+
+/*****************************************************************************
+
+  Macro:        ieGetOctet
+
+  Syntax:       unsigned L3UCHAR ieGetOctet(L3INT e)
+
+  Description:  Macro to fetch one byte from an integer. Mostly used to 
+                avoid warnings.
+
+*****************************************************************************/
+#define ieGetOctet(x) ((L3UCHAR)(x))
+
+/*****************************************************************************
+
+  Macro:        NoWarning
+
+  Syntax:       void NoWarning(x)
+
+  Description:  Macro to suppress unreferenced formal parameter warnings
+
+                Used during creation of the stack since the stack is 
+                developed for Warning Level 4 and this creates a lot of 
+                warning for the initial empty functions.
+
+*****************************************************************************/
+#define NoWarning(x) (x=x)
+
+/*****************************************************************************
+
+  External references. See Q931.c for details.
+
+*****************************************************************************/
+
+extern Q931_TrunkInfo Q931Trunk[Q931MAXTRUNKS];
+
+#include "Q932.h"
+
+/*****************************************************************************
+
+  Q.931 Information Element Pack/Unpack functions. Implemented in Q931ie.c
+
+*****************************************************************************/
+
+L3INT Q931Pie_BearerCap(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_ChanID(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_ProgInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_Display(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_Signal(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_HLComp(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_Segment(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_DateTime(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_Cause(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_SendComplete(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_KeypadFac(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_NotifInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CallID(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_RepeatInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_NetFac(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CallingNum(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CallingSub(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CalledNum(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CalledSub(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CalledNum(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_TransNetSel(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_LLComp(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_CallState(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_RestartInd(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3INT Q931Pie_UserUser(Q931_TrunkInfo *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+
+L3INT Q931Uie_BearerCap(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3USHORT Q931Uie_CRV(Q931_TrunkInfo *pTrunk,L3UCHAR * IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_ChanID(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR *OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_ProgInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_Display(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_Signal(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_HLComp(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_Segment(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_DateTime(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_Cause(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_SendComplete(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_KeypadFac(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_NotifInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_CallID(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_RepeatInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_NetFac(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_CallingNum(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_CallingSub(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_CalledNum(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_CalledSub(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_TransNetSel(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_LLComp(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_CallState(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_RestartInd(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+L3INT Q931Uie_UserUser(Q931_TrunkInfo *pTrunk,ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
+
+/*****************************************************************************
+
+  Q.931 Message Pack/Unpack functions. Implemented in Q931mes.c
+
+*****************************************************************************/
+L3INT Q931Pmes_Alerting(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_CallProceeding(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_CongestionControl(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q931Pmes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+
+L3INT Q931Umes_Alerting(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_CallProceeding(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Connect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_ConnectAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Progress(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Setup(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_SetupAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Resume(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_ResumeAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_ResumeReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Suspend(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_SuspendAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_SuspendReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_UserInformation(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Disconnect(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Release(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_ReleaseComplete(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Restart(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_RestartAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_CongestionControl(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Information(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Notify(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Segment(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_Status(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q931Umes_StatusEnquiry(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+
+/*****************************************************************************
+
+  Q.931 Process Function Prototyping. Implemented in Q931StateTE.c
+
+*****************************************************************************/
+L3INT Q931ProcAlertingTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcCallProceedingTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcConnectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcConnectAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcProgressTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSetupTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSetupAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcResumeTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcResumeAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcResumeRejectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSuspendTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSuspendAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSuspendRejectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcUserInformationTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcDisconnectTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcReleaseTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcReleaseCompleteTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcRestartTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcRestartAckTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcCongestionControlTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcInformationTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcNotifyTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcStatusTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcStatusEnquiryTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSegmentTE(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+
+L3INT Q931ProcAlertingNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcCallProceedingNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcConnectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcConnectAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcProgressNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSetupNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSetupAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcResumeNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcResumeAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcResumeRejectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSuspendNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSuspendAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSuspendRejectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcUserInformationNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcDisconnectNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcReleaseNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcReleaseCompleteNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcRestartNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcRestartAckNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcCongestionControlNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcInformationNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcNotifyNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcStatusNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcStatusEnquiryNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcSegmentNT(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+
+L3INT Q931ProcUnknownMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+L3INT Q931ProcUnexpectedMessage(Q931_TrunkInfo *pTrunk,L3UCHAR * b, L3INT iFrom);
+
+/*****************************************************************************
+
+  Interface Function Prototypes. Implemented in Q931.c
+
+*****************************************************************************/
+void    Q931TimeTick(L3ULONG ms);
+L3INT   Q931Rx23(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);
+L3INT   Q931Tx32(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);
+L3INT   Q931Rx43(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);
+L3INT   Q931Tx34(Q931_TrunkInfo *pTrunk, L3UCHAR * Mes, L3INT Size);
+void    Q931SetError(Q931_TrunkInfo *pTrunk,L3INT ErrID, L3INT ErrPar1, L3INT ErrPar2);
+void   Q931SetTx34CB(L3INT (*Q931Tx34Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size));
+void   Q931SetTx32CB(L3INT (*Q931Tx32Par)(Q931_TrunkInfo *pTrunk,L3UCHAR * Mes, L3INT Size));
+void   Q931SetErrorCB(L3INT (*Q931ErrorPar)(Q931_TrunkInfo *pTrunk,L3INT,L3INT,L3INT));
+void    Q931CreateTE(L3UCHAR i);
+void    Q931CreateNT(L3UCHAR i);
+void    Q931SetMesCreateCB(L3INT (*callback)());
+void    Q931SetDialectCreateCB(L3INT (*callback)(L3INT));
+void    Q931SetHeaderSpace(L3INT space);
+void Q931SetMesProc(L3UCHAR mes, L3UCHAR dialect, 
+                L3INT (*Q931ProcFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom),
+                L3INT (*Q931UmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT IOff, L3INT Size),
+                L3INT (*Q931PmesFunc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize));
+
+void Q931SetIEProc(L3UCHAR iec, L3UCHAR dialect, 
+                          L3INT (*Q931PieProc)(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet),
+                          L3INT (*Q931UieProc)(Q931_TrunkInfo *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)); 
+
+void Q931Initialize();
+void Q931AddDialect(L3UCHAR iDialect, void (*Q931CreateDialectCB)(L3UCHAR iDialect));
+L3INT Q931InitMesSetup(Q931mes_Setup *p);
+
+L3INT  Q931CreateCRV(Q931_TrunkInfo *pTrunk, L3INT * callIndex);
+L3INT  Q931AllocateCRV(Q931_TrunkInfo *pTrunk, L3INT iCRV, L3INT * callIndex);
+L3INT   Q931FindCRV(Q931_TrunkInfo *pTrunk, L3INT crv, L3INT *callindex);
+L3INT  Q931GetCallState(Q931_TrunkInfo *pTrunk, L3INT iCRV);
+L3INT  Q931StartTimer(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3USHORT iTimer);
+L3INT  Q931StopTimer(Q931_TrunkInfo *pTrunk, L3INT callindex, L3USHORT iTimer);
+L3INT  Q931SetState(Q931_TrunkInfo *pTrunk, L3INT callIndex, L3INT iState);
+L3ULONG Q931GetTime();
+void   Q931AddStateEntry(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir);
+L3BOOL Q931IsEventLegal(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir);
+
+/*****************************************************************************
+
+  Q.931 Low Level API Function Prototyping. Implemented in Q931API.c
+
+*****************************************************************************/
+ie Q931AppendIE(L3UCHAR *pm, L3UCHAR *pi);
+L3INT Q931GetUniqueCRV(Q931_TrunkInfo *pTrunk);
+
+L3INT Q931InitIEBearerCap(Q931ie_BearerCap *p);
+L3INT Q931InitIEChanID(Q931ie_ChanID *p);
+L3INT Q931InitIEProgInd(Q931ie_ProgInd *p);
+L3INT Q931InitIENetFac(Q931ie_NetFac * pIE);
+L3INT Q931InitIEDisplay(Q931ie_Display * pIE);
+L3INT Q931InitIEDateTime(Q931ie_DateTime * pIE);
+L3INT Q931InitIEKeypadFac(Q931ie_KeypadFac * pIE);
+L3INT Q931InitIESignal(Q931ie_Signal * pIE);
+L3INT Q931InitIECallingNum(Q931ie_CallingNum * pIE);
+L3INT Q931InitIECallingSub(Q931ie_CallingSub * pIE);
+L3INT Q931InitIECalledNum(Q931ie_CalledNum * pIE);
+L3INT Q931InitIECalledSub(Q931ie_CalledSub * pIE);
+L3INT Q931InitIETransNetSel(Q931ie_TransNetSel * pIE);
+L3INT Q931InitIELLComp(Q931ie_LLComp * pIE);
+L3INT Q931InitIEHLComp(Q931ie_HLComp * pIE);
+
+L3INT Q931Disconnect(Q931_TrunkInfo *pTrunk, L3INT iTo, L3INT iCRV, L3INT iCause);
+L3INT Q931ReleaseComplete(Q931_TrunkInfo *pTrunk, L3INT iTo);
+
+#endif /* _Q931_NL */
index fa17e38ae79b49110d29ddcbf50e27fc219b588a..19b5c4c149dff21abce949a7574426396b173698 100644 (file)
-/*****************************************************************************\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
+/*****************************************************************************
+
+  FileName:            Q932.h
+
+  Contents:            Header w/structs for Q932 Suplementary Services.
+
+  NB:                  Do NOT include this header directly, include Q931.h
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+/*****************************************************************************
+  Q.932 Additional Message codes
+*****************************************************************************/
+
+#define Q932mes_HOLD                 0x24 /* 0010 0100                      */
+#define Q932mes_HOLD_ACKNOWLEDGE     0x28 /* 0010 1000                      */
+#define Q932mes_HOLD_REJECT          0x30 /* 0011 0000                      */
+#define Q932mes_RETRIEVE             0x31 /* 0011 0001                      */
+#define Q932mes_RETRIEVE_ACKNOWLEDGE 0x33 /* 0011 0011                      */
+#define Q932mes_RETRIEVE_REJECT      0x37 /* 0011 0111                      */
+#define Q932mes_FACILITY             0x62 /* 0110 0010                      */
+#define Q932mes_REGISTER             0x64 /* 0110 0100                      */
+
+/*****************************************************************************
+  Q.932 Additional EI Codes
+*****************************************************************************/
+#define Q932ie_FACILITY                         0x1c /* 0001 1100       */
+
+/*****************************************************************************
+  Struct:              Q932ie_Facility
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_Facility;
+
+/*****************************************************************************
+  Struct:              Q932ie_Hold
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_Hold;
+
+/*****************************************************************************
+  Struct:              Q932ie_HoldAck
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_HoldAck;
+
+/*****************************************************************************
+  Struct:              Q932ie_HoldReject
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_HoldReject;
+
+/*****************************************************************************
+  Struct:              Q932ie_Register
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_Register;
+
+/*****************************************************************************
+  Struct:              Q932ie_Retrieve
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_Retrieve;
+
+/*****************************************************************************
+  Struct:              Q932ie_RetrieveAck
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_RetrieveAck;
+
+/*****************************************************************************
+  Struct:              Q932ie_RetrieveReject
+*****************************************************************************/
+typedef struct
+{
+    L3UINT                     Size;           /* Size of message in bytes             */
+    L3UCHAR         ProtDisc;       /* Protocol Discriminator               */
+    L3UCHAR         MesType;        /* Message type                         */
+    L3USHORT        CRV;            /* Call reference value                 */
+    L3UCHAR         buf[1];         /* Dynamic buffer                       */
+}Q932mes_RetrieveReject;
+
+/*****************************************************************************
+  Function Prototypes.
+*****************************************************************************/
+L3INT Q932ProcFacilityTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcHoldTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcHoldAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcHoldRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRegisterTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRetrieveTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRetrieveAckTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRetrieveRejectTE(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+
+L3INT Q932ProcFacilityNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcHoldNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcHoldAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcHoldRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRegisterNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRetrieveNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRetrieveAckNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+L3INT Q932ProcRetrieveRejectNT(Q931_TrunkInfo *pTrunk, L3UCHAR * b, L3INT iFrom);
+
+L3INT Q932Pmes_Facility(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_Hold(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_HoldAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_HoldReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_Register(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_Retrieve(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_RetrieveAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+L3INT Q932Pmes_RetrieveReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize);
+
+L3INT Q932Umes_Facility(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_Hold(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_HoldAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_HoldReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_Register(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_Retrieve(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_RetrieveAck(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
+L3INT Q932Umes_RetrieveReject(Q931_TrunkInfo *pTrunk, L3UCHAR *IBuf, L3UCHAR * OBuf, L3INT I, L3INT O);
index 788adfdb10ef864e416baea69d67a05fa120a635..99faa1d1bae55ecf6c6d14b7616dea444f61487d 100644 (file)
@@ -1,83 +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
-       unsigned 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(unsigned char *buf, int size, int index);\r
-void MFIFOClear(unsigned char * buf);\r
-int MFIFOGetLBOffset(unsigned char *buf);\r
-int MFIFOGetFBOffset(unsigned char *buf);\r
-void MFIFOWriteIX(unsigned char *buf, unsigned char *mes, int size, int ix, int off);\r
-int MFIFOWriteMes(unsigned char *buf, unsigned char *mes, int size);\r
-unsigned char * MFIFOGetMesPtr(unsigned char *buf, int *size);\r
-void MFIFOKillNext(unsigned char *buf);\r
-\r
-#endif\r
+/*****************************************************************************
+
+  Filename:     mfifo.h
+
+  Contents:     header for MFIFO
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+#ifndef _MFIFO
+#define _MFIFO
+
+/*****************************************************************************
+
+  Struct:              MINDEX
+
+  Description: Message Index used to index a dynamic size Message FIFO.
+
+*****************************************************************************/
+typedef struct _mindex
+{
+    int offset;                     /* offset to message in buf             */
+    int size;                       /* size of message in bytes             */
+}MINDEX;
+
+/*****************************************************************************
+
+  Struct:              MFIFO
+
+  Description: Message FIFO. Provides a dynamic sized message based FIFO
+                               queue.
+
+*****************************************************************************/
+typedef struct _mfifo
+{
+       int first;                      /* first out                            */
+       int last;                       /* last in + 1                          */
+       int bsize;                      /* buffer size                          */
+       unsigned char *buf;                      /* ptr to start of buffer               */
+    int ixsize;                     /* index size                           */
+    MINDEX ix[1];                   /* message index                        */
+}MFIFO;
+
+/*****************************************************************************
+  Function prototypes.
+*****************************************************************************/
+int MFIFOCreate(unsigned char *buf, int size, int index);
+void MFIFOClear(unsigned char * buf);
+int MFIFOGetLBOffset(unsigned char *buf);
+int MFIFOGetFBOffset(unsigned char *buf);
+void MFIFOWriteIX(unsigned char *buf, unsigned char *mes, int size, int ix, int off);
+int MFIFOWriteMes(unsigned char *buf, unsigned char *mes, int size);
+unsigned char * MFIFOGetMesPtr(unsigned char *buf, int *size);
+void MFIFOKillNext(unsigned char *buf);
+
+#endif
index 9e409f8a92095bb1894ecd9855280bcd816c8421..a1e85dedf4f0ae4050be2bd0b9a94601d8937e23 100644 (file)
-/*****************************************************************************\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(unsigned 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(unsigned 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(unsigned 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(unsigned 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(unsigned char *buf, unsigned 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(unsigned char *buf, unsigned 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
-unsigned char * MFIFOGetMesPtr(unsigned 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(unsigned 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
+/*****************************************************************************
+
+  Filename:     mfifo.c
+
+  Description:  mfifo is a message orriented fifo system with support of
+                both message and byte per byte retriaval of messages.
+
+                The fifo has been designed with two usages in mind:
+
+                -   Queueing of frames for hdlc and feeding out byte per byte
+                    with the possibility of re-sending of frames etc. 
+
+                - fifo for messages of dynamic size.
+
+                The fifo is allocated on top of any buffer and creates an
+                index of message in the queue. The user can write/read
+                messages or write messages and read the message one byte
+                at the time.
+
+  Interface:    
+                MFIFOCreate         Create/reset/initialize fifo.
+                MFIFOClear          Clear FIFO.
+                MFIFOWriteMes       Write message into fifo
+                * MFIFOReadMes        Read message from fifo.
+                MFIFOGetMesPtr      Get ptr to next message.
+                MFIFOKillNext       Kill next message.
+
+                * currently not implemented.
+
+  Note:         The message will always be saved continuously. If there is not
+                sufficient space at the end of the buffer, the fifo will skip
+                the last bytes and save the message at the top of the buffer.
+
+                This is required to allow direct ptr access to messages 
+                stored in the queue.
+
+  License/Copyright:
+
+  Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
+  email:janvb@caselaboratories.com  
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are 
+  met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+         this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+         this list of conditions and the following disclaimer in the documentation 
+         and/or other materials provided with the distribution.
+    * Neither the name of the Case Labs, Ltd nor the names of its contributors 
+         may be used to endorse or promote products derived from this software 
+         without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "mfifo.h"
+#include <memory.h>
+#include <stdlib.h>
+
+/*****************************************************************************
+
+  Function:     MFIFOCreate
+
+  Description:  Creates a fifo on top of an existing buffer.
+
+  Parameters:   buf     ptr to buffer.
+                size    size of buffer in bytes.
+                index   size of index entries (max no messages).
+
+  Return value: 0 if failure, 1 if ok.
+
+*****************************************************************************/
+int MFIFOCreate(unsigned char *buf, int size, int index)
+{
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    
+    mf->first = mf->last = 0;
+    mf->ixsize = index;
+    mf->buf = &buf[sizeof(MFIFO) + (sizeof(MINDEX) * (index-1))];
+
+    if(mf->buf > & buf[size])
+        return 0;
+
+    mf->bsize = size - sizeof(MFIFO) - (sizeof(MINDEX) * (index-1));
+
+    return 1;
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOClear
+
+  Description:  Clear the FIFO
+
+  Paremeters:   buf     ptr to fifo
+
+  Return Value: none
+
+*****************************************************************************/
+void MFIFOClear(unsigned char * buf)
+{
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    mf->first = mf->last = 0;
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOGetLBOffset
+
+  Description:  Helper function caclulating offset to the 'first out' byte.
+
+  Paremeters:   buf     ptr to fifo
+
+  Return Value: offset.
+
+*****************************************************************************/
+int MFIFOGetLBOffset(unsigned char *buf)
+{
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    if(mf->last != mf->first)
+        return mf->ix[mf->last].offset;
+    
+    return 0;
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOGetFBOffset
+
+  Description:  Helper function calculating the offset to the 'first in' 
+                byte in the buffer. This is the position the next byte
+                entering the fifo will occupy.
+
+  Paremeters:   buf     ptr to fifo
+
+  Return Value: offset
+
+*****************************************************************************/
+int MFIFOGetFBOffset(unsigned char *buf)
+{
+    int x;
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    if(mf->last == mf->first)
+        return 0;
+    x=mf->first;
+    x--;
+    if(x<0)
+        x=mf->ixsize;
+    return mf->ix[x].offset + mf->ix[x].size;
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOWriteIX
+
+  Description:  Helper function writing a calculated entry. The function
+                will perform a memcpy to move the message and set the index
+                values as well as increase the 'first in' index.
+
+  Paremeters:   buf     ptr to fifo
+                mes     ptr to message
+                size    size of message in bytes.
+                ix      index to index entry.
+                off     offset to position to receive the message
+
+  Return Value: none
+
+*****************************************************************************/
+void MFIFOWriteIX(unsigned char *buf, unsigned char *mes, int size, int ix, int off)
+{
+    int x;
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    memcpy(&mf->buf[off],mes,size);
+    mf->ix[ix].offset=off;
+    mf->ix[ix].size=size;
+    x = mf->first+1;
+    if(x > mf->ixsize)
+        x=0;
+    mf->first=x;
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOWriteMes
+
+  Description:  
+
+  Paremeters:
+
+  Return Value:
+
+*****************************************************************************/
+int MFIFOWriteMes(unsigned char *buf, unsigned char *mes, int size)
+{
+    int of,ol,x;
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+
+    x = mf->first+1;
+    if(x > mf->ixsize)
+        x=0;
+    if(x == mf->last)
+        return 0; /* full queue */
+
+    of = MFIFOGetFBOffset(buf);
+    ol = MFIFOGetLBOffset(buf);
+    if(mf->last == mf->first) /* empty queue */
+    {
+        mf->first = mf->last = 0; /* optimize */
+        MFIFOWriteIX(buf, mes, size, mf->first, 0);
+        return 1;
+    }
+    else if(of > ol)
+    {
+        if(mf->bsize - of >= size)
+        {
+            MFIFOWriteIX(buf,mes,size,mf->first,of);
+            return 1;
+        }
+        else if(ol > size)
+        {
+            MFIFOWriteIX(buf,mes,size,mf->first,ol);
+            return 1;
+        }
+    }
+    else if(ol - of > size)
+    {
+            MFIFOWriteIX(buf,mes,size,mf->first,of);
+            return 1;
+    }
+
+    return 0;
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOGetMesPtr
+
+  Description:  
+
+  Paremeters:
+
+  Return Value:
+
+*****************************************************************************/
+unsigned char * MFIFOGetMesPtr(unsigned char *buf, int *size)
+{
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    if(mf->first==mf->last)
+        return NULL;
+    *size = mf->ix[mf->last].size;
+    return &mf->buf[mf->ix[mf->last].offset];
+}
+
+/*****************************************************************************
+
+  Function:     MFIFOKillNext
+
+  Description:  
+
+  Paremeters:
+
+  Return Value:
+
+*****************************************************************************/
+void MFIFOKillNext(unsigned char *buf)
+{
+    int x;
+    MFIFO * mf;
+    mf = (MFIFO*)buf;
+    if(mf->first!=mf->last)
+    {
+        x = mf->last+1;
+        if(x > mf->ixsize)
+            x=0;
+        mf->last=x;
+    }
+}