The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netisdn/i4b_q931.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions
    6  * are met:
    7  * 1. Redistributions of source code must retain the above copyright
    8  *    notice, this list of conditions and the following disclaimer.
    9  * 2. Redistributions in binary form must reproduce the above copyright
   10  *    notice, this list of conditions and the following disclaimer in the
   11  *    documentation and/or other materials provided with the distribution.
   12  *
   13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   23  * SUCH DAMAGE.
   24  *
   25  *---------------------------------------------------------------------------
   26  *
   27  *      i4b_q931.c - Q931 received messages handling
   28  *      --------------------------------------------
   29  *
   30  *      $Id: i4b_q931.c,v 1.21 2006/11/16 01:33:49 christos Exp $
   31  *
   32  * $FreeBSD$
   33  *
   34  *      last edit-date: [Fri Jan  5 11:33:47 2001]
   35  *
   36  *---------------------------------------------------------------------------*/
   37 
   38 #include <sys/cdefs.h>
   39 __KERNEL_RCSID(0, "$NetBSD: i4b_q931.c,v 1.21 2006/11/16 01:33:49 christos Exp $");
   40 
   41 #ifdef __FreeBSD__
   42 #include "i4bq931.h"
   43 #else
   44 #define NI4BQ931        1
   45 #endif
   46 
   47 #if NI4BQ931 > 0
   48 
   49 #include <sys/param.h>
   50 #include <sys/kernel.h>
   51 #include <sys/systm.h>
   52 #include <sys/mbuf.h>
   53 #include <sys/socket.h>
   54 #include <net/if.h>
   55 
   56 #if defined(__NetBSD__) && __NetBSD_Version__ >= 104230000
   57 #include <sys/callout.h>
   58 #endif
   59 
   60 #ifdef __FreeBSD__
   61 #include <machine/i4b_debug.h>
   62 #include <machine/i4b_ioctl.h>
   63 #include <machine/i4b_cause.h>
   64 #else
   65 #include <netisdn/i4b_debug.h>
   66 #include <netisdn/i4b_ioctl.h>
   67 #include <netisdn/i4b_cause.h>
   68 #endif
   69 
   70 #include <netisdn/i4b_isdnq931.h>
   71 #include <netisdn/i4b_l2.h>
   72 #include <netisdn/i4b_l3l4.h>
   73 #include <netisdn/i4b_mbuf.h>
   74 #include <netisdn/i4b_global.h>
   75 
   76 #include <netisdn/i4b_l3.h>
   77 #include <netisdn/i4b_l3fsm.h>
   78 #include <netisdn/i4b_q931.h>
   79 
   80 #include <netisdn/i4b_l4.h>
   81 
   82 unsigned int i4b_l3_debug = L3_DEBUG_DEFAULT;
   83 
   84 /* protocol independent causes -> Q.931 causes */
   85 
   86 unsigned char cause_tab_q931[CAUSE_I4B_MAX] = {
   87         CAUSE_Q850_NCCLR,       /* CAUSE_I4B_NORMAL -> normal call clearing */
   88         CAUSE_Q850_USRBSY,      /* CAUSE_I4B_BUSY -> user busy */
   89         CAUSE_Q850_NOCAVAIL,    /* CAUSE_I4B_NOCHAN -> no circuit/channel available*/
   90         CAUSE_Q850_INCDEST,     /* CAUSE_I4B_INCOMP -> incompatible destination */
   91         CAUSE_Q850_CALLREJ,     /* CAUSE_I4B_REJECT -> call rejected */
   92         CAUSE_Q850_DSTOOORDR,   /* CAUSE_I4B_OOO -> destination out of order */
   93         CAUSE_Q850_TMPFAIL,     /* CAUSE_I4B_TMPFAIL -> temporary failure */
   94         CAUSE_Q850_USRBSY,      /* CAUSE_I4B_L1ERROR -> L1 error / persistent deact XXX */
   95         CAUSE_Q850_USRBSY,      /* CAUSE_I4B_LLDIAL -> no dialout on leased line XXX */
   96 };
   97 
   98 /*---------------------------------------------------------------------------*
   99  *      setup cr ref flag according to direction
  100  *---------------------------------------------------------------------------*/
  101 unsigned char
  102 setup_cr(call_desc_t *cd, unsigned char cr)
  103 {
  104         if(cd->crflag == CRF_ORIG)
  105                 return(cr & 0x7f);      /* clear cr ref flag */
  106         else if(cd->crflag == CRF_DEST)
  107                 return(cr | 0x80);      /* set cr ref flag */
  108         else
  109                 panic("setup_cr: invalid crflag!");
  110 }
  111 
  112 /*---------------------------------------------------------------------------*
  113  *      decode and process a Q.931 message
  114  *---------------------------------------------------------------------------*/
  115 void
  116 i4b_decode_q931(int isdnif, int msg_len, u_char *msg_ptr)
  117 {
  118         call_desc_t *cd = NULL;
  119         int codeset = CODESET_0;
  120         int old_codeset = CODESET_0;
  121         int shift_flag = UNSHIFTED;
  122         int crlen = 0;
  123         int crval = 0;
  124         int crflag = 0;
  125         int i;
  126         int offset;
  127         int s;
  128 
  129         /* check protocol discriminator */
  130 
  131         if(*msg_ptr != PD_Q931)
  132         {
  133                 static int protoflag = -1;      /* print only once .. */
  134 
  135                 if(*msg_ptr != protoflag)
  136                 {
  137                         NDBGL3(L3_P_MSG, "unknown protocol discriminator 0x%x!", *msg_ptr);
  138                         protoflag = *msg_ptr;
  139                 }
  140                 return;
  141         }
  142 
  143         msg_ptr++;
  144         msg_len--;
  145 
  146         s = splnet();           /* this has to be protected ! */
  147 
  148         /* extract call reference */
  149 
  150         crlen = *msg_ptr & CRLENGTH_MASK;
  151         msg_ptr++;
  152         msg_len--;
  153 
  154         if (crlen != 0)
  155         {
  156                 crval += *msg_ptr & 0x7f;
  157                 crflag = (*msg_ptr >> 7) & 0x01;
  158                 msg_ptr++;
  159                 msg_len--;
  160 
  161                 for(i=1; i < crlen; i++)
  162                 {
  163                         crval += *msg_ptr;
  164                         msg_ptr++;
  165                         msg_len--;
  166                 }
  167         }
  168         else
  169         {
  170                 crval = 0;
  171                 crflag = 0;
  172         }
  173 
  174         NDBGL3(L3_P_MSG, "Call Ref, len %d, val %d, flag %d", crlen, crval, crflag);
  175 
  176         /* find or allocate calldescriptor */
  177 
  178         if((cd = cd_by_isdnifcr(isdnif, crval,
  179                         crflag == CRF_DEST ? CRF_ORIG : CRF_DEST)) == NULL)
  180         {
  181                 if(*msg_ptr == SETUP)
  182                 {
  183                         struct isdn_l3_driver *drv;
  184 
  185                         drv = isdn_find_l3_by_isdnif(isdnif);
  186                         /* get and init new calldescriptor */
  187 
  188                         cd = reserve_cd();      /* cdid filled in */
  189                         cd->isdnif = isdnif;
  190                         cd->l3drv = drv;
  191                         cd->cr = crval;
  192                         cd->crflag = CRF_DEST;  /* we are the dest side */
  193                         cd->l4_driver = NULL;           /* reset link tab ptrs */
  194                         cd->l4_driver_softc = NULL;
  195                 }
  196                 else
  197                 {
  198 /*XXX*/                 if(crval != 0)  /* ignore global call references */
  199                         {
  200                                 NDBGL3(L3_P_ERR, "cannot find calldescriptor for cr = 0x%x, crflag = 0x%x, msg = 0x%x, frame = ", crval, crflag, *msg_ptr);
  201                                 i4b_print_frame(msg_len, msg_ptr);
  202                         }
  203                         splx(s);
  204                         return;
  205                 }
  206         }
  207 
  208         splx(s);
  209 
  210         /* decode and handle message type */
  211 
  212         i4b_decode_q931_message(cd, *msg_ptr);
  213         msg_ptr++;
  214         msg_len--;
  215 
  216         /* process information elements */
  217 
  218         while(msg_len > 0)
  219         {
  220                 /* check for shift codeset IE */
  221 
  222                 if((*msg_ptr & 0x80) && ((*msg_ptr & 0xf0) == SOIE_SHIFT))
  223                 {
  224                         if(!(*msg_ptr & SHIFT_LOCK))
  225                                 shift_flag = SHIFTED;
  226 
  227                         old_codeset = codeset;
  228                         codeset = *msg_ptr & CODESET_MASK;
  229 
  230                         if((shift_flag != SHIFTED) &&
  231                            (codeset <= old_codeset))
  232                         {
  233                                 NDBGL3(L3_P_ERR, "Q.931 lockingshift proc violation, shift %d -> %d", old_codeset, codeset);
  234                                 codeset = old_codeset;
  235                         }
  236                         msg_len--;
  237                         msg_ptr++;
  238                 }
  239 
  240                 /* process one IE for selected codeset */
  241 
  242                 switch(codeset)
  243                 {
  244                         case CODESET_0:
  245                                 offset = i4b_decode_q931_cs0_ie(cd, msg_len, msg_ptr);
  246                                 msg_len -= offset;
  247                                 msg_ptr += offset;
  248                                 break;
  249 
  250                         default:
  251                                 NDBGL3(L3_P_ERR, "unknown codeset %d, ", codeset);
  252                                 i4b_print_frame(msg_len, msg_ptr);
  253                                 msg_len = 0;
  254                                 break;
  255                 }
  256 
  257                 /* check for non-locking shifts */
  258 
  259                 if(shift_flag == SHIFTED)
  260                 {
  261                         shift_flag = UNSHIFTED;
  262                         codeset = old_codeset;
  263                 }
  264         }
  265         next_l3state(cd, cd->event);
  266 }
  267 
  268 /*---------------------------------------------------------------------------*
  269  *      decode and process one Q.931 codeset 0 information element
  270  *---------------------------------------------------------------------------*/
  271 int
  272 i4b_decode_q931_cs0_ie(call_desc_t *cd, int msg_len, u_char *msg_ptr)
  273 {
  274         int i, j;
  275         char *p;
  276 
  277         switch(*msg_ptr)
  278         {
  279 
  280 /*********/
  281 /* Q.931 */
  282 /*********/
  283                 /* single byte IE's */
  284 
  285                 case IEI_SENDCOMPL:
  286                         NDBGL3(L3_P_MSG, "IEI_SENDCOMPL");
  287                         return(1);
  288                         break;
  289 
  290                 /* multi byte IE's */
  291 
  292                 case IEI_SEGMMSG:       /* segmented message */
  293                         NDBGL3(L3_P_MSG, "IEI_SEGMENTED_MESSAGE");
  294                         break;
  295 
  296                 case IEI_BEARERCAP:     /* bearer capability */
  297                         switch(msg_ptr[2])
  298                         {
  299                                 case 0x80:      /* speech */
  300                                 case 0x89:      /* restricted digital info */
  301                                 case 0x90:      /* 3.1 kHz audio */
  302 /* XXX */                               cd->bprot = BPROT_NONE;
  303                                         NDBGL3(L3_P_MSG, "IEI_BEARERCAP - Telephony");
  304                                         break;
  305 
  306                                 case 0x88:      /* unrestricted digital info */
  307 /* XXX */                               cd->bprot = BPROT_RHDLC;
  308                                         NDBGL3(L3_P_MSG, "IEI_BEARERCAP - Raw HDLC");
  309                                         break;
  310 
  311                                 default:
  312 /* XXX */                               cd->bprot = BPROT_NONE;
  313                                         NDBGL3(L3_P_ERR, "IEI_BEARERCAP - Unsupported B-Protocol 0x%x", msg_ptr[2]);
  314                                         break;
  315                         }
  316                         break;
  317 
  318                 case IEI_CAUSE:         /* cause */
  319                         if(msg_ptr[2] & 0x80)
  320                         {
  321                                 cd->cause_in = msg_ptr[3] & 0x7f;
  322                                 NDBGL3(L3_P_MSG, "IEI_CAUSE = %d", msg_ptr[3] & 0x7f);
  323                         }
  324                         else
  325                         {
  326                                 cd->cause_in = msg_ptr[4] & 0x7f;
  327                                 NDBGL3(L3_P_MSG, "IEI_CAUSE = %d", msg_ptr[4] & 0x7f);
  328                         }
  329                         break;
  330 
  331                 case IEI_CALLID:        /* call identity */
  332                         NDBGL3(L3_P_MSG, "IEI_CALL_IDENTITY");
  333                         break;
  334 
  335                 case IEI_CALLSTATE:     /* call state           */
  336                         cd->call_state = msg_ptr[2] & 0x3f;
  337                         NDBGL3(L3_P_MSG, "IEI_CALLSTATE = %d", cd->call_state);
  338                         break;
  339 
  340                 case IEI_CHANNELID:     /* channel id */
  341                         if((msg_ptr[2] & 0xf4) != 0x80)
  342                         {
  343                                 cd->channelid = CHAN_NO;
  344                                 NDBGL3(L3_P_ERR, "IEI_CHANNELID, unsupported value 0x%x", msg_ptr[2]);
  345                         }
  346                         else
  347                         {
  348                                 int old_chanid = cd->channelid;
  349                                 switch(msg_ptr[2] & 0x03)
  350                                 {
  351                                         case IE_CHAN_ID_NO:
  352                                                 cd->channelid = CHAN_NO;
  353                                                 break;
  354                                         case IE_CHAN_ID_B1:
  355                                                 cd->channelid = CHAN_B1;
  356                                                 break;
  357                                         case IE_CHAN_ID_B2:
  358                                                 cd->channelid = CHAN_B2;
  359                                                 break;
  360                                         case IE_CHAN_ID_ANY:
  361                                                 cd->channelid = CHAN_ANY;
  362                                                 break;
  363                                 }
  364                                 cd->channelexcl = (msg_ptr[2] & 0x08) >> 3;
  365 
  366                                 NDBGL3(L3_P_MSG, "IEI_CHANNELID - channel %d, exclusive = %d", cd->channelid, cd->channelexcl);
  367 
  368                                 /* if this is the first time we know the real channel,
  369                                  * reserve it */
  370                                 if (old_chanid != cd->channelid)
  371                                 {
  372                                         if((cd->channelid == CHAN_B1) || (cd->channelid == CHAN_B2))
  373                                         {
  374                                                 struct isdn_l3_driver *d = cd->l3drv;
  375 
  376                                                 if (i4b_l2_channel_get_state(d, cd->channelid) == BCH_ST_FREE) {
  377                                                         if (d != NULL) {
  378                                                                 d->bch_state[cd->channelid] = BCH_ST_RSVD;
  379                                                                 update_controller_leds(d);
  380                                                         }
  381                                                         i4b_l2_channel_set_state(d, cd->channelid, BCH_ST_RSVD);
  382                                                 } else
  383                                                         NDBGL3(L3_P_ERR, "IE ChannelID, Channel NOT free!!");
  384                                         }
  385                                         else if(cd->channelid == CHAN_NO)
  386                                         {
  387                                                 NDBGL3(L3_P_MSG, "IE ChannelID, SETUP with channel = No channel (CW)");
  388                                         }
  389                                         else /* cd->channelid == CHAN_ANY */
  390                                         {
  391                                                 NDBGL3(L3_P_ERR, "ERROR: IE ChannelID, SETUP with channel = Any channel!");
  392                                         }
  393                                 }
  394                         }
  395                         break;
  396 
  397                 case IEI_PROGRESSI:     /* progress indicator   */
  398                         NDBGL3(L3_P_MSG, "IEI_PROGRESSINDICATOR");
  399                         break;
  400 
  401                 case IEI_NETSPCFAC:     /* network specific fac */
  402                         NDBGL3(L3_P_MSG, "IEI_NETSPCFAC");
  403                         break;
  404 
  405                 case IEI_NOTIFIND:      /* notification indicator */
  406                         NDBGL3(L3_P_MSG, "IEI_NOTIFICATION_INDICATOR");
  407                         break;
  408 
  409                 case IEI_DISPLAY:       /* display              */
  410                         memcpy(cd->display, &msg_ptr[2], min(DISPLAY_MAX, msg_ptr[1]));
  411                         cd->display[min(DISPLAY_MAX, msg_ptr[1])] = '\0';
  412                         NDBGL3(L3_P_MSG, "IEI_DISPLAY = %s", cd->display);
  413                         break;
  414 
  415                 case IEI_DATETIME:      /* date/time            */
  416                         i = 2;
  417                         j = msg_ptr[1];
  418                         p = &(cd->datetime[0]);
  419                         *p = '\0';
  420 
  421                         for(j = msg_ptr[1]; j > 0; j--, i++)
  422                                 sprintf(p+strlen(p), "%02d", msg_ptr[i]);
  423 
  424                         NDBGL3(L3_P_MSG, "IEI_DATETIME = %s", cd->datetime);
  425                         break;
  426 
  427                 case IEI_KEYPAD:        /* keypad facility */
  428                         NDBGL3(L3_P_MSG, "IEI_KEYPAD_FACILITY");
  429                         break;
  430 
  431                 case IEI_SIGNAL:        /* signal type */
  432                         NDBGL3(L3_P_MSG, "IEI_SIGNAL = %d", msg_ptr[2]);
  433                         break;
  434 
  435                 case IEI_INFRATE:       /* information rate */
  436                         NDBGL3(L3_P_MSG, "IEI_INFORMATION_RATE");
  437                         break;
  438 
  439                 case IEI_ETETDEL:       /* end to end transit delay */
  440                         NDBGL3(L3_P_MSG, "IEI_END_TO_END_TRANSIT_DELAY");
  441                         break;
  442 
  443                 case IEI_CUG:           /* closed user group */
  444                         NDBGL3(L3_P_MSG, "IEI_CLOSED_USER_GROUP");
  445                         break;
  446 
  447                 case IEI_CALLINGPN:     /* calling party no */
  448                         cd->type_plan = msg_ptr[2] & 0x7f;
  449                         if(msg_ptr[2] & 0x80) /* no presentation/screening indicator ? */
  450                         {
  451                                 memcpy(cd->src_telno, &msg_ptr[3], min(TELNO_MAX, msg_ptr[1]-1));
  452                                 cd->src_telno[min(TELNO_MAX, msg_ptr[1] - 1)] = '\0';
  453                                 cd->scr_ind = SCR_NONE;
  454                                 cd->prs_ind = PRS_NONE;
  455                         }
  456                         else
  457                         {
  458                                 memcpy(cd->src_telno, &msg_ptr[4], min(TELNO_MAX, msg_ptr[1]-2));
  459                                 cd->src_telno[min(TELNO_MAX, msg_ptr[1] - 2)] = '\0';
  460                                 cd->scr_ind = (msg_ptr[3] & 0x03) + SCR_USR_NOSC;
  461                                 cd->prs_ind = ((msg_ptr[3] >> 5) & 0x03) + PRS_ALLOWED;
  462                         }
  463                         NDBGL3(L3_P_MSG, "IEI_CALLINGPN = %s", cd->src_telno);
  464                         break;
  465 
  466                 case IEI_CALLINGPS:     /* calling party subaddress */
  467                         NDBGL3(L3_P_MSG, "IEI_CALLINGPS");
  468                         memcpy(cd->src_subaddr, &msg_ptr[1], min(SUBADDR_MAX, msg_ptr[1]-1));
  469                         break;
  470 
  471                 case IEI_CALLEDPN:      /* called party number */
  472                         memcpy(cd->dst_telno, &msg_ptr[3], min(TELNO_MAX, msg_ptr[1]-1));
  473                         cd->dst_telno[min(TELNO_MAX, msg_ptr [1] - 1)] = '\0';
  474                         NDBGL3(L3_P_MSG, "IEI_CALLED = %s", cd->dst_telno);
  475                         break;
  476 
  477                 case IEI_CALLEDPS:      /* called party subaddress */
  478                         NDBGL3(L3_P_MSG, "IEI_CALLEDPS");
  479                         memcpy(cd->dest_subaddr, &msg_ptr[1], min(SUBADDR_MAX, msg_ptr[1]-1));
  480                         break;
  481 
  482                 case IEI_REDIRNO:       /* redirecting number */
  483                         NDBGL3(L3_P_MSG, "IEI_REDIRECTING_NUMBER");
  484                         break;
  485 
  486                 case IEI_TRNSEL:        /* transit network selection */
  487                         NDBGL3(L3_P_MSG, "IEI_TRANSIT_NETWORK_SELECTION");
  488                         break;
  489 
  490                 case IEI_RESTARTI:      /* restart indicator */
  491                         NDBGL3(L3_P_MSG, "IEI_RESTART_INDICATOR");
  492                         break;
  493 
  494                 case IEI_LLCOMPAT:      /* low layer compat */
  495                         NDBGL3(L3_P_MSG, "IEI_LLCOMPAT");
  496                         break;
  497 
  498                 case IEI_HLCOMPAT:      /* high layer compat    */
  499                         NDBGL3(L3_P_MSG, "IEI_HLCOMPAT");
  500                         break;
  501 
  502                 case IEI_USERUSER:      /* user-user */
  503                         NDBGL3(L3_P_MSG, "IEI_USER_USER");
  504                         break;
  505 
  506                 case IEI_ESCAPE:        /* escape for extension */
  507                         NDBGL3(L3_P_MSG, "IEI_ESCAPE");
  508                         break;
  509 
  510 /*********/
  511 /* Q.932 */
  512 /*********/
  513                 case IEI_FACILITY:      /* facility             */
  514                         NDBGL3(L3_P_MSG, "IEI_FACILITY");
  515                         if(i4b_aoc(msg_ptr, cd) > -1)
  516                                 i4b_l4_charging_ind(cd);
  517                         break;
  518 
  519 /*********/
  520 /* Q.95x */
  521 /*********/
  522                 case IEI_CONCTDNO:      /* connected number     */
  523                         NDBGL3(L3_P_MSG, "IEI_CONCTDNO");
  524                         break;
  525 
  526 
  527                 default:
  528                         NDBGL3(L3_P_ERR, "Unknown IE %d - ", *msg_ptr);
  529                         i4b_print_frame(msg_ptr[1]+2, msg_ptr);
  530                         break;
  531         }
  532         return(msg_ptr[1] + 2);
  533 }
  534 
  535 /*---------------------------------------------------------------------------*
  536  *      decode and process one Q.931 codeset 0 information element
  537  *---------------------------------------------------------------------------*/
  538 void
  539 i4b_decode_q931_message(call_desc_t *cd, u_char message_type)
  540 {
  541         const char *m = NULL;
  542 
  543         cd->event = EV_ILL;
  544 
  545         switch(message_type)
  546         {
  547                 /* call establishment */
  548 
  549                 case ALERT:
  550                         cd->event = EV_ALERT;
  551                         m = "ALERT";
  552                         break;
  553 
  554                 case CALL_PROCEEDING:
  555                         cd->event = EV_CALLPRC;
  556                         m = "CALL_PROCEEDING";
  557                         break;
  558 
  559                 case PROGRESS:
  560                         cd->event = EV_PROGIND;
  561                         m = "PROGRESS";
  562                         break;
  563 
  564                 case SETUP:
  565                         m = "SETUP";
  566                         cd->bprot = BPROT_NONE;
  567                         cd->cause_in = 0;
  568                         cd->cause_out = 0;
  569                         cd->dst_telno[0] = '\0';
  570                         cd->src_telno[0] = '\0';
  571                         cd->channelid = CHAN_NO;
  572                         cd->channelexcl = 0;
  573                         cd->display[0] = '\0';
  574                         cd->datetime[0] = '\0';
  575                         cd->event = EV_SETUP;
  576                         break;
  577 
  578                 case CONNECT:
  579                         m = "CONNECT";
  580                         cd->datetime[0] = '\0';
  581                         cd->event = EV_CONNECT;
  582                         break;
  583 
  584                 case SETUP_ACKNOWLEDGE:
  585                         m = "SETUP_ACKNOWLEDGE";
  586                         cd->event = EV_SETUPAK;
  587                         break;
  588 
  589                 case CONNECT_ACKNOWLEDGE:
  590                         m = "CONNECT_ACKNOWLEDGE";
  591                         cd->event = EV_CONACK;
  592                         break;
  593 
  594                 /* call information */
  595 
  596                 case USER_INFORMATION:
  597                         m = "USER_INFORMATION";
  598                         break;
  599 
  600                 case SUSPEND_REJECT:
  601                         m = "SUSPEND_REJECT";
  602                         break;
  603 
  604                 case RESUME_REJECT:
  605                         m = "RESUME_REJECT";
  606                         break;
  607 
  608                 case HOLD:
  609                         m = "HOLD";
  610                         break;
  611 
  612                 case SUSPEND:
  613                         m = "SUSPEND";
  614                         break;
  615 
  616                 case RESUME:
  617                         m = "RESUME";
  618                         break;
  619 
  620                 case HOLD_ACKNOWLEDGE:
  621                         m = "HOLD_ACKNOWLEDGE";
  622                         break;
  623 
  624                 case SUSPEND_ACKNOWLEDGE:
  625                         m = "SUSPEND_ACKNOWLEDGE";
  626                         break;
  627 
  628                 case RESUME_ACKNOWLEDGE:
  629                         m = "RESUME_ACKNOWLEDGE";
  630                         break;
  631 
  632                 case HOLD_REJECT:
  633                         m = "HOLD_REJECT";
  634                         break;
  635 
  636                 case RETRIEVE:
  637                         m = "RETRIEVE";
  638                         break;
  639 
  640                 case RETRIEVE_ACKNOWLEDGE:
  641                         m = "RETRIEVE_ACKNOWLEDGE";
  642                         break;
  643 
  644                 case RETRIEVE_REJECT:
  645                         m = "RETRIEVE_REJECT";
  646                         break;
  647 
  648                 /* call clearing */
  649 
  650                 case DISCONNECT:
  651                         m = "DISCONNECT";
  652                         cd->event = EV_DISCONN;
  653                         break;
  654 
  655                 case RESTART:
  656                         m = "RESTART";
  657                         break;
  658 
  659                 case RELEASE:
  660                         m = "RELEASE";
  661                         cd->event = EV_RELEASE;
  662                         break;
  663 
  664                 case RESTART_ACKNOWLEDGE:
  665                         m = "RESTART_ACKNOWLEDGE";
  666                         break;
  667 
  668                 case RELEASE_COMPLETE:
  669                         m = "RELEASE_COMPLETE";
  670                         cd->event = EV_RELCOMP;
  671                         break;
  672 
  673                 /* misc messages */
  674 
  675                 case SEGMENT:
  676                         m = "SEGMENT";
  677                         break;
  678 
  679                 case FACILITY:
  680                         m = "FACILITY";
  681                         cd->event = EV_FACILITY;
  682                         break;
  683 
  684                 case REGISTER:
  685                         m = "REGISTER";
  686                         break;
  687 
  688                 case NOTIFY:
  689                         m = "NOTIFY";
  690                         break;
  691 
  692                 case STATUS_ENQUIRY:
  693                         m = "STATUS_ENQUIRY";
  694                         cd->event = EV_STATENQ;
  695                         break;
  696 
  697                 case CONGESTION_CONTROL:
  698                         m = "CONGESTION_CONTROL";
  699                         break;
  700 
  701                 case INFORMATION:
  702                         m = "INFORMATION";
  703                         cd->event = EV_INFO;
  704                         break;
  705 
  706                 case STATUS:
  707                         m = "STATUS";
  708                         cd->event = EV_STATUS;
  709                         break;
  710 
  711                 default:
  712                         NDBGL3(L3_P_ERR, "isdnif %d, cr = 0x%02x, msg = 0x%02x", cd->isdnif, cd->cr, message_type);
  713                         break;
  714         }
  715         if(m)
  716         {
  717                 NDBGL3(L3_PRIM, "%s: isdnif %d, cr = 0x%02x\n", m, cd->isdnif, cd->cr);
  718         }
  719 }
  720 
  721 #endif /* NI4BQ931 > 0 */

Cache object: a816975cade80deca2966160cbb55ed1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.