Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / usr.sbin / i4b / isdntrace / 1tr6.c
1 /*
2  * Copyright (c) 1997, 1999 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  *      1tr6.c - print 1TR6 protocol traces
28  *      -----------------------------------
29  *
30  *      $Id: 1tr6.c,v 1.6 1999/12/13 21:25:26 hm Exp $ 
31  *
32  * $FreeBSD: src/usr.sbin/i4b/isdntrace/1tr6.c,v 1.6.2.1 2001/08/01 17:45:08 obrien Exp $
33  * $DragonFly: src/usr.sbin/i4b/isdntrace/1tr6.c,v 1.2 2003/06/17 04:29:55 dillon Exp $
34  *
35  *      last edit-date: [Mon Dec 13 21:55:31 1999]
36  *
37  *---------------------------------------------------------------------------*/
38
39 #include "trace.h"
40
41 static int p_1tr6address(char *pbuf, unsigned char buf[]);
42 static int p_1tr6cause(char *pbuf, unsigned char buf[]);
43
44 /*---------------------------------------------------------------------------*
45  *      decode the (german) national specific 1TR6 protocol
46  *---------------------------------------------------------------------------*/
47 void
48 decode_1tr6(char *pbuf, int n, int off, unsigned char *buf, int raw)
49 {
50         int codeset = 0;
51         int oldcodeset = 0;     
52         int codelock = 0;
53
54         int pd;
55         int len;
56         int j;
57         int i;
58
59         if(n <= 0)
60                 return;
61
62         *pbuf = '\0';
63         
64         if(raw)
65         {       
66                 for (i = 0; i < n; i += 16)
67                 {
68                         sprintf((pbuf+strlen(pbuf)),"Dump:%.3d  ", i+off);
69                         for (j = 0; j < 16; j++)
70                                 if (i + j < n)
71                                         sprintf((pbuf+strlen(pbuf)),"%02x ", buf[i + j]);
72                                 else
73                                         sprintf((pbuf+strlen(pbuf)),"   ");
74                         sprintf((pbuf+strlen(pbuf)),"      ");
75                         for (j = 0; j < 16 && i + j < n; j++)
76                                 if (isprint(buf[i + j]))
77                                         sprintf((pbuf+strlen(pbuf)),"%c", buf[i + j]);
78                                 else
79                                         sprintf((pbuf+strlen(pbuf)),".");
80                         sprintf((pbuf+strlen(pbuf)),"\n");
81                 }
82         }
83
84         sprintf((pbuf+strlen(pbuf)), "1TR6: ");
85
86         /* protocol discriminator */
87
88         i = 0;
89
90         pd = buf[i];
91
92         switch(pd)
93         {
94                 case 0x40:
95                         sprintf((pbuf+strlen(pbuf)), "pd=N0, ");
96                         break;
97                 case 0x41:
98                         sprintf((pbuf+strlen(pbuf)), "pd=N1, ");
99                         break;
100                 default:
101                         sprintf((pbuf+strlen(pbuf)), "pd=UNDEF (0x%02x), ",pd);
102                         break;
103         }
104
105         /* call reference */
106
107         i++;
108
109         len = buf[i] & 0x0f;
110
111         switch(len)
112         {
113                 case 1:
114                         sprintf((pbuf+strlen(pbuf)), "cr=0x%02x %s, ", (buf[i+1] & 0x7f), (buf[i+1] & 0x80) ? "(from destination)" : "(from origination)");
115                         break;
116                 default:
117                         sprintf((pbuf+strlen(pbuf)), "cr: LEN=%d %s 0x%02x 0x%02x, ", len, (buf[i+1] & 0x80) ? "org" : "dst", (buf[i+1] & 0x7f), (buf[i+2] & 0x7f));
118                         break;
119         }
120
121         i += (len+1);
122
123         /* message type */
124
125         sprintf((pbuf+strlen(pbuf)), "message=");
126
127         if(pd == 0x40)  /* protocol discriminator N0 */
128         {
129                 switch(buf[i])
130                 {
131                         case 0x61:
132                                 sprintf((pbuf+strlen(pbuf)), "REGISTER INDICATION: ");
133                                 break;
134                         case 0x62:
135                                 sprintf((pbuf+strlen(pbuf)), "CANCEL INDICATION: ");
136                                 break;
137                         case 0x63:
138                                 sprintf((pbuf+strlen(pbuf)), "FACILITY STATUS: ");
139                                 break;
140                         case 0x64:
141                                 sprintf((pbuf+strlen(pbuf)), "STATUS ACKNOWLEDGE: ");
142                                 break;
143                         case 0x65:
144                                 sprintf((pbuf+strlen(pbuf)), "STATUS REJECT: ");
145                                 break;
146                         case 0x66:
147                                 sprintf((pbuf+strlen(pbuf)), "FACILITY INFORMATION: ");
148                                 break;
149                         case 0x67:
150                                 sprintf((pbuf+strlen(pbuf)), "INFORMATION ACKNOWLEDGE: ");
151                                 break;
152                         case 0x68:
153                                 sprintf((pbuf+strlen(pbuf)), "INFORMATION REJECT: ");
154                                 break;
155                         case 0x75:
156                                 sprintf((pbuf+strlen(pbuf)), "CLOSE: ");
157                                 break;
158                         case 0x77:
159                                 sprintf((pbuf+strlen(pbuf)), "CLOSE ACKNOWLEDGE: ");
160                                 break;
161                         default:
162                                 sprintf((pbuf+strlen(pbuf)), "ERROR: PD=0x40 MSG=0x%02x, ", buf[i]);
163                                 break;
164                 }
165         }
166         else if(pd == 0x41)
167         {
168                 switch(buf[i])
169                 {
170                         case 0x00:
171                                 sprintf((pbuf+strlen(pbuf)), "ESCAPE: ");
172                                 break;
173                         case 0x01:
174                                 sprintf((pbuf+strlen(pbuf)), "ALERT: ");
175                                 break;
176                         case 0x02:
177                                 sprintf((pbuf+strlen(pbuf)), "CALL SENT: ");
178                                 break;
179                         case 0x07:
180                                 sprintf((pbuf+strlen(pbuf)), "CONNECT: ");
181                                 break;
182                         case 0x0f:
183                                 sprintf((pbuf+strlen(pbuf)), "CONNECT ACKNOWLEDGE: ");
184                                 break;
185                         case 0x05:
186                                 sprintf((pbuf+strlen(pbuf)), "SETUP: ");
187                                 break;
188                         case 0x0d:
189                                 sprintf((pbuf+strlen(pbuf)), "SETUP ACKNOWLEDGE: ");
190                                 break;
191
192                         case 0x26:
193                                 sprintf((pbuf+strlen(pbuf)), "RESUME: ");
194                                 break;
195                         case 0x2e:
196                                 sprintf((pbuf+strlen(pbuf)), "RESUME ACKNOWLEDGE: ");
197                                 break;
198                         case 0x22:
199                                 sprintf((pbuf+strlen(pbuf)), "RESUME REJECT: ");
200                                 break;
201                         case 0x25:
202                                 sprintf((pbuf+strlen(pbuf)), "SUSPEND: ");
203                                 break;
204                         case 0x2d:
205                                 sprintf((pbuf+strlen(pbuf)), "SUSPEND ACKNOWLEDGE: ");
206                                 break;
207                         case 0x21:
208                                 sprintf((pbuf+strlen(pbuf)), "SUSPEND REJECT: ");
209                                 break;
210                         case 0x20:
211                                 sprintf((pbuf+strlen(pbuf)), "USER INFORMATION: ");
212                                 break;
213                                 
214                         case 0x40:
215                                 sprintf((pbuf+strlen(pbuf)), "DETACH");
216                                 break;
217                         case 0x45:
218                                 sprintf((pbuf+strlen(pbuf)), "DISCONNECT: ");
219                                 break;
220                         case 0x4d:
221                                 sprintf((pbuf+strlen(pbuf)), "RELEASE: ");
222                                 break;
223                         case 0x5a:
224                                 sprintf((pbuf+strlen(pbuf)), "RELEASE ACKNOWLEDGE");
225                                 break;
226                                 
227                         case 0x6e:
228                                 sprintf((pbuf+strlen(pbuf)), "CANCEL ACKNOWLEDGE: ");
229                                 break;
230                         case 0x67:
231                                 sprintf((pbuf+strlen(pbuf)), "CANCEL REJECT: ");
232                                 break;
233                         case 0x69:
234                                 sprintf((pbuf+strlen(pbuf)), "CONGESTION CONTROL: ");
235                                 break;
236                         case 0x60:
237                                 sprintf((pbuf+strlen(pbuf)), "FACILITY: ");
238                                 break;
239                         case 0x68:
240                                 sprintf((pbuf+strlen(pbuf)), "FACILITY ACKNOWLEDGE: ");
241                                 break;
242                         case 0x66:
243                                 sprintf((pbuf+strlen(pbuf)), "FACILITY CANCEL: ");
244                                 break;
245                         case 0x64:
246                                 sprintf((pbuf+strlen(pbuf)), "FACILITY REGISTER: ");
247                                 break;
248                         case 0x65:
249                                 sprintf((pbuf+strlen(pbuf)), "FACILITY REJECT: ");
250                                 break;
251                         case 0x6d:
252                                 sprintf((pbuf+strlen(pbuf)), "INFORMATION: ");
253                                 break;
254                         case 0x6c:
255                                 sprintf((pbuf+strlen(pbuf)), "REGISTER ACKNOWLEDGE: ");
256                                 break;
257                         case 0x6f:
258                                 sprintf((pbuf+strlen(pbuf)), "REGISTER REJECT: ");
259                                 break;
260                         case 0x63:
261                                 sprintf((pbuf+strlen(pbuf)), "STATUS: ");
262                                 break;
263
264                         default:
265                                 sprintf((pbuf+strlen(pbuf)), "ERROR: PD=0x41 MSG=0x%02x, ", buf[i]);
266                                 break;
267                 }
268         }
269         else
270         {
271                 sprintf((pbuf+strlen(pbuf)), "ERROR: PD=0x%02x MSG=0x%02x, ", pd, buf[i]);
272         }
273
274         /* other information elements */
275
276         i++;
277         
278         for (; i < n;)
279         {
280                 sprintf((pbuf+strlen(pbuf)), "\n     ");
281                 
282                 if(buf[i] & 0x80)
283                 {
284                         /* single octett info element */
285
286                         switch(buf[i] & 0x70)
287                         {
288                                 case 0x00:      /* reserved */
289                                         sprintf((pbuf+strlen(pbuf)), "[reserved single octett info]");
290                                         break;
291
292                                 case 0x10:      /* shift */
293                                         oldcodeset = codeset;
294                                         codeset = buf[i] & 0x07;
295                                         if(buf[i] & 0x08)
296                                                 codelock = 0;
297                                         else
298                                                 codelock = 1;
299                                         sprintf((pbuf+strlen(pbuf)), "[shift: codeset=%d lock=%d]", codeset, codelock);
300                                         break;
301
302                                 case 0x20:      /* more data */
303                                         sprintf((pbuf+strlen(pbuf)), "[more data]");
304                                         break;
305
306                                 case 0x30:      /* congestion level */
307                                         sprintf((pbuf+strlen(pbuf)), "[congestion level = %d]", buf[i] & 0x0f);
308                                         break;
309
310                                 default:
311                                         sprintf((pbuf+strlen(pbuf)), "[UNDEF SINGLE OCTET ELEMENT 0x%02x]", buf[i]);
312                                         break;
313                         }
314
315                         i++;    /* next */
316
317                 }
318                 else
319                 {
320                         /* variable length info element */
321
322                         if(codeset == 0)
323                         {
324                                 switch(buf[i])
325                                 {
326                                         case 0x08:
327                                                 sprintf((pbuf+strlen(pbuf)), "[cause: ");
328                                                 i += p_1tr6cause(pbuf, &buf[i]);
329                                                 goto next;
330                                                 break;
331                                                 
332                                         case 0x0c:
333                                                 sprintf((pbuf+strlen(pbuf)), "[connected address: ");
334                                                 i += p_1tr6address(pbuf, &buf[i]);
335                                                 goto next;
336                                                 break;
337
338                                         case 0x10:
339                                                 sprintf((pbuf+strlen(pbuf)), "[call identity: ");
340                                                 break;
341                                         case 0x18:
342                                                 sprintf((pbuf+strlen(pbuf)), "[channel id: channel=");
343                                                 i += 2;
344                                                 switch(buf[i] & 0x03)
345                                                 {
346                                                         case 0:
347                                                                 sprintf((pbuf+strlen(pbuf)), "no channel");
348                                                                 break;
349                                                         case 1:
350                                                                 sprintf((pbuf+strlen(pbuf)), "B-1");
351                                                                 break;
352                                                         case 2:
353                                                                 sprintf((pbuf+strlen(pbuf)), "B-2");
354                                                                 break;
355                                                         case 3:
356                                                                 sprintf((pbuf+strlen(pbuf)), "any channel");
357                                                                 break;
358                                                 }
359                                                 if(buf[i] & 0x08)
360                                                         sprintf((pbuf+strlen(pbuf)), " (exclusive)]");
361                                                 else
362                                                         sprintf((pbuf+strlen(pbuf)), " (preferred)]");
363                                                 i++;
364                                                 goto next;
365                                                 break;
366                                         case 0x20:
367                                                 sprintf((pbuf+strlen(pbuf)), "[network specific facilities: ");
368                                                 i++;
369                                                 len = buf[i];
370                                                 i+=2;
371                                                 switch(buf[i])
372                                                 {
373                                                         case 1:
374                                                                 sprintf((pbuf+strlen(pbuf)), "Sperre");
375                                                                 break;
376                                                         case 2:
377                                                                 sprintf((pbuf+strlen(pbuf)), "AWS 1");
378                                                                 break;
379                                                         case 3:
380                                                                 sprintf((pbuf+strlen(pbuf)), "AWS 2");
381                                                                 break;
382                                                         case 0xe:
383                                                                 sprintf((pbuf+strlen(pbuf)), "Konferenz");
384                                                                 break;
385                                                         case 0xf:
386                                                                 sprintf((pbuf+strlen(pbuf)), "B-Kan uebern.");
387                                                                 break;
388                                                         case 0x10:
389                                                                 sprintf((pbuf+strlen(pbuf)), "aktvrg. ghlt. Vbdg.");
390                                                                 break;
391                                                         case 0x11:
392                                                                 sprintf((pbuf+strlen(pbuf)), "3er Konf");
393                                                                 break;
394                                                         case 0x12:
395                                                                 sprintf((pbuf+strlen(pbuf)), "1seitg D/G Wechsel");
396                                                                 break;
397                                                         case 0x13:
398                                                                 sprintf((pbuf+strlen(pbuf)), "2seitig D/G Wechsel");
399                                                                 break;
400                                                         case 0x14:
401                                                                 sprintf((pbuf+strlen(pbuf)), "Rufnr. identifiz.");
402                                                                 break;
403                                                         case 0x15:
404                                                                 sprintf((pbuf+strlen(pbuf)), "GBG");
405                                                                 break;
406                                                         case 0x17:
407                                                                 sprintf((pbuf+strlen(pbuf)), "ueberg. Ruf");
408                                                                 break;
409                                                         case 0x1a:
410                                                                 sprintf((pbuf+strlen(pbuf)), "um/weitergel. Ruf");
411                                                                 break;
412                                                         case 0x1b:
413                                                                 sprintf((pbuf+strlen(pbuf)), "unterdr. A-Rufnr.");
414                                                                 break;
415                                                         case 0x1e:
416                                                                 sprintf((pbuf+strlen(pbuf)), "Verbdg. deaktivieren");
417                                                                 break;
418                                                         case 0x1d:
419                                                                 sprintf((pbuf+strlen(pbuf)), "Verbdg. aktivieren");
420                                                                 break;
421                                                         case 0x1f:
422                                                                 sprintf((pbuf+strlen(pbuf)), "SPV");
423                                                                 break;
424                                                         case 0x23:
425                                                                 sprintf((pbuf+strlen(pbuf)), "Rueckw. 2seitg. DW");
426                                                                 break;
427                                                         case 0x24:
428                                                                 sprintf((pbuf+strlen(pbuf)), "Anrufumltg. priv. Netz");
429                                                                 break;
430                                                         default:
431                                                                 sprintf((pbuf+strlen(pbuf)), "undefined");
432                                                                 break;
433                                                 }
434                                                 i++;
435                                                 sprintf((pbuf+strlen(pbuf)), ", serv=%d", buf[i]);
436                                                 i++;
437                                                 sprintf((pbuf+strlen(pbuf)), ", ainfo=%d", buf[i]);
438                                                 i++;
439                                                 len-=4;
440                                                 for(j = 0; j < len; j++)
441                                                 {
442                                                         sprintf((pbuf+strlen(pbuf))," 0x%02x", buf[j+i]);
443                                                 }
444                                                 sprintf((pbuf+strlen(pbuf)),"]");
445                                                 i += j;
446                                                 goto next;
447                                                 break;
448                                         case 0x28:
449                                                 sprintf((pbuf+strlen(pbuf)), "[display: ");
450                                                 break;
451                                         case 0x2c:
452                                                 sprintf((pbuf+strlen(pbuf)), "[keypad: ");
453                                                 break;
454                                         case 0x6c:
455                                                 sprintf((pbuf+strlen(pbuf)), "[origination address: ");
456                                                 i += p_1tr6address(pbuf, &buf[i]);
457                                                 goto next;
458                                                 break;
459                                         case 0x70:
460                                                 sprintf((pbuf+strlen(pbuf)), "[destination address: ");
461                                                 i += p_1tr6address(pbuf, &buf[i]);
462                                                 goto next;
463                                                 break;
464                                         case 0x7e:
465                                                 sprintf((pbuf+strlen(pbuf)), "[user-user information: ");
466                                                 break;
467                                         case 0x7f:
468                                                 sprintf((pbuf+strlen(pbuf)), "[reserved: ");
469                                                 break;
470                                         default:
471                                                 sprintf((pbuf+strlen(pbuf)), "[UNKNOWN INFO-ELEMENT-ID");
472                                                 break;
473                                 }
474                         }
475                         else if(codeset == 6)
476                         {
477                                 switch(buf[i])
478                                 {
479                                         case 0x01:
480                                                 sprintf((pbuf+strlen(pbuf)), "[service ind: serv=");
481                                                 i+= 2;
482                                                 switch(buf[i])
483                                                 {
484                                                         case 0x01:
485                                                                 sprintf((pbuf+strlen(pbuf)), "phone");
486                                                                 break;
487                                                         case 0x02:
488                                                                 sprintf((pbuf+strlen(pbuf)), "a/b");
489                                                                 break;
490                                                         case 0x03:
491                                                                 sprintf((pbuf+strlen(pbuf)), "X.21");
492                                                                 break;
493                                                         case 0x04:
494                                                                 sprintf((pbuf+strlen(pbuf)), "fax g4");
495                                                                 break;
496                                                         case 0x05:
497                                                                 sprintf((pbuf+strlen(pbuf)), "btx");
498                                                                 break;
499                                                         case 0x07:
500                                                                 sprintf((pbuf+strlen(pbuf)), "64k data");
501                                                                 break;
502                                                         case 0x08:
503                                                                 sprintf((pbuf+strlen(pbuf)), "X.25");
504                                                                 break;
505                                                         case 0x09:
506                                                                 sprintf((pbuf+strlen(pbuf)), "teletex");
507                                                                 break;
508                                                         case 0x0a:
509                                                                 sprintf((pbuf+strlen(pbuf)), "mixed");
510                                                                 break;
511                                                         case 0x0d:
512                                                                 sprintf((pbuf+strlen(pbuf)), "temex");
513                                                                 break;
514                                                         case 0x0e:
515                                                                 sprintf((pbuf+strlen(pbuf)), "picturephone");
516                                                                 break;
517                                                         case 0x0f:
518                                                                 sprintf((pbuf+strlen(pbuf)), "btx (new)");
519                                                                 break;
520                                                         case 0x10:
521                                                                 sprintf((pbuf+strlen(pbuf)), "videophone");
522                                                                 break;
523                                                         default:
524                                                                 sprintf((pbuf+strlen(pbuf)), "undefined");
525                                                                 break;
526                                                 }
527                                                 i++;
528                                                 sprintf((pbuf+strlen(pbuf)), ", ainfo=0x%02x]", buf[i]);
529                                                 i++;
530                                                 goto next;
531                                                 break;
532                                         case 0x02:
533                                                 sprintf((pbuf+strlen(pbuf)), "[charging information: ");
534                                                 break;
535                                         case 0x03:
536                                                 sprintf((pbuf+strlen(pbuf)), "[date: ");
537                                                 i++;
538                                                 len = buf[i];
539                                                 i++;
540                                                 for(j = 0; j < len; j++)
541                                                 {
542                                                         sprintf((pbuf+strlen(pbuf)),"%c", buf[j+i]);
543                                                 }
544                                                 sprintf((pbuf+strlen(pbuf)),"]");
545                                                 i += j;
546                                                 goto next;
547                                                 break;
548                                         case 0x05:
549                                                 sprintf((pbuf+strlen(pbuf)), "[facility select: ");
550                                                 break;
551                                         case 0x06:
552                                                 sprintf((pbuf+strlen(pbuf)), "[status of facilities: ");
553                                                 break;
554                                         case 0x07:
555                                                 sprintf((pbuf+strlen(pbuf)), "[status of called party: ");
556                                                 i+=2;
557                                                 switch(buf[i])
558                                                 {
559                                                         case 1:
560                                                                 sprintf((pbuf+strlen(pbuf)), "no information]");
561                                                                 break;
562                                                         case 2:
563                                                                 sprintf((pbuf+strlen(pbuf)), "is being called]");
564                                                                 break;
565                                                         default:
566                                                                 sprintf((pbuf+strlen(pbuf)), "undefined (0x%02x)]", buf[i]);
567                                                                 break;
568                                                 }
569                                                 i++;
570                                                 goto next;
571                                                 break;
572                                         case 0x08:
573                                                 sprintf((pbuf+strlen(pbuf)), "[additional tx attributes: ");
574                                                 i++;
575                                                 len = buf[i];
576                                                 i++;
577                                                 for(j = 0; j < len; j++)
578                                                 {
579                                                         switch(buf[j+i] &0x70)
580                                                         {
581                                                                 case 0:
582                                                                         sprintf((pbuf+strlen(pbuf)), "no satellite link");
583                                                                         break;
584                                                                 case 1:
585                                                                         sprintf((pbuf+strlen(pbuf)), "one satellite link");
586                                                                         break;
587                                                                 case 2:
588                                                                         sprintf((pbuf+strlen(pbuf)), "two satellite links");
589                                                                         break;
590                                                                 case 3:
591                                                                         sprintf((pbuf+strlen(pbuf)), "three satellite links");
592                                                                         break;
593                                                                 default:
594                                                                         sprintf((pbuf+strlen(pbuf)), "undefined value");
595                                                                         break;
596                                                         }
597                                                         if(buf[j+i] & 0x80)
598                                                                 sprintf((pbuf+strlen(pbuf)),"(flag=req)]");
599                                                         else
600                                                                 sprintf((pbuf+strlen(pbuf)),"(flag=ind)]");
601                                                 }
602                                                 i += j;
603                                                 goto next;
604                                                 break;
605                                         default:
606                                                 sprintf((pbuf+strlen(pbuf)), "[UNKNOWN INFO-ELEMENT-ID");
607                                                 break;
608                                 }
609                         }
610                         else
611                         {
612                                 sprintf((pbuf+strlen(pbuf)), "[ILLEGAL CODESET = 0x%02x", codeset);
613                         }
614
615                         i++;    /* index -> length */
616
617                         len = buf[i];
618
619                         i++;    /* index -> 1st param */
620
621                         for(j = 0; j < len; j++)
622                         {
623                                 sprintf((pbuf+strlen(pbuf))," 0x%02x", buf[j+i]);
624                         }
625         
626                         sprintf((pbuf+strlen(pbuf)),"]");
627
628                         i += len;
629
630 next:
631
632                         if(!codelock && (codeset != oldcodeset))
633                                 codeset = oldcodeset;
634                 }
635         }
636         sprintf((pbuf+strlen(pbuf)),"\n");
637 }
638
639 /*---------------------------------------------------------------------------*
640  *      decode and print the cause
641  *---------------------------------------------------------------------------*/
642 static int
643 p_1tr6cause(char *pbuf, unsigned char buf[])
644 {
645         int j;
646         int len;
647         int i = 0;
648         
649         i++;    /* index -> length */
650
651         len = buf[i];
652
653         switch(len)
654         {
655                 case 0:
656                         sprintf((pbuf+strlen(pbuf)), "%s", print_cause_1tr6(0));
657                         break;
658                 case 1:
659                         i++;
660                         sprintf((pbuf+strlen(pbuf)), "%s", print_cause_1tr6(buf[i] & 0x7f));
661                         break;
662                 case 2:
663                         i++;
664                         sprintf((pbuf+strlen(pbuf)), "%s, location: ", print_cause_1tr6(buf[i] & 0x7f));
665                         i++;
666                         switch(buf[i] & 0x0f)
667                         {
668                                 case 0x04:
669                                         sprintf((pbuf+strlen(pbuf)), "public network");
670                                         break;
671                                 case 0x05:
672                                         sprintf((pbuf+strlen(pbuf)), "private network");
673                                         break;
674                                 case 0x0f:
675                                         sprintf((pbuf+strlen(pbuf)), "no information");
676                                         break;
677                                 default:
678                                         sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", buf[i] & 0x0f);
679                                         break;
680                         }
681                         break;
682                 default:
683                         i++;    /* index -> length */
684                         len = buf[i];
685                         i++;    /* index -> 1st param */
686                         for(j = 0; j < len; j++)
687                         {
688                                 sprintf((pbuf+strlen(pbuf))," 0x%02x", buf[j+i]);
689                         }
690                         break;
691         }
692         i++;
693         sprintf((pbuf+strlen(pbuf)),"]");
694         return(i);
695 }
696
697 /*---------------------------------------------------------------------------*
698  *      decode and print the ISDN (telephone) number
699  *---------------------------------------------------------------------------*/
700 static int
701 p_1tr6address(char *pbuf, unsigned char buf[])
702 {
703         int j;
704         int len;
705         int i = 0;
706         int tp;
707         
708         i++;    /* index -> length */
709         len = buf[i];
710         i++;    /* index -> 1st param */
711         tp = buf[i];
712         
713         i++;
714         len--;
715         
716         for(j = 0; j < len; j++)
717         {
718                 sprintf((pbuf+strlen(pbuf)),"%c", buf[j+i]);
719         }
720
721         switch((tp & 0x70) >> 4)
722         {
723                 case 0:
724                         sprintf((pbuf+strlen(pbuf)), " (type=unknown, ");
725                         break;
726                 case 1:
727                         sprintf((pbuf+strlen(pbuf)), " (type=international, ");
728                         break;
729                 case 2:
730                         sprintf((pbuf+strlen(pbuf)), " (type=national, ");
731                         break;
732                 default:
733                         sprintf((pbuf+strlen(pbuf)), " (type=%d, ", ((tp & 0x70) >> 4));
734                         break;
735         }
736
737         switch(tp & 0x0f)
738         {
739                 case 0:
740                         sprintf((pbuf+strlen(pbuf)), "plan=unknown)");
741                         break;
742                 case 1:
743                         sprintf((pbuf+strlen(pbuf)), "plan=ISDN)");
744                         break;
745                 default:
746                         sprintf((pbuf+strlen(pbuf)), "plan=%d)", (tp & 0x0f));
747                         break;
748         }
749         
750         sprintf((pbuf+strlen(pbuf)),"]");
751
752         i += j;
753
754         return(i);
755 }
756
757 /* EOF */