]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - usr.sbin/i4b/isdntrace/q931.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / usr.sbin / i4b / isdntrace / q931.c
1 /*
2  * Copyright (c) 1997, 2001 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  *      q931.c - print Q.931 traces
28  *      ---------------------------
29  *
30  * $FreeBSD$
31  *
32  *      last edit-date: [Wed Oct 17 14:49:16 2001]
33  *
34  *---------------------------------------------------------------------------*/
35
36 #include "trace.h"
37
38 /*---------------------------------------------------------------------------*
39  *      decode Q.931 protocol
40  *---------------------------------------------------------------------------*/
41 void
42 decode_q931(char *pbuf, int n, int off, unsigned char *buf, int raw)
43 {
44         int codeset = 0;
45         int codelock = 0;
46         int oldcodeset = 0;
47         
48         int pd;
49         int len;
50         int j;
51         int i;
52
53         if(n <= 0)
54                 return;
55
56         *pbuf = '\0';
57         
58         if(raw)
59         {
60                 for (i = 0; i < n; i += 16)
61                 {
62                         sprintf((pbuf+strlen(pbuf)),"Dump:%.3d  ", i+off);
63                         for (j = 0; j < 16; j++)
64                                 if (i + j < n)
65                                         sprintf((pbuf+strlen(pbuf)),"%02x ", buf[i + j]);
66                                 else
67                                         sprintf((pbuf+strlen(pbuf)),"   ");
68                         sprintf((pbuf+strlen(pbuf)),"      ");
69                         for (j = 0; j < 16 && i + j < n; j++)
70                                 if (isprint(buf[i + j]))
71                                         sprintf((pbuf+strlen(pbuf)),"%c", buf[i + j]);
72                                 else
73                                         sprintf((pbuf+strlen(pbuf)),".");
74                         sprintf((pbuf+strlen(pbuf)),"\n");
75                 }
76         }
77
78         i = 0;
79                 
80         sprintf((pbuf+strlen(pbuf)), "Q931: ");
81
82         /* protocol discriminator */
83
84         pd = buf[i];
85
86         if(pd >= 0x00 && pd <= 0x07)
87                 sprintf((pbuf+strlen(pbuf)), "pd=User-User (0x%02x)\n",pd);
88         else if(pd == 0x08)
89                 sprintf((pbuf+strlen(pbuf)), "pd=Q.931/I.451, ");
90         else if(pd >= 0x10 && pd <= 0x3f)
91                 sprintf((pbuf+strlen(pbuf)), "pd=Other Layer 3 or X.25 (0x%02x)\n",pd);
92         else if(pd >= 0x40 && pd <= 0x4f)
93                 sprintf((pbuf+strlen(pbuf)), "pd=National Use (0x%02x)\n",pd);
94         else if(pd >= 0x50 && pd <= 0xfe)
95                 sprintf((pbuf+strlen(pbuf)), "pd=Other Layer 3 or X.25 (0x%02x)\n",pd);
96         else
97                 sprintf((pbuf+strlen(pbuf)), "pd=Reserved (0x%02x)\n",pd);
98
99         /* call reference */
100
101         i++;
102
103         len = buf[i] & 0x0f;
104
105         switch(len)
106         {
107                 case 0:
108                         sprintf((pbuf+strlen(pbuf)), "cr=Dummy, ");
109                         break;
110                 case 1:
111                         sprintf((pbuf+strlen(pbuf)), "cr=0x%02x %s, ", (buf[i+1] & 0x7f), (buf[i+1] & 0x80) ? "(from destination)" : "(from origination)");
112                         break;
113                 case 2:
114                         sprintf((pbuf+strlen(pbuf)), "cr=0x%02x 0x%02x %s, ", (buf[i+1] & 0x7f), (buf[i+2] & 0x7f), (buf[i+1] & 0x80) ? "(org)" : "(dst)");
115                         break;
116         }
117
118         i += (len+1);
119         
120         /* message type */      
121
122         sprintf((pbuf+strlen(pbuf)), "message=");
123
124         switch(buf[i])
125         {
126                 /* escape to nationally specific message type */
127
128                 case 0x00:
129                         sprintf((pbuf+strlen(pbuf)), "ESCAPE: ");
130                         break;
131
132                 /* call establishment */
133
134                 case 0x01:
135                         sprintf((pbuf+strlen(pbuf)), "ALERTING: ");
136                         break;
137                 case 0x02:
138                         sprintf((pbuf+strlen(pbuf)), "CALL PROCEEDING: ");
139                         break;
140                 case 0x03:
141                         sprintf((pbuf+strlen(pbuf)), "PROGRESS: ");
142                         break;
143                 case 0x05:
144                         sprintf((pbuf+strlen(pbuf)), "SETUP: ");
145                         break;
146                 case 0x07:
147                         sprintf((pbuf+strlen(pbuf)), "CONNECT: ");
148                         break;
149                 case 0x0d:
150                         sprintf((pbuf+strlen(pbuf)), "SETUP ACKNOWLEDGE: ");
151                         break;
152                 case 0x0f:
153                         sprintf((pbuf+strlen(pbuf)), "CONNECT ACKNOWLEDGE: ");
154                         break;
155
156                 /* call information phase */
157
158                 case 0x20:
159                         sprintf((pbuf+strlen(pbuf)), "USER INFORMATION: ");
160                         break;
161                 case 0x21:
162                         sprintf((pbuf+strlen(pbuf)), "SUSPEND REJECT: ");
163                         break;
164                 case 0x22:
165                         sprintf((pbuf+strlen(pbuf)), "RESUME REJECT: ");
166                         break;
167                 case 0x24:
168                         sprintf((pbuf+strlen(pbuf)), "HOLD: ");
169                         break;
170                 case 0x25:
171                         sprintf((pbuf+strlen(pbuf)), "SUSPEND: ");
172                         break;
173                 case 0x26:
174                         sprintf((pbuf+strlen(pbuf)), "RESUME: ");
175                         break;
176                 case 0x28:
177                         sprintf((pbuf+strlen(pbuf)), "HOLD ACKNOWLEDGE: ");
178                         break;
179                 case 0x2d:
180                         sprintf((pbuf+strlen(pbuf)), "SUSPEND ACKNOWLEDGE: ");
181                         break;
182                 case 0x2e:
183                         sprintf((pbuf+strlen(pbuf)), "RESUME ACKNOWLEDGE: ");
184                         break;
185                 case 0x30:
186                         sprintf((pbuf+strlen(pbuf)), "HOLD REJECT (Q.932): ");
187                         break;
188                 case 0x31:
189                         sprintf((pbuf+strlen(pbuf)), "RETRIEVE (Q.932): ");
190                         break;
191                 case 0x32:
192                         sprintf((pbuf+strlen(pbuf)), "RETRIEVE ACKNOWLEDGE (Q.932): ");
193                         break;
194                 case 0x37:
195                         sprintf((pbuf+strlen(pbuf)), "RETRIEVE REJECT (Q.932): ");
196                         break;
197
198                 /* call clearing */
199                         
200                 case 0x40:
201                         sprintf((pbuf+strlen(pbuf)), "DETACH: ");
202                         break;
203                 case 0x45:
204                         sprintf((pbuf+strlen(pbuf)), "DISCONNECT: ");
205                         break;
206                 case 0x46:
207                         sprintf((pbuf+strlen(pbuf)), "RESTART: ");
208                         break;
209                 case 0x48:
210                         sprintf((pbuf+strlen(pbuf)), "DETACH ACKNOWLEDGE: ");
211                         break;
212                 case 0x4d:
213                         sprintf((pbuf+strlen(pbuf)), "RELEASE: ");
214                         break;
215                 case 0x4e:
216                         sprintf((pbuf+strlen(pbuf)), "RESTART ACKNOWLEDGE: ");
217                         break;
218                 case 0x5a:
219                         sprintf((pbuf+strlen(pbuf)), "RELEASE COMPLETE: ");
220                         break;
221                         
222                 /* misc messages */
223
224                 case 0x60:
225                         sprintf((pbuf+strlen(pbuf)), "SEGMENT: ");
226                         break;
227                 case 0x62:
228                         sprintf((pbuf+strlen(pbuf)), "FACILITY (Q.932): ");
229                         break;
230                 case 0x64:
231                         sprintf((pbuf+strlen(pbuf)), "REGISTER (Q.932): ");
232                         break;
233                 case 0x68:
234                         sprintf((pbuf+strlen(pbuf)), "CANCEL ACKNOWLEDGE: ");
235                         break;
236                 case 0x6a:
237                         sprintf((pbuf+strlen(pbuf)), "FACILITY ACKNOWLEDGE: ");
238                         break;
239                 case 0x6c:
240                         sprintf((pbuf+strlen(pbuf)), "REGISTER ACKNOWLEDGE: ");
241                         break;
242                 case 0x6e:
243                         sprintf((pbuf+strlen(pbuf)), "NOTIFY: ");
244                         break;
245                 case 0x70:
246                         sprintf((pbuf+strlen(pbuf)), "CANCEL REJECT: ");
247                         break;
248                 case 0x72:
249                         sprintf((pbuf+strlen(pbuf)), "FACILITY REJECT: ");
250                         break;
251                 case 0x74:
252                         sprintf((pbuf+strlen(pbuf)), "REGISTER REJECT: ");
253                         break;
254                 case 0x75:
255                         sprintf((pbuf+strlen(pbuf)), "STATUS ENQIRY: ");
256                         break;
257                 case 0x79:
258                         sprintf((pbuf+strlen(pbuf)), "CONGESTION CONTROL: ");
259                         break;
260                 case 0x7b:
261                         sprintf((pbuf+strlen(pbuf)), "INFORMATION: ");
262                         break;
263                 case 0x7d:
264                         sprintf((pbuf+strlen(pbuf)), "STATUS: ");
265                         break;
266                 default:
267                         sprintf((pbuf+strlen(pbuf)), "UNDEFINED, TYPE=0x%02x, ", buf[i]);
268                         break;
269         }
270
271         /* other information elements */
272
273         i++;
274         
275         for (; i < n;)
276         {
277                 sprintf((pbuf+strlen(pbuf)), "\n     ");
278                 
279                 if(buf[i] & 0x80)
280                 {
281                         /* single octett info element */
282
283                         switch(buf[i] & 0x70)
284                         {
285                                 case 0x00:      /* reserved */
286                                         sprintf((pbuf+strlen(pbuf)), "[reserved single octett info]");
287                                         break;
288
289                                 case 0x10:      /* shift */
290                                         oldcodeset = codeset;
291                                         codeset = buf[i] & 0x07;
292                                         if(buf[i] & 0x08)
293                                                 codelock = 0;
294                                         else
295                                                 codelock = 1;
296                                         sprintf((pbuf+strlen(pbuf)), "[shift: codeset=%d lock=%d]", codeset, codelock);
297                                         break;
298
299                                 case 0x20:      /* more data */
300                                         if(buf[i] & 0x01)
301                                                 sprintf((pbuf+strlen(pbuf)), "[sending complete]");
302                                         else
303                                                 sprintf((pbuf+strlen(pbuf)), "[more data]");
304                                         break;
305
306                                 case 0x30:      /* congestion level */
307                                         sprintf((pbuf+strlen(pbuf)), "[congestion level=");
308                                         switch(buf[i] & 0x0f)
309                                         {
310                                                 case 0x00:
311                                                         sprintf((pbuf+strlen(pbuf)), "rx-ready]");
312                                                         break;
313                                                 case 0x0f:
314                                                         sprintf((pbuf+strlen(pbuf)), "rx-not-ready]");
315                                                         break;
316                                                 default:
317                                                         sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)]", buf[i] & 0x0f);
318                                                         break;
319                                         }
320                                         break;
321                                         
322                                 case 0x50:      /* repeat ind */
323                                         sprintf((pbuf+strlen(pbuf)), "[repeat indicator]");
324                                         break;
325
326                                 default:
327                                         sprintf((pbuf+strlen(pbuf)), "[UNKNOWN SINGLE OCTET ELEMENT 0x%02x]", buf[i]);
328                                         break;
329                         }
330
331                         i++;    /* next */
332
333                 }
334                 else
335                 {
336                         /* variable length info element */
337
338                         if(codeset == 0)
339                         {
340                                 switch(buf[i])
341                                 {
342                                         case 0x00:
343                                                 sprintf((pbuf+strlen(pbuf)), "[segmented message: ");
344                                                 break;
345                                         case 0x04:
346                                                 sprintf((pbuf+strlen(pbuf)), "[bearer capability: ");
347                                                 i += p_q931bc(pbuf, &buf[i]);
348                                                 goto next;
349                                                 break;
350                                         case 0x08:
351                                                 sprintf((pbuf+strlen(pbuf)), "[cause: ");
352                                                 i += p_q931cause(pbuf, &buf[i]);
353                                                 goto next;
354                                                 break;
355                                         case 0x0c:
356                                                 sprintf((pbuf+strlen(pbuf)), "[connected address (old): ");
357                                                 break;
358                                         case 0x0d:
359                                                 sprintf((pbuf+strlen(pbuf)), "[extended facility (Q.932: )");
360                                                 break;
361                                         case 0x10:
362                                                 sprintf((pbuf+strlen(pbuf)), "[call identity: ");
363                                                 break;
364                                         case 0x14:
365                                                 sprintf((pbuf+strlen(pbuf)), "[call state: ");
366                                                 i++;
367                                                 len = buf[i];
368                                                 i++;
369                                                 sprintf((pbuf+strlen(pbuf)), "Std=");
370                                                 switch((buf[i] & 0x60) >> 5)
371                                                 {
372                                                         case 0:
373                                                                 sprintf((pbuf+strlen(pbuf)), "CCITT");
374                                                                 break;
375                                                         case 1:
376                                                                 sprintf((pbuf+strlen(pbuf)), "ISO/IEC");
377                                                                 break;
378                                                         case 2:
379                                                                 sprintf((pbuf+strlen(pbuf)), "National");
380                                                                 break;
381                                                         case 3:
382                                                                 sprintf((pbuf+strlen(pbuf)), "Special");
383                                                                 break;
384                                                 }
385                                                 sprintf((pbuf+strlen(pbuf)), ", State=");
386
387                                                 switch((buf[i] & 0x3f))
388                                                 {
389                                                         case 0:
390                                                                 sprintf((pbuf+strlen(pbuf)), "Null");
391                                                                 break;
392                                                         case 1:
393                                                                 sprintf((pbuf+strlen(pbuf)), "Call initiated");
394                                                                 break;
395                                                         case 2:
396                                                                 sprintf((pbuf+strlen(pbuf)), "Overlap sending");
397                                                                 break;
398                                                         case 3:
399                                                                 sprintf((pbuf+strlen(pbuf)), "Outgoing call proceeding");
400                                                                 break;
401                                                         case 4:
402                                                                 sprintf((pbuf+strlen(pbuf)), "Call delivered");
403                                                                 break;
404                                                         case 6:
405                                                                 sprintf((pbuf+strlen(pbuf)), "Call present");
406                                                                 break;
407                                                         case 7:
408                                                                 sprintf((pbuf+strlen(pbuf)), "Call received");
409                                                                 break;
410                                                         case 8:
411                                                                 sprintf((pbuf+strlen(pbuf)), "Connect request");
412                                                                 break;
413                                                         case 9:
414                                                                 sprintf((pbuf+strlen(pbuf)), "Incoming call proceeding");
415                                                                 break;
416                                                         case 10:
417                                                                 sprintf((pbuf+strlen(pbuf)), "Active");
418                                                                 break;
419                                                         case 11:
420                                                                 sprintf((pbuf+strlen(pbuf)), "Disconnect request");
421                                                                 break;
422                                                         case 12:
423                                                                 sprintf((pbuf+strlen(pbuf)), "Disconnect indication");
424                                                                 break;
425                                                         case 15:
426                                                                 sprintf((pbuf+strlen(pbuf)), "Suspend request");
427                                                                 break;
428                                                         case 17:
429                                                                 sprintf((pbuf+strlen(pbuf)), "Resume request");
430                                                                 break;
431                                                         case 19:
432                                                                 sprintf((pbuf+strlen(pbuf)), "Release request");
433                                                                 break;
434                                                         case 22:
435                                                                 sprintf((pbuf+strlen(pbuf)), "Call abort");
436                                                                 break;
437                                                         case 25:
438                                                                 sprintf((pbuf+strlen(pbuf)), "Overlap receiving");
439                                                                 break;
440                                                         case 0x3d:
441                                                                 sprintf((pbuf+strlen(pbuf)), "Restart request");
442                                                                 break;
443                                                         case 0x3e:
444                                                                 sprintf((pbuf+strlen(pbuf)), "Restart");
445                                                                 break;
446                                                         default:
447                                                                 sprintf((pbuf+strlen(pbuf)), "ERROR: undefined/reserved");
448                                                                 break;
449                                                 }
450                                                 sprintf((pbuf+strlen(pbuf)), "]");
451                                                 i++;
452                                                 goto next;
453                                                 break;
454                                         case 0x18:
455                                                 sprintf((pbuf+strlen(pbuf)), "[channel id: channel=");
456                                                 i++;
457                                                 len = buf[i];
458                                                 i++;
459                                                 switch(buf[i] & 0x03)
460                                                 {
461                                                         case 0:
462                                                                 sprintf((pbuf+strlen(pbuf)), "no channel");
463                                                                 break;
464                                                         case 1:
465                                                                 sprintf((pbuf+strlen(pbuf)), "B-1");
466                                                                 break;
467                                                         case 2:
468                                                                 sprintf((pbuf+strlen(pbuf)), "B-2");
469                                                                 break;
470                                                         case 3:
471                                                                 sprintf((pbuf+strlen(pbuf)), "any channel");
472                                                                 break;
473                                                 }
474                                                 if(buf[i] & 0x08)
475                                                         sprintf((pbuf+strlen(pbuf)), " (exclusive)]");
476                                                 else
477                                                         sprintf((pbuf+strlen(pbuf)), " (preferred)]");
478                                                 i++;
479                                                 goto next;
480                                                 break;
481                                         case 0x19:
482                                                 sprintf((pbuf+strlen(pbuf)), "[data link connection id (Q.933): ");
483                                                 break;
484                                         case 0x1c:
485                                                 i += q932_facility(pbuf, &buf[i]);
486                                                 goto next;
487                                                 break;
488                                         case 0x1e:
489                                                 sprintf((pbuf+strlen(pbuf)), "[progress ind: ");
490                                                 i++;
491                                                 len = buf[i];
492                                                 i++;
493                                                 sprintf((pbuf+strlen(pbuf)), "Std=");
494                                                 switch((buf[i] & 0x60) >> 5)
495                                                 {
496                                                         case 0:
497                                                                 sprintf((pbuf+strlen(pbuf)), "CCITT");
498                                                                 break;
499                                                         case 1:
500                                                                 sprintf((pbuf+strlen(pbuf)), "ISO/IEC");
501                                                                 break;
502                                                         case 2:
503                                                                 sprintf((pbuf+strlen(pbuf)), "National");
504                                                                 break;
505                                                         case 3:
506                                                                 sprintf((pbuf+strlen(pbuf)), "Local");
507                                                                 break;
508                                                 }
509                                                 sprintf((pbuf+strlen(pbuf)), ", Loc=");
510
511                                                 switch((buf[i] & 0x0f))
512                                                 {
513                                                         case 0:
514                                                                 sprintf((pbuf+strlen(pbuf)), "User");
515                                                                 break;
516                                                         case 1:
517                                                                 sprintf((pbuf+strlen(pbuf)), "Private network serving local user");
518                                                                 break;
519                                                         case 2:
520                                                                 sprintf((pbuf+strlen(pbuf)), "Public network serving local user");
521                                                                 break;
522                                                         case 3:
523                                                                 sprintf((pbuf+strlen(pbuf)), "Transit network");
524                                                                 break;
525                                                         case 4:
526                                                                 sprintf((pbuf+strlen(pbuf)), "Public network serving remote user");
527                                                                 break;
528                                                         case 5:
529                                                                 sprintf((pbuf+strlen(pbuf)), "Private network serving remote user");
530                                                                 break;
531                                                         case 6:
532                                                                 sprintf((pbuf+strlen(pbuf)), "Network beyond interworking point");
533                                                                 break;
534                                                         default:
535                                                                 sprintf((pbuf+strlen(pbuf)), "ERROR: undefined/reserved");
536                                                                 break;
537                                                 }
538
539                                                 i++;
540
541                                                 sprintf((pbuf+strlen(pbuf)), "\n          Description: ");
542                                                 
543                                                 switch((buf[i] & 0x7f))
544                                                 {
545                                                         case 1:
546                                                                 sprintf((pbuf+strlen(pbuf)), "Call is not end-to-end ISDN");
547                                                                 break;
548                                                         case 2:
549                                                                 sprintf((pbuf+strlen(pbuf)), "Destination address is non-ISDN");
550                                                                 break;
551                                                         case 3:
552                                                                 sprintf((pbuf+strlen(pbuf)), "Origination address is non-ISDN");
553                                                                 break;
554                                                         case 4:
555                                                                 sprintf((pbuf+strlen(pbuf)), "Call has returned to the ISDN");
556                                                                 break;
557                                                         case 5:
558                                                                 sprintf((pbuf+strlen(pbuf)), "Interworking occured, Service change");
559                                                                 break;
560                                                         case 8:
561                                                                 sprintf((pbuf+strlen(pbuf)), "In-band info or appropriate pattern now available");
562                                                                 break;
563                                                         default:
564                                                                 sprintf((pbuf+strlen(pbuf)), "ERROR: undefined/reserved");
565                                                                 break;
566                                                 }
567                                                 sprintf((pbuf+strlen(pbuf)), "]");
568                                                 i++;
569                                                 goto next;
570                                                 break;
571                                         case 0x20:
572                                                 sprintf((pbuf+strlen(pbuf)), "[network specific facilities: ");
573                                                 break;
574                                         case 0x24:
575                                                 sprintf((pbuf+strlen(pbuf)), "[terminal capabilities: ");
576                                                 break;
577                                         case 0x27:
578                                                 sprintf((pbuf+strlen(pbuf)), "[notification indicator: ");
579                                                 i += p_q931notification(pbuf, &buf[i]);
580                                                 goto next;
581                                                 break;
582                                         case 0x28:
583                                                 sprintf((pbuf+strlen(pbuf)), "[display: ");
584                                                 i++;
585                                                 len = buf[i];
586                                                 i++;
587                                                 for(j = 0; j < len; j++)
588                                                 {
589                                                         sprintf((pbuf+strlen(pbuf)),"%c", buf[j+i]);
590                                                 }
591                                                 sprintf((pbuf+strlen(pbuf)),"]");
592                                                 i += j;
593                                                 goto next;
594                                                 break;
595                                         case 0x29:
596                                                 sprintf((pbuf+strlen(pbuf)), "[date/time: ");
597                                                 i++;
598                                                 len = buf[i];
599                                                 i++;
600                                                 j = 0;
601                                                 sprintf((pbuf+strlen(pbuf)),"%.2d.%.2d.%.2d",
602                                                         buf[i+2], buf[i+1], buf[i]);
603                                                 j+=3;
604                                                 if(j < len)
605                                                 {
606                                                         sprintf((pbuf+strlen(pbuf))," %.2d", buf[i+3]);
607                                                         j++;
608                                                 }
609                                                 if(j < len)
610                                                 {
611                                                         sprintf((pbuf+strlen(pbuf)),":%.2d", buf[i+4]);
612                                                         j++;
613                                                 }
614                                                 if(j < len)
615                                                 {
616                                                         sprintf((pbuf+strlen(pbuf)),":%.2d", buf[i+5]);
617                                                         j++;
618                                                 }
619                                                 sprintf((pbuf+strlen(pbuf)),"]");       
620                                                 i += len;
621                                                 goto next;
622                                                 break;
623                                         case 0x2c:
624                                                 sprintf((pbuf+strlen(pbuf)), "[keypad: ");
625                                                 i++;
626                                                 len = buf[i];
627                                                 i++;
628                                                 for(j = 0; j < len; j++)
629                                                 {
630                                                         sprintf((pbuf+strlen(pbuf)),"%c", buf[j+i]);
631                                                 }
632                                                 sprintf((pbuf+strlen(pbuf)),"]");
633                                                 i += j;
634                                                 goto next;
635                                                 break;
636                                         case 0x30:
637                                                 sprintf((pbuf+strlen(pbuf)), "[keypad echo: ");
638                                                 break;
639                                         case 0x32:
640                                                 sprintf((pbuf+strlen(pbuf)), "[information req (Q.932): ");
641                                                 break;
642                                         case 0x34:
643                                                 sprintf((pbuf+strlen(pbuf)), "[signal: ");
644                                                 break;
645                                         case 0x36:
646                                                 sprintf((pbuf+strlen(pbuf)), "[switchhook: ");
647                                                 break;
648                                         case 0x38:
649                                                 sprintf((pbuf+strlen(pbuf)), "[feature activation (Q.932): ");
650                                                 break;
651                                         case 0x39:
652                                                 sprintf((pbuf+strlen(pbuf)), "[feature ind (Q.932): ");
653                                                 break;
654                                         case 0x3a:
655                                                 sprintf((pbuf+strlen(pbuf)), "[service profile id (Q.932): ");
656                                                 break;
657                                         case 0x3b:
658                                                 sprintf((pbuf+strlen(pbuf)), "[endpoint id (Q.932): ");
659                                                 break;
660                                         case 0x40:
661                                                 sprintf((pbuf+strlen(pbuf)), "[information rate: ");
662                                                 break;
663                                         case 0x41:
664                                                 sprintf((pbuf+strlen(pbuf)), "[precedence level (Q.955): ");
665                                                 break;
666                                         case 0x42:
667                                                 sprintf((pbuf+strlen(pbuf)), "[end-to-end transit delay: ");
668                                                 break;
669                                         case 0x43:
670                                                 sprintf((pbuf+strlen(pbuf)), "[transit delay detection and indication: ");
671                                                 break;
672                                         case 0x44:
673                                                 sprintf((pbuf+strlen(pbuf)), "[packet layer binary parameters: ");
674                                                 break;
675                                         case 0x45:
676                                                 sprintf((pbuf+strlen(pbuf)), "[packet layer window size: ");
677                                                 break;
678                                         case 0x46:
679                                                 sprintf((pbuf+strlen(pbuf)), "[packet size: ");
680                                                 break;
681                                         case 0x47:
682                                                 sprintf((pbuf+strlen(pbuf)), "[closed user group: ");
683                                                 break;
684                                         case 0x48:
685                                                 sprintf((pbuf+strlen(pbuf)), "[link layer core parameters (Q.933): ");
686                                                 break;
687                                         case 0x49:
688                                                 sprintf((pbuf+strlen(pbuf)), "[link layer protocol parameters (Q.933): ");
689                                                 break;
690                                         case 0x4a:
691                                                 sprintf((pbuf+strlen(pbuf)), "[reverse charging information: ");
692                                                 break;
693                                         case 0x4c:
694                                                 sprintf((pbuf+strlen(pbuf)), "[connected number (Q.951): ");
695                                                 i += p_q931address(pbuf, &buf[i]);
696                                                 goto next;
697                                                 break;
698
699                                                 break;
700                                         case 0x4d:
701                                                 sprintf((pbuf+strlen(pbuf)), "[connected subaddress (Q.951): ");
702                                                 break;
703                                         case 0x50:
704                                                 sprintf((pbuf+strlen(pbuf)), "[X.213 priority (Q.933): ");
705                                                 break;
706                                         case 0x51:
707                                                 sprintf((pbuf+strlen(pbuf)), "[report type (Q.933): ");
708                                                 break;
709                                         case 0x53:
710                                                 sprintf((pbuf+strlen(pbuf)), "[link integrity verification (Q.933): ");
711                                                 break;
712                                         case 0x57:
713                                                 sprintf((pbuf+strlen(pbuf)), "[PVC status (Q.933): ");
714                                                 break;
715                                         case 0x6c:
716                                                 sprintf((pbuf+strlen(pbuf)), "[calling party number: ");
717                                                 i += p_q931address(pbuf, &buf[i]);
718                                                 goto next;
719                                                 break;
720                                         case 0x6d:
721                                                 sprintf((pbuf+strlen(pbuf)), "[calling party subaddress: ");
722                                                 break;
723                                         case 0x70:
724                                                 sprintf((pbuf+strlen(pbuf)), "[called party number: ");
725                                                 i += p_q931address(pbuf, &buf[i]);
726                                                 goto next;
727                                                 break;
728                                         case 0x71:
729                                                 sprintf((pbuf+strlen(pbuf)), "[called party subaddress: ");
730                                                 break;
731                                         case 0x74:
732                                                 sprintf((pbuf+strlen(pbuf)), "[redirecting number: ");
733                                                 i += p_q931redir(pbuf, &buf[i]);
734                                                 goto next;
735                                                 break;
736                                         case 0x76:
737                                                 sprintf((pbuf+strlen(pbuf)), "[redirection number: ");
738                                                 i += p_q931redir(pbuf, &buf[i]);
739                                                 goto next;
740                                                 break;
741                                         case 0x78:
742                                                 sprintf((pbuf+strlen(pbuf)), "[transit network selection: ");
743                                                 break;
744                                         case 0x79:
745                                                 sprintf((pbuf+strlen(pbuf)), "[restart indicator: ");
746                                                 break;
747                                         case 0x7c:
748                                                 sprintf((pbuf+strlen(pbuf)), "[low layer compatibility: ");
749                                                 break;
750                                         case 0x7d:
751                                                 sprintf((pbuf+strlen(pbuf)), "[high layer compatibility:");
752                                                 i += p_q931high_compat(pbuf, &buf[i]);
753                                                 goto next;
754                                                 break;
755                                         case 0x7e:
756                                                 sprintf((pbuf+strlen(pbuf)), "[user-user: ");
757                                                 i += p_q931user_user(pbuf, &buf[i]);
758                                                 goto next;
759                                                 break;
760                                         case 0x7f:
761                                                 sprintf((pbuf+strlen(pbuf)), "[escape for extension: ");
762                                                 break;
763                                         default:
764                                                 sprintf((pbuf+strlen(pbuf)), "[UNKNOWN INFO-ELEMENT-ID=0x%02x: ", buf[i]);
765                                                 break;
766                                 }
767                         }
768                         else
769                         {
770                                 sprintf((pbuf+strlen(pbuf)), "[UNKNOWN CODESET=%d, IE=0x%02x: ", codeset, buf[i]);
771                         }
772
773                         i++;    /* index -> length */
774
775                         len = buf[i];
776
777                         sprintf((pbuf+strlen(pbuf)), "LEN=0x%02x, DATA=", len);                 
778
779                         i++;    /* index -> 1st param */
780
781                         for(j = 0; j < len; j++)
782                         {
783                                 sprintf((pbuf+strlen(pbuf)),"0x%02x ", buf[j+i]);
784                         }
785         
786                         sprintf((pbuf+strlen(pbuf)),"]");
787
788                         i += len;
789
790 next:
791
792                         if(!codelock && (codeset != oldcodeset))
793                                 codeset = oldcodeset;
794                 }
795         }
796         sprintf((pbuf+strlen(pbuf)),"\n");
797 }
798
799 /* EOF */
800