-/*****************************************************************************\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"
+
+
-/*****************************************************************************\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);
+}
-/*****************************************************************************\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;
+}
+
-/*****************************************************************************\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;
+}
-/*****************************************************************************\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;
+}
+
-/*****************************************************************************\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;
+}
+
-/*****************************************************************************\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;
+}
-/*****************************************************************************\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;
+}
+
-/*****************************************************************************\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;
+}
+
-/*****************************************************************************\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;
+}
-/*****************************************************************************\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
+
-/******************************************************************************\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 */
-/*****************************************************************************\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);
-/*****************************************************************************\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
-/*****************************************************************************\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;
+ }
+}