root/src/isdn/Q931mes.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. Q931MesgHeader
  2. Q931Umes_Alerting
  3. Q931Pmes_Alerting
  4. Q931Umes_CallProceeding
  5. Q931Pmes_CallProceeding
  6. Q931Umes_CongestionControl
  7. Q931Pmes_CongestionControl
  8. Q931Umes_Connect
  9. Q931Pmes_Connect
  10. Q931Umes_ConnectAck
  11. Q931Pmes_ConnectAck
  12. Q931Umes_Disconnect
  13. Q931Pmes_Disconnect
  14. Q931Umes_Information
  15. Q931Pmes_Information
  16. Q931Umes_Notify
  17. Q931Pmes_Notify
  18. Q931Umes_Progress
  19. Q931Pmes_Progress
  20. Q931Umes_Release
  21. Q931Pmes_Release
  22. Q931Umes_ReleaseComplete
  23. Q931Pmes_ReleaseComplete
  24. Q931Umes_Restart
  25. Q931Pmes_Restart
  26. Q931Umes_RestartAck
  27. Q931Pmes_RestartAck
  28. Q931Umes_Resume
  29. Q931Pmes_Resume
  30. Q931Umes_ResumeAck
  31. Q931Pmes_ResumeAck
  32. Q931Umes_ResumeReject
  33. Q931Pmes_ResumeReject
  34. Q931Umes_Segment
  35. Q931Pmes_Segment
  36. Q931Umes_Setup
  37. Q931Pmes_Setup
  38. Q931Umes_SetupAck
  39. Q931Pmes_SetupAck
  40. Q931Umes_Status
  41. Q931Pmes_Status
  42. Q931Umes_StatusEnquiry
  43. Q931Pmes_StatusEnquiry
  44. Q931Umes_Suspend
  45. Q931Pmes_Suspend
  46. Q931Umes_SuspendAck
  47. Q931Pmes_SuspendAck
  48. Q931Umes_SuspendReject
  49. Q931Pmes_SuspendReject
  50. Q931Umes_UserInformation
  51. Q931Pmes_UserInformation
  52. Q931Umes_Service
  53. Q931Pmes_Service
  54. Q931Umes_ServiceAck
  55. Q931Pmes_ServiceAck

   1 /*****************************************************************************
   2 
   3   FileName:     Q931mes.c
   4 
   5   Contents:     Pack/Unpack functions. These functions will unpack a Q931 
   6                 message from the bit packed original format into structs
   7                 that contains variables sized by the user. It will also pack
   8                 the struct back into a Q.931 message as required.
   9 
  10                 See q931.h for description. 
  11 
  12   License/Copyright:
  13 
  14   Copyright (c) 2007, Jan Vidar Berger, Case Labs, Ltd. All rights reserved.
  15   email:janvb@caselaboratories.com  
  16 
  17   Redistribution and use in source and binary forms, with or without 
  18   modification, are permitted provided that the following conditions are 
  19   met:
  20 
  21         * Redistributions of source code must retain the above copyright notice, 
  22           this list of conditions and the following disclaimer.
  23         * Redistributions in binary form must reproduce the above copyright notice, 
  24           this list of conditions and the following disclaimer in the documentation 
  25           and/or other materials provided with the distribution.
  26         * Neither the name of the Case Labs, Ltd nor the names of its contributors 
  27           may be used to endorse or promote products derived from this software 
  28           without specific prior written permission.
  29 
  30   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  31   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  32   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  33   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
  34   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  35   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
  36   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  37   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
  38   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  39   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  40   POSSIBILITY OF SUCH DAMAGE.
  41 
  42 *****************************************************************************/
  43 
  44 #include "Q931.h"
  45 
  46 /**
  47  * Q931MesgHeader
  48  * \brief       Create Q.931 Message header
  49  */
  50 L3INT Q931MesgHeader(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *mes, L3UCHAR *OBuf, L3INT Size, L3INT *IOff)
  51 {
  52         L3INT Octet = *IOff;
  53 
  54         Q931Log(pTrunk, Q931_LOG_DEBUG, "Creating Q.931 Message Header:\n    ProtDisc %d (%#x), CRV %d (%#x), CRVflag: %d (%#x), MesType: %d (%#x)\n",
  55                          mes->ProtDisc, mes->ProtDisc, mes->CRV, mes->CRV, mes->CRVFlag, mes->CRVFlag, mes->MesType, mes->MesType);
  56 
  57         OBuf[Octet++] = mes->ProtDisc;                          /* Protocol discriminator */
  58         if (!Q931_IS_BRI(pTrunk)) {
  59                 OBuf[Octet++] = 2;                                                                      /* length is 2 octets */
  60                 OBuf[Octet++] = (L3UCHAR)((mes->CRV >> 8) & 0x7f) | ((mes->CRVFlag << 7) & 0x80);       /* msb */
  61                 OBuf[Octet++] = (L3UCHAR) (mes->CRV & 0xff);                                            /* lsb */
  62         } else {
  63                 OBuf[Octet++] = 1;                                                                      /* length is 1 octet */
  64                 OBuf[Octet++] = (L3UCHAR) (mes->CRV & 0x7f) | ((mes->CRVFlag << 7) & 0x80);             /* CRV & flag */
  65         }
  66         OBuf[Octet++] = mes->MesType;                           /* message header */
  67 
  68         *IOff = Octet;
  69         return 0;
  70 }
  71 
  72 
  73 /*****************************************************************************
  74 
  75   Function:      Q931Umes_Alerting
  76 
  77 *****************************************************************************/
  78 
  79 L3INT Q931Umes_Alerting(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
  80 {
  81         L3INT OOff = 0;
  82         L3INT rc = Q931E_NO_ERROR;
  83 
  84         while (IOff < Size) {
  85                 switch (IBuf[IOff]) {
  86                 case Q931ie_BEARER_CAPABILITY: 
  87                 case Q931ie_CHANNEL_IDENTIFICATION:
  88                 case Q931ie_PROGRESS_INDICATOR:
  89                 case Q931ie_DISPLAY:
  90                 case Q931ie_SIGNAL:
  91                 case Q931ie_HIGH_LAYER_COMPATIBILITY:
  92                 case Q931ie_USER_USER:
  93                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
  94                         if (rc != Q931E_NO_ERROR) 
  95                                 return rc;
  96                         break;
  97                 default:
  98                         return Q931E_ILLEGAL_IE;
  99                         break;
 100                 }
 101         }
 102 
 103         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 104         return Q931E_NO_ERROR;
 105 }
 106 
 107 /*****************************************************************************
 108 
 109   Function:      Q931Pmes_Alerting
 110 
 111 *****************************************************************************/
 112 L3INT Q931Pmes_Alerting(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 113 {
 114         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 115         L3INT rc = Q931E_NO_ERROR;
 116         L3INT Octet = 0;
 117 
 118         /* Q931 Message Header */
 119         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 120         
 121         /* Bearer capability */
 122         if (Q931IsIEPresent(pMes->BearerCap)) {
 123                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
 124                         return rc;
 125         }
 126 
 127         /* Channel Identification */
 128         if (Q931IsIEPresent(pMes->ChanID)) {
 129                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
 130                         return rc;
 131         }
 132 
 133         /* Progress indicator */
 134         if (Q931IsIEPresent(pMes->ProgInd)) {
 135                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
 136                         return rc;
 137         }
 138 
 139         /* Display */
 140         if (Q931IsIEPresent(pMes->Display)) {
 141                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 142                         return rc;
 143         }
 144 
 145         /* Signal */
 146         if (Q931IsIEPresent(pMes->Signal)) {
 147                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 148                         return rc;
 149         }
 150 
 151         /* High Layer Compatibility */
 152         if (Q931IsIEPresent(pMes->HLComp)) {
 153                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
 154                         return rc;
 155         }
 156 
 157         *OSize = Octet; 
 158         return rc;
 159 }
 160 
 161 /*****************************************************************************
 162 
 163   Function:      Q931Umes_CallProceeding
 164 
 165 *****************************************************************************/
 166 L3INT Q931Umes_CallProceeding(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 167 {
 168         L3INT OOff = 0;
 169         L3INT rc = Q931E_NO_ERROR;
 170 
 171         while (IOff < Size) {
 172                 switch (IBuf[IOff]) {
 173                 case Q931ie_BEARER_CAPABILITY:
 174                 case Q931ie_CHANNEL_IDENTIFICATION:
 175                 case Q931ie_PROGRESS_INDICATOR:
 176                 case Q931ie_DISPLAY:
 177                 case Q931ie_HIGH_LAYER_COMPATIBILITY:
 178                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 179                         if (rc != Q931E_NO_ERROR) 
 180                                 return rc;
 181                         break;
 182                 default:
 183                         return Q931E_ILLEGAL_IE;
 184                         break;
 185                 }
 186         }
 187 
 188         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 189         return Q931E_NO_ERROR;
 190 }
 191 
 192 /*****************************************************************************
 193 
 194   Function:      Q931Pmes_CallProceeding
 195 
 196 *****************************************************************************/
 197 L3INT Q931Pmes_CallProceeding(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 198 {
 199         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 200         L3INT rc = Q931E_NO_ERROR;
 201         L3INT Octet = 0;
 202 
 203         /* Q931 Message Header */
 204         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 205         
 206         /* Bearer capability */
 207         if (Q931IsIEPresent(pMes->BearerCap)) {
 208                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
 209                         return rc;
 210         }
 211 
 212         /* Channel Identification */
 213         if (Q931IsIEPresent(pMes->ChanID)) {
 214                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
 215                         return rc;
 216         }
 217         
 218         /* Progress indicator */
 219         if (Q931IsIEPresent(pMes->ProgInd)) {
 220                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
 221                         return rc;
 222         }
 223 
 224         /* Display */
 225         if (Q931IsIEPresent(pMes->Display)) {
 226                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 227                         return rc;
 228         }
 229 
 230         /* High Layer Compatibility */
 231         if (Q931IsIEPresent(pMes->HLComp)) {
 232                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
 233                         return rc;
 234         }
 235 
 236         *OSize = Octet; 
 237         return rc;
 238 }
 239 
 240 /*****************************************************************************
 241 
 242   Function:      Q931Umes_CongestionControl
 243 
 244 *****************************************************************************/
 245 L3INT Q931Umes_CongestionControl(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 246 {
 247         L3BOOL RetCode = L3FALSE;
 248 
 249         NoWarning(mes);
 250         NoWarning(IBuf);
 251 
 252         return RetCode;
 253 }
 254 
 255 
 256 /*****************************************************************************
 257 
 258   Function:      Q931Pmes_CongestionControl
 259 
 260 *****************************************************************************/
 261 L3INT Q931Pmes_CongestionControl(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 262 {
 263         L3BOOL RetCode = L3FALSE;
 264 
 265         NoWarning(OBuf);
 266         NoWarning(IBuf);
 267 
 268         *OSize = 0;     
 269         return RetCode;
 270 }
 271 
 272 /*****************************************************************************
 273 
 274   Function:      Q931Umes_Connect
 275 
 276 *****************************************************************************/
 277 L3INT Q931Umes_Connect(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 278 {
 279         L3INT OOff = 0;
 280         L3INT rc = Q931E_NO_ERROR;
 281 
 282         while (IOff < Size) {
 283                 switch (IBuf[IOff]) {
 284                 case Q931ie_BEARER_CAPABILITY:
 285                 case Q931ie_CHANNEL_IDENTIFICATION:
 286                 case Q931ie_PROGRESS_INDICATOR:
 287                 case Q931ie_DISPLAY:
 288                 case Q931ie_DATETIME:
 289                 case Q931ie_SIGNAL:
 290                 case Q931ie_LOW_LAYER_COMPATIBILITY:
 291                 case Q931ie_HIGH_LAYER_COMPATIBILITY:
 292                 case Q931ie_CONNECTED_NUMBER:           /* not actually used, seen while testing BRI PTMP TE */
 293                 case Q931ie_USER_USER:
 294                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 295                         if (rc != Q931E_NO_ERROR) 
 296                                 return rc;
 297                         break;
 298 
 299                 default:
 300                         Q931Log(pTrunk, Q931_LOG_ERROR, "Illegal IE %#hhx in Connect Message\n", IBuf[IOff]);
 301 
 302                         return Q931E_ILLEGAL_IE;
 303                         break;
 304                 }
 305         }
 306 
 307         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 308         return Q931E_NO_ERROR;
 309 }
 310 
 311 /*****************************************************************************
 312 
 313   Function:      Q931Pmes_Connect
 314 
 315 *****************************************************************************/
 316 L3INT Q931Pmes_Connect(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 317 {
 318         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 319         L3INT rc = Q931E_NO_ERROR;
 320         L3INT Octet = 0;
 321 
 322         /* Q931 Message Header */
 323         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 324         
 325         /* Bearer capability */
 326         if (Q931IsIEPresent(pMes->BearerCap)) {
 327                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
 328                         return rc;
 329         }
 330 
 331         /* Channel Identification */
 332         if (Q931IsIEPresent(pMes->ChanID)) {
 333                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
 334                         return rc;
 335         }
 336 
 337         /* Progress indicator */
 338         if (Q931IsIEPresent(pMes->ProgInd)) {
 339                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
 340                         return rc;
 341         }
 342 
 343         /* Display */
 344         if (Q931IsIEPresent(pMes->Display)) {
 345                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 346                         return rc;
 347         }
 348 
 349         /* Date/Time */
 350         if (Q931IsIEPresent(pMes->DateTime)) {
 351                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DATETIME](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet)) != 0)
 352                         return rc;
 353         }
 354 
 355         /* Signal */
 356         if (Q931IsIEPresent(pMes->Signal)) {
 357                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 358                         return rc;
 359         }
 360 
 361         /* Low Layer Compatibility */
 362         if (Q931IsIEPresent(pMes->LLComp)) {
 363                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_LOW_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet)) != 0)
 364                         return rc;
 365         }
 366 
 367         /* High Layer Compatibility */
 368         if (Q931IsIEPresent(pMes->HLComp)) {
 369                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
 370                         return rc;
 371         }
 372 
 373         *OSize = Octet; 
 374         return rc;
 375 }
 376 
 377 /*****************************************************************************
 378 
 379   Function:      Q931Umes_ConnectAck
 380 
 381 *****************************************************************************/
 382 L3INT Q931Umes_ConnectAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 383 {
 384         L3INT OOff = 0;
 385         L3INT rc = Q931E_NO_ERROR;
 386 
 387         while (IOff < Size) {
 388                 switch (IBuf[IOff]) {
 389                 case Q931ie_DISPLAY:
 390                 case Q931ie_SIGNAL:
 391                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 392                         if (rc != Q931E_NO_ERROR) 
 393                                 return rc;
 394                         break;
 395                 default:
 396                         return Q931E_ILLEGAL_IE;
 397                         break;
 398                 }
 399         }
 400 
 401         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 402         return Q931E_NO_ERROR;
 403 }
 404 
 405 
 406 /*****************************************************************************
 407 
 408   Function:      Q931Pmes_ConnectAck
 409 
 410 *****************************************************************************/
 411 L3INT Q931Pmes_ConnectAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 412 {
 413         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 414         L3INT rc = Q931E_NO_ERROR;
 415         L3INT Octet = 0;
 416 
 417         /* Q931 Message Header */
 418         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 419         
 420         /* Display */
 421         if (Q931IsIEPresent(pMes->Display)) {
 422                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 423                         return rc;
 424         }
 425 
 426         /* Signal */
 427         if (Q931IsIEPresent(pMes->Signal)) {
 428                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 429                         return rc;
 430         }
 431 
 432         *OSize = Octet; 
 433         return rc;
 434 }
 435 
 436 /*****************************************************************************
 437 
 438   Function:      Q931Umes_Disconnect
 439 
 440 *****************************************************************************/
 441 L3INT Q931Umes_Disconnect(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 442 {
 443         L3INT OOff = 0;
 444         L3INT rc = Q931E_NO_ERROR;
 445 
 446         while (IOff < Size) {
 447                 switch (IBuf[IOff]) {
 448                 case Q931ie_CAUSE:
 449                 case Q931ie_PROGRESS_INDICATOR:
 450                 case Q931ie_DISPLAY:
 451                 case Q931ie_SIGNAL:
 452                 case Q931ie_FACILITY:
 453                 case Q931ie_USER_USER:
 454                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 455                         if (rc != Q931E_NO_ERROR) 
 456                                 return rc;
 457                         break;
 458                 default:
 459                         return Q931E_ILLEGAL_IE;
 460                         break;
 461                 }
 462         }
 463 
 464         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 465         return Q931E_NO_ERROR;
 466 }
 467 
 468 /*****************************************************************************
 469 
 470   Function:      Q931Pmes_Disconnect
 471 
 472 *****************************************************************************/
 473 L3INT Q931Pmes_Disconnect(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 474 {
 475         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 476         L3INT rc = Q931E_NO_ERROR;
 477         L3INT Octet = 0;
 478 
 479         /* Q931 Message Header */
 480         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 481         
 482         /* Cause */
 483         if (Q931IsIEPresent(pMes->Cause)) {
 484                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
 485                         return rc;
 486         }
 487         
 488         /* Progress indicator */
 489         if (Q931IsIEPresent(pMes->ProgInd)) {
 490                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
 491                         return rc;
 492         }
 493 
 494         /* Display */
 495         if (Q931IsIEPresent(pMes->Display)) {
 496                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 497                         return rc;
 498         }
 499 
 500         /* Signal */
 501         if (Q931IsIEPresent(pMes->Signal)) {
 502                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 503                         return rc;
 504         }
 505 
 506         *OSize = Octet; 
 507         return rc;
 508 }
 509 
 510 /*****************************************************************************
 511 
 512   Function:      Q931Umes_Information
 513 
 514 *****************************************************************************/
 515 L3INT Q931Umes_Information(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 516 {
 517         L3INT OOff = 0;
 518         L3INT rc = Q931E_NO_ERROR;
 519 
 520         while (IOff < Size) {
 521                 switch (IBuf[IOff]) {
 522                 case Q931ie_SENDING_COMPLETE:
 523                 case Q931ie_DISPLAY:
 524                 case Q931ie_KEYPAD_FACILITY:
 525                 case Q931ie_CALLED_PARTY_NUMBER:
 526                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 527                         if (rc != Q931E_NO_ERROR) 
 528                                 return rc;
 529                         break;
 530                 default:
 531                         return Q931E_ILLEGAL_IE;
 532                         break;
 533                 }
 534         }
 535 
 536         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 537         return Q931E_NO_ERROR;
 538 }
 539 
 540 /*****************************************************************************
 541 
 542   Function:      Q931Pmes_Information
 543 
 544 *****************************************************************************/
 545 L3INT Q931Pmes_Information(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 546 {
 547         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 548         L3INT rc = Q931E_NO_ERROR;
 549         L3INT Octet = 0;
 550 
 551         /* Q931 Message Header */
 552         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 553 
 554         /* Sending Complete */
 555         if (Q931IsIEPresent(pMes->SendComplete)) {
 556                 OBuf[Octet++]   = (L3UCHAR)(pMes->SendComplete & 0x00ff);
 557         }
 558 
 559         /* Display */
 560         if (Q931IsIEPresent(pMes->Display)) {
 561                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 562                         return rc;
 563         }
 564 
 565         /* Keypad Facility */
 566         if (Q931IsIEPresent(pMes->KeypadFac)) {
 567                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_KEYPAD_FACILITY](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet)) != 0)
 568                         return rc;
 569         }
 570 
 571         /* Signal */
 572         if (Q931IsIEPresent(pMes->Signal)) {
 573                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 574                         return rc;
 575         }
 576 
 577         /* Called Party number */
 578         if (Q931IsIEPresent(pMes->CalledNum)) {
 579                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet)) != 0)
 580                         return rc;
 581         }
 582 
 583         *OSize = Octet; 
 584         return rc;
 585 }
 586 
 587 /*****************************************************************************
 588 
 589   Function:      Q931Umes_Notify
 590 
 591 *****************************************************************************/
 592 L3INT Q931Umes_Notify(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 593 {
 594         L3INT OOff = 0;
 595         L3INT rc = Q931E_NO_ERROR;
 596 
 597         while (IOff < Size) {
 598                 switch (IBuf[IOff]) {
 599                 case Q931ie_BEARER_CAPABILITY:
 600                 case Q931ie_NOTIFICATION_INDICATOR:
 601                 case Q931ie_DISPLAY:
 602                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 603                         if (rc != Q931E_NO_ERROR) 
 604                                 return rc;
 605                         break;
 606                 default:
 607                         return Q931E_ILLEGAL_IE;
 608                         break;
 609                 }
 610         }
 611 
 612         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 613         return Q931E_NO_ERROR;
 614 }
 615 
 616 /*****************************************************************************
 617 
 618   Function:      Q931Pmes_Notify
 619 
 620 *****************************************************************************/
 621 L3INT Q931Pmes_Notify(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 622 {
 623         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 624         L3INT rc = Q931E_NO_ERROR;
 625         L3INT Octet = 0;
 626 
 627         /* Q931 Message Header */
 628         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 629         
 630         /* Bearer capability */
 631         if (Q931IsIEPresent(pMes->BearerCap)) {
 632                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
 633                         return rc;
 634         }
 635 
 636         /* Display */
 637         if (Q931IsIEPresent(pMes->Display)) {
 638                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 639                         return rc;
 640         }
 641 
 642         *OSize = Octet; 
 643         return rc;
 644 }
 645 
 646 /*****************************************************************************
 647 
 648   Function:      Q931Umes_Progress
 649 
 650 *****************************************************************************/
 651 L3INT Q931Umes_Progress(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 652 {
 653         L3INT OOff = 0;
 654         L3INT rc = Q931E_NO_ERROR;
 655 
 656         while (IOff < Size) {
 657                 switch (IBuf[IOff]) {
 658                 case Q931ie_BEARER_CAPABILITY:
 659                 case Q931ie_CAUSE:
 660                 case Q931ie_PROGRESS_INDICATOR:
 661                 case Q931ie_DISPLAY:
 662                 case Q931ie_HIGH_LAYER_COMPATIBILITY:
 663                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 664                         if (rc != Q931E_NO_ERROR) 
 665                                 return rc;
 666                         break;
 667                 default:
 668                         return Q931E_ILLEGAL_IE;
 669                         break;
 670                 }
 671         }
 672 
 673         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 674         return Q931E_NO_ERROR;
 675 }
 676 
 677 /*****************************************************************************
 678 
 679   Function:      Q931Pmes_Progress
 680 
 681 *****************************************************************************/
 682 L3INT Q931Pmes_Progress(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 683 {
 684         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 685         L3INT rc = Q931E_NO_ERROR;
 686         L3INT Octet = 0;
 687 
 688         /* Q931 Message Header */
 689         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 690         
 691         /* Bearer capability */
 692         if (Q931IsIEPresent(pMes->BearerCap)) {
 693                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
 694                         return rc;
 695         }
 696 
 697         /* Cause */
 698         if (Q931IsIEPresent(pMes->Cause)) {
 699                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
 700                         return rc;
 701         }
 702 
 703         /* Progress indicator */
 704         if (Q931IsIEPresent(pMes->ProgInd)) {
 705                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
 706                         return rc;
 707         }
 708 
 709         /* Display */
 710         if (Q931IsIEPresent(pMes->Display)) {
 711                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 712                         return rc;
 713         }
 714 
 715         /* High Layer Compatibility */
 716         if (Q931IsIEPresent(pMes->HLComp)) {
 717                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
 718                         return rc;
 719         }
 720 
 721         *OSize = Octet; 
 722         return rc;
 723 }
 724 
 725 /*****************************************************************************
 726 
 727   Function:      Q931Umes_Release
 728 
 729 *****************************************************************************/
 730 L3INT Q931Umes_Release(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 731 {
 732         L3INT OOff = 0;
 733         L3INT rc = Q931E_NO_ERROR;
 734 
 735         while (IOff < Size) {
 736                 switch (IBuf[IOff]) {
 737                 case Q931ie_CAUSE:
 738                 case Q931ie_DISPLAY:
 739                 case Q931ie_SIGNAL:
 740                 case Q931ie_USER_USER:
 741                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 742                         if (rc != Q931E_NO_ERROR) 
 743                                 return rc;
 744                         break;
 745                 default:
 746                         return Q931E_ILLEGAL_IE;
 747                         break;
 748                 }
 749         }
 750 
 751         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 752         return Q931E_NO_ERROR;
 753 }
 754 
 755 /*****************************************************************************
 756 
 757   Function:      Q931Pmes_Release
 758 
 759 *****************************************************************************/
 760 L3INT Q931Pmes_Release(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 761 {
 762         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 763         L3INT rc = Q931E_NO_ERROR;
 764         L3INT Octet = 0;
 765 
 766         /* Q931 Message Header */
 767         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 768         
 769         /* Cause */
 770         if (Q931IsIEPresent(pMes->Cause)) {
 771                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
 772                         return rc;
 773         }
 774 
 775         /* Display */
 776         if (Q931IsIEPresent(pMes->Display)) {
 777                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 778                         return rc;
 779         }
 780 
 781         /* Signal */
 782         if (Q931IsIEPresent(pMes->Signal)) {
 783                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 784                         return rc;
 785         }
 786 
 787         *OSize = Octet; 
 788         return rc;
 789 }
 790 
 791 /*****************************************************************************
 792 
 793   Function:      Q931Umes_ReleaseComplete
 794 
 795 *****************************************************************************/
 796 L3INT Q931Umes_ReleaseComplete(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 797 {
 798         L3INT OOff = 0;
 799         L3INT rc = Q931E_NO_ERROR;
 800 
 801         while (IOff < Size) {
 802                 switch (IBuf[IOff]) {
 803                 case Q931ie_CAUSE:
 804                 case Q931ie_DISPLAY:
 805                 case Q931ie_SIGNAL:
 806                 case Q931ie_USER_USER:
 807                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 808                         if (rc != Q931E_NO_ERROR) 
 809                                 return rc;
 810                         break;
 811                 default:
 812                         return Q931E_ILLEGAL_IE;
 813                         break;
 814                 }
 815         }
 816 
 817         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 818         return Q931E_NO_ERROR;
 819 }
 820 
 821 /*****************************************************************************
 822 
 823   Function:      Q931Pmes_ReleaseComplete
 824 
 825 *****************************************************************************/
 826 L3INT Q931Pmes_ReleaseComplete(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 827 {
 828         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 829         L3INT rc = Q931E_NO_ERROR;
 830         L3INT Octet = 0;
 831 
 832         /* Q931 Message Header */
 833         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 834         
 835         /* Cause */
 836         if (Q931IsIEPresent(pMes->Cause)) {
 837                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
 838                         return rc;
 839         }
 840 
 841         /* Display */
 842         if (Q931IsIEPresent(pMes->Display)) {
 843                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 844                         return rc;
 845         }
 846 
 847         /* Signal */
 848         if (Q931IsIEPresent(pMes->Signal)) {
 849                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
 850                         return rc;
 851         }
 852 
 853         *OSize = Octet; 
 854         return rc;
 855 }
 856 
 857 /*****************************************************************************
 858 
 859   Function:      Q931Umes_Restart
 860 
 861 *****************************************************************************/
 862 L3INT Q931Umes_Restart(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 863 {
 864         L3INT OOff = 0;
 865         L3INT rc = Q931E_NO_ERROR;
 866 
 867         while (IOff < Size) {
 868                 switch (IBuf[IOff]) {
 869                 case Q931ie_CHANNEL_IDENTIFICATION:
 870                 case Q931ie_DISPLAY:
 871                 case Q931ie_RESTART_INDICATOR:
 872                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 873                         if (rc != Q931E_NO_ERROR) 
 874                                 return rc;
 875                         break;
 876                 default:
 877                         return Q931E_ILLEGAL_IE;
 878                         break;
 879                 }
 880         }
 881 
 882         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 883         return Q931E_NO_ERROR;
 884 }
 885 
 886 /*****************************************************************************
 887 
 888   Function:      Q931Pmes_Restart
 889 
 890 *****************************************************************************/
 891 L3INT Q931Pmes_Restart(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 892 {
 893         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 894         L3INT rc = Q931E_NO_ERROR;
 895         L3INT Octet = 0;
 896 
 897         /* Q931 Message Header */
 898         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 899    
 900         /* ChanID */
 901         if (Q931IsIEPresent(pMes->ChanID)) {
 902                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
 903                         return rc;
 904         }
 905 
 906         /* Display */
 907         if (Q931IsIEPresent(pMes->Display)) {
 908                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 909                         return rc;
 910         }
 911 
 912         /* RestartInd */
 913         if (Q931IsIEPresent(pMes->RestartInd)) {
 914                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_RESTART_INDICATOR](pTrunk, Q931GetIEPtr(pMes->RestartInd,pMes->buf), OBuf, &Octet)) != 0)
 915                         return rc;
 916         }
 917 
 918         *OSize = Octet; 
 919         return rc;
 920 }
 921 
 922 /*****************************************************************************
 923 
 924   Function:      Q931Umes_RestartAck
 925 
 926 *****************************************************************************/
 927 L3INT Q931Umes_RestartAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *OBuf, L3INT IOff, L3INT Size)
 928 {
 929         Q931mes_Generic *mes = (Q931mes_Generic*)OBuf;
 930         L3INT OOff = 0;
 931         L3INT rc = Q931E_NO_ERROR;
 932 
 933         while (IOff < Size) {
 934                 switch (IBuf[IOff]) {
 935                 case Q931ie_CHANNEL_IDENTIFICATION:
 936                 case Q931ie_DISPLAY:
 937                 case Q931ie_RESTART_INDICATOR:
 938                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
 939                         if (rc != Q931E_NO_ERROR) 
 940                                 return rc;
 941                         break;
 942                 default:
 943                         return Q931E_ILLEGAL_IE;
 944                         break;
 945                 }
 946         }
 947 
 948         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
 949         return Q931E_NO_ERROR;
 950 }
 951 
 952 /*****************************************************************************
 953 
 954   Function:      Q931Pmes_RestartAck
 955 
 956 *****************************************************************************/
 957 L3INT Q931Pmes_RestartAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
 958 {
 959         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
 960         L3INT rc = Q931E_NO_ERROR;
 961         L3INT Octet = 0;
 962 
 963         /* Q931 Message Header */
 964         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
 965         
 966         /* ChanID */
 967         if (Q931IsIEPresent(pMes->ChanID)) {
 968                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
 969                         return rc;
 970         }
 971 
 972         /* Display */
 973         if (Q931IsIEPresent(pMes->Display)) {
 974                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
 975                         return rc;
 976         }
 977 
 978         /* RestartInd */
 979         if (Q931IsIEPresent(pMes->RestartInd)) {
 980                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_RESTART_INDICATOR](pTrunk, Q931GetIEPtr(pMes->RestartInd,pMes->buf), OBuf, &Octet)) != 0)
 981                         return rc;
 982         }
 983 
 984         *OSize = Octet; 
 985         return rc;
 986 }
 987 
 988 /*****************************************************************************
 989 
 990   Function:      Q931Umes_Resume
 991 
 992 *****************************************************************************/
 993 L3INT Q931Umes_Resume(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
 994 {
 995         L3INT OOff = 0;
 996         L3INT rc = Q931E_NO_ERROR;
 997 
 998         while (IOff < Size) {
 999                 switch (IBuf[IOff]) {
1000                 case Q931ie_CALL_IDENTITY:
1001                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1002                         if (rc != Q931E_NO_ERROR) 
1003                                 return rc;
1004                         break;
1005                 default:
1006                         return Q931E_ILLEGAL_IE;
1007                         break;
1008                 }
1009         }
1010 
1011         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1012         return Q931E_NO_ERROR;
1013 }
1014 
1015 /*****************************************************************************
1016 
1017   Function:      Q931Pmes_Resume
1018 
1019 *****************************************************************************/
1020 L3INT Q931Pmes_Resume(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1021 {
1022         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1023         L3INT rc = Q931E_NO_ERROR;
1024         L3INT Octet = 0;
1025 
1026         /* Q931 Message Header */
1027         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1028 
1029         /* Call Identity */
1030         if (Q931IsIEPresent(pMes->CallID)) {
1031                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALL_IDENTITY](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet)) != 0)
1032                         return rc;
1033         }
1034 
1035         *OSize = Octet; 
1036         return rc;
1037 }
1038 
1039 /*****************************************************************************
1040 
1041   Function:      Q931Umes_ResumeAck
1042 
1043 *****************************************************************************/
1044 L3INT Q931Umes_ResumeAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1045 {
1046         L3INT OOff = 0;
1047         L3INT rc = Q931E_NO_ERROR;
1048 
1049         while (IOff < Size) {
1050                 switch (IBuf[IOff]) {
1051                 case Q931ie_CHANNEL_IDENTIFICATION:
1052                 case Q931ie_DISPLAY:
1053                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1054                         if (rc != Q931E_NO_ERROR) 
1055                                 return rc;
1056                         break;
1057                 default:
1058                         return Q931E_ILLEGAL_IE;
1059                         break;
1060                 }
1061         }
1062 
1063         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1064         return Q931E_NO_ERROR;
1065 }
1066 
1067 
1068 /*****************************************************************************
1069 
1070   Function:      Q931Pmes_ResumeAck
1071 
1072 *****************************************************************************/
1073 L3INT Q931Pmes_ResumeAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1074 {
1075         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1076         L3INT rc = Q931E_NO_ERROR;
1077         L3INT Octet = 0;
1078 
1079         /* Q931 Message Header */
1080         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1081         
1082         /* Channel Identification */
1083         if (Q931IsIEPresent(pMes->ChanID)) {
1084                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1085                         return rc;
1086         }
1087 
1088         /* Display */
1089         if (Q931IsIEPresent(pMes->Display)) {
1090                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1091                         return rc;
1092         }
1093 
1094         *OSize = Octet; 
1095         return rc;
1096 }
1097 
1098 /*****************************************************************************
1099 
1100   Function:      Q931Umes_ResumeReject
1101 
1102 *****************************************************************************/
1103 L3INT Q931Umes_ResumeReject(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1104 {
1105         L3INT OOff = 0;
1106         L3INT rc = Q931E_NO_ERROR;
1107 
1108         while (IOff < Size) {
1109                 switch (IBuf[IOff]) {
1110                 case Q931ie_CAUSE:
1111                 case Q931ie_DISPLAY:
1112                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1113                         if (rc != Q931E_NO_ERROR) 
1114                                 return rc;
1115                         break;
1116                 default:
1117                         return Q931E_ILLEGAL_IE;
1118                         break;
1119                 }
1120         }
1121 
1122         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1123         return Q931E_NO_ERROR;
1124 }
1125 
1126 
1127 /*****************************************************************************
1128 
1129   Function:      Q931Pmes_ResumeReject
1130 
1131 *****************************************************************************/
1132 L3INT Q931Pmes_ResumeReject(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1133 {
1134         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1135         L3INT rc = Q931E_NO_ERROR;
1136         L3INT Octet = 0;
1137 
1138         /* Q931 Message Header  */
1139         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1140 
1141         /* Cause */
1142         if (Q931IsIEPresent(pMes->Cause)) {
1143                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
1144                         return rc;
1145         }
1146 
1147         /* Display */
1148         if (Q931IsIEPresent(pMes->Display)) {
1149                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1150                         return rc;
1151         }
1152 
1153         *OSize = Octet; 
1154         return rc;
1155 }
1156 
1157 L3INT Q931Umes_Segment(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT OOff)
1158 {
1159         L3INT i = IOff;
1160 
1161         return IOff - i;
1162 }
1163 
1164 L3INT Q931Pmes_Segment(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1165 {
1166         L3BOOL RetCode = L3FALSE;
1167 
1168         *OSize = 0;     
1169         return RetCode;
1170 }
1171 
1172 /*****************************************************************************
1173 
1174   Function:      Q931Umes_Setup
1175 
1176 *****************************************************************************/
1177 L3INT Q931Umes_Setup(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1178 {
1179         L3INT ir = 0;
1180         L3INT OOff = 0;
1181         L3INT rc = Q931E_NO_ERROR;
1182 
1183         while (IOff < Size) {
1184                 switch (IBuf[IOff]) {
1185                 case Q931ie_SENDING_COMPLETE:
1186                         IOff++;
1187                         break;
1188 
1189                 case Q931ie_BEARER_CAPABILITY:
1190                 case Q931ie_CHANNEL_IDENTIFICATION:
1191                 case Q931ie_PROGRESS_INDICATOR:
1192                 case Q931ie_NETWORK_SPECIFIC_FACILITIES:
1193                 case Q931ie_DISPLAY:
1194                 case Q931ie_DATETIME:
1195                 case Q931ie_KEYPAD_FACILITY:
1196                 case Q931ie_SIGNAL:
1197                 case Q931ie_CALLING_PARTY_NUMBER:
1198                 case Q931ie_CALLING_PARTY_SUBADDRESS:
1199                 case Q931ie_CALLED_PARTY_NUMBER:
1200                 case Q931ie_CALLED_PARTY_SUBADDRESS:
1201                 case Q931ie_TRANSIT_NETWORK_SELECTION:
1202                 case Q931ie_LOW_LAYER_COMPATIBILITY:
1203                 case Q931ie_HIGH_LAYER_COMPATIBILITY:
1204                 case Q931ie_FACILITY:
1205                 case Q931ie_USER_USER:
1206                 case Q931ie_REDIRECTING_NUMBER:
1207                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1208                         if (rc != Q931E_NO_ERROR) 
1209                                 return rc;
1210                         break;
1211 
1212                 case Q931ie_REPEAT_INDICATOR:
1213                         if (ir < 2) {
1214                                 rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1215                                 ir++;
1216                         } else {
1217                                 return Q931E_ILLEGAL_IE;
1218                         }
1219                         break;
1220 
1221                 default:
1222                         return Q931E_ILLEGAL_IE;
1223                         break;
1224                 }
1225         }
1226 
1227         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1228         return Q931E_NO_ERROR;
1229 }
1230 
1231 /*****************************************************************************
1232 
1233   Function:      Q931Pmes_Setup
1234 
1235   Decription:   Pack a Q931mes_Generic into a real Q.931 message. The user will
1236                                 set up a SETUP message and issue this to the stack where it
1237                                 is processed by Q931ProcSetup that processes and validates
1238                                 it before it actually sends it out. This function is called
1239                                 to compute the real Q.931 message.
1240 
1241   Parameters:   IBuf[IN]        Ptr to un-packed struct
1242                                 ISize[IN]       Size of input buffer (unpacked message).
1243                                 OBuf[OUT]       Ptr to packed 'octet' wise message.
1244                                 OSize[OUT]      Size of packed message.
1245 
1246   Called By:    Q931ProcSetup
1247 
1248 *****************************************************************************/
1249 L3INT Q931Pmes_Setup(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1250 {
1251         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1252         L3INT rc = Q931E_NO_ERROR;
1253         L3INT Octet = 0;
1254 
1255         /* Q931 Message Header */
1256         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1257 
1258         /* Sending Complete */
1259         if (Q931IsIEPresent(pMes->SendComplete)) {
1260                 OBuf[Octet++] = (L3UCHAR)Q931ie_SENDING_COMPLETE & 0xff;
1261         }
1262 
1263         /* Repeat Indicator */
1264         if (Q931IsIEPresent(pMes->RepeatInd)) {
1265                 OBuf[Octet++] = (L3UCHAR)Q931ie_REPEAT_INDICATOR & 0xff;                
1266         }
1267 
1268         /* Bearer capability */
1269         if (Q931IsIEPresent(pMes->BearerCap)) {
1270                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_BEARER_CAPABILITY](pTrunk, Q931GetIEPtr(pMes->BearerCap,pMes->buf), OBuf, &Octet)) != 0)
1271                         return rc;
1272         } else {
1273                 rc = Q931E_BEARERCAP;
1274         }
1275 
1276         /* Channel Identification */
1277         if (Q931IsIEPresent(pMes->ChanID)) {
1278                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1279                         return rc;
1280         }
1281 
1282         /* Progress indicator */
1283         if (Q931IsIEPresent(pMes->ProgInd)) {
1284                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
1285                         return rc;
1286         }
1287 
1288         /* Network spesific facilities */
1289         if (Q931IsIEPresent(pMes->NetFac)) {
1290                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_NETWORK_SPECIFIC_FACILITIES](pTrunk, Q931GetIEPtr(pMes->NetFac,pMes->buf), OBuf, &Octet)) != 0)
1291                         return rc;
1292         }
1293 
1294         /* Display */
1295         if (Q931IsIEPresent(pMes->Display)) {
1296                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1297                         return rc;
1298         }
1299 
1300         /* Date/Time */
1301         if (Q931IsIEPresent(pMes->DateTime)) {
1302                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DATETIME](pTrunk, Q931GetIEPtr(pMes->DateTime,pMes->buf), OBuf, &Octet)) != 0)
1303                         return rc;
1304         }
1305 
1306         /* Keypad Facility */
1307         if (Q931IsIEPresent(pMes->KeypadFac)) {
1308                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_KEYPAD_FACILITY](pTrunk, Q931GetIEPtr(pMes->KeypadFac,pMes->buf), OBuf, &Octet)) != 0)
1309                         return rc;
1310         }
1311 
1312         /* Signal */
1313         if (Q931IsIEPresent(pMes->Signal)) {
1314                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
1315                         return rc;
1316         }
1317 
1318         /* Calling Party Number */
1319         if (Q931IsIEPresent(pMes->CallingNum)) {
1320                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLING_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CallingNum,pMes->buf), OBuf, &Octet)) != 0)
1321                         return rc;
1322         }
1323 
1324         /* Calling Party Subaddress */
1325         if (Q931IsIEPresent(pMes->CallingSub)) {
1326                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLING_PARTY_SUBADDRESS](pTrunk, Q931GetIEPtr(pMes->CallingSub,pMes->buf), OBuf, &Octet)) != 0)
1327                         return rc;
1328         }
1329 
1330         /* Called Party number */
1331         if (Q931IsIEPresent(pMes->CalledNum)) {
1332                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_NUMBER](pTrunk, Q931GetIEPtr(pMes->CalledNum,pMes->buf), OBuf, &Octet)) != 0)
1333                         return rc;
1334         }
1335 
1336         /* Called party subaddress */
1337         if (Q931IsIEPresent(pMes->CalledSub)) {
1338                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALLED_PARTY_SUBADDRESS](pTrunk, Q931GetIEPtr(pMes->CalledSub,pMes->buf), OBuf, &Octet)) != 0)
1339                         return rc;
1340         }
1341 
1342         /* Transit network selection */
1343         if (Q931IsIEPresent(pMes->TransNetSel)) {
1344                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_TRANSIT_NETWORK_SELECTION](pTrunk, Q931GetIEPtr(pMes->TransNetSel,pMes->buf), OBuf, &Octet)) != 0)
1345                         return rc;
1346         }
1347 
1348         /* Repeat Indicator */
1349         if (Q931IsIEPresent(pMes->LLRepeatInd)) {
1350                 rc = Q931E_UNKNOWN_IE;/* TODO */
1351         }
1352 
1353         /* Low Layer Compatibility */
1354         if (Q931IsIEPresent(pMes->LLComp)) {
1355                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_LOW_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->LLComp,pMes->buf), OBuf, &Octet)) != 0)
1356                         return rc;
1357         }
1358 
1359         /* High Layer Compatibility */
1360         if (Q931IsIEPresent(pMes->HLComp)) {
1361                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_HIGH_LAYER_COMPATIBILITY](pTrunk, Q931GetIEPtr(pMes->HLComp,pMes->buf), OBuf, &Octet)) != 0)
1362                         return rc;
1363         }
1364 
1365         *OSize = Octet; 
1366         return rc;
1367 }
1368 
1369 /*****************************************************************************
1370 
1371   Function:      Q931Umes_SetupAck
1372 
1373 *****************************************************************************/
1374 L3INT Q931Umes_SetupAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1375 {
1376         L3INT OOff = 0;
1377         L3INT rc = Q931E_NO_ERROR;
1378 
1379         while (IOff < Size) {
1380                 switch (IBuf[IOff]) {
1381                 case Q931ie_CHANNEL_IDENTIFICATION:
1382                 case Q931ie_PROGRESS_INDICATOR:
1383                 case Q931ie_DISPLAY:
1384                 case Q931ie_SIGNAL:
1385                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1386                         if (rc != Q931E_NO_ERROR) 
1387                                 return rc;
1388                         break;
1389                 default:
1390                         return Q931E_ILLEGAL_IE;
1391                         break;
1392                 }
1393         }
1394 
1395         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1396         return Q931E_NO_ERROR;
1397 }
1398 
1399 /*****************************************************************************
1400 
1401   Function:      Q931Pmes_SetupAck
1402 
1403 *****************************************************************************/
1404 L3INT Q931Pmes_SetupAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1405 {
1406         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1407         L3INT rc = Q931E_NO_ERROR;
1408         L3INT Octet = 0;
1409 
1410         /* Q931 Message Header */
1411         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1412         
1413         /* Channel Identification */
1414         if (Q931IsIEPresent(pMes->ChanID)) {
1415                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1416                         return rc;
1417         }
1418 
1419         /* Progress indicator */
1420         if (Q931IsIEPresent(pMes->ProgInd)) {
1421                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_PROGRESS_INDICATOR](pTrunk, Q931GetIEPtr(pMes->ProgInd,pMes->buf), OBuf, &Octet)) != 0)
1422                         return rc;
1423         }
1424 
1425         /* Display */
1426         if (Q931IsIEPresent(pMes->Display)) {
1427                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1428                         return rc;
1429         }
1430 
1431         /* Signal */
1432         if (Q931IsIEPresent(pMes->Signal)) {
1433                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_SIGNAL](pTrunk, Q931GetIEPtr(pMes->Signal,pMes->buf), OBuf, &Octet)) != 0)
1434                         return rc;
1435         }
1436 
1437         *OSize = Octet; 
1438         return rc;
1439 }
1440 
1441 /*****************************************************************************
1442 
1443   Function:      Q931Umes_Status
1444 
1445 *****************************************************************************/
1446 L3INT Q931Umes_Status(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1447 {
1448         L3INT OOff = 0;
1449         L3INT rc = Q931E_NO_ERROR;
1450 
1451         while (IOff < Size) {
1452                 switch (IBuf[IOff]) {
1453                 case Q931ie_CAUSE:
1454                 case Q931ie_CALL_STATE:
1455                 case Q931ie_DISPLAY:
1456                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1457                         if (rc != Q931E_NO_ERROR) 
1458                                 return rc;
1459                         break;
1460                 default:
1461                         return Q931E_ILLEGAL_IE;
1462                         break;
1463                 }
1464         }
1465 
1466         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1467         return Q931E_NO_ERROR;
1468 }
1469 
1470 
1471 /*****************************************************************************
1472 
1473   Function:      Q931Pmes_Status
1474 
1475 *****************************************************************************/
1476 L3INT Q931Pmes_Status(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1477 {
1478         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1479         L3INT rc = Q931E_NO_ERROR;
1480         L3INT Octet = 0;
1481 
1482         /* Q931 Message Header */
1483         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1484         
1485         /* Cause */
1486         if (Q931IsIEPresent(pMes->Cause)) {
1487                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
1488                         return rc;
1489         }
1490 
1491         /* Call State */
1492         if (Q931IsIEPresent(pMes->CallState)) {
1493                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALL_STATE](pTrunk, Q931GetIEPtr(pMes->CallState,pMes->buf), OBuf, &Octet)) != 0)
1494                         return rc;
1495         }
1496 
1497         /* Display */
1498         if (Q931IsIEPresent(pMes->Display)) {
1499                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1500                         return rc;
1501         }
1502 
1503         *OSize = Octet; 
1504         return rc;
1505 }
1506 
1507 /*****************************************************************************
1508 
1509   Function:      Q931Umes_StatusEnquiry
1510 
1511 *****************************************************************************/
1512 L3INT Q931Umes_StatusEnquiry(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1513 {
1514         L3INT OOff = 0;
1515         L3INT rc = Q931E_NO_ERROR;
1516 
1517         while (IOff < Size) {
1518                 switch (IBuf[IOff]) {
1519                 case Q931ie_DISPLAY:
1520                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1521                         if (rc != Q931E_NO_ERROR) 
1522                                 return rc;
1523                         break;
1524                 default:
1525                         return Q931E_ILLEGAL_IE;
1526                         break;
1527                 }
1528         }
1529 
1530         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1531         return Q931E_NO_ERROR;
1532 }
1533 
1534 /*****************************************************************************
1535 
1536   Function:      Q931Pmes_StatusEnquiry
1537 
1538 *****************************************************************************/
1539 L3INT Q931Pmes_StatusEnquiry(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1540 {
1541         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1542         L3INT rc = Q931E_NO_ERROR;
1543         L3INT Octet = 0;
1544 
1545         /* Q931 Message Header */
1546         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1547         
1548         /* Display */
1549         if (Q931IsIEPresent(pMes->Display)) {
1550                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1551                         return rc;
1552         }
1553 
1554         *OSize = Octet; 
1555 
1556         return rc;
1557 }
1558 
1559 /*****************************************************************************
1560 
1561   Function:      Q931Umes_Suspend
1562 
1563 *****************************************************************************/
1564 L3INT Q931Umes_Suspend(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1565 {
1566         L3INT OOff = 0;
1567         L3INT rc = Q931E_NO_ERROR;
1568 
1569         while (IOff < Size) {
1570                 switch (IBuf[IOff]) {
1571                 case Q931ie_CALL_IDENTITY:
1572                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1573                         if (rc != Q931E_NO_ERROR) 
1574                                 return rc;
1575                         break;
1576                 default:
1577                         return Q931E_ILLEGAL_IE;
1578                         break;
1579                 }
1580         }
1581 
1582         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1583         return Q931E_NO_ERROR;
1584 }
1585 
1586 /*****************************************************************************
1587 
1588   Function:      Q931Pmes_Suspend
1589 
1590 *****************************************************************************/
1591 L3INT Q931Pmes_Suspend(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1592 {
1593         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1594         L3INT rc = Q931E_NO_ERROR;
1595         L3INT Octet = 0;
1596 
1597         /* Q931 Message Header */
1598         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1599         
1600         /* Call Identity */
1601         if (Q931IsIEPresent(pMes->CallID)) {
1602                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CALL_IDENTITY](pTrunk, Q931GetIEPtr(pMes->CallID,pMes->buf), OBuf, &Octet)) != 0)
1603                         return rc;
1604         }
1605 
1606         *OSize = Octet; 
1607         return rc;
1608 }
1609 
1610 /*****************************************************************************
1611 
1612   Function:      Q931Umes_SuspendAck
1613 
1614 *****************************************************************************/
1615 L3INT Q931Umes_SuspendAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1616 {
1617         L3INT OOff = 0;
1618         L3INT rc = Q931E_NO_ERROR;
1619 
1620         while (IOff < Size) {
1621                 switch (IBuf[IOff]) {
1622                 case Q931ie_DISPLAY:
1623                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1624                         if (rc != Q931E_NO_ERROR) 
1625                                 return rc;
1626                         break;
1627                 default:
1628                         return Q931E_ILLEGAL_IE;
1629                         break;
1630                 }
1631         }
1632 
1633         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1634         return Q931E_NO_ERROR;
1635 }
1636 
1637 /*****************************************************************************
1638 
1639   Function:      Q931Pmes_SuspendAck
1640 
1641 *****************************************************************************/
1642 L3INT Q931Pmes_SuspendAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1643 {
1644         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1645         L3INT rc = Q931E_NO_ERROR;
1646         L3INT Octet = 0;
1647 
1648         /* Q931 Message Header */
1649         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1650         
1651         /* Display */
1652         if (Q931IsIEPresent(pMes->Display)) {
1653                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1654                         return rc;
1655         }
1656 
1657         *OSize = Octet; 
1658         return rc;
1659 }
1660 
1661 /*****************************************************************************
1662 
1663   Function:      Q931Umes_SuspendReject
1664 
1665 *****************************************************************************/
1666 L3INT Q931Umes_SuspendReject(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1667 {
1668         L3INT OOff = 0;
1669         L3INT rc = Q931E_NO_ERROR;
1670 
1671         while (IOff < Size) {
1672                 switch (IBuf[IOff]) {
1673                 case Q931ie_CAUSE:
1674                 case Q931ie_DISPLAY:
1675                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1676                         if (rc != Q931E_NO_ERROR) 
1677                                 return rc;
1678                         break;
1679                 default:
1680                         return Q931E_ILLEGAL_IE;
1681                         break;
1682                 }
1683         }
1684 
1685         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1686         return Q931E_NO_ERROR;
1687 }
1688 
1689 /*****************************************************************************
1690 
1691   Function:      Q931Pmes_SuspendReject
1692 
1693 *****************************************************************************/
1694 L3INT Q931Pmes_SuspendReject(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1695 {
1696         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1697         L3INT rc = Q931E_NO_ERROR;
1698         L3INT Octet = 0;
1699 
1700         /* Q931 Message Header */
1701         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1702         
1703         /* Cause */
1704         if (Q931IsIEPresent(pMes->Cause)) {
1705                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CAUSE](pTrunk, Q931GetIEPtr(pMes->Cause,pMes->buf), OBuf, &Octet)) != 0)
1706                         return rc;
1707         }
1708 
1709         /* Display */
1710         if (Q931IsIEPresent(pMes->Display)) {
1711                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_DISPLAY](pTrunk, Q931GetIEPtr(pMes->Display,pMes->buf), OBuf, &Octet)) != 0)
1712                         return rc;
1713         }
1714 
1715         *OSize = Octet; 
1716         return rc;
1717 }
1718 
1719 /*****************************************************************************
1720 
1721   Function:      Q931Umes_UserInformation
1722 
1723 *****************************************************************************/
1724 L3INT Q931Umes_UserInformation(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT I, L3INT O)
1725 {
1726         L3BOOL RetCode = L3FALSE;
1727 
1728         NoWarning(mes);
1729         NoWarning(IBuf);
1730 
1731         return RetCode;
1732 }
1733 
1734 /*****************************************************************************
1735 
1736   Function:      Q931Pmes_UserInformation
1737 
1738 *****************************************************************************/
1739 L3INT Q931Pmes_UserInformation(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1740 {
1741         L3BOOL RetCode = L3FALSE;
1742 
1743         NoWarning(OBuf);
1744         NoWarning(IBuf);
1745 
1746         *OSize = 0;     
1747 
1748         return RetCode;
1749 }
1750 
1751 /*****************************************************************************
1752 
1753   Function:      Q931Umes_Service
1754 
1755 *****************************************************************************/
1756 L3INT Q931Umes_Service(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1757 {
1758         L3INT OOff = 0;
1759         L3INT rc = Q931E_NO_ERROR;
1760 
1761         while (IOff < Size) {
1762                 switch (IBuf[IOff]) {
1763                 case Q931ie_CHANNEL_IDENTIFICATION:
1764                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1765                         if (rc != Q931E_NO_ERROR) 
1766                                 return rc;
1767                         break;
1768                 case Q931ie_CHANGE_STATUS:
1769                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1770                         if (rc != Q931E_NO_ERROR) 
1771                                 return rc;
1772                         break;
1773                 default:
1774                         return Q931E_ILLEGAL_IE;
1775                         break;
1776                 }
1777         }
1778 
1779         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1780         return Q931E_NO_ERROR;
1781 }
1782 
1783 /*****************************************************************************
1784 
1785   Function:      Q931Pmes_Service
1786 
1787 *****************************************************************************/
1788 L3INT Q931Pmes_Service(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1789 {
1790         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1791         L3INT rc = Q931E_NO_ERROR;
1792         L3INT Octet = 0;
1793 
1794         /* Q931 Message Header */
1795         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1796         
1797         /* Display */
1798         if (Q931IsIEPresent(pMes->ChanID)) {
1799                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1800                         return rc;
1801         }
1802 
1803         if (Q931IsIEPresent(pMes->ChangeStatus)) {
1804                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANGE_STATUS](pTrunk, Q931GetIEPtr(pMes->ChangeStatus,pMes->buf), OBuf, &Octet)) != 0)
1805                         return rc;
1806         }
1807 
1808         *OSize = Octet; 
1809         return rc;
1810 }
1811 
1812 /*****************************************************************************
1813 
1814   Function:      Q931Umes_ServiceAck
1815 
1816 *****************************************************************************/
1817 L3INT Q931Umes_ServiceAck(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generic *mes, L3INT IOff, L3INT Size)
1818 {
1819         L3INT OOff = 0;
1820         L3INT rc = Q931E_NO_ERROR;
1821 
1822         while (IOff < Size) {
1823                 switch (IBuf[IOff]) {
1824                 case Q931ie_CHANNEL_IDENTIFICATION:
1825                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1826                         if (rc != Q931E_NO_ERROR) 
1827                                 return rc;
1828                         break;
1829                 case Q931ie_CHANGE_STATUS:
1830                         rc = Q931Uie[pTrunk->Dialect][IBuf[IOff]](pTrunk, mes, &IBuf[IOff], &mes->buf[OOff], &IOff, &OOff);
1831                         if (rc != Q931E_NO_ERROR) 
1832                                 return rc;
1833                         break;
1834                 default:
1835                         return Q931E_ILLEGAL_IE;
1836                         break;
1837                 }
1838         }
1839 
1840         mes->Size = sizeof(Q931mes_Generic) - 1 + OOff;
1841         return Q931E_NO_ERROR;
1842 }
1843 
1844 /*****************************************************************************
1845 
1846   Function:      Q931Pmes_ServiceAck
1847 
1848 *****************************************************************************/
1849 L3INT Q931Pmes_ServiceAck(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *IBuf, L3INT ISize, L3UCHAR *OBuf, L3INT *OSize)
1850 {
1851         Q931mes_Generic *pMes = (Q931mes_Generic *)IBuf;
1852         L3INT rc = Q931E_NO_ERROR;
1853         L3INT Octet = 0;
1854 
1855         /* Q931 Message Header */
1856         Q931MesgHeader(pTrunk, pMes, OBuf, *OSize, &Octet);
1857         
1858         if (Q931IsIEPresent(pMes->ChangeStatus)) {
1859                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANGE_STATUS](pTrunk, Q931GetIEPtr(pMes->ChangeStatus,pMes->buf), OBuf, &Octet)) != 0)
1860                         return rc;
1861         }
1862 
1863         if (Q931IsIEPresent(pMes->ChanID)) {
1864                 if ((rc = Q931Pie[pTrunk->Dialect][Q931ie_CHANNEL_IDENTIFICATION](pTrunk, Q931GetIEPtr(pMes->ChanID,pMes->buf), OBuf, &Octet)) != 0)
1865                         return rc;
1866         }
1867 
1868         *OSize = Octet; 
1869         return rc;
1870 }

/* [<][>][^][v][top][bottom][index][help] */