5ESSStateTE.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002 
00003   FileName:     5ESSStateTE.c
00004 
00005   Contents:     AT&T 5ESS ISDN State Engine for TE (User Mode).
00006 
00007                     The controlling state engine for Q.931 is the state engine
00008                     on the NT side. The state engine on the TE side is a slave 
00009                     of this. The TE side maintain it's own states as described in
00010                     ITU-T Q931, but will in    raise conditions be overridden by 
00011                     the NT side.
00012 
00013                     This reference implementation uses a process per message, 
00014                     meaning that each message must check call states. This
00015                     is easier for dialect maintenance as each message proc
00016                     can be replaced individually. A new TE variant only
00017                     need to copy the Q931CreateTE and replace those procs or
00018                     need to override.
00019 
00020   License/Copyright:
00021 
00022   Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
00023   email:janvb@caselaboratories.com  
00024 
00025   Copyright (c) 2007, Michael Jerris. All rights reserved.
00026   email:mike@jerris.com  
00027   
00028   Copyright (c) 2007, Michael S. Collins, All rights reserved.
00029   email:mcollins@fcnetwork.com
00030   
00031   Redistribution and use in source and binary forms, with or without 
00032   modification, are permitted provided that the following conditions are 
00033   met:
00034 
00035         * Redistributions of source code must retain the above copyright notice, 
00036         this list of conditions and the following disclaimer.
00037         * Redistributions in binary form must reproduce the above copyright notice, 
00038         this list of conditions and the following disclaimer in the documentation 
00039         and/or other materials provided with the distribution.
00040         * Neither the name of the Case Labs, Ltd nor the names of its contributors 
00041         may be used to endorse or promote products derived from this software 
00042         without specific prior written permission.
00043 
00044   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
00045   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
00046   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
00047   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
00048   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00049   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
00050   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
00051   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
00052   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
00053   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
00054   POSSIBILITY OF SUCH DAMAGE.
00055 *****************************************************************************/
00056 
00057 #define Q931PRIVATE
00058 
00059 #include "5ESS.h"
00060 
00061 extern L3INT Q931L4HeaderSpace;
00062 extern struct Q931MessageIE *ATT5ESSMessageIEs;
00063 
00064 /*
00065  * ProtDisc 3 (Service/ServiceAck) and 8 (Connect/ConnectAck) share the same message IDs
00066  * Use custom functions to handle them
00067  */
00068 static L3INT ATT5ESSProc0x07TE(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom);
00069 static L3INT ATT5ESSProc0x0fTE(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom);
00070 
00071 
00072 void ATT5ESSCreateTE(struct Q931Dialect *dlct)
00073 {
00074         Q931DialectSetName(dlct, "5ESS TE");
00075 
00076         /*
00077          * Flags
00078          */
00079         Q931DialectSetFlag(dlct, 0);
00080 
00081         /*
00082          * Codesets
00083          */
00084         Q931DialectAddCodeset(dlct, Q931_CODESET_0);
00085         Q931DialectAddCodeset(dlct, Q931_CODESET_6);
00086         Q931DialectAddCodeset(dlct, Q931_CODESET_7);
00087 
00088         /*
00089          *
00090          */
00091         Q931DialectSetMesProc(dlct, Q931mes_ALERTING,             Q931ProcAlertingTE,          Q931Umes_Generic, Q931Pmes_Generic);
00092         Q931DialectSetMesProc(dlct, Q931mes_CALL_PROCEEDING,      Q931ProcCallProceedingTE,    Q931Umes_Generic, Q931Pmes_Generic);
00093         Q931DialectSetMesProc(dlct, Q931mes_CONNECT,              ATT5ESSProc0x0fTE,           Q931Umes_Generic, Q931Pmes_Generic);
00094         Q931DialectSetMesProc(dlct, Q931mes_CONNECT_ACKNOWLEDGE,  ATT5ESSProc0x07TE,           Q931Umes_Generic, Q931Pmes_Generic);
00095         Q931DialectSetMesProc(dlct, Q931mes_PROGRESS,             Q931ProcProgressTE,          Q931Umes_Generic, Q931Pmes_Generic);
00096         Q931DialectSetMesProc(dlct, Q931mes_SETUP,                Q931ProcSetupTE,             Q931Umes_Generic, Q931Pmes_Generic);
00097 #if 0
00098         Q931DialectSetMesProc(dlct, Q931mes_SETUP_ACKNOWLEDGE,    Q931ProcSetupAckTE,          Q931Umes_Generic, Q931Pmes_Generic);
00099         Q931DialectSetMesProc(dlct, Q931mes_RESUME,               Q931ProcResumeTE,            Q931Umes_Generic, Q931Pmes_Generic);
00100         Q931DialectSetMesProc(dlct, Q931mes_RESUME_ACKNOWLEDGE,   Q931ProcResumeAckTE,         Q931Umes_Generic, Q931Pmes_Generic);
00101         Q931DialectSetMesProc(dlct, Q931mes_RESUME_REJECT,        Q931ProcResumeRejectTE,      Q931Umes_Generic, Q931Pmes_Generic);
00102         Q931DialectSetMesProc(dlct, Q931mes_SUSPEND,              Q931ProcSuspendTE,           Q931Umes_Generic, Q931Pmes_Generic);
00103         Q931DialectSetMesProc(dlct, Q931mes_SUSPEND_ACKNOWLEDGE,  Q931ProcSuspendAckTE,        Q931Umes_Generic, Q931Pmes_Generic);
00104         Q931DialectSetMesProc(dlct, Q931mes_SUSPEND_REJECT,       Q931ProcSuspendRejectTE,     Q931Umes_Generic, Q931Pmes_Generic);
00105 #endif
00106         Q931DialectSetMesProc(dlct, Q931mes_USER_INFORMATION,     Q931ProcUserInformationTE,   Q931Umes_Generic, Q931Pmes_Generic);
00107         Q931DialectSetMesProc(dlct, Q931mes_DISCONNECT,           Q931ProcDisconnectTE,        Q931Umes_Generic, Q931Pmes_Generic);
00108         Q931DialectSetMesProc(dlct, Q931mes_RELEASE,              Q931ProcReleaseTE,           Q931Umes_Generic, Q931Pmes_Generic);
00109         Q931DialectSetMesProc(dlct, Q931mes_RELEASE_COMPLETE,     Q931ProcReleaseCompleteTE,   Q931Umes_Generic, Q931Pmes_Generic);
00110         Q931DialectSetMesProc(dlct, Q931mes_RESTART,              Q931ProcRestartTE,           Q931Umes_Generic, Q931Pmes_Generic);
00111         Q931DialectSetMesProc(dlct, Q931mes_RESTART_ACKNOWLEDGE,  Q931ProcRestartAckTE,        Q931Umes_Generic, Q931Pmes_Generic);
00112         Q931DialectSetMesProc(dlct, Q931mes_CONGESTION_CONTROL,   Q931ProcCongestionControlTE, Q931Umes_Generic, Q931Pmes_Generic);
00113 #if 0
00114         Q931DialectSetMesProc(dlct, Q931mes_INFORMATION,          Q931ProcInformationTE,       Q931Umes_Generic, Q931Pmes_Generic);
00115         Q931DialectSetMesProc(dlct, Q931mes_NOTIFY,               Q931ProcNotifyTE,            Q931Umes_Generic, Q931Pmes_Generic);
00116 #endif
00117         Q931DialectSetMesProc(dlct, Q931mes_STATUS,               Q931ProcStatusTE,            Q931Umes_Generic, Q931Pmes_Generic);
00118         Q931DialectSetMesProc(dlct, Q931mes_STATUS_ENQUIRY,       Q931ProcStatusEnquiryTE,     Q931Umes_Generic, Q931Pmes_Generic);
00119         Q931DialectSetMesProc(dlct, Q931mes_SEGMENT,              Q931ProcSegmentTE,           Q931Umes_Generic, Q931Pmes_Generic);
00120 
00121         Q931DialectSetMesProc(dlct, Q932mes_FACILITY,             Q932ProcFacilityTE,          Q932Umes_Facility,       Q932Pmes_Facility);
00122         Q931DialectSetMesProc(dlct, Q932mes_HOLD,                 Q932ProcHoldTE,              Q932Umes_Hold,           Q932Pmes_Hold);
00123         Q931DialectSetMesProc(dlct, Q932mes_HOLD_ACKNOWLEDGE,     Q932ProcHoldAckTE,           Q932Umes_HoldAck,        Q932Pmes_HoldAck);
00124         Q931DialectSetMesProc(dlct, Q932mes_HOLD_REJECT,          Q932ProcHoldRejectTE,        Q932Umes_HoldReject,     Q932Pmes_HoldReject);
00125         Q931DialectSetMesProc(dlct, Q932mes_REGISTER,             Q932ProcRegisterTE,          Q932Umes_Register,       Q932Pmes_Register);
00126         Q931DialectSetMesProc(dlct, Q932mes_RETRIEVE,             Q932ProcRetrieveTE,          Q932Umes_Retrieve,       Q932Pmes_Retrieve);
00127         Q931DialectSetMesProc(dlct, Q932mes_RETRIEVE_ACKNOWLEDGE, Q932ProcRetrieveAckTE,       Q932Umes_RetrieveAck,    Q932Pmes_RetrieveAck);
00128         Q931DialectSetMesProc(dlct, Q932mes_RETRIEVE_REJECT,      Q932ProcRetrieveRejectTE,    Q932Umes_RetrieveReject, Q932Pmes_RetrieveReject);
00129 
00130         /*
00131          * Unknown / Invalid (Unexpected) Message handler
00132          */
00133         Q931DialectSetUnknownMesProc(dlct, Q931ProcUnknownMessage);
00134         Q931DialectSetInvalidMesProc(dlct, Q931ProcUnexpectedMessage);
00135 
00136 
00137         /*
00138          * Set up the IE encoder/decoder handle table.
00139          */ 
00140         Q931DialectSetIEProc(dlct, Q931ie_SEGMENTED_MESSAGE,                Q931Pie_Segment,       Q931Uie_Segment);
00141         Q931DialectSetIEProc(dlct, Q931ie_BEARER_CAPABILITY,                Q931Pie_BearerCap,     Q931Uie_BearerCap);
00142         Q931DialectSetIEProc(dlct, Q931ie_CAUSE,                            Q931Pie_Cause,         Q931Uie_Cause);
00143         Q931DialectSetIEProc(dlct, Q931ie_CALL_IDENTITY,                    Q931Pie_CallID,        Q931Uie_CallID);
00144         Q931DialectSetIEProc(dlct, Q931ie_CALL_STATE,                       Q931Pie_CallState,     Q931Uie_CallState);
00145         Q931DialectSetIEProc(dlct, Q931ie_CHANGE_STATUS,                    Q931Pie_ChangeStatus,  Q931Uie_ChangeStatus);
00146         Q931DialectSetIEProc(dlct, Q931ie_CHANNEL_IDENTIFICATION,           Q931Pie_ChanID,        Q931Uie_ChanID);
00147         Q931DialectSetIEProc(dlct, Q931ie_PROGRESS_INDICATOR,               Q931Pie_ProgInd,       Q931Uie_ProgInd);
00148         Q931DialectSetIEProc(dlct, Q931ie_NETWORK_SPECIFIC_FACILITIES,      Q931Pie_NetFac,        Q931Uie_NetFac);
00149         Q931DialectSetIEProc(dlct, Q931ie_NOTIFICATION_INDICATOR,           Q931Pie_NotifInd,      Q931Uie_NotifInd);
00150         Q931DialectSetIEProc(dlct, Q931ie_DISPLAY,                          Q931Pie_Display,       Q931Uie_Display);
00151         Q931DialectSetIEProc(dlct, Q931ie_DATETIME,                         Q931Pie_DateTime,      Q931Uie_DateTime);
00152         Q931DialectSetIEProc(dlct, Q931ie_KEYPAD_FACILITY,                  Q931Pie_KeypadFac,     Q931Uie_KeypadFac);
00153         Q931DialectSetIEProc(dlct, Q931ie_SIGNAL,                           Q931Pie_Signal,        Q931Uie_Signal);
00154         Q931DialectSetIEProc(dlct, Q931ie_TRANSIT_DELAY_SELECTION_AND_IND,  Q931Pie_TransNetSel,   Q931Uie_TransNetSel);
00155         Q931DialectSetIEProc(dlct, Q931ie_CALLING_PARTY_NUMBER,             Q931Pie_CallingNum,    Q931Uie_CallingNum);
00156         Q931DialectSetIEProc(dlct, Q931ie_CALLING_PARTY_SUBADDRESS,         Q931Pie_CallingSub,    Q931Uie_CallingSub);
00157         Q931DialectSetIEProc(dlct, Q931ie_CALLED_PARTY_NUMBER,              Q931Pie_CalledNum,     Q931Uie_CalledNum);
00158         Q931DialectSetIEProc(dlct, Q931ie_CALLED_PARTY_SUBADDRESS,          Q931Pie_CalledSub,     Q931Uie_CalledSub);
00159         Q931DialectSetIEProc(dlct, Q931ie_TRANSIT_NETWORK_SELECTION,        Q931Pie_TransNetSel,   Q931Uie_TransNetSel);
00160         Q931DialectSetIEProc(dlct, Q931ie_RESTART_INDICATOR,                Q931Pie_RestartInd,    Q931Uie_RestartInd);
00161         Q931DialectSetIEProc(dlct, Q931ie_LOW_LAYER_COMPATIBILITY,          Q931Pie_LLComp,        Q931Uie_LLComp);
00162         Q931DialectSetIEProc(dlct, Q931ie_HIGH_LAYER_COMPATIBILITY,         Q931Pie_HLComp,        Q931Uie_HLComp);
00163         Q931DialectSetIEProc(dlct, Q931ie_USER_USER,                        Q931Pie_UserUser,      Q931Uie_UserUser);
00164         Q931DialectSetIEProc(dlct, Q931ie_GENERIC_DIGITS,                   Q931Pie_GenericDigits, Q931Uie_GenericDigits);
00165 
00166         Q931DialectSetIEProc(dlct, Q931ie_CONNECTED_NUMBER,                 Q931Pie_Generic,       Q931Uie_Generic);
00167         Q931DialectSetIEProc(dlct, Q931ie_FACILITY,                         Q931Pie_Generic,       Q931Uie_Generic);
00168 
00169 
00170         /*
00171          * State Table
00172          */
00173 
00174         /*
00175          * Q.931 message <-> ie table
00176          */
00177         Q931DialectSetMesIEMap(dlct, ATT5ESSMessageIEs);
00178 }
00179 
00180 /*****************************************************************************
00181 
00182   Function:             ATT5ESSProc0x0fTE
00183 
00184 *****************************************************************************/
00185 static L3INT ATT5ESSProc0x0fTE(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom)
00186 {
00187         Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
00188         L3INT ret = Q931E_NO_ERROR;
00189 
00190         switch (pMes->ProtDisc) {
00191         case 8:
00192                 return Q931ProcConnectAckTE(pTrunk, buf, iFrom);
00193 
00194         case 3:
00195                 if (iFrom == 4) {
00196                         /* TODO Add proc here*/
00197                         ret = Q931Tx32Data(pTrunk, 0, buf, pMes->Size);
00198                 }
00199                 else if (iFrom == 2) {
00200                         /* TODO Add proc here*/
00201                         ret = Q931Tx34(pTrunk, buf, pMes->Size);
00202 
00203                         if (Q931TrunkIsSetFlag(pTrunk, Q931_TFLAG_AUTO_SERVICE_ACK)) {
00204                                 Q931Log(pTrunk, Q931_LOG_DEBUG, "autoServiceAck is on, responding to Service Req from network...\n");
00205                                 Q931AckService(pTrunk, buf);
00206                         }
00207                 }
00208                 return ret;
00209 
00210         default:
00211                 break;
00212         }
00213         return Q931E_NO_ERROR;
00214 }
00215 
00216 /*****************************************************************************
00217 
00218   Function:             ATT5ESSProc0x07TE
00219 
00220 *****************************************************************************/
00221 static L3INT ATT5ESSProc0x07TE(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom)
00222 {
00223         Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
00224         L3INT ret = Q931E_NO_ERROR;
00225 
00226         switch (pMes->ProtDisc) {
00227         case 8:
00228                 return Q931ProcConnectTE(pTrunk, buf, iFrom);
00229 
00230         case 3:
00231                 if (iFrom == 4) {
00232                         /* TODO Add proc here*/
00233                         ret = Q931Tx32Data(pTrunk, 0, buf, pMes->Size);
00234                 }
00235                 else if (iFrom == 2) {
00236                         /* TODO Add proc here*/
00237                         ret = Q931Tx34(pTrunk, buf, pMes->Size);
00238                 }
00239                 return ret;
00240 
00241         default:
00242                 break;
00243         }
00244         return Q931E_NO_ERROR;
00245 }

Generated on Tue Apr 7 17:38:18 2009 for mod_ssh by  doxygen 1.5.4