5ESSStateNT.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002 
00003   FileName:     5ESSStateNT.c
00004 
00005   Contents:     AT&T 5ESS ISDN State Engine for NT (Network 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   License/Copyright:
00014 
00015   Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
00016   email:janvb@caselaboratories.com  
00017 
00018   Copyright (c) 2007, Michael Jerris. All rights reserved.
00019   email:mike@jerris.com  
00020   
00021   Copyright (c) 2007, Michael S. Collins, All rights reserved.
00022   email:mcollins@fcnetwork.com
00023   
00024   Redistribution and use in source and binary forms, with or without 
00025   modification, are permitted provided that the following conditions are 
00026   met:
00027 
00028         * Redistributions of source code must retain the above copyright notice, 
00029           this list of conditions and the following disclaimer.
00030         * Redistributions in binary form must reproduce the above copyright notice, 
00031           this list of conditions and the following disclaimer in the documentation 
00032           and/or other materials provided with the distribution.
00033         * Neither the name of the Case Labs, Ltd nor the names of its contributors 
00034           may be used to endorse or promote products derived from this software 
00035           without specific prior written permission.
00036 
00037   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
00038   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
00039   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
00040   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
00041   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00042   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
00043   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
00044   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
00045   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
00046   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
00047   POSSIBILITY OF SUCH DAMAGE.
00048 *****************************************************************************/
00049 
00050 #define Q931PRIVATE
00051 
00052 #include "5ESS.h"
00053 
00054 extern L3INT Q931L4HeaderSpace;
00055 extern struct Q931MessageIE *ATT5ESSMessageIEs;
00056 
00057 /*
00058  * ProtDisc 3 (Service/ServiceAck) and 8 (Connect/ConnectAck) share the same message IDs
00059  * Use custom functions to handle them
00060  */
00061 static L3INT ATT5ESSProc0x07NT(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom);
00062 static L3INT ATT5ESSProc0x0fNT(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom);
00063 
00064 
00065 void ATT5ESSCreateNT(struct Q931Dialect *dlct)
00066 {
00067         Q931DialectSetName(dlct, "5ESS NT");
00068 
00069         /*
00070          * Flags
00071          */
00072         Q931DialectSetFlag(dlct, 0);
00073 
00074         /*
00075          * Codesets
00076          */
00077         Q931DialectAddCodeset(dlct, Q931_CODESET_0);
00078         Q931DialectAddCodeset(dlct, Q931_CODESET_6);
00079         Q931DialectAddCodeset(dlct, Q931_CODESET_7);
00080 
00081         /*
00082          *
00083          */
00084         Q931DialectSetMesProc(dlct, Q931mes_ALERTING,             Q931ProcAlertingNT,          Q931Umes_Generic, Q931Pmes_Generic);
00085         Q931DialectSetMesProc(dlct, Q931mes_CALL_PROCEEDING,      Q931ProcCallProceedingNT,    Q931Umes_Generic, Q931Pmes_Generic);
00086         Q931DialectSetMesProc(dlct, Q931mes_CONNECT,              ATT5ESSProc0x07NT,           Q931Umes_Generic, Q931Pmes_Generic);
00087         Q931DialectSetMesProc(dlct, Q931mes_CONNECT_ACKNOWLEDGE,  ATT5ESSProc0x0fNT,           Q931Umes_Generic, Q931Pmes_Generic);
00088         Q931DialectSetMesProc(dlct, Q931mes_PROGRESS,             Q931ProcProgressNT,          Q931Umes_Generic, Q931Pmes_Generic);
00089         Q931DialectSetMesProc(dlct, Q931mes_SETUP,                Q931ProcSetupNT,             Q931Umes_Generic, Q931Pmes_Generic);
00090 #if 0
00091         Q931DialectSetMesProc(dlct, Q931mes_SETUP_ACKNOWLEDGE,    Q931ProcSetupAckNT,          Q931Umes_Generic, Q931Pmes_Generic);
00092         Q931DialectSetMesProc(dlct, Q931mes_RESUME,               Q931ProcResumeNT,            Q931Umes_Generic, Q931Pmes_Generic);
00093         Q931DialectSetMesProc(dlct, Q931mes_RESUME_ACKNOWLEDGE,   Q931ProcResumeAckNT,         Q931Umes_Generic, Q931Pmes_Generic);
00094         Q931DialectSetMesProc(dlct, Q931mes_RESUME_REJECT,        Q931ProcResumeRejectNT,      Q931Umes_Generic, Q931Pmes_Generic);
00095         Q931DialectSetMesProc(dlct, Q931mes_SUSPEND,              Q931ProcSuspendNT,           Q931Umes_Generic, Q931Pmes_Generic);
00096         Q931DialectSetMesProc(dlct, Q931mes_SUSPEND_ACKNOWLEDGE,  Q931ProcSuspendAckNT,        Q931Umes_Generic, Q931Pmes_Generic);
00097         Q931DialectSetMesProc(dlct, Q931mes_SUSPEND_REJECT,       Q931ProcSuspendRejectNT,     Q931Umes_Generic, Q931Pmes_Generic);
00098 #endif
00099         Q931DialectSetMesProc(dlct, Q931mes_USER_INFORMATION,     Q931ProcUserInformationNT,   Q931Umes_Generic, Q931Pmes_Generic);
00100         Q931DialectSetMesProc(dlct, Q931mes_DISCONNECT,           Q931ProcDisconnectNT,        Q931Umes_Generic, Q931Pmes_Generic);
00101         Q931DialectSetMesProc(dlct, Q931mes_RELEASE,              Q931ProcReleaseNT,           Q931Umes_Generic, Q931Pmes_Generic);
00102         Q931DialectSetMesProc(dlct, Q931mes_RELEASE_COMPLETE,     Q931ProcReleaseCompleteNT,   Q931Umes_Generic, Q931Pmes_Generic);
00103         Q931DialectSetMesProc(dlct, Q931mes_RESTART,              Q931ProcRestartNT,           Q931Umes_Generic, Q931Pmes_Generic);
00104         Q931DialectSetMesProc(dlct, Q931mes_RESTART_ACKNOWLEDGE,  Q931ProcRestartAckNT,        Q931Umes_Generic, Q931Pmes_Generic);
00105         Q931DialectSetMesProc(dlct, Q931mes_CONGESTION_CONTROL,   Q931ProcCongestionControlNT, Q931Umes_Generic, Q931Pmes_Generic);
00106 #if 0
00107         Q931DialectSetMesProc(dlct, Q931mes_INFORMATION,          Q931ProcInformationNT,       Q931Umes_Generic, Q931Pmes_Generic);
00108         Q931DialectSetMesProc(dlct, Q931mes_NOTIFY,               Q931ProcNotifyNT,            Q931Umes_Generic, Q931Pmes_Generic);
00109 #endif
00110         Q931DialectSetMesProc(dlct, Q931mes_STATUS,               Q931ProcStatusNT,            Q931Umes_Generic, Q931Pmes_Generic);
00111         Q931DialectSetMesProc(dlct, Q931mes_STATUS_ENQUIRY,       Q931ProcStatusEnquiryNT,     Q931Umes_Generic, Q931Pmes_Generic);
00112         Q931DialectSetMesProc(dlct, Q931mes_SEGMENT,              Q931ProcSegmentNT,           Q931Umes_Generic, Q931Pmes_Generic);
00113 
00114         Q931DialectSetMesProc(dlct, Q932mes_FACILITY,             Q932ProcFacilityNT,          Q932Umes_Facility,       Q932Pmes_Facility);
00115         Q931DialectSetMesProc(dlct, Q932mes_HOLD,                 Q932ProcHoldNT,              Q932Umes_Hold,           Q932Pmes_Hold);
00116         Q931DialectSetMesProc(dlct, Q932mes_HOLD_ACKNOWLEDGE,     Q932ProcHoldAckNT,           Q932Umes_HoldAck,        Q932Pmes_HoldAck);
00117         Q931DialectSetMesProc(dlct, Q932mes_HOLD_REJECT,          Q932ProcHoldRejectNT,        Q932Umes_HoldReject,     Q932Pmes_HoldReject);
00118         Q931DialectSetMesProc(dlct, Q932mes_REGISTER,             Q932ProcRegisterNT,          Q932Umes_Register,       Q932Pmes_Register);
00119         Q931DialectSetMesProc(dlct, Q932mes_RETRIEVE,             Q932ProcRetrieveNT,          Q932Umes_Retrieve,       Q932Pmes_Retrieve);
00120         Q931DialectSetMesProc(dlct, Q932mes_RETRIEVE_ACKNOWLEDGE, Q932ProcRetrieveAckNT,       Q932Umes_RetrieveAck,    Q932Pmes_RetrieveAck);
00121         Q931DialectSetMesProc(dlct, Q932mes_RETRIEVE_REJECT,      Q932ProcRetrieveRejectNT,    Q932Umes_RetrieveReject, Q932Pmes_RetrieveReject);
00122 
00123         /*
00124          * Unknown / Invalid (Unexpected) Message handler
00125          */
00126         Q931DialectSetUnknownMesProc(dlct, Q931ProcUnknownMessage);
00127         Q931DialectSetInvalidMesProc(dlct, Q931ProcUnexpectedMessage);
00128 
00129 
00130         /*
00131          * Set up the IE encoder/decoder handle table.
00132          */ 
00133         Q931DialectSetIEProc(dlct, Q931ie_SEGMENTED_MESSAGE,                Q931Pie_Segment,       Q931Uie_Segment);
00134         Q931DialectSetIEProc(dlct, Q931ie_BEARER_CAPABILITY,                Q931Pie_BearerCap,     Q931Uie_BearerCap);
00135         Q931DialectSetIEProc(dlct, Q931ie_CAUSE,                            Q931Pie_Cause,         Q931Uie_Cause);
00136         Q931DialectSetIEProc(dlct, Q931ie_CALL_IDENTITY,                    Q931Pie_CallID,        Q931Uie_CallID);
00137         Q931DialectSetIEProc(dlct, Q931ie_CALL_STATE,                       Q931Pie_CallState,     Q931Uie_CallState);
00138         Q931DialectSetIEProc(dlct, Q931ie_CHANGE_STATUS,                    Q931Pie_ChangeStatus,  Q931Uie_ChangeStatus);
00139         Q931DialectSetIEProc(dlct, Q931ie_CHANNEL_IDENTIFICATION,           Q931Pie_ChanID,        Q931Uie_ChanID);
00140         Q931DialectSetIEProc(dlct, Q931ie_PROGRESS_INDICATOR,               Q931Pie_ProgInd,       Q931Uie_ProgInd);
00141         Q931DialectSetIEProc(dlct, Q931ie_NETWORK_SPECIFIC_FACILITIES,      Q931Pie_NetFac,        Q931Uie_NetFac);
00142         Q931DialectSetIEProc(dlct, Q931ie_NOTIFICATION_INDICATOR,           Q931Pie_NotifInd,      Q931Uie_NotifInd);
00143         Q931DialectSetIEProc(dlct, Q931ie_DISPLAY,                          Q931Pie_Display,       Q931Uie_Display);
00144         Q931DialectSetIEProc(dlct, Q931ie_DATETIME,                         Q931Pie_DateTime,      Q931Uie_DateTime);
00145         Q931DialectSetIEProc(dlct, Q931ie_KEYPAD_FACILITY,                  Q931Pie_KeypadFac,     Q931Uie_KeypadFac);
00146         Q931DialectSetIEProc(dlct, Q931ie_SIGNAL,                           Q931Pie_Signal,        Q931Uie_Signal);
00147         Q931DialectSetIEProc(dlct, Q931ie_TRANSIT_DELAY_SELECTION_AND_IND,  Q931Pie_TransNetSel,   Q931Uie_TransNetSel);
00148         Q931DialectSetIEProc(dlct, Q931ie_CALLING_PARTY_NUMBER,             Q931Pie_CallingNum,    Q931Uie_CallingNum);
00149         Q931DialectSetIEProc(dlct, Q931ie_CALLING_PARTY_SUBADDRESS,         Q931Pie_CallingSub,    Q931Uie_CallingSub);
00150         Q931DialectSetIEProc(dlct, Q931ie_CALLED_PARTY_NUMBER,              Q931Pie_CalledNum,     Q931Uie_CalledNum);
00151         Q931DialectSetIEProc(dlct, Q931ie_CALLED_PARTY_SUBADDRESS,          Q931Pie_CalledSub,     Q931Uie_CalledSub);
00152         Q931DialectSetIEProc(dlct, Q931ie_TRANSIT_NETWORK_SELECTION,        Q931Pie_TransNetSel,   Q931Uie_TransNetSel);
00153         Q931DialectSetIEProc(dlct, Q931ie_RESTART_INDICATOR,                Q931Pie_RestartInd,    Q931Uie_RestartInd);
00154         Q931DialectSetIEProc(dlct, Q931ie_LOW_LAYER_COMPATIBILITY,          Q931Pie_LLComp,        Q931Uie_LLComp);
00155         Q931DialectSetIEProc(dlct, Q931ie_HIGH_LAYER_COMPATIBILITY,         Q931Pie_HLComp,        Q931Uie_HLComp);
00156         Q931DialectSetIEProc(dlct, Q931ie_USER_USER,                        Q931Pie_UserUser,      Q931Uie_UserUser);
00157         Q931DialectSetIEProc(dlct, Q931ie_GENERIC_DIGITS,                   Q931Pie_GenericDigits, Q931Uie_GenericDigits);
00158 
00159         Q931DialectSetIEProc(dlct, Q931ie_CONNECTED_NUMBER,                 Q931Pie_Generic,       Q931Uie_Generic);
00160         Q931DialectSetIEProc(dlct, Q931ie_FACILITY,                         Q931Pie_Generic,       Q931Uie_Generic);
00161 
00162 
00163         /*
00164          * State Table
00165          */
00166 
00167         /* Any State */
00168         Q931DialectAddStateEntry(dlct, Q931_NANY, Q931mes_STATUS,           MSGF_FROM_BOTH);
00169         Q931DialectAddStateEntry(dlct, Q931_NANY, Q931mes_STATUS_ENQUIRY,   MSGF_FROM_L2);
00170 
00171         /* State 0 Idle */
00172         Q931DialectAddStateEntry(dlct, Q931_N0, Q931mes_SETUP,            MSGF_FROM_BOTH);
00173         Q931DialectAddStateEntry(dlct, Q931_N0, Q931mes_RELEASE,          MSGF_FROM_BOTH);
00174         Q931DialectAddStateEntry(dlct, Q931_N0, Q931mes_RELEASE_COMPLETE, MSGF_FROM_BOTH);
00175         Q931DialectAddStateEntry(dlct, Q931_N0, Q931mes_RESUME,           MSGF_FROM_L2);
00176 
00177         /* State 1 Call Initiating */
00178         Q931DialectAddStateEntry(dlct, Q931_N1, Q931mes_DISCONNECT,        MSGF_FROM_BOTH);
00179         Q931DialectAddStateEntry(dlct, Q931_N1, Q931mes_SETUP_ACKNOWLEDGE, MSGF_FROM_L4);
00180         Q931DialectAddStateEntry(dlct, Q931_N1, Q931mes_RELEASE_COMPLETE,  MSGF_FROM_L4);
00181         Q931DialectAddStateEntry(dlct, Q931_N1, Q931mes_CALL_PROCEEDING,   MSGF_FROM_L4);
00182         Q931DialectAddStateEntry(dlct, Q931_N1, Q931mes_ALERTING,          MSGF_FROM_L4); /* ITU-T Q.931 Annex D */
00183         Q931DialectAddStateEntry(dlct, Q931_N1, Q931mes_CONNECT,           MSGF_FROM_L4); /* ITU-T Q.931 Annex D */
00184 
00185         /* State 2 Overlap Sending */
00186         Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_DISCONNECT,      MSGF_FROM_BOTH);
00187         Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_INFORMATION,     MSGF_FROM_L2);
00188         Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_CALL_PROCEEDING, MSGF_FROM_L4);
00189         Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_ALERTING,        MSGF_FROM_L4);
00190         Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_PROGRESS,        MSGF_FROM_L4);
00191         Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_CONNECT,         MSGF_FROM_L4);
00192 /*      Q931DialectAddStateEntry(dlct, Q931_N2, Q931mes_RELEASE,         MSGF_FROM_L4); ??? */
00193 
00194         /* State 3 Outgoing Call Proceeding */
00195         Q931DialectAddStateEntry(dlct, Q931_N3, Q931mes_DISCONNECT,     MSGF_FROM_BOTH);
00196         Q931DialectAddStateEntry(dlct, Q931_N3, Q931mes_PROGRESS,       MSGF_FROM_L4);
00197         Q931DialectAddStateEntry(dlct, Q931_N3, Q931mes_ALERTING,       MSGF_FROM_L4);
00198         Q931DialectAddStateEntry(dlct, Q931_N3, Q931mes_CONNECT,        MSGF_FROM_L4);
00199 /*      Q931DialectAddStateEntry(dlct, Q931_N3, Q931mes_RELEASE,        MSGF_FROM_L4); ??? */
00200 
00201         /* State 4 Call Delivered */
00202         Q931DialectAddStateEntry(dlct, Q931_N4, Q931mes_DISCONNECT,     MSGF_FROM_BOTH);
00203         Q931DialectAddStateEntry(dlct, Q931_N4, Q931mes_CONNECT,        MSGF_FROM_L4);
00204         Q931DialectAddStateEntry(dlct, Q931_N4, Q931mes_PROGRESS,       MSGF_FROM_L4);
00205 
00206         /* State 6 Call Present */
00207         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_CONNECT,           MSGF_FROM_L2);
00208         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_RELEASE_COMPLETE,  MSGF_FROM_L2);
00209         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_SETUP_ACKNOWLEDGE, MSGF_FROM_L2);
00210         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_INFORMATION,       MSGF_FROM_L4);
00211         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_ALERTING,          MSGF_FROM_L2);
00212         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_CALL_PROCEEDING,   MSGF_FROM_L2);
00213         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_RELEASE,           MSGF_FROM_L2);
00214         Q931DialectAddStateEntry(dlct, Q931_N6, Q931mes_DISCONNECT,        MSGF_FROM_L2);
00215 
00216         /* State 7 Call Received */
00217         Q931DialectAddStateEntry(dlct, Q931_N7, Q931mes_CONNECT,        MSGF_FROM_L2);
00218         Q931DialectAddStateEntry(dlct, Q931_N7, Q931mes_DISCONNECT,     MSGF_FROM_BOTH);
00219 
00220         /* State 8 Connect request */
00221         Q931DialectAddStateEntry(dlct, Q931_N8, Q931mes_CONNECT_ACKNOWLEDGE, MSGF_FROM_L4);
00222         Q931DialectAddStateEntry(dlct, Q931_N8, Q931mes_DISCONNECT,          MSGF_FROM_BOTH);
00223 
00224         /* State 9 Incoming Call Proceeding */
00225         Q931DialectAddStateEntry(dlct, Q931_N9, Q931mes_CONNECT,        MSGF_FROM_L2);
00226         Q931DialectAddStateEntry(dlct, Q931_N9, Q931mes_ALERTING,       MSGF_FROM_L2);
00227         Q931DialectAddStateEntry(dlct, Q931_N9, Q931mes_PROGRESS,       MSGF_FROM_L2);
00228         Q931DialectAddStateEntry(dlct, Q931_N9, Q931mes_DISCONNECT,     MSGF_FROM_BOTH);
00229 
00230         /* State 10 Active */
00231         Q931DialectAddStateEntry(dlct, Q931_N10, Q931mes_DISCONNECT,          MSGF_FROM_BOTH);
00232         Q931DialectAddStateEntry(dlct, Q931_N10, Q931mes_CONNECT_ACKNOWLEDGE, MSGF_FROM_L2);
00233         Q931DialectAddStateEntry(dlct, Q931_N10, Q931mes_SUSPEND,             MSGF_FROM_L2);
00234         Q931DialectAddStateEntry(dlct, Q931_N10, Q931mes_NOTIFY,              MSGF_FROM_BOTH);
00235 
00236         /* State 11 Disconnect Request */
00237         Q931DialectAddStateEntry(dlct, Q931_N11, Q931mes_RELEASE,        MSGF_FROM_L4);
00238         Q931DialectAddStateEntry(dlct, Q931_N11, Q931mes_DISCONNECT,     MSGF_FROM_L2);
00239 /*      Q931DialectAddStateEntry(dlct, Q931_N11, Q931mes_NOTIFY,         MSGF_FROM_L2); ??? */
00240 
00241         /* State 12 Disconnect Ind */
00242         Q931DialectAddStateEntry(dlct, Q931_N12, Q931mes_RELEASE,        MSGF_FROM_L2);
00243         Q931DialectAddStateEntry(dlct, Q931_N12, Q931mes_DISCONNECT,     MSGF_FROM_L2);
00244 
00245         /* State 15 Suspend Request */
00246         Q931DialectAddStateEntry(dlct, Q931_N15, Q931mes_SUSPEND_ACKNOWLEDGE, MSGF_FROM_L4);
00247         Q931DialectAddStateEntry(dlct, Q931_N15, Q931mes_SUSPEND_REJECT,      MSGF_FROM_L4);
00248         Q931DialectAddStateEntry(dlct, Q931_N15, Q931mes_DISCONNECT,          MSGF_FROM_BOTH);
00249 /*      Q931DialectAddStateEntry(dlct, Q931_N15, Q931mes_RELEASE,             MSGF_FROM_L2); ??? */
00250 
00251         /* State 17 Resume Request */
00252         Q931DialectAddStateEntry(dlct, Q931_N17, Q931mes_RESUME_ACKNOWLEDGE,  MSGF_FROM_L4);
00253         Q931DialectAddStateEntry(dlct, Q931_N17, Q931mes_RESUME_REJECT,       MSGF_FROM_L4);
00254         Q931DialectAddStateEntry(dlct, Q931_N17, Q931mes_DISCONNECT,          MSGF_FROM_BOTH);
00255 
00256         /* State 19 Release Request */
00257         Q931DialectAddStateEntry(dlct, Q931_N19, Q931mes_RELEASE_COMPLETE,    MSGF_FROM_L2);
00258         Q931DialectAddStateEntry(dlct, Q931_N19, Q931mes_RELEASE,             MSGF_FROM_L2);
00259 
00260         /* State 25 Overlap Receiving */
00261 /*      Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_SETUP_ACKNOWLEDGE,   MSGF_FROM_L4); */
00262 /*      Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_RELEASE_COMPLETE,    MSGF_FROM_L4); */
00263         Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_CALL_PROCEEDING,     MSGF_FROM_L2);
00264         Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_ALERTING,            MSGF_FROM_L2);
00265         Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_PROGRESS,            MSGF_FROM_L2);
00266         Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_CONNECT,             MSGF_FROM_L2);
00267         Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_INFORMATION,         MSGF_FROM_L4);
00268         Q931DialectAddStateEntry(dlct, Q931_N25, Q931mes_DISCONNECT,          MSGF_FROM_BOTH);
00269 
00270 
00271         /*
00272          * Timer default values
00273          */
00274         Q931DialectSetTimerProcAll(dlct, Q931TimeoutDummy);
00275 
00276         /* Per-timer timeout callbacks, per-mode for now, until i know if they can be shared (and which) */
00277         Q931DialectSetTimerProc(dlct, Q931_TIMER_T301, Q931ProcTimeoutT301TE);
00278         Q931DialectSetTimerProc(dlct, Q931_TIMER_T302, Q931ProcTimeoutT302TE);
00279         Q931DialectSetTimerProc(dlct, Q931_TIMER_T303, Q931ProcTimeoutT303TE);
00280         Q931DialectSetTimerProc(dlct, Q931_TIMER_T304, Q931ProcTimeoutT304TE);
00281         Q931DialectSetTimerProc(dlct, Q931_TIMER_T305, Q931ProcTimeoutT305TE);
00282         Q931DialectSetTimerProc(dlct, Q931_TIMER_T306, Q931ProcTimeoutT305TE);
00283         Q931DialectSetTimerProc(dlct, Q931_TIMER_T307, Q931ProcTimeoutT305TE);
00284         Q931DialectSetTimerProc(dlct, Q931_TIMER_T308, Q931ProcTimeoutT308TE);
00285         Q931DialectSetTimerProc(dlct, Q931_TIMER_T309, Q931ProcTimeoutT309TE);
00286         Q931DialectSetTimerProc(dlct, Q931_TIMER_T310, Q931ProcTimeoutT310TE);
00287         Q931DialectSetTimerProc(dlct, Q931_TIMER_T312, Q931ProcTimeoutT311TE);
00288         Q931DialectSetTimerProc(dlct, Q931_TIMER_T314, Q931ProcTimeoutT314TE);
00289         Q931DialectSetTimerProc(dlct, Q931_TIMER_T316, Q931ProcTimeoutT316TE);
00290         Q931DialectSetTimerProc(dlct, Q931_TIMER_T317, Q931ProcTimeoutT317TE);
00291         Q931DialectSetTimerProc(dlct, Q931_TIMER_T320, Q931ProcTimeoutT319TE);
00292         Q931DialectSetTimerProc(dlct, Q931_TIMER_T321, Q931ProcTimeoutT321TE);
00293         Q931DialectSetTimerProc(dlct, Q931_TIMER_T322, Q931ProcTimeoutT322TE);
00294 
00295         Q931DialectSetTimeout(dlct, Q931_TIMER_T301, 180000);   /* T301: 180s */
00296         Q931DialectSetTimeout(dlct, Q931_TIMER_T302,  15000);   /* T302:  15s */
00297         Q931DialectSetTimeout(dlct, Q931_TIMER_T303,   4000);   /* T303:   4s */
00298         Q931DialectSetTimeout(dlct, Q931_TIMER_T304,  20000);   /* T304:  20s */
00299         Q931DialectSetTimeout(dlct, Q931_TIMER_T305,  30000);   /* T305:  30s */
00300         Q931DialectSetTimeout(dlct, Q931_TIMER_T306,  30000);   /* T306:  30s */
00301         Q931DialectSetTimeout(dlct, Q931_TIMER_T307, 180000);   /* T307: 180s */
00302         Q931DialectSetTimeout(dlct, Q931_TIMER_T308,   4000);   /* T308:   4s */
00303         Q931DialectSetTimeout(dlct, Q931_TIMER_T309,  60000);   /* T309:  60s */
00304         Q931DialectSetTimeout(dlct, Q931_TIMER_T310,  10000);   /* T310:  10s */
00305         Q931DialectSetTimeout(dlct, Q931_TIMER_T312,  12000);   /* T312:  12s */
00306         Q931DialectSetTimeout(dlct, Q931_TIMER_T314,   4000);   /* T314:   4s */
00307         Q931DialectSetTimeout(dlct, Q931_TIMER_T316, 120000);   /* T316: 120s */
00308         Q931DialectSetTimeout(dlct, Q931_TIMER_T317,  90000);   /* T317:  90s */
00309         Q931DialectSetTimeout(dlct, Q931_TIMER_T320,  30000);   /* T320:  30s */
00310         Q931DialectSetTimeout(dlct, Q931_TIMER_T321,  30000);   /* T321:  30s */
00311         Q931DialectSetTimeout(dlct, Q931_TIMER_T322,   4000);   /* T322:   4s */
00312 
00313         /*
00314          * Q.931 message <-> ie table
00315          */
00316         Q931DialectSetMesIEMap(dlct, ATT5ESSMessageIEs);
00317 }
00318 
00319 /*****************************************************************************
00320 
00321   Function:             ATT5ESSProc0x0fNT
00322 
00323 *****************************************************************************/
00324 static L3INT ATT5ESSProc0x0fNT(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom)
00325 {
00326         Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
00327         L3INT ret = Q931E_NO_ERROR;
00328 
00329         switch (pMes->ProtDisc) {
00330         case 8:
00331                 return Q931ProcConnectAckNT(pTrunk, buf, iFrom);
00332 
00333         case 3:
00334                 if (iFrom == 4) {
00335                         /* TODO Add proc here*/
00336                         ret = Q931Tx32Data(pTrunk, 0, buf, pMes->Size);
00337                 }
00338                 else if (iFrom == 2) {
00339                         /* TODO Add proc here*/
00340                         ret = Q931Tx34(pTrunk, buf, pMes->Size);
00341 
00342                         if (Q931TrunkIsSetFlag(pTrunk, Q931_TFLAG_AUTO_SERVICE_ACK)) {
00343                                 Q931Log(pTrunk, Q931_LOG_DEBUG, "autoServiceAck is on, responding to Service Req from network...\n");
00344                                 Q931AckService(pTrunk, buf);
00345                         }
00346                 }
00347                 return ret;
00348 
00349         default:
00350                 break;
00351         }
00352         return Q931E_NO_ERROR;
00353 }
00354 
00355 /*****************************************************************************
00356 
00357   Function:             ATT5ESSProc0x07TE
00358 
00359 *****************************************************************************/
00360 static L3INT ATT5ESSProc0x07NT(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT iFrom)
00361 {
00362         Q931mes_Header *pMes = (Q931mes_Header *)&buf[Q931L4HeaderSpace];
00363         L3INT ret = Q931E_NO_ERROR;
00364 
00365         switch (pMes->ProtDisc) {
00366         case 8:
00367                 return Q931ProcConnectNT(pTrunk, buf, iFrom);
00368 
00369         case 3:
00370                 if (iFrom == 4) {
00371                         /* TODO Add proc here*/
00372                         ret = Q931Tx32Data(pTrunk, 0, buf, pMes->Size);
00373                 }
00374                 else if (iFrom == 2) {
00375                         /* TODO Add proc here*/
00376                         ret = Q931Tx34(pTrunk, buf, pMes->Size);
00377                 }
00378                 return ret;
00379 
00380         default:
00381                 break;
00382         }
00383         return Q931E_NO_ERROR;
00384 }

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