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.4 2009/04/16 05:56:33 lukem Exp $
34 * last edit-date: [Thu Feb 24 17:36:47 2000]
36 *---------------------------------------------------------------------------
38 * - Q.932 (03/93) Generic Procedures for the Control of
39 * ISDN Supplementaty Services
40 * - Q.950 (03/93) Supplementary Services Protocols, Structure and
42 * - ETS 300 179 (10/92) Advice Of Charge: charging information during
43 * the call (AOC-D) supplementary service Service description
44 * - ETS 300 180 (10/92) Advice Of Charge: charging information at the
45 * end of call (AOC-E) supplementary service Service description
46 * - ETS 300 181 (04/93) Advice Of Charge (AOC) supplementary service
47 * Functional capabilities and information flows
48 * - ETS 300 182 (04/93) Advice Of Charge (AOC) supplementary service
49 * Digital Subscriber Signalling System No. one (DSS1) protocol
50 * - X.208 Specification of Abstract Syntax Notation One (ASN.1)
51 * - X.209 Specification of Basic Encoding Rules for
52 * Abstract Syntax Notation One (ASN.1)
53 * - "ASN.1 Abstract Syntax Notation One", Walter Gora, DATACOM-Verlag
54 * 1992, 3rd Edition (ISBN 3-89238-062-7) (german !)
56 *---------------------------------------------------------------------------*/
61 static int do_component(int length
, char *pbuf
);
62 static const char *uni_str(int code
);
63 static const char *opval_str(int val
);
64 static const char *bid_str(int val
);
65 static void next_state(char *pbuf
, int class, int form
, int code
, int val
);
67 static void object_id(int comp_length
, unsigned char *pbuf
);
70 static unsigned char *byte_buf
;
73 /*---------------------------------------------------------------------------*
74 * decode Q.931/Q.932 facility info element
75 *---------------------------------------------------------------------------*/
77 q932_facility(char *pbuf
, unsigned char *buf
)
81 sprintf((pbuf
+strlen(pbuf
)), "[facility (Q.932): ");
87 buf
++; /* protocol profile */
89 sprintf((pbuf
+strlen(pbuf
)), "Protocol=");
94 sprintf((pbuf
+strlen(pbuf
)), "Remote Operations Protocol\n");
98 sprintf((pbuf
+strlen(pbuf
)), "CMIP Protocol (Q.941), UNSUPPORTED!\n");
103 sprintf((pbuf
+strlen(pbuf
)), "ACSE Protocol (X.217/X.227), UNSUPPORTED!\n");
108 sprintf((pbuf
+strlen(pbuf
)), "Unknown Protocol (val = 0x%x), UNSUPPORTED!\n", *buf
& 0x1f);
118 /* initialize variables for do_component */
122 state
= ST_EXP_COMP_TYP
;
124 /* decode facility */
126 do_component(len
, pbuf
);
128 sprintf((pbuf
+(strlen(pbuf
)-1)), "]"); /* XXX replace last newline */
133 /*---------------------------------------------------------------------------*
134 * handle a component recursively
135 *---------------------------------------------------------------------------*/
137 do_component(int length
, char *pbuf
)
139 int comp_tag_class
; /* component tag class */
140 int comp_tag_form
; /* component form: constructor or primitive */
141 int comp_tag_code
; /* component code depending on class */
142 int comp_length
= 0; /* component length */
145 sprintf((pbuf
+strlen(pbuf
)), "ENTER - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
151 sprintf((pbuf
+strlen(pbuf
)), "AGAIN - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
154 /*----------------------------------------*/
155 /* first component element: component tag */
156 /*----------------------------------------*/
160 sprintf((pbuf
+strlen(pbuf
)), "\t0x%02x Tag: ", *byte_buf
);
162 comp_tag_class
= (*byte_buf
& 0xc0) >> 6;
164 switch (comp_tag_class
)
166 case FAC_TAGCLASS_UNI
:
167 sprintf((pbuf
+strlen(pbuf
)), "Universal");
169 case FAC_TAGCLASS_APW
:
170 sprintf((pbuf
+strlen(pbuf
)), "Applic-wide");
172 case FAC_TAGCLASS_COS
:
173 sprintf((pbuf
+strlen(pbuf
)), "Context-spec");
175 case FAC_TAGCLASS_PRU
:
176 sprintf((pbuf
+strlen(pbuf
)), "Private");
182 comp_tag_form
= (*byte_buf
& 0x20) > 5;
184 sprintf((pbuf
+strlen(pbuf
)), ", ");
186 if (comp_tag_form
== FAC_TAGFORM_CON
)
188 sprintf((pbuf
+strlen(pbuf
)), "Constructor");
192 sprintf((pbuf
+strlen(pbuf
)), "Primitive");
197 comp_tag_code
= *byte_buf
& 0x1f;
199 sprintf((pbuf
+strlen(pbuf
)), ", ");
201 if (comp_tag_code
== 0x1f)
208 while(*byte_buf
& 0x80)
210 comp_tag_code
+= (*byte_buf
& 0x7f);
214 comp_tag_code
+= (*byte_buf
& 0x7f);
215 sprintf((pbuf
+strlen(pbuf
)), "%d (ext)\n", comp_tag_code
);
219 comp_tag_code
= (*byte_buf
& 0x1f);
221 if (comp_tag_class
== FAC_TAGCLASS_UNI
)
223 sprintf((pbuf
+strlen(pbuf
)), "%s (%d)\n", uni_str(comp_tag_code
), comp_tag_code
);
227 sprintf((pbuf
+strlen(pbuf
)), "code = %d\n", comp_tag_code
);
234 /*--------------------------------------------*/
235 /* second component element: component length */
236 /*--------------------------------------------*/
238 sprintf((pbuf
+strlen(pbuf
)), "\t0x%02x Len: ", *byte_buf
);
242 if (*byte_buf
& 0x80)
244 int i
= *byte_buf
& 0x7f;
251 comp_length
+= (*byte_buf
* (i
*256));
253 sprintf((pbuf
+strlen(pbuf
)), "%d (long form)\n", comp_length
);
257 comp_length
= *byte_buf
& 0x7f;
258 sprintf((pbuf
+strlen(pbuf
)), "%d (short form)\n", comp_length
);
261 next_state(pbuf
, comp_tag_class
, comp_tag_form
, comp_tag_code
, -1);
269 /*---------------------------------------------*/
270 /* third component element: component contents */
271 /*---------------------------------------------*/
273 if (comp_tag_form
) /* == constructor */
275 do_component(comp_length
, pbuf
);
280 if (comp_tag_class
== FAC_TAGCLASS_UNI
)
282 switch (comp_tag_code
)
284 case FAC_CODEUNI_INT
:
285 case FAC_CODEUNI_ENUM
:
286 case FAC_CODEUNI_BOOL
:
291 sprintf((pbuf
+strlen(pbuf
)), "\t");
293 for (i
= comp_length
-1; i
>= 0; i
--)
295 sprintf((pbuf
+strlen(pbuf
)), "0x%02x ", *byte_buf
);
296 val
+= (*byte_buf
+ (i
*255));
300 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
302 sprintf((pbuf
+strlen(pbuf
)), "Val: %d\n", val
);
306 case FAC_CODEUNI_OBJI
: /* object id */
309 object_id(comp_length
, pbuf
);
317 sprintf((pbuf
+strlen(pbuf
)), "\t");
319 for (i
= comp_length
-1; i
>= 0; i
--)
321 sprintf((pbuf
+strlen(pbuf
)), "0x%02x = %d", *byte_buf
, *byte_buf
);
322 if (isprint(*byte_buf
))
323 sprintf((pbuf
+strlen(pbuf
)), " = '%c'", *byte_buf
);
327 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
334 else /* comp_tag_class != FAC_TAGCLASS_UNI */
340 sprintf((pbuf
+strlen(pbuf
)), "\t");
342 for (i
= comp_length
-1; i
>= 0; i
--)
344 sprintf((pbuf
+strlen(pbuf
)), "0x%02x", *byte_buf
);
345 val
+= (*byte_buf
+ (i
*255));
349 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
351 sprintf((pbuf
+strlen(pbuf
)), "\n");
354 next_state(pbuf
, comp_tag_class
, comp_tag_form
, comp_tag_code
, val
);
359 sprintf((pbuf
+strlen(pbuf
)), "PREGOTO - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
361 if (byte_len
< length
)
364 sprintf((pbuf
+strlen(pbuf
)), "RETURN - comp_length = %d, byte_len = %d, length =%d\n", comp_length
, byte_len
, length
);
369 /*---------------------------------------------------------------------------*
370 * print universal id type
371 *---------------------------------------------------------------------------*/
372 static const char *uni_str(int code
)
374 static const char *tbl
[] = {
404 if (code
>= 1 && code
<= (int)(sizeof(tbl
) / sizeof(tbl
[0])))
407 return("ERROR, Value out of Range!");
410 /*---------------------------------------------------------------------------*
411 * print operation value
412 *---------------------------------------------------------------------------*/
413 static const char *opval_str(int val
)
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 *---------------------------------------------------------------------------*/
562 static const char *bid_str(int val
)
564 static char buffer
[80];
570 r
= "normalCharging";
573 r
= "reverseCharging";
576 r
= "creditCardCharging";
579 r
= "callForwardingUnconditional";
582 r
= "callForwardingBusy";
585 r
= "callForwardingNoReply";
588 r
= "callDeflection";
594 sprintf(buffer
, "unknown billing-id value %d!", val
);
600 /*---------------------------------------------------------------------------*
602 *---------------------------------------------------------------------------*/
604 F_1_1(char *pbuf
, int val
)
607 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_1, val = %d\n", val
);
611 sprintf((pbuf
+strlen(pbuf
)), "\t invokeComponent\n");
612 state
= ST_EXP_INV_ID
;
616 /*---------------------------------------------------------------------------*
618 *---------------------------------------------------------------------------*/
620 F_1_2(char *pbuf
, int val
)
623 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_2, val = %d\n", val
);
627 sprintf((pbuf
+strlen(pbuf
)), "\t returnResult\n");
628 state
= ST_EXP_RR_INV_ID
;
631 /*---------------------------------------------------------------------------*
633 *---------------------------------------------------------------------------*/
635 F_1_3(char *pbuf
, int val
)
638 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_3, val = %d\n", val
);
642 sprintf((pbuf
+strlen(pbuf
)), "\t returnError\n");
646 /*---------------------------------------------------------------------------*
648 *---------------------------------------------------------------------------*/
650 F_1_4(char *pbuf
, int val
)
653 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_1_4, val = %d\n", val
);
657 sprintf((pbuf
+strlen(pbuf
)), "\t reject\n");
658 state
= ST_EXP_REJ_INV_ID
;
662 /*---------------------------------------------------------------------------*
663 * return result: invoke id
664 *---------------------------------------------------------------------------*/
666 F_RJ2(char *pbuf
, int val
)
669 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ2, val = %d\n", val
);
673 sprintf((pbuf
+strlen(pbuf
)), "\t InvokeIdentifier = %d\n", val
);
674 state
= ST_EXP_REJ_OP_VAL
;
678 /*---------------------------------------------------------------------------*
679 * reject, general problem
680 *---------------------------------------------------------------------------*/
682 F_RJ30(char *pbuf
, int val
)
685 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ30, val = %d\n", val
);
689 sprintf((pbuf
+strlen(pbuf
)), "\t General problem\n");
696 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized component\n");
699 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped component\n");
702 sprintf((pbuf
+strlen(pbuf
)), "\t problem = badly structured component\n");
705 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
712 /*---------------------------------------------------------------------------*
713 * reject, invoke problem
714 *---------------------------------------------------------------------------*/
716 F_RJ31(char *pbuf
, int val
)
719 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ31, val = %d\n", val
);
723 sprintf((pbuf
+strlen(pbuf
)), "\t Invoke problem\n");
730 sprintf((pbuf
+strlen(pbuf
)), "\t problem = duplicate invocation\n");
733 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized operation\n");
736 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped argument\n");
739 sprintf((pbuf
+strlen(pbuf
)), "\t problem = resource limitation\n");
742 sprintf((pbuf
+strlen(pbuf
)), "\t problem = initiator releasing\n");
745 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized linked identifier\n");
748 sprintf((pbuf
+strlen(pbuf
)), "\t problem = linked resonse unexpected\n");
751 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unexpected child operation\n");
754 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
761 /*---------------------------------------------------------------------------*
762 * reject, return result problem
763 *---------------------------------------------------------------------------*/
765 F_RJ32(char *pbuf
, int val
)
768 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ32, val = %d\n", val
);
772 sprintf((pbuf
+strlen(pbuf
)), "\t Return result problem\n");
779 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized invocation\n");
782 sprintf((pbuf
+strlen(pbuf
)), "\t problem = return response unexpected\n");
785 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped result\n");
788 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
795 /*---------------------------------------------------------------------------*
796 * reject, return error problem
797 *---------------------------------------------------------------------------*/
799 F_RJ33(char *pbuf
, int val
)
802 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RJ33, val = %d\n", val
);
806 sprintf((pbuf
+strlen(pbuf
)), "\t Return error problem\n");
813 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized invocation\n");
816 sprintf((pbuf
+strlen(pbuf
)), "\t problem = error response unexpected\n");
819 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unrecognized error\n");
822 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unexpected error\n");
825 sprintf((pbuf
+strlen(pbuf
)), "\t problem = mistyped parameter\n");
828 sprintf((pbuf
+strlen(pbuf
)), "\t problem = unknown problem code 0x%x\n", val
);
835 /*---------------------------------------------------------------------------*
836 * invoke component: invoke id
837 *---------------------------------------------------------------------------*/
839 F_2(char *pbuf
, int val
)
842 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_2, val = %d\n", val
);
846 sprintf((pbuf
+strlen(pbuf
)), "\t InvokeIdentifier = %d\n", val
);
847 state
= ST_EXP_OP_VAL
;
851 /*---------------------------------------------------------------------------*
852 * return result: invoke id
853 *---------------------------------------------------------------------------*/
855 F_RR2(char *pbuf
, int val
)
858 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RR2, val = %d\n", val
);
862 sprintf((pbuf
+strlen(pbuf
)), "\t InvokeIdentifier = %d\n", val
);
863 state
= ST_EXP_RR_OP_VAL
;
867 /*---------------------------------------------------------------------------*
868 * invoke component: operation value
869 *---------------------------------------------------------------------------*/
871 F_3(char *pbuf
, int val
)
874 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_3, val = %d\n", val
);
878 sprintf((pbuf
+strlen(pbuf
)), "\t Operation Value = %s (%d)\n", opval_str(val
), val
);
883 /*---------------------------------------------------------------------------*
884 * return result: operation value
885 *---------------------------------------------------------------------------*/
887 F_RR3(char *pbuf
, int val
)
890 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RR3, val = %d\n", val
);
894 sprintf((pbuf
+strlen(pbuf
)), "\t Operation Value = %s (%d)\n", opval_str(val
), val
);
895 state
= ST_EXP_RR_RESULT
;
899 /*---------------------------------------------------------------------------*
900 * return result: RESULT
901 *---------------------------------------------------------------------------*/
903 F_RRR(char *pbuf
, int val
)
906 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_RRR, val = %d\n", val
);
911 /*---------------------------------------------------------------------------*
913 *---------------------------------------------------------------------------*/
915 F_4(char *pbuf
, int val
)
918 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_4, val = %d\n", val
);
922 sprintf((pbuf
+strlen(pbuf
)), "\t specificChargingUnits\n");
927 /*---------------------------------------------------------------------------*
929 *---------------------------------------------------------------------------*/
931 F_4_1(char *pbuf
, int val
)
934 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_4_1, val = %d\n", val
);
938 sprintf((pbuf
+strlen(pbuf
)), "\t freeOfCharge\n");
943 /*---------------------------------------------------------------------------*
945 *---------------------------------------------------------------------------*/
947 F_4_2(char *pbuf
, int val
)
950 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_4_2, val = %d\n", val
);
954 sprintf((pbuf
+strlen(pbuf
)), "\t chargeNotAvailable\n");
959 /*---------------------------------------------------------------------------*
961 *---------------------------------------------------------------------------*/
963 F_5(char *pbuf
, int val
)
966 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_5, val = %d\n", val
);
970 sprintf((pbuf
+strlen(pbuf
)), "\t recordedUnitsList [1]\n");
975 /*---------------------------------------------------------------------------*
977 *---------------------------------------------------------------------------*/
979 F_6(char *pbuf
, int val
)
982 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_6, val = %d\n", val
);
986 sprintf((pbuf
+strlen(pbuf
)), "\t RecordedUnits\n");
991 /*---------------------------------------------------------------------------*
993 *---------------------------------------------------------------------------*/
995 F_7(char *pbuf
, int val
)
998 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_7, val = %d\n", val
);
1002 sprintf((pbuf
+strlen(pbuf
)), "\t NumberOfUnits = %d\n", val
);
1003 state
= ST_EXP_TOCI
;
1007 /*---------------------------------------------------------------------------*
1009 *---------------------------------------------------------------------------*/
1011 F_8(char *pbuf
, int val
)
1014 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_8, val = %d\n", val
);
1018 sprintf((pbuf
+strlen(pbuf
)), "\t typeOfChargingInfo = %s\n", val
== 0 ? "subTotal" : "total");
1019 state
= ST_EXP_DBID
;
1023 /*---------------------------------------------------------------------------*
1025 *---------------------------------------------------------------------------*/
1027 F_9(char *pbuf
, int val
)
1030 sprintf((pbuf
+strlen(pbuf
)), "next_state: exec F_9, val = %d\n", val
);
1034 sprintf((pbuf
+strlen(pbuf
)), "\t AOCDBillingId = %s (%d)\n", bid_str(val
), val
);
1039 /*---------------------------------------------------------------------------*
1041 *---------------------------------------------------------------------------*/
1042 static struct statetab
{
1043 int currstate
; /* input: current state we are in */
1044 int form
; /* input: current tag form */
1045 int class; /* input: current tag class */
1046 int code
; /* input: current tag code */
1047 void (*func
)(char *,int); /* output: func to exec */
1050 /* current state tag form tag class tag code function */
1051 /* --------------------- ---------------------- ---------------------- ---------------------- ----------------*/
1055 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 1, F_1_1
},
1056 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 2, F_1_2
},
1057 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 3, F_1_3
},
1058 {ST_EXP_COMP_TYP
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 4, F_1_4
},
1059 {ST_EXP_INV_ID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_2
},
1060 {ST_EXP_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_3
},
1061 {ST_EXP_INFO
, FAC_TAGFORM_CON
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_SEQ
, F_4
},
1062 {ST_EXP_INFO
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_NULL
, F_4_1
},
1063 {ST_EXP_INFO
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 1, F_4_2
},
1064 {ST_EXP_RUL
, FAC_TAGFORM_CON
, FAC_TAGCLASS_COS
, 1, F_5
},
1065 {ST_EXP_RU
, FAC_TAGFORM_CON
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_SEQ
, F_6
},
1066 {ST_EXP_RNOU
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_7
},
1067 {ST_EXP_TOCI
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 2, F_8
},
1068 {ST_EXP_DBID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 3, F_9
},
1072 {ST_EXP_RR_INV_ID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_RR2
},
1073 {ST_EXP_RR_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_RR3
},
1074 {ST_EXP_RR_RESULT
, FAC_TAGFORM_CON
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_SET
, F_RRR
},
1076 /* current state tag form tag class tag code function */
1077 /* --------------------- ---------------------- ---------------------- ---------------------- ----------------*/
1080 {ST_EXP_REJ_INV_ID
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_UNI
, FAC_CODEUNI_INT
, F_RJ2
},
1081 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 0, F_RJ30
},
1082 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 1, F_RJ31
},
1083 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 2, F_RJ32
},
1084 {ST_EXP_REJ_OP_VAL
, FAC_TAGFORM_PRI
, FAC_TAGCLASS_COS
, 3, F_RJ33
},
1088 {-1, -1, -1, -1, NULL
}
1091 /*---------------------------------------------------------------------------*
1092 * state decode for do_component
1093 *---------------------------------------------------------------------------*/
1095 next_state(char *pbuf
, int class, int form
, int code
, int val
)
1100 sprintf((pbuf
+strlen(pbuf
)), "next_state: class=%d, form=%d, code=%d, val=%d\n", class, form
, code
, val
);
1105 if ((statetab
[i
].currstate
> state
) ||
1106 (statetab
[i
].currstate
== -1))
1111 if ((statetab
[i
].currstate
== state
) &&
1112 (statetab
[i
].form
== form
) &&
1113 (statetab
[i
].class == class) &&
1114 (statetab
[i
].code
== code
))
1116 (*statetab
[i
].func
)(pbuf
, val
);
1122 /*---------------------------------------------------------------------------*
1123 * decode OBJECT IDENTIFIER
1124 *---------------------------------------------------------------------------*/
1126 object_id(int comp_length
, unsigned char *pbuf
)
1134 sprintf((pbuf
+strlen(pbuf
)), "\t");
1136 for (i
= comp_length
- 1; i
>= 0; i
--, j
++)
1138 sprintf((pbuf
+strlen(pbuf
)), "0x%02x = %d", *byte_buf
, *byte_buf
);
1144 if (x
>= 0 && x
<= 39)
1146 sprintf((pbuf
+strlen(pbuf
)), " ccitt/itu-t (0)");
1150 sprintf((pbuf
+strlen(pbuf
)), " recommendation (0)");
1153 sprintf((pbuf
+strlen(pbuf
)), " question (1)");
1156 sprintf((pbuf
+strlen(pbuf
)), " administration (2)");
1159 sprintf((pbuf
+strlen(pbuf
)), " network-operator (3)");
1162 sprintf((pbuf
+strlen(pbuf
)), " identified-organization (4)");
1166 sprintf((pbuf
+strlen(pbuf
)), " error: undefined-identifier (%d)", x
);
1170 else if (x
>= 40 && x
<= 79)
1172 sprintf((pbuf
+strlen(pbuf
)), " iso (1)");
1177 sprintf((pbuf
+strlen(pbuf
)), " standard (0)");
1180 sprintf((pbuf
+strlen(pbuf
)), " registration-authority (1)");
1183 sprintf((pbuf
+strlen(pbuf
)), " member-body (2)");
1186 sprintf((pbuf
+strlen(pbuf
)), " identified-organization (3)");
1190 sprintf((pbuf
+strlen(pbuf
)), " error: undefined-identifier (%d)", x
);
1197 sprintf((pbuf
+strlen(pbuf
)), " joint-iso-ccitt (3) ??? (%d)", x
);
1207 sprintf((pbuf
+strlen(pbuf
)), " etsi (0)");
1219 sprintf((pbuf
+strlen(pbuf
)), " mobileDomain (0)");
1223 sprintf((pbuf
+strlen(pbuf
)), " inDomain (1)");
1232 sprintf((pbuf
+strlen(pbuf
)), "\n\t");
1234 sprintf((pbuf
+strlen(pbuf
)), "\n");