From 45268b86af31583d7fba96e97623c250c227e487 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 22 May 2007 01:25:35 +0000 Subject: [PATCH] add functions to initialize a trunk, and a public function to receive from layer 3 that sends an I frame. git-svn-id: http://svn.openzap.org/svn/openzap/trunk@86 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/openzap/src/isdn/Q921.c | 882 ++++++++++++++------------- libs/openzap/src/isdn/include/Q921.h | 245 ++++---- 2 files changed, 586 insertions(+), 541 deletions(-) diff --git a/libs/openzap/src/isdn/Q921.c b/libs/openzap/src/isdn/Q921.c index 27802d877d..3f768e4116 100644 --- a/libs/openzap/src/isdn/Q921.c +++ b/libs/openzap/src/isdn/Q921.c @@ -1,424 +1,458 @@ -/***************************************************************************** - - 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 -#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>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; -} - +/***************************************************************************** + + 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 +#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) + return 0; + + Q921DevSpace[trunk].sapi = sapi; + Q921DevSpace[trunk].tei = tei; + Q921DevSpace[trunk].NetUser = NetUser; + return 1; +} + +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); +} + +int Q921Rx32(long trunk, L2UCHAR * Mes, L2INT Size) +{ + return Q921SendI(trunk, + Q921DevSpace[x].sapi, + Q921DevSpace[x].NetUser == Q921_TE ? 0 : 1; + Q921DevSpace[x].tei, + 0, + 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; +} + diff --git a/libs/openzap/src/isdn/include/Q921.h b/libs/openzap/src/isdn/include/Q921.h index 26d4699c73..cec349820a 100644 --- a/libs/openzap/src/isdn/include/Q921.h +++ b/libs/openzap/src/isdn/include/Q921.h @@ -1,117 +1,128 @@ -/***************************************************************************** - - 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. - - - 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 - +/***************************************************************************** + + 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. + + + 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 enum /* Network/User Mode. */ +{ + Q921_TE=0, /* 0 : User Mode */ + Q921_NT=1 /* 1 : Network Mode */ +} Q921NetUser_t; + +typedef struct +{ + L2UCHAR HDLCInQueue[Q921MAXHDLCSPACE]; + L2UCHAR vs; + L2UCHAR vr; + L2INT state; + L2INT sapi; + L2INT tei; + Q921NetUser_t NetUser; + +}Q921Data; + +void Q921Init(); +int Q921_InitTrunk(long trunk, int sapi, int tei, Q921NetUser_t NetUser); +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 +