MFC:
[dragonfly.git] / usr.sbin / i4b / isdndecode / layer3_subr.c
blobd8aadd16629b51f35eb117a30a80826a02d9d85c
1 /*
2 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
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.
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.
25 *---------------------------------------------------------------------------
27 * layer3_subr.c - subroutines for IE decoding
28 * -------------------------------------------
30 * $Id: layer3_subr.c,v 1.8 2000/02/21 15:17:17 hm Exp $
32 * $FreeBSD: src/usr.sbin/i4b/isdndecode/layer3_subr.c,v 1.6.2.2 2001/08/01 17:45:05 obrien Exp $
33 * $DragonFly: src/usr.sbin/i4b/isdndecode/layer3_subr.c,v 1.3 2007/05/13 18:33:59 swildner Exp $
35 * last edit-date: [Mon Feb 21 15:45:16 2000]
37 *---------------------------------------------------------------------------*/
39 #include "decode.h"
41 /*---------------------------------------------------------------------------*
42 * dummy function
43 *---------------------------------------------------------------------------*/
44 int
45 f_null(char *pbuf, unsigned char *buf, int off)
47 return(0);
50 /*---------------------------------------------------------------------------*
52 *---------------------------------------------------------------------------*/
53 int
54 f_cstat(char *pbuf, unsigned char *buf, int off)
56 int i = 0;
57 int len = 0;
58 char buffer[256];
60 i++;
61 len = buf[i];
62 i++;
63 sprintf((pbuf+strlen(pbuf)), "Std=");
64 switch((buf[i] & 0x60) >> 5)
66 case 0:
67 strcpy(buffer, "CCITT");
68 break;
69 case 1:
70 strcpy(buffer, "ISO/IEC");
71 break;
72 case 2:
73 strcpy(buffer, "National");
74 break;
75 case 3:
76 strcpy(buffer, "Special");
77 break;
79 sprintf((pbuf+strlen(pbuf)), ", State=");
81 switch((buf[i] & 0x3f))
83 case 0:
84 strcpy(buffer, "Null");
85 break;
86 case 1:
87 strcpy(buffer, "Call initiated");
88 break;
89 case 2:
90 strcpy(buffer, "Overlap sending");
91 break;
92 case 3:
93 strcpy(buffer, "Outgoing call proceeding");
94 break;
95 case 4:
96 strcpy(buffer, "Call delivered");
97 break;
98 case 6:
99 strcpy(buffer, "Call present");
100 break;
101 case 7:
102 strcpy(buffer, "Call received");
103 break;
104 case 8:
105 strcpy(buffer, "Connect request");
106 break;
107 case 9:
108 strcpy(buffer, "Incoming call proceeding");
109 break;
110 case 10:
111 strcpy(buffer, "Active");
112 break;
113 case 11:
114 strcpy(buffer, "Disconnect request");
115 break;
116 case 12:
117 strcpy(buffer, "Disconnect indication");
118 break;
119 case 15:
120 strcpy(buffer, "Suspend request");
121 break;
122 case 17:
123 strcpy(buffer, "Resume request");
124 break;
125 case 19:
126 strcpy(buffer, "Release request");
127 break;
128 case 22:
129 strcpy(buffer, "Call abort");
130 break;
131 case 25:
132 strcpy(buffer, "Overlap receiving");
133 break;
134 case 0x3d:
135 strcpy(buffer, "Restart request");
136 break;
137 case 0x3e:
138 strcpy(buffer, "Restart");
139 break;
140 default:
141 strcpy(buffer, "ERROR: undefined/reserved");
142 break;
144 sprintf((pbuf+strlen(pbuf)), "]");
145 i++;
146 return(i);
149 /*---------------------------------------------------------------------------*
151 *---------------------------------------------------------------------------*/
153 f_chid(char *pbuf, unsigned char *buf, int off)
155 int i = 0;
156 int len = 0;
157 char buffer[256];
159 i++;
160 len = buf[i];
161 i++;
163 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
165 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x40, "Interface Id present = %s", buf[i] & 0x40 ? "Yes" : "No");
167 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x20, "Interface Type = %s", buf[i] & 0x20 ? "Other (PRI)" : "BRI");
169 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x10, "Spare");
171 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x08, "Channel = %s", buf[i] & 0x08 ? "exclusive" : "preferred");
173 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x04, "Channel is%s the D-Channel", buf[i] & 0x04 ? "" : " not");
175 switch(buf[i] & 0x03)
177 case 0:
178 strcpy(buffer, "no channel");
179 break;
180 case 1:
181 strcpy(buffer, "B-1");
182 break;
183 case 2:
184 strcpy(buffer, "B-2");
185 break;
186 case 3:
187 strcpy(buffer, "any channel");
188 break;
190 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x03, "Channel = %s", buffer);
192 i++;
193 return(i);
196 /*---------------------------------------------------------------------------*
198 *---------------------------------------------------------------------------*/
200 f_fac(char *pbuf, unsigned char *buf, int off)
202 return(q932_facility(pbuf, buf));
205 /*---------------------------------------------------------------------------*
207 *---------------------------------------------------------------------------*/
209 f_progi(char *pbuf, unsigned char *buf, int off)
211 int i = 0;
212 int len = 0;
213 char buffer[256];
215 i++;
216 len = buf[i];
217 i++;
218 sprintf((pbuf+strlen(pbuf)), "Std=");
219 switch((buf[i] & 0x60) >> 5)
221 case 0:
222 strcpy(buffer, "CCITT");
223 break;
224 case 1:
225 strcpy(buffer, "ISO/IEC");
226 break;
227 case 2:
228 strcpy(buffer, "National");
229 break;
230 case 3:
231 strcpy(buffer, "Local");
232 break;
234 sprintf((pbuf+strlen(pbuf)), ", Loc=");
236 switch((buf[i] & 0x0f))
238 case 0:
239 strcpy(buffer, "User");
240 break;
241 case 1:
242 strcpy(buffer, "Private network serving local user");
243 break;
244 case 2:
245 strcpy(buffer, "Public network serving local user");
246 break;
247 case 3:
248 strcpy(buffer, "Transit network");
249 break;
250 case 4:
251 strcpy(buffer, "Public network serving remote user");
252 break;
253 case 5:
254 strcpy(buffer, "Private network serving remote user");
255 break;
256 case 6:
257 strcpy(buffer, "Network beyond interworking point");
258 break;
259 default:
260 strcpy(buffer, "ERROR: undefined/reserved");
261 break;
264 i++;
266 sprintf((pbuf+strlen(pbuf)), "\n Description");
268 switch((buf[i] & 0x7f))
270 case 1:
271 strcpy(buffer, "Call is not end-to-end ISDN");
272 break;
273 case 2:
274 strcpy(buffer, "Destination address is non-ISDN");
275 break;
276 case 3:
277 strcpy(buffer, "Origination address is non-ISDN");
278 break;
279 case 4:
280 strcpy(buffer, "Call has returned to the ISDN");
281 break;
282 case 5:
283 strcpy(buffer, "Interworking occurred, Service change");
284 break;
285 case 8:
286 strcpy(buffer, "In-band info or appropriate pattern now available");
287 break;
288 default:
289 strcpy(buffer, "ERROR: undefined/reserved");
290 break;
292 sprintf((pbuf+strlen(pbuf)), "]");
293 i++;
295 return(i);
298 /*---------------------------------------------------------------------------*
300 *---------------------------------------------------------------------------*/
302 f_displ(char *pbuf, unsigned char *buf, int off)
304 int i = 0;
305 int j = 0;
306 int len = 0;
308 i++;
309 len = buf[i];
310 i++;
311 for(j = 0; j < len; j++)
313 sprintf((pbuf+strlen(pbuf)),"%c", buf[j+i]);
315 sprintf((pbuf+strlen(pbuf)),"]");
316 i += j;
318 return(i);
321 /*---------------------------------------------------------------------------*
323 *---------------------------------------------------------------------------*/
325 f_date(char *pbuf, unsigned char *buf, int off)
327 int i = 0;
328 int j = 0;
329 int len = 0;
331 i++;
332 len = buf[i];
333 i++;
335 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Year = %02d", buf[i]);
336 i++;
338 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Month = %02d", buf[i]);
339 i++;
341 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Day = %02d", buf[i]);
342 i++;
344 j=3;
345 if(j < len)
347 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Hour = %02d", buf[i]);
348 i++;
349 j++;
351 if(j < len)
353 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Minute = %02d", buf[i]);
354 i++;
355 j++;
357 if(j < len)
359 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Second = %02d", buf[i]);
360 i++;
361 j++;
363 i += len;
364 return(i);
367 /*---------------------------------------------------------------------------*
368 * decode and print the cause
369 *---------------------------------------------------------------------------*/
371 f_cause(char *pbuf, unsigned char *buf, int off)
373 int j;
374 int len;
375 int i = 0;
376 int ls;
377 char buffer[256];
379 i++; /* index -> length */
381 len = buf[i];
383 i++; /* coding/location */
384 len--;
386 ls = buf[i];
388 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
390 switch((ls & 0x60) >> 5)
392 case 0:
393 strcpy(buffer, "CCITT");
394 break;
395 case 1:
396 strcpy(buffer, "ISO/IEC");
397 break;
398 case 2:
399 strcpy(buffer, "National");
400 break;
401 case 3:
402 strcpy(buffer, "Local");
403 break;
405 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Coding Standard = %s", buffer);
407 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x10, "Spare");
409 switch(ls & 0x0f)
411 case 0x00:
412 strcpy(buffer, "user");
413 break;
414 case 0x01:
415 strcpy(buffer, "private network serving local user");
416 break;
417 case 0x02:
418 strcpy(buffer, "public network serving local user");
419 break;
420 case 0x03:
421 strcpy(buffer, "transit network");
422 break;
423 case 0x04:
424 strcpy(buffer, "public network serving remote user");
425 break;
426 case 0x05:
427 strcpy(buffer, "private network serving remote user");
428 break;
429 case 0x07:
430 strcpy(buffer, "international network");
431 break;
432 case 0x0a:
433 strcpy(buffer, "network beyond interworking point");
434 break;
435 default:
436 sprintf(buffer, "reserved (0x%02x)", ls & 0x0f);
437 break;
439 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x0f, "Location = %s", buffer);
441 i++;
442 len--;
444 if(!(ls & 0x80))
446 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
448 switch(buf[i] & 0x7f)
450 case 0:
451 strcpy(buffer, "Q.931");
452 break;
453 case 3:
454 strcpy(buffer, "X.21");
455 break;
456 case 4:
457 strcpy(buffer, "X.25");
458 break;
459 case 5:
460 strcpy(buffer, "Q.1031/Q.1051");
461 break;
462 default:
463 strcpy(buffer, "Reserved");
464 break;
466 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Recommendation = %s", buffer);
467 i++;
468 len--;
471 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
473 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Cause = %s", print_cause_q850(buf[i] & 0x7f));
475 i++;
476 len--;
478 for(j = 0; j < len; j++)
479 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "Diagnostics = %02d %s", buf[i+j], buf[i+j]);
481 i += (len+1);
483 return(i);
486 /*---------------------------------------------------------------------------*
487 * decode and print the bearer capability
488 *---------------------------------------------------------------------------*/
490 f_bc(char *pbuf, unsigned char *buf, int off)
492 int len;
493 int i = 0;
494 int mr = 0;
495 char buffer[256];
497 i++; /* index -> length */
499 len = buf[i];
500 i++;
502 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
504 switch((buf[i] & 0x60) >> 5)
506 case 0:
507 strcpy(buffer, "CCITT");
508 break;
509 case 1:
510 strcpy(buffer, "ISO/IEC");
511 break;
512 case 2:
513 strcpy(buffer, "National");
514 break;
515 case 3:
516 strcpy(buffer, "NSI Std");
517 break;
519 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Coding standard = %s", buffer);
521 switch(buf[i] & 0x1f)
523 case 0x00:
524 strcpy(buffer, "speech");
525 break;
526 case 0x08:
527 strcpy(buffer, "unrestricted digital information");
528 break;
529 case 0x09:
530 strcpy(buffer, "restricted digital information");
531 break;
532 case 0x10:
533 strcpy(buffer, "3.1 kHz audio");
534 break;
535 case 0x11:
536 strcpy(buffer, "unrestricted digital information with tones");
537 break;
538 case 0x18:
539 strcpy(buffer, "video");
540 break;
541 default:
542 sprintf(buffer, "reserved (0x%02x)", buf[i] & 0x0f);
543 break;
545 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1f, "Capability = %s", buffer);
547 i++;
548 len--;
550 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
552 switch((buf[i] & 0x60) >> 5)
554 case 0:
555 strcpy(buffer, "circuit");
556 break;
557 case 2:
558 strcpy(buffer, "packet");
559 break;
560 default:
561 sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", ((buf[i] & 0x60) >> 5));
562 break;
564 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Mode = %s", buffer);
566 switch(buf[i] & 0x1f)
568 case 0x00:
569 strcpy(buffer, "packet mode");
570 break;
571 case 0x10:
572 strcpy(buffer, "64 kbit/s");
573 break;
574 case 0x11:
575 strcpy(buffer, "2 x 64 kbit/s");
576 break;
577 case 0x13:
578 strcpy(buffer, "384 kbit/s");
579 break;
580 case 0x15:
581 strcpy(buffer, "1536 kbit/s");
582 break;
583 case 0x17:
584 strcpy(buffer, "1920 kbit/s");
585 break;
586 case 0x18:
587 strcpy(buffer, "Multirate");
588 mr = 1;
589 break;
590 default:
591 sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", buf[i] & 0x0f);
592 break;
594 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1f, "Rate = %s", buffer);
596 i++;
597 len--;
599 if(!len)
600 goto exit;
602 if(mr)
604 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
605 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Rate multiplier = %d", buf[i] & 0x7f);
606 i++;
607 len--;
610 if(!len)
611 goto exit;
613 switch(buf[i] & 0x1f)
615 case 0x01:
616 strcpy(buffer, "V.110/X.30");
617 break;
618 case 0x02:
619 strcpy(buffer, "G.711 u-Law");
620 break;
621 case 0x03:
622 strcpy(buffer, "G.711 a-Law");
623 break;
624 case 0x04:
625 strcpy(buffer, "G.721 ADPCM/I.460");
626 break;
627 case 0x05:
628 strcpy(buffer, "H.221/H.242");
629 break;
630 case 0x07:
631 strcpy(buffer, "non-CCITT rate adaption");
632 break;
633 case 0x08:
634 strcpy(buffer, "V.120");
635 break;
636 case 0x09:
637 strcpy(buffer, "X.31");
638 break;
639 default:
640 sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", buf[i] & 0x1f);
641 break;
643 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1f, "Layer 1 Protocol = %s", buffer);
645 i++;
646 len--;
648 if(!len)
649 goto exit;
651 /* work to do ahead !!! */
653 if(!(buf[i-1] & 0x80))
655 sprintf((pbuf+strlen(pbuf)), "\n user rate=0x%02x ", buf[i] & 0x1f);
657 if(buf[i] & 0x40)
658 sprintf((pbuf+strlen(pbuf)), "(async,");
659 else
660 sprintf((pbuf+strlen(pbuf)), "(sync,");
662 if(buf[i] & 0x20)
663 sprintf((pbuf+strlen(pbuf)), "in-band neg. possible)");
664 else
665 sprintf((pbuf+strlen(pbuf)), "in-band neg not possible)");
667 i++;
668 len--;
671 if(!len)
672 goto exit;
674 if(!(buf[i-1] & 0x80))
676 sprintf((pbuf+strlen(pbuf)), "\n clk/flow=0x%02x", buf[i] & 0x1f);
678 sprintf((pbuf+strlen(pbuf)), "\n intermediate rate=");
680 switch((buf[i] & 0x60) >> 5)
682 case 0:
683 sprintf((pbuf+strlen(pbuf)), "not used");
684 break;
685 case 1:
686 sprintf((pbuf+strlen(pbuf)), "8 kbit/s");
687 break;
688 case 2:
689 sprintf((pbuf+strlen(pbuf)), "16 kbit/s");
690 break;
691 case 3:
692 sprintf((pbuf+strlen(pbuf)), "32 kbit/s");
693 break;
695 i++;
696 len--;
699 if(!len)
700 goto exit;
702 if(!(buf[i-1] & 0x80))
704 sprintf((pbuf+strlen(pbuf)), "\n hdr/mfrm/etc.=0x%02x", buf[i]);
705 i++;
706 len--;
709 if(!len)
710 goto exit;
712 if(!(buf[i-1] & 0x80))
714 sprintf((pbuf+strlen(pbuf)), "\n stop/data/parity=0x%02x", buf[i]);
715 i++;
716 len--;
719 if(!len)
720 goto exit;
722 if(!(buf[i-1] & 0x80))
724 sprintf((pbuf+strlen(pbuf)), "\n modemtype=0x%02x", buf[i]);
725 i++;
726 len--;
729 if(!len)
730 goto exit;
732 switch(buf[i] & 0x7f)
734 case 0x42:
735 sprintf((pbuf+strlen(pbuf)), "\n layer2=Q.921/I.441");
736 break;
737 case 0x46:
738 sprintf((pbuf+strlen(pbuf)), "\n layer2=X.25 link");
739 break;
740 default:
741 sprintf((pbuf+strlen(pbuf)), "\n layer2=0x%02x",(buf[i] & 0x7f));
742 break;
744 i++;
745 len--;
747 if(!len)
748 goto exit;
750 switch(buf[i] & 0x7f)
752 case 0x62:
753 sprintf((pbuf+strlen(pbuf)), "\n layer3=Q.921/I.441");
754 break;
755 case 0x66:
756 sprintf((pbuf+strlen(pbuf)), "\n layer3=X.25 packet");
757 break;
758 default:
759 sprintf((pbuf+strlen(pbuf)), "\n layer3=0x%02x",(buf[i] & 0x7f));
760 break;
762 i++;
763 len--;
765 exit:
767 return(i);
770 /*---------------------------------------------------------------------------*
771 * decode and print the ISDN (telephone) number
772 *---------------------------------------------------------------------------*/
774 f_cnu(char *pbuf, unsigned char *buf, int off)
776 int j;
777 int len;
778 int i = 0;
779 int tp;
780 int ind = 0;
781 char buffer[256];
783 i++; /* index -> length */
784 len = buf[i];
786 i++; /* index -> type/plan */
787 tp = buf[i];
789 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
791 switch((tp & 0x70) >> 4)
793 case 0:
794 strcpy(buffer, "Unknown");
795 break;
796 case 1:
797 strcpy(buffer, "International number");
798 break;
799 case 2:
800 strcpy(buffer, "National number");
801 break;
802 case 3:
803 strcpy(buffer, "Network specific number");
804 break;
805 case 4:
806 strcpy(buffer, "Subscriber number");
807 break;
808 case 6:
809 strcpy(buffer, "Abbreviated number");
810 break;
811 default:
812 sprintf(buffer, "Reserved (%d), ", ((tp & 0x70) >> 4));
813 break;
815 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Type = %s", buffer);
817 switch(tp & 0x0f)
819 case 0:
820 strcpy(buffer, "Unknown");
821 break;
822 case 1:
823 strcpy(buffer, "ISDN (E.164)");
824 break;
825 case 3:
826 strcpy(buffer, "Data (X.121)");
827 break;
828 case 4:
829 strcpy(buffer, "Telex (F.69)");
830 break;
831 case 8:
832 strcpy(buffer, "National");
833 break;
834 case 9:
835 strcpy(buffer, "Private");
836 break;
837 default:
838 sprintf(buffer, "Reserved (%d)", (tp & 0x0f));
839 break;
841 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x0f, "Plan = %s", buffer);
843 i++;
844 len--;
846 if(!(tp & 0x80))
848 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
850 switch((buf[i] & 0x60) >> 5)
852 case 0:
853 strcpy(buffer, "allowed");
854 break;
855 case 1:
856 strcpy(buffer, "restricted");
857 break;
858 case 2:
859 strcpy(buffer, "number not available");
860 break;
861 case 3:
862 strcpy(buffer, "reserved");
863 break;
865 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Presentation = %s", buffer);
867 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1c, "Spare");
869 switch(ind & 0x03)
871 case 0:
872 strcpy(buffer, "user provided, not screened");
873 break;
874 case 1:
875 strcpy(buffer, "user provided, verified & passed");
876 break;
877 case 2:
878 strcpy(buffer, "user provided, verified & failed");
879 break;
880 case 3:
881 strcpy(buffer, "network provided");
882 break;
884 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x03, "Screening = %s", buffer);
885 i++;
886 len--;
889 for(j = 0; j < len; j++)
891 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "Number digit = %c", buf[i+j]);
894 i += j;
896 return(i);
899 /*---------------------------------------------------------------------------*
900 * decode and print HL comatibility
901 *---------------------------------------------------------------------------*/
903 f_hlc(char *pbuf, unsigned char *buf, int off)
905 int i = 0;
906 int len = 0;
907 char buffer[256];
909 i++;
910 len = buf[i];
912 i++;
913 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
915 switch((buf[i] >> 5) & 0x03)
917 case 0: strcpy(buffer, "CCITT");
918 break;
919 case 1: strcpy(buffer, "ISO/IEC");
920 break;
921 case 2: strcpy(buffer, "National");
922 break;
923 case 3: strcpy(buffer, "Network");
925 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Coding standard = %s", buffer);
927 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1c, "Interpretation = %s", ((buf[i] >> 2) & 0x07) == 0x04 ? "first" : "reserved");
929 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x03, "Presentation = %s", ((buf[i]) & 0x03) == 0x01 ? "High layer protocol profile" : "reserved");
931 i++;
932 len--;
934 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
936 switch(buf[i] & 0x7f)
938 case 0x01:
939 strcpy(buffer, "Telephony");
940 break;
941 case 0x04:
942 strcpy(buffer, "Fax Group 2/3 (F.182)");
943 break;
944 case 0x21:
945 strcpy(buffer, "Fax Group 4 I (F.184)");
946 break;
947 case 0x24:
948 strcpy(buffer, "Teletex (F.230) or Fax Group 4 II/III (F.184)");
949 break;
950 case 0x28:
951 strcpy(buffer, "Teletex (F.220)");
952 break;
953 case 0x31:
954 strcpy(buffer, "Teletex (F.200)");
955 break;
956 case 0x32:
957 strcpy(buffer, "Videotex (F.300/T.102)");
958 break;
959 case 0x33:
960 strcpy(buffer, "Videotex (F.300/T.101)");
961 break;
962 case 0x35:
963 strcpy(buffer, "Telex (F.60)");
964 break;
965 case 0x38:
966 strcpy(buffer, "MHS (X.400)");
967 break;
968 case 0x41:
969 strcpy(buffer, "OSI (X.200)");
970 break;
971 case 0x5e:
972 strcpy(buffer, "Maintenance");
973 break;
974 case 0x5f:
975 strcpy(buffer, "Management");
976 break;
977 case 0x60:
978 strcpy(buffer, "Audio visual (F.721)");
979 break;
980 default:
981 sprintf(buffer, "Reserved (0x%02x)", buf[i] & 0x7f);
982 break;
984 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Characteristics = %s", buffer);
985 i++;
986 len--;
988 if(buf[i-1] & 0x80)
990 return(i);
993 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
995 switch(buf[i] & 0x7f)
997 case 0x01:
998 strcpy(buffer, "Telephony");
999 break;
1000 case 0x04:
1001 strcpy(buffer, "Fax Group 2/3 (F.182)");
1002 break;
1003 case 0x21:
1004 strcpy(buffer, "Fax Group 4 I (F.184)");
1005 break;
1006 case 0x24:
1007 strcpy(buffer, "Teletex (F.230) or Fax Group 4 II/III (F.184)");
1008 break;
1009 case 0x28:
1010 strcpy(buffer, "Teletex (F.220)");
1011 break;
1012 case 0x31:
1013 strcpy(buffer, "Teletex (F.200)");
1014 break;
1015 case 0x32:
1016 strcpy(buffer, "Videotex (F.300/T.102)");
1017 break;
1018 case 0x33:
1019 strcpy(buffer, "Videotex (F.300/T.101)");
1020 break;
1021 case 0x35:
1022 strcpy(buffer, "Telex (F.60)");
1023 break;
1024 case 0x38:
1025 strcpy(buffer, "MHS (X.400)");
1026 break;
1027 case 0x41:
1028 strcpy(buffer, "OSI (X.200)");
1029 break;
1030 case 0x5e:
1031 strcpy(buffer, "Maintenance");
1032 break;
1033 case 0x5f:
1034 strcpy(buffer, "Management");
1035 break;
1036 case 0x60:
1037 strcpy(buffer, "Audio visual (F.721)");
1038 break;
1039 default:
1040 sprintf(buffer, "Reserved (0x%02x)", buf[i] & 0x7f);
1041 break;
1044 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Ext. characteristics = %s", buffer);
1045 i++;
1046 return(i);
1049 /*---------------------------------------------------------------------------*
1050 * user-user
1051 *---------------------------------------------------------------------------*/
1053 f_uu(char *pbuf, unsigned char *buf, int off)
1055 int j;
1056 int len;
1057 int i = 0;
1058 int pd;
1059 char buffer[256];
1061 i++; /* index -> length */
1062 len = buf[i];
1064 i++; /* index -> PD */
1065 pd = buf[i];
1067 switch(pd)
1069 case 0:
1070 strcpy(buffer, "user-specific");
1071 break;
1072 case 1:
1073 strcpy(buffer, "OSI high layer");
1074 break;
1075 case 2:
1076 strcpy(buffer, "X.244");
1077 break;
1078 case 3:
1079 strcpy(buffer, "reserved for sys mgmt");
1080 break;
1081 case 4:
1082 strcpy(buffer, "IA5 characters");
1083 break;
1084 case 5:
1085 strcpy(buffer, "X.208/X.209");
1086 break;
1087 case 7:
1088 strcpy(buffer, "V.120");
1089 break;
1090 case 8:
1091 strcpy(buffer, "Q.931/I.451");
1092 break;
1093 default:
1094 if(pd >= 0x10 && pd <= 0x3f)
1095 sprintf(buffer, "reserved incl X.31 (0x%2x)", pd);
1096 else if (pd >= 0x40 && pd <= 0x4f)
1097 sprintf(buffer, "national use (0x%2x)", pd);
1098 else if (pd >= 0x50 && pd <= 0xfe)
1099 sprintf(buffer, "reserved incl X.31 (0x%2x)", pd);
1100 else
1101 sprintf(buffer, "reserved (0x%2x)", pd);
1102 break;
1104 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "protocol = %s", buffer);
1106 i++;
1107 len--;
1109 for(j = 0; j < len; j++)
1111 if(isprint(buf[i+j]))
1112 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "user information = %c", buf[i+j]);
1113 else
1114 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "user information = 0x%2x", buf[i+j]);
1117 i += j;
1119 return(i);
1122 /* EOF */