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 * q931_util.c - utility functions to print Q.931 traces
28 * -----------------------------------------------------
30 * $Id: q931_util.c,v 1.11 2000/02/15 12:48:14 hm Exp $
32 * $FreeBSD: src/usr.sbin/i4b/isdntrace/q931_util.c,v 1.6.2.1 2001/08/01 17:45:08 obrien Exp $
33 * $DragonFly: src/usr.sbin/i4b/isdntrace/q931_util.c,v 1.2 2003/06/17 04:29:55 dillon Exp $
35 * last edit-date: [Tue Feb 15 13:52:09 2000]
37 *---------------------------------------------------------------------------*/
41 /*---------------------------------------------------------------------------*
42 * decode and print the cause
43 *---------------------------------------------------------------------------*/
45 p_q931cause(char *pbuf
, unsigned char *buf
)
54 i
++; /* index -> length */
58 i
++; /* coding/location */
66 if(!(buf
[i
-1] & 0x80))
74 sprintf((pbuf
+strlen(pbuf
)), "%s ", print_cause_q850(buf
[i
] & 0x7f));
76 sprintf((pbuf
+strlen(pbuf
)), "\n (location=");
81 sprintf((pbuf
+strlen(pbuf
)), "user");
84 sprintf((pbuf
+strlen(pbuf
)), "private network serving local user");
87 sprintf((pbuf
+strlen(pbuf
)), "public network serving local user");
90 sprintf((pbuf
+strlen(pbuf
)), "transit network");
93 sprintf((pbuf
+strlen(pbuf
)), "public network serving remote user");
96 sprintf((pbuf
+strlen(pbuf
)), "private network serving remote user");
99 sprintf((pbuf
+strlen(pbuf
)), "international network");
102 sprintf((pbuf
+strlen(pbuf
)), "network beyond interworking point");
105 sprintf((pbuf
+strlen(pbuf
)), "reserved (0x%02x)", ls
& 0x0f);
109 sprintf((pbuf
+strlen(pbuf
)), ", std=");
111 switch((ls
& 0x60) >> 5)
114 sprintf((pbuf
+strlen(pbuf
)), "CCITT");
117 sprintf((pbuf
+strlen(pbuf
)), "ISO/IEC");
120 sprintf((pbuf
+strlen(pbuf
)), "National");
123 sprintf((pbuf
+strlen(pbuf
)), "Local");
129 sprintf((pbuf
+strlen(pbuf
)), ", rec=");
134 sprintf((pbuf
+strlen(pbuf
)), "Q.931");
137 sprintf((pbuf
+strlen(pbuf
)), "X.21");
140 sprintf((pbuf
+strlen(pbuf
)), "X.25");
143 sprintf((pbuf
+strlen(pbuf
)), "Q.1031/Q.1051");
146 sprintf((pbuf
+strlen(pbuf
)), "Reserved");
151 sprintf((pbuf
+strlen(pbuf
)),")");
156 for(j
= 0; j
< len
; j
++)
157 sprintf((pbuf
+strlen(pbuf
))," 0x%02x", buf
[j
+i
]);
159 sprintf((pbuf
+strlen(pbuf
)),"]");
166 /*---------------------------------------------------------------------------*
167 * decode and print the bearer capability
168 *---------------------------------------------------------------------------*/
170 p_q931bc(char *pbuf
, unsigned char *buf
)
176 i
++; /* index -> length */
182 sprintf((pbuf
+strlen(pbuf
)), "\n cap=");
184 switch(buf
[i
] & 0x1f)
187 sprintf((pbuf
+strlen(pbuf
)), "speech");
190 sprintf((pbuf
+strlen(pbuf
)), "unrestricted digital information");
193 sprintf((pbuf
+strlen(pbuf
)), "restricted digital information");
196 sprintf((pbuf
+strlen(pbuf
)), "3.1 kHz audio");
199 sprintf((pbuf
+strlen(pbuf
)), "unrestricted digital information with tones");
202 sprintf((pbuf
+strlen(pbuf
)), "video");
205 sprintf((pbuf
+strlen(pbuf
)), "reserved (0x%02x)", buf
[i
] & 0x0f);
209 sprintf((pbuf
+strlen(pbuf
)), "\n std=");
211 switch((buf
[i
] & 0x60) >> 5)
214 sprintf((pbuf
+strlen(pbuf
)), "CCITT");
217 sprintf((pbuf
+strlen(pbuf
)), "ISO/IEC");
220 sprintf((pbuf
+strlen(pbuf
)), "National");
223 sprintf((pbuf
+strlen(pbuf
)), "NSI Std");
230 sprintf((pbuf
+strlen(pbuf
)), "\n rate=");
232 switch(buf
[i
] & 0x1f)
235 sprintf((pbuf
+strlen(pbuf
)), "packet mode");
238 sprintf((pbuf
+strlen(pbuf
)), "64 kbit/s");
241 sprintf((pbuf
+strlen(pbuf
)), "2 x 64 kbit/s");
244 sprintf((pbuf
+strlen(pbuf
)), "384 kbit/s");
247 sprintf((pbuf
+strlen(pbuf
)), "1536 kbit/s");
250 sprintf((pbuf
+strlen(pbuf
)), "1920 kbit/s");
253 sprintf((pbuf
+strlen(pbuf
)), "Multirate");
257 sprintf((pbuf
+strlen(pbuf
)), "reserved (0x%02x)", buf
[i
] & 0x0f);
261 sprintf((pbuf
+strlen(pbuf
)), "\n mode=");
263 switch((buf
[i
] & 0x60) >> 5)
266 sprintf((pbuf
+strlen(pbuf
)), "circuit");
269 sprintf((pbuf
+strlen(pbuf
)), "packet");
272 sprintf((pbuf
+strlen(pbuf
)), "reserved (0x%02x)", ((buf
[i
] & 0x60) >> 5));
284 sprintf((pbuf
+strlen(pbuf
)), "\n rate multiplier=%d", buf
[i
] & 0x7f);
292 sprintf((pbuf
+strlen(pbuf
)), "\n layer1=");
294 switch(buf
[i
] & 0x1f)
297 sprintf((pbuf
+strlen(pbuf
)), "V.110");
300 sprintf((pbuf
+strlen(pbuf
)), "G.711 u-law");
303 sprintf((pbuf
+strlen(pbuf
)), "G.711 A-law");
306 sprintf((pbuf
+strlen(pbuf
)), "G.721");
309 sprintf((pbuf
+strlen(pbuf
)), "H.221/H.242");
312 sprintf((pbuf
+strlen(pbuf
)), "Non-Std");
315 sprintf((pbuf
+strlen(pbuf
)), "V.120");
318 sprintf((pbuf
+strlen(pbuf
)), "X.31");
321 sprintf((pbuf
+strlen(pbuf
)), "reserved (0x%02x)", buf
[i
] & 0x0f);
330 if(!(buf
[i
-1] & 0x80))
332 sprintf((pbuf
+strlen(pbuf
)), "\n user rate=0x%02x ", buf
[i
] & 0x1f);
335 sprintf((pbuf
+strlen(pbuf
)), "(async,");
337 sprintf((pbuf
+strlen(pbuf
)), "(sync,");
340 sprintf((pbuf
+strlen(pbuf
)), "in-band neg. possible)");
342 sprintf((pbuf
+strlen(pbuf
)), "in-band neg not possible)");
351 if(!(buf
[i
-1] & 0x80))
353 sprintf((pbuf
+strlen(pbuf
)), "\n clk/flow=0x%02x", buf
[i
] & 0x1f);
355 sprintf((pbuf
+strlen(pbuf
)), "\n intermediate rate=");
357 switch((buf
[i
] & 0x60) >> 5)
360 sprintf((pbuf
+strlen(pbuf
)), "not used");
363 sprintf((pbuf
+strlen(pbuf
)), "8 kbit/s");
366 sprintf((pbuf
+strlen(pbuf
)), "16 kbit/s");
369 sprintf((pbuf
+strlen(pbuf
)), "32 kbit/s");
379 if(!(buf
[i
-1] & 0x80))
381 sprintf((pbuf
+strlen(pbuf
)), "\n hdr/mfrm/etc.=0x%02x", buf
[i
]);
389 if(!(buf
[i
-1] & 0x80))
391 sprintf((pbuf
+strlen(pbuf
)), "\n stop/data/parity=0x%02x", buf
[i
]);
399 if(!(buf
[i
-1] & 0x80))
401 sprintf((pbuf
+strlen(pbuf
)), "\n modemtype=0x%02x", buf
[i
]);
409 switch(buf
[i
] & 0x7f)
412 sprintf((pbuf
+strlen(pbuf
)), "\n layer2=Q.921/I.441");
415 sprintf((pbuf
+strlen(pbuf
)), "\n layer2=X.25 link");
418 sprintf((pbuf
+strlen(pbuf
)), "\n layer2=0x%02x",(buf
[i
] & 0x7f));
427 switch(buf
[i
] & 0x7f)
430 sprintf((pbuf
+strlen(pbuf
)), "\n layer3=Q.921/I.441");
433 sprintf((pbuf
+strlen(pbuf
)), "\n layer3=X.25 packet");
436 sprintf((pbuf
+strlen(pbuf
)), "\n layer3=0x%02x",(buf
[i
] & 0x7f));
443 sprintf((pbuf
+strlen(pbuf
)), "]");
447 /*---------------------------------------------------------------------------*
448 * decode and print the ISDN (telephone) number
449 *---------------------------------------------------------------------------*/
451 p_q931address(char *pbuf
, unsigned char *buf
)
460 i
++; /* index -> length */
463 i
++; /* index -> type/plan */
477 for(j
= 0; j
< len
; j
++)
479 sprintf((pbuf
+strlen(pbuf
)),"%c", buf
[j
+i
]);
482 switch((tp
& 0x70) >> 4)
485 sprintf((pbuf
+strlen(pbuf
)), " (type=unknown, ");
488 sprintf((pbuf
+strlen(pbuf
)), " (type=international, ");
491 sprintf((pbuf
+strlen(pbuf
)), " (type=national, ");
494 sprintf((pbuf
+strlen(pbuf
)), " (type=network specific, ");
497 sprintf((pbuf
+strlen(pbuf
)), " (type=subscriber, ");
500 sprintf((pbuf
+strlen(pbuf
)), " (type=abbreviated, ");
503 sprintf((pbuf
+strlen(pbuf
)), " (type=reserved (%d), ", ((tp
& 0x70) >> 4));
510 sprintf((pbuf
+strlen(pbuf
)), "plan=unknown");
513 sprintf((pbuf
+strlen(pbuf
)), "plan=ISDN");
516 sprintf((pbuf
+strlen(pbuf
)), "plan=Data");
519 sprintf((pbuf
+strlen(pbuf
)), "plan=Telex");
522 sprintf((pbuf
+strlen(pbuf
)), "plan=National");
525 sprintf((pbuf
+strlen(pbuf
)), "plan=private");
528 sprintf((pbuf
+strlen(pbuf
)), "plan=reserved (%d)", (tp
& 0x0f));
534 sprintf((pbuf
+strlen(pbuf
)), ",\n ");
535 switch((ind
& 0x60) >> 5)
538 sprintf((pbuf
+strlen(pbuf
)), "presentation allowed, ");
541 sprintf((pbuf
+strlen(pbuf
)), "presentation restricted, ");
544 sprintf((pbuf
+strlen(pbuf
)), "number not available, ");
547 sprintf((pbuf
+strlen(pbuf
)), "reserved, ");
554 sprintf((pbuf
+strlen(pbuf
)), "screening user provided: not screened");
557 sprintf((pbuf
+strlen(pbuf
)), "screening user provided: verified & passed");
560 sprintf((pbuf
+strlen(pbuf
)), "screening user provided: verified & failed");
563 sprintf((pbuf
+strlen(pbuf
)), "screening network provided");
568 sprintf((pbuf
+strlen(pbuf
)),")]");
575 /*---------------------------------------------------------------------------*
576 * decode and print HL comatibility
577 *---------------------------------------------------------------------------*/
579 p_q931high_compat(char *pbuf
, unsigned char *buf
)
583 sprintf(pbuf
+strlen(pbuf
), " standard=");
585 switch ((buf
[2] >> 5) & 0x03)
587 case 0: sprintf(pbuf
+strlen(pbuf
), "CCITT");
589 case 1: sprintf(pbuf
+strlen(pbuf
), "unknown international standard");
591 case 2: sprintf(pbuf
+strlen(pbuf
), "unknown national standard");
593 case 3: sprintf(pbuf
+strlen(pbuf
), "local network standard");
598 sprintf(pbuf
+strlen(pbuf
), ", characteristics=");
600 switch (buf
[3] & 0x7f)
603 sprintf(pbuf
+strlen(pbuf
), "Telephony");
606 sprintf(pbuf
+strlen(pbuf
), "Fax Group 2/3");
609 sprintf(pbuf
+strlen(pbuf
), "Fax Group 4 Class I (F.184)");
612 sprintf(pbuf
+strlen(pbuf
), "Teletex basic/mixed (F.230) or Fax Group 4 Class II/III (F.184)");
615 sprintf(pbuf
+strlen(pbuf
), "Teletex basic/processable (F.220)");
618 sprintf(pbuf
+strlen(pbuf
), "Teletex basic mode (F.200)");
621 sprintf(pbuf
+strlen(pbuf
), "Videotex (F.300 and T.101)");
624 sprintf(pbuf
+strlen(pbuf
), "Telex (F.60)");
627 sprintf(pbuf
+strlen(pbuf
), "MHS (X.400 series)");
630 sprintf(pbuf
+strlen(pbuf
), "OSI application (X.200 series)");
633 sprintf(pbuf
+strlen(pbuf
), "Maintenance");
636 sprintf(pbuf
+strlen(pbuf
), "Management");
639 sprintf(pbuf
+strlen(pbuf
), "reserved");
642 sprintf(pbuf
+strlen(pbuf
), "UNKNOWN (0x%02x)", buf
[3]);
650 sprintf(pbuf
+strlen(pbuf
), "]");
654 sprintf(pbuf
+strlen(pbuf
), " of ");
656 switch (buf
[4] & 0x7f)
659 sprintf(pbuf
+strlen(pbuf
), "Telephony");
662 sprintf(pbuf
+strlen(pbuf
), "Fax Group 2/3");
665 sprintf(pbuf
+strlen(pbuf
), "Fax Group 4 Class I (F.184)");
668 sprintf(pbuf
+strlen(pbuf
), "Teletex basic/mixed (F.230) or Fax Group 4 Class II/III (F.184)");
671 sprintf(pbuf
+strlen(pbuf
), "Teletex basic/processable (F.220)");
674 sprintf(pbuf
+strlen(pbuf
), "Teletex basic mode (F.200)");
677 sprintf(pbuf
+strlen(pbuf
), "Videotex (F.300 and T.101)");
680 sprintf(pbuf
+strlen(pbuf
), "Telex (F.60)");
683 sprintf(pbuf
+strlen(pbuf
), "MHS (X.400 series)");
686 sprintf(pbuf
+strlen(pbuf
), "OSI application (X.200 series)");
689 sprintf(pbuf
+strlen(pbuf
), "reserved");
692 sprintf(pbuf
+strlen(pbuf
), "UNKNOWN (0x%02x)", buf
[3]);
695 sprintf(pbuf
+strlen(pbuf
), "]");
699 /*---------------------------------------------------------------------------*
700 * decode and print user-user IE
701 *---------------------------------------------------------------------------*/
703 p_q931user_user(char *pbuf
, unsigned char *buf
)
710 i
++; /* index -> length */
713 i
++; /* index -> protocoldiscriminator */
719 sprintf((pbuf
+strlen(pbuf
)), "(pd=user-specific");
722 sprintf((pbuf
+strlen(pbuf
)), "(pd=OSI high-layer protocols");
725 sprintf((pbuf
+strlen(pbuf
)), "(pd=X.244");
728 sprintf((pbuf
+strlen(pbuf
)), "(pd=reserved for system management");
731 sprintf((pbuf
+strlen(pbuf
)), "(pd=IA5 characters");
734 sprintf((pbuf
+strlen(pbuf
)), "(pd=X.208/X.209 coded user info");
737 sprintf((pbuf
+strlen(pbuf
)), "(pd=V.120 rate adaption");
740 sprintf((pbuf
+strlen(pbuf
)), "(pd=Q.931/I.451 user network call control messages");
743 if(pd
>= 0x10 && pd
<= 0x3f)
744 sprintf((pbuf
+strlen(pbuf
)), "(pd=0x%x=reserved for other L3 protocols incl. X.25", pd
);
745 else if(pd
>= 0x40 && pd
<= 0x47)
746 sprintf((pbuf
+strlen(pbuf
)), "(pd=0x%x=national use", pd
);
747 else if(pd
>= 0x48 && pd
<= 0x4f)
748 sprintf((pbuf
+strlen(pbuf
)), "(pd=0x%x=reserved for ETSI", pd
);
749 else if(pd
>= 0x50 && pd
<= 0xfe)
750 sprintf((pbuf
+strlen(pbuf
)), "(pd=0x%x=reserved for other L3 protocols incl. X.25", pd
);
752 sprintf((pbuf
+strlen(pbuf
)), "(pd=0x%x=reserved", pd
);
759 sprintf((pbuf
+strlen(pbuf
)),": (");
761 for(j
= 0; j
< len
; j
++)
764 sprintf((pbuf
+strlen(pbuf
)),"%c", buf
[j
+i
]);
766 sprintf((pbuf
+strlen(pbuf
)),"0x%2x", buf
[j
+i
]);
769 sprintf((pbuf
+strlen(pbuf
)),"))]");
776 /*---------------------------------------------------------------------------*
777 * decode and notification indicator IE (Q.932, p44)
778 *---------------------------------------------------------------------------*/
780 p_q931notification(char *pbuf
, unsigned char *buf
)
787 i
++; /* index -> length */
790 i
++; /* index -> notification description */
796 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, user suspended", nd
);
799 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, user resumed", nd
);
802 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, bearer service changed", nd
);
806 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, BER coded information", nd
);
810 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, conference established", nd
);
813 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, conference disconnected", nd
);
816 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, other party added", nd
);
819 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, isolated", nd
);
822 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, reattached", nd
);
825 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, other party isolated", nd
);
828 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, other party reattached", nd
);
831 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, other party split", nd
);
834 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, other party disconnected", nd
);
837 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, conference floating", nd
);
840 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, conference disconnected, preemption", nd
);
843 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, conference floating, server user preempted", nd
);
847 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, call is a waiting call", nd
);
850 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, diversion activated", nd
);
852 case 0xe9: /* ECT, EN 300 369-1 V1.2.4 p12) */
853 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, call transferred, alerting", nd
);
855 case 0xea: /* ECT, EN 300 369-1 V1.2.4 p12) */
856 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, call transferred, active", nd
);
859 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, reverse charging", nd
);
863 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, remote hold", nd
);
866 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, remote retrieval", nd
);
869 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, call is diverting", nd
);
872 sprintf((pbuf
+strlen(pbuf
)), "0x%2x, undefined", nd
);
881 sprintf((pbuf
+strlen(pbuf
)),": (");
886 sprintf((pbuf
+strlen(pbuf
)),"%c", buf
[j
+i
]);
888 sprintf((pbuf
+strlen(pbuf
)),"0x%2x", buf
[j
+i
]);
891 sprintf((pbuf
+strlen(pbuf
)),")");
893 sprintf((pbuf
+strlen(pbuf
)),"]");
899 /*---------------------------------------------------------------------------*
900 * decode and print redirecting/redirection number
901 *---------------------------------------------------------------------------*/
903 p_q931redir(char *pbuf
, unsigned char *buf
)
914 i
++; /* index -> length */
917 i
++; /* index -> type/plan */
939 for(j
= 0; j
< len
; j
++)
941 sprintf((pbuf
+strlen(pbuf
)),"%c", buf
[j
+i
]);
944 switch((tp
& 0x70) >> 4)
947 sprintf((pbuf
+strlen(pbuf
)), " (type=unknown, ");
950 sprintf((pbuf
+strlen(pbuf
)), " (type=international, ");
953 sprintf((pbuf
+strlen(pbuf
)), " (type=national, ");
956 sprintf((pbuf
+strlen(pbuf
)), " (type=network specific, ");
959 sprintf((pbuf
+strlen(pbuf
)), " (type=subscriber, ");
962 sprintf((pbuf
+strlen(pbuf
)), " (type=abbreviated, ");
965 sprintf((pbuf
+strlen(pbuf
)), " (type=reserved (%d), ", ((tp
& 0x70) >> 4));
972 sprintf((pbuf
+strlen(pbuf
)), "plan=unknown");
975 sprintf((pbuf
+strlen(pbuf
)), "plan=ISDN");
978 sprintf((pbuf
+strlen(pbuf
)), "plan=Data");
981 sprintf((pbuf
+strlen(pbuf
)), "plan=Telex");
984 sprintf((pbuf
+strlen(pbuf
)), "plan=National");
987 sprintf((pbuf
+strlen(pbuf
)), "plan=private");
990 sprintf((pbuf
+strlen(pbuf
)), "plan=reserved (%d)", (tp
& 0x0f));
996 sprintf((pbuf
+strlen(pbuf
)), ",\n ");
997 switch((ind
& 0x60) >> 5)
1000 sprintf((pbuf
+strlen(pbuf
)), "presentation allowed");
1003 sprintf((pbuf
+strlen(pbuf
)), "presentation restricted");
1006 sprintf((pbuf
+strlen(pbuf
)), "number not available");
1009 sprintf((pbuf
+strlen(pbuf
)), "reserved");
1016 sprintf((pbuf
+strlen(pbuf
)), ",\n ");
1020 sprintf((pbuf
+strlen(pbuf
)), "reason for diversion: unknown");
1023 sprintf((pbuf
+strlen(pbuf
)), "reason for diversion: call forwarding busy");
1026 sprintf((pbuf
+strlen(pbuf
)), "reason for diversion: call forwarding unconditional");
1029 sprintf((pbuf
+strlen(pbuf
)), "reason for diversion: called DTE");
1032 sprintf((pbuf
+strlen(pbuf
)), "reason for diversion: call forwarding unconditional");
1035 sprintf((pbuf
+strlen(pbuf
)), "reason for diversion: reserved (0x%2x)",reas
& 0x0f);
1040 sprintf((pbuf
+strlen(pbuf
)),")]");