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
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
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 $
34 * last edit-date: [Mon Feb 21 15:45:16 2000]
36 *---------------------------------------------------------------------------*/
40 /*---------------------------------------------------------------------------*
42 *---------------------------------------------------------------------------*/
44 f_null(char *pbuf, unsigned char *buf, int off)
49 /*---------------------------------------------------------------------------*
51 *---------------------------------------------------------------------------*/
53 f_cstat(char *pbuf, unsigned char *buf, int off)
62 sprintf((pbuf+strlen(pbuf)), "Std=");
63 switch((buf[i] & 0x60) >> 5)
66 strcpy(buffer, "CCITT");
69 strcpy(buffer, "ISO/IEC");
72 strcpy(buffer, "National");
75 strcpy(buffer, "Special");
78 sprintf((pbuf+strlen(pbuf)), ", State=");
80 switch((buf[i] & 0x3f))
83 strcpy(buffer, "Null");
86 strcpy(buffer, "Call initiated");
89 strcpy(buffer, "Overlap sending");
92 strcpy(buffer, "Outgoing call proceeding");
95 strcpy(buffer, "Call delivered");
98 strcpy(buffer, "Call present");
101 strcpy(buffer, "Call received");
104 strcpy(buffer, "Connect request");
107 strcpy(buffer, "Incoming call proceeding");
110 strcpy(buffer, "Active");
113 strcpy(buffer, "Disconnect request");
116 strcpy(buffer, "Disconnect indication");
119 strcpy(buffer, "Suspend request");
122 strcpy(buffer, "Resume request");
125 strcpy(buffer, "Release request");
128 strcpy(buffer, "Call abort");
131 strcpy(buffer, "Overlap receiving");
134 strcpy(buffer, "Restart request");
137 strcpy(buffer, "Restart");
140 strcpy(buffer, "ERROR: undefined/reserved");
143 sprintf((pbuf+strlen(pbuf)), "]");
148 /*---------------------------------------------------------------------------*
150 *---------------------------------------------------------------------------*/
152 f_chid(char *pbuf, unsigned char *buf, int off)
162 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
164 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x40, "Interface Id present = %s", buf[i] & 0x40 ? "Yes" : "No");
166 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x20, "Interface Type = %s", buf[i] & 0x20 ? "Other (PRI)" : "BRI");
168 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x10, "Spare");
170 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x08, "Channel = %s", buf[i] & 0x08 ? "exclusive" : "preferred");
172 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x04, "Channel is%s the D-Channel", buf[i] & 0x04 ? "" : " not");
174 switch(buf[i] & 0x03)
177 strcpy(buffer, "no channel");
180 strcpy(buffer, "B-1");
183 strcpy(buffer, "B-2");
186 strcpy(buffer, "any channel");
189 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x03, "Channel = %s", buffer);
195 /*---------------------------------------------------------------------------*
197 *---------------------------------------------------------------------------*/
199 f_fac(char *pbuf, unsigned char *buf, int off)
201 return(q932_facility(pbuf, buf));
204 /*---------------------------------------------------------------------------*
206 *---------------------------------------------------------------------------*/
208 f_progi(char *pbuf, unsigned char *buf, int off)
217 sprintf((pbuf+strlen(pbuf)), "Std=");
218 switch((buf[i] & 0x60) >> 5)
221 strcpy(buffer, "CCITT");
224 strcpy(buffer, "ISO/IEC");
227 strcpy(buffer, "National");
230 strcpy(buffer, "Local");
233 sprintf((pbuf+strlen(pbuf)), ", Loc=");
235 switch((buf[i] & 0x0f))
238 strcpy(buffer, "User");
241 strcpy(buffer, "Private network serving local user");
244 strcpy(buffer, "Public network serving local user");
247 strcpy(buffer, "Transit network");
250 strcpy(buffer, "Public network serving remote user");
253 strcpy(buffer, "Private network serving remote user");
256 strcpy(buffer, "Network beyond interworking point");
259 strcpy(buffer, "ERROR: undefined/reserved");
265 sprintf((pbuf+strlen(pbuf)), "\n Description");
267 switch((buf[i] & 0x7f))
270 strcpy(buffer, "Call is not end-to-end ISDN");
273 strcpy(buffer, "Destination address is non-ISDN");
276 strcpy(buffer, "Origination address is non-ISDN");
279 strcpy(buffer, "Call has returned to the ISDN");
282 strcpy(buffer, "Interworking occured, Service change");
285 strcpy(buffer, "In-band info or appropriate pattern now available");
288 strcpy(buffer, "ERROR: undefined/reserved");
291 sprintf((pbuf+strlen(pbuf)), "]");
297 /*---------------------------------------------------------------------------*
299 *---------------------------------------------------------------------------*/
301 f_displ(char *pbuf, unsigned char *buf, int off)
310 for(j = 0; j < len; j++)
312 sprintf((pbuf+strlen(pbuf)),"%c", buf[j+i]);
314 sprintf((pbuf+strlen(pbuf)),"]");
320 /*---------------------------------------------------------------------------*
322 *---------------------------------------------------------------------------*/
324 f_date(char *pbuf, unsigned char *buf, int off)
334 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Year = %02d", buf[i]);
337 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Month = %02d", buf[i]);
340 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Day = %02d", buf[i]);
346 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Hour = %02d", buf[i]);
352 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Minute = %02d", buf[i]);
358 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "Second = %02d", buf[i]);
366 /*---------------------------------------------------------------------------*
367 * decode and print the cause
368 *---------------------------------------------------------------------------*/
370 f_cause(char *pbuf, unsigned char *buf, int off)
378 i++; /* index -> length */
382 i++; /* coding/location */
387 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
389 switch((ls & 0x60) >> 5)
392 strcpy(buffer, "CCITT");
395 strcpy(buffer, "ISO/IEC");
398 strcpy(buffer, "National");
401 strcpy(buffer, "Local");
404 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Coding Standard = %s", buffer);
406 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x10, "Spare");
411 strcpy(buffer, "user");
414 strcpy(buffer, "private network serving local user");
417 strcpy(buffer, "public network serving local user");
420 strcpy(buffer, "transit network");
423 strcpy(buffer, "public network serving remote user");
426 strcpy(buffer, "private network serving remote user");
429 strcpy(buffer, "international network");
432 strcpy(buffer, "network beyond interworking point");
435 sprintf(buffer, "reserved (0x%02x)", ls & 0x0f);
438 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x0f, "Location = %s", buffer);
445 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
447 switch(buf[i] & 0x7f)
450 strcpy(buffer, "Q.931");
453 strcpy(buffer, "X.21");
456 strcpy(buffer, "X.25");
459 strcpy(buffer, "Q.1031/Q.1051");
462 strcpy(buffer, "Reserved");
465 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Recommendation = %s", buffer);
470 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
472 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Cause = %s", print_cause_q850(buf[i] & 0x7f));
477 for(j = 0; j < len; j++)
478 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "Diagnostics = %02d %s", buf[i+j], buf[i+j]);
485 /*---------------------------------------------------------------------------*
486 * decode and print the bearer capability
487 *---------------------------------------------------------------------------*/
489 f_bc(char *pbuf, unsigned char *buf, int off)
496 i++; /* index -> length */
501 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
503 switch((buf[i] & 0x60) >> 5)
506 strcpy(buffer, "CCITT");
509 strcpy(buffer, "ISO/IEC");
512 strcpy(buffer, "National");
515 strcpy(buffer, "NSI Std");
518 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Coding standard = %s", buffer);
520 switch(buf[i] & 0x1f)
523 strcpy(buffer, "speech");
526 strcpy(buffer, "unrestricted digital information");
529 strcpy(buffer, "restricted digital information");
532 strcpy(buffer, "3.1 kHz audio");
535 strcpy(buffer, "unrestricted digital information with tones");
538 strcpy(buffer, "video");
541 sprintf(buffer, "reserved (0x%02x)", buf[i] & 0x0f);
544 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1f, "Capability = %s", buffer);
549 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
551 switch((buf[i] & 0x60) >> 5)
554 strcpy(buffer, "circuit");
557 strcpy(buffer, "packet");
560 sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", ((buf[i] & 0x60) >> 5));
563 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Mode = %s", buffer);
565 switch(buf[i] & 0x1f)
568 strcpy(buffer, "packet mode");
571 strcpy(buffer, "64 kbit/s");
574 strcpy(buffer, "2 x 64 kbit/s");
577 strcpy(buffer, "384 kbit/s");
580 strcpy(buffer, "1536 kbit/s");
583 strcpy(buffer, "1920 kbit/s");
586 strcpy(buffer, "Multirate");
590 sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", buf[i] & 0x0f);
593 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1f, "Rate = %s", buffer);
603 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
604 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Rate multiplier = %d", buf[i] & 0x7f);
612 switch(buf[i] & 0x1f)
615 strcpy(buffer, "V.110/X.30");
618 strcpy(buffer, "G.711 u-Law");
621 strcpy(buffer, "G.711 a-Law");
624 strcpy(buffer, "G.721 ADPCM/I.460");
627 strcpy(buffer, "H.221/H.242");
630 strcpy(buffer, "non-CCITT rate adaption");
633 strcpy(buffer, "V.120");
636 strcpy(buffer, "X.31");
639 sprintf((pbuf+strlen(pbuf)), "reserved (0x%02x)", buf[i] & 0x1f);
642 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1f, "Layer 1 Protocol = %s", buffer);
650 /* work to do ahead !!! */
652 if(!(buf[i-1] & 0x80))
654 sprintf((pbuf+strlen(pbuf)), "\n user rate=0x%02x ", buf[i] & 0x1f);
657 sprintf((pbuf+strlen(pbuf)), "(async,");
659 sprintf((pbuf+strlen(pbuf)), "(sync,");
662 sprintf((pbuf+strlen(pbuf)), "in-band neg. possible)");
664 sprintf((pbuf+strlen(pbuf)), "in-band neg not possible)");
673 if(!(buf[i-1] & 0x80))
675 sprintf((pbuf+strlen(pbuf)), "\n clk/flow=0x%02x", buf[i] & 0x1f);
677 sprintf((pbuf+strlen(pbuf)), "\n intermediate rate=");
679 switch((buf[i] & 0x60) >> 5)
682 sprintf((pbuf+strlen(pbuf)), "not used");
685 sprintf((pbuf+strlen(pbuf)), "8 kbit/s");
688 sprintf((pbuf+strlen(pbuf)), "16 kbit/s");
691 sprintf((pbuf+strlen(pbuf)), "32 kbit/s");
701 if(!(buf[i-1] & 0x80))
703 sprintf((pbuf+strlen(pbuf)), "\n hdr/mfrm/etc.=0x%02x", buf[i]);
711 if(!(buf[i-1] & 0x80))
713 sprintf((pbuf+strlen(pbuf)), "\n stop/data/parity=0x%02x", buf[i]);
721 if(!(buf[i-1] & 0x80))
723 sprintf((pbuf+strlen(pbuf)), "\n modemtype=0x%02x", buf[i]);
731 switch(buf[i] & 0x7f)
734 sprintf((pbuf+strlen(pbuf)), "\n layer2=Q.921/I.441");
737 sprintf((pbuf+strlen(pbuf)), "\n layer2=X.25 link");
740 sprintf((pbuf+strlen(pbuf)), "\n layer2=0x%02x",(buf[i] & 0x7f));
749 switch(buf[i] & 0x7f)
752 sprintf((pbuf+strlen(pbuf)), "\n layer3=Q.921/I.441");
755 sprintf((pbuf+strlen(pbuf)), "\n layer3=X.25 packet");
758 sprintf((pbuf+strlen(pbuf)), "\n layer3=0x%02x",(buf[i] & 0x7f));
769 /*---------------------------------------------------------------------------*
770 * decode and print the ISDN (telephone) number
771 *---------------------------------------------------------------------------*/
773 f_cnu(char *pbuf, unsigned char *buf, int off)
782 i++; /* index -> length */
785 i++; /* index -> type/plan */
788 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
790 switch((tp & 0x70) >> 4)
793 strcpy(buffer, "Unknown");
796 strcpy(buffer, "International number");
799 strcpy(buffer, "National number");
802 strcpy(buffer, "Network specific number");
805 strcpy(buffer, "Subscriber number");
808 strcpy(buffer, "Abbreviated number");
811 sprintf(buffer, "Reserved (%d), ", ((tp & 0x70) >> 4));
814 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Type = %s", buffer);
819 strcpy(buffer, "Unknown");
822 strcpy(buffer, "ISDN (E.164)");
825 strcpy(buffer, "Data (X.121)");
828 strcpy(buffer, "Telex (F.69)");
831 strcpy(buffer, "National");
834 strcpy(buffer, "Private");
837 sprintf(buffer, "Reserved (%d)", (tp & 0x0f));
840 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x0f, "Plan = %s", buffer);
847 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
849 switch((buf[i] & 0x60) >> 5)
852 strcpy(buffer, "allowed");
855 strcpy(buffer, "restricted");
858 strcpy(buffer, "number not available");
861 strcpy(buffer, "reserved");
864 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Presentation = %s", buffer);
866 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1c, "Spare");
871 strcpy(buffer, "user provided, not screened");
874 strcpy(buffer, "user provided, verified & passed");
877 strcpy(buffer, "user provided, verified & failed");
880 strcpy(buffer, "network provided");
883 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x03, "Screening = %s", buffer);
888 for(j = 0; j < len; j++)
890 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "Number digit = %c", buf[i+j]);
898 /*---------------------------------------------------------------------------*
899 * decode and print HL comatibility
900 *---------------------------------------------------------------------------*/
902 f_hlc(char *pbuf, unsigned char *buf, int off)
912 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
914 switch((buf[i] >> 5) & 0x03)
916 case 0: strcpy(buffer, "CCITT");
918 case 1: strcpy(buffer, "ISO/IEC");
920 case 2: strcpy(buffer, "National");
922 case 3: strcpy(buffer, "Network");
924 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x60, "Coding standard = %s", buffer);
926 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x1c, "Interpretation = %s", ((buf[i] >> 2) & 0x07) == 0x04 ? "first" : "reserved");
928 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x03, "Presentation = %s", ((buf[i]) & 0x03) == 0x01 ? "High layer protocol profile" : "reserved");
933 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
935 switch(buf[i] & 0x7f)
938 strcpy(buffer, "Telephony");
941 strcpy(buffer, "Fax Group 2/3 (F.182)");
944 strcpy(buffer, "Fax Group 4 I (F.184)");
947 strcpy(buffer, "Teletex (F.230) or Fax Group 4 II/III (F.184)");
950 strcpy(buffer, "Teletex (F.220)");
953 strcpy(buffer, "Teletex (F.200)");
956 strcpy(buffer, "Videotex (F.300/T.102)");
959 strcpy(buffer, "Videotex (F.300/T.101)");
962 strcpy(buffer, "Telex (F.60)");
965 strcpy(buffer, "MHS (X.400)");
968 strcpy(buffer, "OSI (X.200)");
971 strcpy(buffer, "Maintenance");
974 strcpy(buffer, "Management");
977 strcpy(buffer, "Audio visual (F.721)");
980 sprintf(buffer, "Reserved (0x%02x)", buf[i] & 0x7f);
983 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Characteristics = %s", buffer);
992 extension(3, pbuf+strlen(pbuf), off+i, buf[i], 0x80);
994 switch(buf[i] & 0x7f)
997 strcpy(buffer, "Telephony");
1000 strcpy(buffer, "Fax Group 2/3 (F.182)");
1003 strcpy(buffer, "Fax Group 4 I (F.184)");
1006 strcpy(buffer, "Teletex (F.230) or Fax Group 4 II/III (F.184)");
1009 strcpy(buffer, "Teletex (F.220)");
1012 strcpy(buffer, "Teletex (F.200)");
1015 strcpy(buffer, "Videotex (F.300/T.102)");
1018 strcpy(buffer, "Videotex (F.300/T.101)");
1021 strcpy(buffer, "Telex (F.60)");
1024 strcpy(buffer, "MHS (X.400)");
1027 strcpy(buffer, "OSI (X.200)");
1030 strcpy(buffer, "Maintenance");
1033 strcpy(buffer, "Management");
1036 strcpy(buffer, "Audio visual (F.721)");
1039 sprintf(buffer, "Reserved (0x%02x)", buf[i] & 0x7f);
1043 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0x7f, "Ext. characteristics = %s", buffer);
1048 /*---------------------------------------------------------------------------*
1050 *---------------------------------------------------------------------------*/
1052 f_uu(char *pbuf, unsigned char *buf, int off)
1060 i++; /* index -> length */
1063 i++; /* index -> PD */
1069 strcpy(buffer, "user-specific");
1072 strcpy(buffer, "OSI high layer");
1075 strcpy(buffer, "X.244");
1078 strcpy(buffer, "reserved for sys mgmt");
1081 strcpy(buffer, "IA5 characters");
1084 strcpy(buffer, "X.208/X.209");
1087 strcpy(buffer, "V.120");
1090 strcpy(buffer, "Q.931/I.451");
1093 if(pd >= 0x10 && pd <= 0x3f)
1094 sprintf(buffer, "reserved incl X.31 (0x%2x)", pd);
1095 else if (pd >= 0x40 && pd <= 0x4f)
1096 sprintf(buffer, "national use (0x%2x)", pd);
1097 else if (pd >= 0x50 && pd <= 0xfe)
1098 sprintf(buffer, "reserved incl X.31 (0x%2x)", pd);
1100 sprintf(buffer, "reserved (0x%2x)", pd);
1103 sprintline(3, (pbuf+strlen(pbuf)), off+i, buf[i], 0xff, "protocol = %s", buffer);
1108 for(j = 0; j < len; j++)
1110 if(isprint(buf[i+j]))
1111 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "user information = %c", buf[i+j]);
1113 sprintline(3, (pbuf+strlen(pbuf)), off+i+j, buf[i+j], 0xff, "user information = 0x%2x", buf[i+j]);