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 * q932_fac.c - decode Q.932 facilities
28 * ------------------------------------
30 * $Id: q932_fac.c,v 1.8 2000/02/24 16:32:46 hm Exp $
32 * $FreeBSD: src/usr.sbin/i4b/isdntrace/q932_fac.c,v 1.6.2.1 2001/08/01 17:45:08 obrien Exp $
33 * $DragonFly: src/usr.sbin/i4b/isdntrace/q932_fac.c,v 1.3 2005/11/25 00:58:52 swildner Exp $
35 * last edit-date: [Thu Feb 24 17:36:47 2000]
37 *---------------------------------------------------------------------------
39 * - Q.932 (03/93) Generic Procedures for the Control of
40 * ISDN Supplementaty Services
41 * - Q.950 (03/93) Supplementary Services Protocols, Structure and
43 * - ETS 300 179 (10/92) Advice Of Charge: charging information during
44 * the call (AOC-D) supplementary service Service description
45 * - ETS 300 180 (10/92) Advice Of Charge: charging information at the
46 * end of call (AOC-E) supplementary service Service description
47 * - ETS 300 181 (04/93) Advice Of Charge (AOC) supplementary service
48 * Functional capabilities and information flows
49 * - ETS 300 182 (04/93) Advice Of Charge (AOC) supplementary service
50 * Digital Subscriber Signalling System No. one (DSS1) protocol
51 * - X.208 Specification of Abstract Syntax Notation One (ASN.1)
52 * - X.209 Specification of Basic Encoding Rules for
53 * Abstract Syntax Notation One (ASN.1)
54 * - "ASN.1 Abstract Syntax Notation One", Walter Gora, DATACOM-Verlag
55 * 1992, 3rd Edition (ISBN 3-89238-062-7) (german !)
57 *---------------------------------------------------------------------------*/
62 static int do_component(int length
, char *pbuf
);
63 static char *uni_str(int code
);
64 static char *opval_str(int val
);
65 static char *bid_str(int val
);
66 static void next_state(char *pbuf
, int class, int form
, int code
, int val
);
68 static void object_id(int comp_length
, unsigned char *pbuf
);
71 static unsigned char *byte_buf
;
74 /*---------------------------------------------------------------------------*
75 * decode Q.931/Q.932 facility info element
76 *---------------------------------------------------------------------------*/
78 q932_facility(char *pbuf
, unsigned char *buf
)
82 sprintf((pbuf
+strlen(pbuf
)), "[facility (Q.932): ");
88 buf
++; /* protocol profile */
90 sprintf((pbuf
+strlen(pbuf
)), "Protocol=");
95 sprintf((pbuf
+strlen(pbuf
)), "Remote Operations Protocol\n");
99 sprintf((pbuf
+strlen(pbuf
)), "CMIP Protocol (Q.941), UNSUPPORTED!\n");
104 sprintf((pbuf
+strlen(pbuf
)), "ACSE Protocol (X.217/X.227), UNSUPPORTED!\n");
109 sprintf((pbuf
+strlen(pbuf
)), "Unknown Protocol (val = 0x%x), UNSUPPORTED!\n", *buf
& 0x1f);
119 /* initialize variables for do_component */
123 state
= ST_EXP_COMP_TYP
;
125 /* decode facility */
127 do_component(len
, pbuf
);
129 sprintf((pbuf
+(strlen(pbuf
)-1)), "]"); /* XXX replace last newline */
134 /*---------------------------------------------------------------------------*
135 * handle a component recursively
136 *---------------------------------------------------------------------------*/
138 do_component(int length
, char *pbuf
)
140 int comp_tag_class
; /* component tag class */
141 int comp_tag_form
; /* component form: constructor or primitive */
142 int comp_tag_code
; /* component code depending on class */
143 int comp_length
= 0; /* component length */
146 sprintf((pbuf
+strlen(pbuf
)), "ENTER - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
152 sprintf((pbuf
+strlen(pbuf
)), "AGAIN - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
155 /*----------------------------------------*/
156 /* first component element: component tag */
157 /*----------------------------------------*/
161 sprintf((pbuf
+strlen(pbuf
)), "\t0x%02x Tag: ", *byte_buf
);
163 comp_tag_class
= (*byte_buf
& 0xc0) >> 6;
165 switch(comp_tag_class
)
167 case FAC_TAGCLASS_UNI
:
168 sprintf((pbuf
+strlen(pbuf
)), "Universal");
170 case FAC_TAGCLASS_APW
:
171 sprintf((pbuf
+strlen(pbuf
)), "Applic-wide");
173 case FAC_TAGCLASS_COS
:
174 sprintf((pbuf
+strlen(pbuf
)), "Context-spec");
176 case FAC_TAGCLASS_PRU
:
177 sprintf((pbuf
+strlen(pbuf
)), "Private");
183 comp_tag_form
= (*byte_buf
& 0x20) > 5;
185 sprintf((pbuf
+strlen(pbuf
)), ", ");
187 if(comp_tag_form
== FAC_TAGFORM_CON
)
189 sprintf((pbuf
+strlen(pbuf
)), "Constructor");
193 sprintf((pbuf
+strlen(pbuf
)), "Primitive");
198 comp_tag_code
= *byte_buf
& 0x1f;
200 sprintf((pbuf
+strlen(pbuf
)), ", ");
202 if(comp_tag_code
== 0x1f)
209 while(*byte_buf
& 0x80)
211 comp_tag_code
+= (*byte_buf
& 0x7f);
215 comp_tag_code
+= (*byte_buf
& 0x7f);
216 sprintf((pbuf
+strlen(pbuf
)), "%d (ext)\n", comp_tag_code
);
220 comp_tag_code
= (*byte_buf
& 0x1f);
222 if(comp_tag_class
== FAC_TAGCLASS_UNI
)
224 sprintf((pbuf
+strlen(pbuf
)), "%s (%d)\n", uni_str(comp_tag_code
), comp_tag_code
);
228 sprintf((pbuf
+strlen(pbuf
)), "code = %d\n", comp_tag_code
);
235 /*--------------------------------------------*/
236 /* second component element: component length */
237 /*--------------------------------------------*/
239 sprintf((pbuf
+strlen(pbuf
)), "\t0x%02x Len: ", *byte_buf
);
245 int i
= *byte_buf
& 0x7f;
252 comp_length
+= (*byte_buf
* (i
*256));
254 sprintf((pbuf
+strlen(pbuf
)), "%d (long form)\n", comp_length
);
258 comp_length
= *byte_buf
& 0x7f;
259 sprintf((pbuf
+strlen(pbuf
)), "%d (short form)\n", comp_length
);
262 next_state(pbuf
, comp_tag_class
, comp_tag_form
, comp_tag_code
, -1);
270 /*---------------------------------------------*/
271 /* third component element: component contents */
272 /*---------------------------------------------*/
274 if(comp_tag_form
) /* == constructor */
276 do_component(comp_length
, pbuf
);
281 if(comp_tag_class
== FAC_TAGCLASS_UNI
)
283 switch(comp_tag_code
)
285 case FAC_CODEUNI_INT
:
286 case FAC_CODEUNI_ENUM
:
287 case FAC_CODEUNI_BOOL
:
292 sprintf((pbuf
+strlen(pbuf
)), "\t");
294 for(i
= comp_length
-1; i
>= 0; i
--)
296 sprintf((pbuf
+strlen(pbuf
)), "0x%02x ", *byte_buf
);
297 val
+= (*byte_buf
+ (i
*255));
301 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
303 sprintf((pbuf
+strlen(pbuf
)), "Val: %d\n", val
);
307 case FAC_CODEUNI_OBJI
: /* object id */
310 object_id(comp_length
, pbuf
);
318 sprintf((pbuf
+strlen(pbuf
)), "\t");
320 for(i
= comp_length
-1; i
>= 0; i
--)
322 sprintf((pbuf
+strlen(pbuf
)), "0x%02x = %d", *byte_buf
, *byte_buf
);
323 if(isprint(*byte_buf
))
324 sprintf((pbuf
+strlen(pbuf
)), " = '%c'", *byte_buf
);
328 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
335 else /* comp_tag_class != FAC_TAGCLASS_UNI */
341 sprintf((pbuf
+strlen(pbuf
)), "\t");
343 for(i
= comp_length
-1; i
>= 0; i
--)
345 sprintf((pbuf
+strlen(pbuf
)), "0x%02x", *byte_buf
);
346 val
+= (*byte_buf
+ (i
*255));
350 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
352 sprintf((pbuf
+strlen(pbuf
)), "\n");
355 next_state(pbuf
, comp_tag_class
, comp_tag_form
, comp_tag_code
, val
);
360 sprintf((pbuf
+strlen(pbuf
)), "PREGOTO - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
362 if(byte_len
< length
)
365 sprintf((pbuf
+strlen(pbuf
)), "RETURN - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
370 /*---------------------------------------------------------------------------*
371 * print universal id type
372 *---------------------------------------------------------------------------*/
376 static char *tbl
[] = {
403 if(code
>= 1 && code
<= FAC_CODEUNI_GNSTR
)
406 return("ERROR, Value out of Range!");
409 /*---------------------------------------------------------------------------*
410 * print operation value
411 *---------------------------------------------------------------------------*/
415 static char buffer
[80];
438 case FAC_OPVAL_DIV_ACT
:
439 r
= "activationDiversion";
441 case FAC_OPVAL_DIV_DEACT
:
442 r
= "deactivationDiversion";
444 case FAC_OPVAL_DIV_ACTSN
:
445 r
= "activationStatusNotificationDiv";
447 case FAC_OPVAL_DIV_DEACTSN
:
448 r
= "deactivationStatusNotificationDiv";
450 case FAC_OPVAL_DIV_INTER
:
451 r
= "interrogationDiversion";
453 case FAC_OPVAL_DIV_INFO
:
454 r
= "diversionInformation";
456 case FAC_OPVAL_DIV_CALLDEF
:
457 r
= "callDeflection";
459 case FAC_OPVAL_DIV_CALLRER
:
462 case FAC_OPVAL_DIV_LINF2
:
463 r
= "divertingLegInformation2";
465 case FAC_OPVAL_DIV_INVS
:
468 case FAC_OPVAL_DIV_INTER1
:
469 r
= "interrogationDiversion1";
471 case FAC_OPVAL_DIV_LINF1
:
472 r
= "divertingLegInformation1";
474 case FAC_OPVAL_DIV_LINF3
:
475 r
= "divertingLegInformation3";
477 case FAC_OPVAL_ER_CRCO
:
478 r
= "explicitReservationCreationControl";
480 case FAC_OPVAL_ER_MGMT
:
481 r
= "explicitReservationManagement";
483 case FAC_OPVAL_ER_CANC
:
484 r
= "explicitReservationCancel";
486 case FAC_OPVAL_MLPP_QUERY
:
487 r
= "mLPP lfb Query";
489 case FAC_OPVAL_MLPP_CALLR
:
490 r
= "mLPP Call Request";
492 case FAC_OPVAL_MLPP_CALLP
:
493 r
= "mLPP Call Preemption";
495 case FAC_OPVAL_AOC_REQ
:
496 r
= "chargingRequest";
498 case FAC_OPVAL_AOC_S_CUR
:
501 case FAC_OPVAL_AOC_S_SPC
:
502 r
= "aOCSSpecialArrangement";
504 case FAC_OPVAL_AOC_D_CUR
:
507 case FAC_OPVAL_AOC_D_UNIT
:
508 r
= "aOCDChargingUnit";
510 case FAC_OPVAL_AOC_E_CUR
:
513 case FAC_OPVAL_AOC_E_UNIT
:
514 r
= "aOCEChargingUnit";
516 case FAC_OPVAL_AOC_IDOFCRG
:
517 r
= "identificationOfCharge";
519 case FAC_OPVAL_CONF_BEG
:
522 case FAC_OPVAL_CONF_ADD
:
525 case FAC_OPVAL_CONF_SPLIT
:
528 case FAC_OPVAL_CONF_DROP
:
531 case FAC_OPVAL_CONF_ISOLATE
:
534 case FAC_OPVAL_CONF_REATT
:
537 case FAC_OPVAL_CONF_PDISC
:
540 case FAC_OPVAL_CONF_FCONF
:
543 case FAC_OPVAL_CONF_END
:
546 case FAC_OPVAL_CONF_IDCFE
:
547 r
= "indentifyConferee";
549 case FAC_OPVAL_REVC_REQ
:
553 sprintf(buffer
, "unknown operation value %d!", val
);
559 /*---------------------------------------------------------------------------*
561 *---------------------------------------------------------------------------*/
565 static char buffer
[80];
571 r
= "normalCharging";
574 r
= "reverseCharging";
577 r
= "creditCardCharging";
580 r
= "callForwardingUnconditional";
583 r
= "callForwardingBusy";
586 r
= "callForwardingNoReply";
589 r
= "callDeflection";
595 sprintf(buffer
, "unknown billing-id value %d!", val
);
601 /*---------------------------------------------------------------------------*
603 *---------------------------------------------------------------------------*/
605 F_1_1(char *pbuf
, int val
)
608 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_1, val = %d\n", val
);
612 sprintf((pbuf
+strlen(pbuf
)), "\t invokeComponent\n");
613 state
= ST_EXP_INV_ID
;
617 /*---------------------------------------------------------------------------*
619 *---------------------------------------------------------------------------*/
621 F_1_2(char *pbuf
, int val
)
624 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_2, val = %d\n", val
);
628 sprintf((pbuf
+strlen(pbuf
)), "\t returnResult\n");
629 state
= ST_EXP_RR_INV_ID
;
632 /*---------------------------------------------------------------------------*
634 *---------------------------------------------------------------------------*/
636 F_1_3(char *pbuf
, int val
)
639 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_3, val = %d\n", val
);
643 sprintf((pbuf
+strlen(pbuf
)), "\t returnError\n");
647 /*---------------------------------------------------------------------------*
649 *---------------------------------------------------------------------------*/
651 F_1_4(char *pbuf
, int val
)
654 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_4, val = %d\n", val
);
658 sprintf((pbuf
+strlen(pbuf
)), "\t reject\n");
659 state
= ST_EXP_REJ_INV_ID
;
663 /*---------------------------------------------------------------------------*
664 * return result: invoke id
665 *---------------------------------------------------------------------------*/
667 F_RJ2(char *pbuf
, int val
)
670 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ2, val = %d\n", val
);
674 sprintf((pbuf
+strlen(pbuf
)), "\t InvokeIdentifier = %d\n", val
);
675 state
= ST_EXP_REJ_OP_VAL
;
679 /*---------------------------------------------------------------------------*
680 * reject, general problem
681 *---------------------------------------------------------------------------*/
683 F_RJ30(char *pbuf
, int val
)
686 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ30, val = %d\n", val
);
690 sprintf((pbuf
+strlen(pbuf
)), "\t General problem\n");
697 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized component\n");
700 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped component\n");
703 sprintf((pbuf
+strlen(pbuf
)), "\t problem = badly structured component\n");
706 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
713 /*---------------------------------------------------------------------------*
714 * reject, invoke problem
715 *---------------------------------------------------------------------------*/
717 F_RJ31(char *pbuf
, int val
)
720 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ31, val = %d\n", val
);
724 sprintf((pbuf
+strlen(pbuf
)), "\t Invoke problem\n");
731 sprintf((pbuf
+strlen(pbuf
)), "\t problem = duplicate invocation\n");
734 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized operation\n");
737 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped argument\n");
740 sprintf((pbuf
+strlen(pbuf
)), "\t problem = resource limitation\n");
743 sprintf((pbuf
+strlen(pbuf
)), "\t problem = initiator releasing\n");
746 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized linked identifier\n");
749 sprintf((pbuf
+strlen(pbuf
)), "\t problem = linked resonse unexpected\n");
752 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unexpected child operation\n");
755 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
762 /*---------------------------------------------------------------------------*
763 * reject, return result problem
764 *---------------------------------------------------------------------------*/
766 F_RJ32(char *pbuf
, int val
)
769 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ32, val = %d\n", val
);
773 sprintf((pbuf
+strlen(pbuf
)), "\t Return result problem\n");
780 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized invocation\n");
783 sprintf((pbuf
+strlen(pbuf
)), "\t problem = return response unexpected\n");
786 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped result\n");
789 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
796 /*---------------------------------------------------------------------------*
797 * reject, return error problem
798 *---------------------------------------------------------------------------*/
800 F_RJ33(char *pbuf
, int val
)
803 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ33, val = %d\n", val
);
807 sprintf((pbuf
+strlen(pbuf
)), "\t Return error problem\n");
814 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized invocation\n");
817 sprintf((pbuf
+strlen(pbuf
)), "\t problem = error response unexpected\n");
820 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized error\n");
823 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unexpected error\n");
826 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped parameter\n");
829 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
836 /*---------------------------------------------------------------------------*
837 * invoke component: invoke id
838 *---------------------------------------------------------------------------*/
840 F_2(char *pbuf
, int val
)
843 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_2, val = %d\n", val
);
847 sprintf((pbuf
+strlen(pbuf
)), "\t InvokeIdentifier = %d\n", val
);
848 state
= ST_EXP_OP_VAL
;
852 /*---------------------------------------------------------------------------*
853 * return result: invoke id
854 *---------------------------------------------------------------------------*/
856 F_RR2(char *pbuf
, int val
)
859 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RR2, val = %d\n", val
);
863 sprintf((pbuf
+strlen(pbuf
)), "\t InvokeIdentifier = %d\n", val
);
864 state
= ST_EXP_RR_OP_VAL
;
868 /*---------------------------------------------------------------------------*
869 * invoke component: operation value
870 *---------------------------------------------------------------------------*/
872 F_3(char *pbuf
, int val
)
875 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_3, val = %d\n", val
);
879 sprintf((pbuf
+strlen(pbuf
)), "\t Operation Value = %s (%d)\n", opval_str(val
), val
);
884 /*---------------------------------------------------------------------------*
885 * return result: operation value
886 *---------------------------------------------------------------------------*/
888 F_RR3(char *pbuf
, int val
)
891 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RR3, val = %d\n", val
);
895 sprintf((pbuf
+strlen(pbuf
)), "\t Operation Value = %s (%d)\n", opval_str(val
), val
);
896 state
= ST_EXP_RR_RESULT
;
900 /*---------------------------------------------------------------------------*
901 * return result: RESULT
902 *---------------------------------------------------------------------------*/
904 F_RRR(char *pbuf
, int val
)
907 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RRR, val = %d\n", val
);
912 /*---------------------------------------------------------------------------*
914 *---------------------------------------------------------------------------*/
916 F_4(char *pbuf
, int val
)
919 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_4, val = %d\n", val
);
923 sprintf((pbuf
+strlen(pbuf
)), "\t specificChargingUnits\n");
928 /*---------------------------------------------------------------------------*
930 *---------------------------------------------------------------------------*/
932 F_4_1(char *pbuf
, int val
)
935 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_4_1, val = %d\n", val
);
939 sprintf((pbuf
+strlen(pbuf
)), "\t freeOfCharge\n");
944 /*---------------------------------------------------------------------------*
946 *---------------------------------------------------------------------------*/
948 F_4_2(char *pbuf
, int val
)
951 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_4_2, val = %d\n", val
);
955 sprintf((pbuf
+strlen(pbuf
)), "\t chargeNotAvailable\n");
960 /*---------------------------------------------------------------------------*
962 *---------------------------------------------------------------------------*/
964 F_5(char *pbuf
, int val
)
967 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_5, val = %d\n", val
);
971 sprintf((pbuf
+strlen(pbuf
)), "\t recordedUnitsList [1]\n");
976 /*---------------------------------------------------------------------------*
978 *---------------------------------------------------------------------------*/
980 F_6(char *pbuf
, int val
)
983 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_6, val = %d\n", val
);
987 sprintf((pbuf
+strlen(pbuf
)), "\t RecordedUnits\n");
992 /*---------------------------------------------------------------------------*
994 *---------------------------------------------------------------------------*/
996 F_7(char *pbuf
, int val
)
999 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_7, val = %d\n", val
);
1003 sprintf((pbuf
+strlen(pbuf
)), "\t NumberOfUnits = %d\n", val
);
1004 state
= ST_EXP_TOCI
;
1008 /*---------------------------------------------------------------------------*
1010 *---------------------------------------------------------------------------*/
1012 F_8(char *pbuf
, int val
)
1015 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_8, val = %d\n", val
);
1019 sprintf((pbuf
+strlen(pbuf
)), "\t typeOfChargingInfo = %s\n", val
== 0 ? "subTotal" : "total");
1020 state
= ST_EXP_DBID
;
1024 /*---------------------------------------------------------------------------*
1026 *---------------------------------------------------------------------------*/
1028 F_9(char *pbuf
, int val
)
1031 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_9, val = %d\n", val
);
1035 sprintf((pbuf
+strlen(pbuf
)), "\t AOCDBillingId = %s (%d)\n", bid_str(val
), val
);
1040 /*---------------------------------------------------------------------------*
1042 *---------------------------------------------------------------------------*/
1043 static struct statetab
{
1044 int currstate
; /* input: current state we are in */
1045 int form
; /* input: current tag form */
1046 int class; /* input: current tag class */
1047 int code
; /* input: current tag code */
1048 void (*func
)(char *,int); /* output: func to exec */
1051 /* current state tag form tag class tag code function */
1052 /* --------------------- ---------------------- ---------------------- ---------------------- ----------------*/
1056 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 1, F_1_1
},
1057 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 2, F_1_2
},
1058 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 3, F_1_3
},
1059 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 4, F_1_4
},
1060 {ST_EXP_INV_ID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_2
},
1061 {ST_EXP_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_3
},
1062 {ST_EXP_INFO
, FAC_TAGFORM_CON
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_SEQ
, F_4
},
1063 {ST_EXP_INFO
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_NULL
, F_4_1
},
1064 {ST_EXP_INFO
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 1, F_4_2
},
1065 {ST_EXP_RUL
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 1, F_5
},
1066 {ST_EXP_RU
, FAC_TAGFORM_CON
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_SEQ
, F_6
},
1067 {ST_EXP_RNOU
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_7
},
1068 {ST_EXP_TOCI
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 2, F_8
},
1069 {ST_EXP_DBID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 3, F_9
},
1073 {ST_EXP_RR_INV_ID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_RR2
},
1074 {ST_EXP_RR_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_RR3
},
1075 {ST_EXP_RR_RESULT
, FAC_TAGFORM_CON
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_SET
, F_RRR
},
1077 /* current state tag form tag class tag code function */
1078 /* --------------------- ---------------------- ---------------------- ---------------------- ----------------*/
1081 {ST_EXP_REJ_INV_ID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_RJ2
},
1082 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 0, F_RJ30
},
1083 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 1, F_RJ31
},
1084 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 2, F_RJ32
},
1085 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 3, F_RJ33
},
1089 {-1, -1, -1, -1, NULL
}
1092 /*---------------------------------------------------------------------------*
1093 * state decode for do_component
1094 *---------------------------------------------------------------------------*/
1096 next_state(char *pbuf
, int class, int form
, int code
, int val
)
1101 sprintf((pbuf
+strlen(pbuf
)), "next_state: class=%d, form=%d, code=%d, val=%d\n", class, form
, code
, val
);
1106 if((statetab
[i
].currstate
> state
) ||
1107 (statetab
[i
].currstate
== -1))
1112 if((statetab
[i
].currstate
== state
) &&
1113 (statetab
[i
].form
== form
) &&
1114 (statetab
[i
].class == class) &&
1115 (statetab
[i
].code
== code
))
1117 (*statetab
[i
].func
)(pbuf
, val
);
1123 /*---------------------------------------------------------------------------*
1124 * decode OBJECT IDENTIFIER
1125 *---------------------------------------------------------------------------*/
1127 object_id(int comp_length
, unsigned char *pbuf
)
1135 sprintf((pbuf
+strlen(pbuf
)), "\t");
1137 for(i
= comp_length
-1; i
>= 0; i
--, j
++)
1139 sprintf((pbuf
+strlen(pbuf
)), "0x%02x = %d", *byte_buf
, *byte_buf
);
1145 if(x
>= 0 && x
<= 39)
1147 sprintf((pbuf
+strlen(pbuf
)), " ccitt/itu-t (0)");
1151 sprintf((pbuf
+strlen(pbuf
)), " recommendation (0)");
1154 sprintf((pbuf
+strlen(pbuf
)), " question (1)");
1157 sprintf((pbuf
+strlen(pbuf
)), " administration (2)");
1160 sprintf((pbuf
+strlen(pbuf
)), " network-operator (3)");
1163 sprintf((pbuf
+strlen(pbuf
)), " identified-organization (4)");
1167 sprintf((pbuf
+strlen(pbuf
)), " error: undefined-identifier (%d)", x
);
1171 else if(x
>= 40 && x
<= 79)
1173 sprintf((pbuf
+strlen(pbuf
)), " iso (1)");
1178 sprintf((pbuf
+strlen(pbuf
)), " standard (0)");
1181 sprintf((pbuf
+strlen(pbuf
)), " registration-authority (1)");
1184 sprintf((pbuf
+strlen(pbuf
)), " member-body (2)");
1187 sprintf((pbuf
+strlen(pbuf
)), " identified-organization (3)");
1191 sprintf((pbuf
+strlen(pbuf
)), " error: undefined-identifier (%d)", x
);
1198 sprintf((pbuf
+strlen(pbuf
)), " joint-iso-ccitt (3) ??? (%d)", x
);
1208 sprintf((pbuf
+strlen(pbuf
)), " etsi (0)");
1220 sprintf((pbuf
+strlen(pbuf
)), " mobileDomain (0)");
1224 sprintf((pbuf
+strlen(pbuf
)), " inDomain (1)");
1233 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
1235 sprintf((pbuf
+strlen(pbuf
)), "\n");