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.2 2003/06/17 04:29:55 dillon 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 *---------------------------------------------------------------------------*/
373 static char *uni_str(int code)
375 static char *tbl[] = {
402 if(code >= 1 && code <= FAC_CODEUNI_GNSTR)
405 return("ERROR, Value out of Range!");
408 /*---------------------------------------------------------------------------*
409 * print operation value
410 *---------------------------------------------------------------------------*/
411 static char *opval_str(int val)
413 static char buffer[80];
436 case FAC_OPVAL_DIV_ACT:
437 r = "activationDiversion";
439 case FAC_OPVAL_DIV_DEACT:
440 r = "deactivationDiversion";
442 case FAC_OPVAL_DIV_ACTSN:
443 r = "activationStatusNotificationDiv";
445 case FAC_OPVAL_DIV_DEACTSN:
446 r = "deactivationStatusNotificationDiv";
448 case FAC_OPVAL_DIV_INTER:
449 r = "interrogationDiversion";
451 case FAC_OPVAL_DIV_INFO:
452 r = "diversionInformation";
454 case FAC_OPVAL_DIV_CALLDEF:
455 r = "callDeflection";
457 case FAC_OPVAL_DIV_CALLRER:
460 case FAC_OPVAL_DIV_LINF2:
461 r = "divertingLegInformation2";
463 case FAC_OPVAL_DIV_INVS:
466 case FAC_OPVAL_DIV_INTER1:
467 r = "interrogationDiversion1";
469 case FAC_OPVAL_DIV_LINF1:
470 r = "divertingLegInformation1";
472 case FAC_OPVAL_DIV_LINF3:
473 r = "divertingLegInformation3";
475 case FAC_OPVAL_ER_CRCO:
476 r = "explicitReservationCreationControl";
478 case FAC_OPVAL_ER_MGMT:
479 r = "explicitReservationManagement";
481 case FAC_OPVAL_ER_CANC:
482 r = "explicitReservationCancel";
484 case FAC_OPVAL_MLPP_QUERY:
485 r = "mLPP lfb Query";
487 case FAC_OPVAL_MLPP_CALLR:
488 r = "mLPP Call Request";
490 case FAC_OPVAL_MLPP_CALLP:
491 r = "mLPP Call Preemption";
493 case FAC_OPVAL_AOC_REQ:
494 r = "chargingRequest";
496 case FAC_OPVAL_AOC_S_CUR:
499 case FAC_OPVAL_AOC_S_SPC:
500 r = "aOCSSpecialArrangement";
502 case FAC_OPVAL_AOC_D_CUR:
505 case FAC_OPVAL_AOC_D_UNIT:
506 r = "aOCDChargingUnit";
508 case FAC_OPVAL_AOC_E_CUR:
511 case FAC_OPVAL_AOC_E_UNIT:
512 r = "aOCEChargingUnit";
514 case FAC_OPVAL_AOC_IDOFCRG:
515 r = "identificationOfCharge";
517 case FAC_OPVAL_CONF_BEG:
520 case FAC_OPVAL_CONF_ADD:
523 case FAC_OPVAL_CONF_SPLIT:
526 case FAC_OPVAL_CONF_DROP:
529 case FAC_OPVAL_CONF_ISOLATE:
532 case FAC_OPVAL_CONF_REATT:
535 case FAC_OPVAL_CONF_PDISC:
538 case FAC_OPVAL_CONF_FCONF:
541 case FAC_OPVAL_CONF_END:
544 case FAC_OPVAL_CONF_IDCFE:
545 r = "indentifyConferee";
547 case FAC_OPVAL_REVC_REQ:
551 sprintf(buffer, "unknown operation value %d!", val);
557 /*---------------------------------------------------------------------------*
559 *---------------------------------------------------------------------------*/
560 static char *bid_str(int val)
562 static char buffer[80];
568 r = "normalCharging";
571 r = "reverseCharging";
574 r = "creditCardCharging";
577 r = "callForwardingUnconditional";
580 r = "callForwardingBusy";
583 r = "callForwardingNoReply";
586 r = "callDeflection";
592 sprintf(buffer, "unknown billing-id value %d!", val);
598 /*---------------------------------------------------------------------------*
600 *---------------------------------------------------------------------------*/
602 F_1_1(char *pbuf, int val)
605 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_1_1, val = %d\n", val);
609 sprintf((pbuf+strlen(pbuf)), "\t invokeComponent\n");
610 state = ST_EXP_INV_ID;
614 /*---------------------------------------------------------------------------*
616 *---------------------------------------------------------------------------*/
618 F_1_2(char *pbuf, int val)
621 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_1_2, val = %d\n", val);
625 sprintf((pbuf+strlen(pbuf)), "\t returnResult\n");
626 state = ST_EXP_RR_INV_ID;
629 /*---------------------------------------------------------------------------*
631 *---------------------------------------------------------------------------*/
633 F_1_3(char *pbuf, int val)
636 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_1_3, val = %d\n", val);
640 sprintf((pbuf+strlen(pbuf)), "\t returnError\n");
644 /*---------------------------------------------------------------------------*
646 *---------------------------------------------------------------------------*/
648 F_1_4(char *pbuf, int val)
651 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_1_4, val = %d\n", val);
655 sprintf((pbuf+strlen(pbuf)), "\t reject\n");
656 state = ST_EXP_REJ_INV_ID;
660 /*---------------------------------------------------------------------------*
661 * return result: invoke id
662 *---------------------------------------------------------------------------*/
664 F_RJ2(char *pbuf, int val)
667 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RJ2, val = %d\n", val);
671 sprintf((pbuf+strlen(pbuf)), "\t InvokeIdentifier = %d\n", val);
672 state = ST_EXP_REJ_OP_VAL;
676 /*---------------------------------------------------------------------------*
677 * reject, general problem
678 *---------------------------------------------------------------------------*/
680 F_RJ30(char *pbuf, int val)
683 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RJ30, val = %d\n", val);
687 sprintf((pbuf+strlen(pbuf)), "\t General problem\n");
694 sprintf((pbuf+strlen(pbuf)), "\t problem = unrecognized component\n");
697 sprintf((pbuf+strlen(pbuf)), "\t problem = mistyped component\n");
700 sprintf((pbuf+strlen(pbuf)), "\t problem = badly structured component\n");
703 sprintf((pbuf+strlen(pbuf)), "\t problem = unknown problem code 0x%x\n", val);
710 /*---------------------------------------------------------------------------*
711 * reject, invoke problem
712 *---------------------------------------------------------------------------*/
714 F_RJ31(char *pbuf, int val)
717 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RJ31, val = %d\n", val);
721 sprintf((pbuf+strlen(pbuf)), "\t Invoke problem\n");
728 sprintf((pbuf+strlen(pbuf)), "\t problem = duplicate invocation\n");
731 sprintf((pbuf+strlen(pbuf)), "\t problem = unrecognized operation\n");
734 sprintf((pbuf+strlen(pbuf)), "\t problem = mistyped argument\n");
737 sprintf((pbuf+strlen(pbuf)), "\t problem = resource limitation\n");
740 sprintf((pbuf+strlen(pbuf)), "\t problem = initiator releasing\n");
743 sprintf((pbuf+strlen(pbuf)), "\t problem = unrecognized linked identifier\n");
746 sprintf((pbuf+strlen(pbuf)), "\t problem = linked resonse unexpected\n");
749 sprintf((pbuf+strlen(pbuf)), "\t problem = unexpected child operation\n");
752 sprintf((pbuf+strlen(pbuf)), "\t problem = unknown problem code 0x%x\n", val);
759 /*---------------------------------------------------------------------------*
760 * reject, return result problem
761 *---------------------------------------------------------------------------*/
763 F_RJ32(char *pbuf, int val)
766 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RJ32, val = %d\n", val);
770 sprintf((pbuf+strlen(pbuf)), "\t Return result problem\n");
777 sprintf((pbuf+strlen(pbuf)), "\t problem = unrecognized invocation\n");
780 sprintf((pbuf+strlen(pbuf)), "\t problem = return response unexpected\n");
783 sprintf((pbuf+strlen(pbuf)), "\t problem = mistyped result\n");
786 sprintf((pbuf+strlen(pbuf)), "\t problem = unknown problem code 0x%x\n", val);
793 /*---------------------------------------------------------------------------*
794 * reject, return error problem
795 *---------------------------------------------------------------------------*/
797 F_RJ33(char *pbuf, int val)
800 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RJ33, val = %d\n", val);
804 sprintf((pbuf+strlen(pbuf)), "\t Return error problem\n");
811 sprintf((pbuf+strlen(pbuf)), "\t problem = unrecognized invocation\n");
814 sprintf((pbuf+strlen(pbuf)), "\t problem = error response unexpected\n");
817 sprintf((pbuf+strlen(pbuf)), "\t problem = unrecognized error\n");
820 sprintf((pbuf+strlen(pbuf)), "\t problem = unexpected error\n");
823 sprintf((pbuf+strlen(pbuf)), "\t problem = mistyped parameter\n");
826 sprintf((pbuf+strlen(pbuf)), "\t problem = unknown problem code 0x%x\n", val);
833 /*---------------------------------------------------------------------------*
834 * invoke component: invoke id
835 *---------------------------------------------------------------------------*/
837 F_2(char *pbuf, int val)
840 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_2, val = %d\n", val);
844 sprintf((pbuf+strlen(pbuf)), "\t InvokeIdentifier = %d\n", val);
845 state = ST_EXP_OP_VAL;
849 /*---------------------------------------------------------------------------*
850 * return result: invoke id
851 *---------------------------------------------------------------------------*/
853 F_RR2(char *pbuf, int val)
856 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RR2, val = %d\n", val);
860 sprintf((pbuf+strlen(pbuf)), "\t InvokeIdentifier = %d\n", val);
861 state = ST_EXP_RR_OP_VAL;
865 /*---------------------------------------------------------------------------*
866 * invoke component: operation value
867 *---------------------------------------------------------------------------*/
869 F_3(char *pbuf, int val)
872 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_3, val = %d\n", val);
876 sprintf((pbuf+strlen(pbuf)), "\t Operation Value = %s (%d)\n", opval_str(val), val);
881 /*---------------------------------------------------------------------------*
882 * return result: operation value
883 *---------------------------------------------------------------------------*/
885 F_RR3(char *pbuf, int val)
888 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RR3, val = %d\n", val);
892 sprintf((pbuf+strlen(pbuf)), "\t Operation Value = %s (%d)\n", opval_str(val), val);
893 state = ST_EXP_RR_RESULT;
897 /*---------------------------------------------------------------------------*
898 * return result: RESULT
899 *---------------------------------------------------------------------------*/
901 F_RRR(char *pbuf, int val)
904 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_RRR, val = %d\n", val);
909 /*---------------------------------------------------------------------------*
911 *---------------------------------------------------------------------------*/
913 F_4(char *pbuf, int val)
916 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_4, val = %d\n", val);
920 sprintf((pbuf+strlen(pbuf)), "\t specificChargingUnits\n");
925 /*---------------------------------------------------------------------------*
927 *---------------------------------------------------------------------------*/
929 F_4_1(char *pbuf, int val)
932 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_4_1, val = %d\n", val);
936 sprintf((pbuf+strlen(pbuf)), "\t freeOfCharge\n");
941 /*---------------------------------------------------------------------------*
943 *---------------------------------------------------------------------------*/
945 F_4_2(char *pbuf, int val)
948 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_4_2, val = %d\n", val);
952 sprintf((pbuf+strlen(pbuf)), "\t chargeNotAvailable\n");
957 /*---------------------------------------------------------------------------*
959 *---------------------------------------------------------------------------*/
961 F_5(char *pbuf, int val)
964 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_5, val = %d\n", val);
968 sprintf((pbuf+strlen(pbuf)), "\t recordedUnitsList [1]\n");
973 /*---------------------------------------------------------------------------*
975 *---------------------------------------------------------------------------*/
977 F_6(char *pbuf, int val)
980 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_6, val = %d\n", val);
984 sprintf((pbuf+strlen(pbuf)), "\t RecordedUnits\n");
989 /*---------------------------------------------------------------------------*
991 *---------------------------------------------------------------------------*/
993 F_7(char *pbuf, int val)
996 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_7, val = %d\n", val);
1000 sprintf((pbuf+strlen(pbuf)), "\t NumberOfUnits = %d\n", val);
1001 state = ST_EXP_TOCI;
1005 /*---------------------------------------------------------------------------*
1007 *---------------------------------------------------------------------------*/
1009 F_8(char *pbuf, int val)
1012 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_8, val = %d\n", val);
1016 sprintf((pbuf+strlen(pbuf)), "\t typeOfChargingInfo = %s\n", val == 0 ? "subTotal" : "total");
1017 state = ST_EXP_DBID;
1021 /*---------------------------------------------------------------------------*
1023 *---------------------------------------------------------------------------*/
1025 F_9(char *pbuf, int val)
1028 sprintf((pbuf+strlen(pbuf)), "next_state: exec F_9, val = %d\n", val);
1032 sprintf((pbuf+strlen(pbuf)), "\t AOCDBillingId = %s (%d)\n", bid_str(val), val);
1037 /*---------------------------------------------------------------------------*
1039 *---------------------------------------------------------------------------*/
1040 static struct statetab {
1041 int currstate; /* input: current state we are in */
1042 int form; /* input: current tag form */
1043 int class; /* input: current tag class */
1044 int code; /* input: current tag code */
1045 void (*func)(char *,int); /* output: func to exec */
1048 /* current state tag form tag class tag code function */
1049 /* --------------------- ---------------------- ---------------------- ---------------------- ----------------*/
1053 {ST_EXP_COMP_TYP, FAC_TAGFORM_CON, FAC_TAGCLASS_COS, 1, F_1_1 },
1054 {ST_EXP_COMP_TYP, FAC_TAGFORM_CON, FAC_TAGCLASS_COS, 2, F_1_2 },
1055 {ST_EXP_COMP_TYP, FAC_TAGFORM_CON, FAC_TAGCLASS_COS, 3, F_1_3 },
1056 {ST_EXP_COMP_TYP, FAC_TAGFORM_CON, FAC_TAGCLASS_COS, 4, F_1_4 },
1057 {ST_EXP_INV_ID, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_INT, F_2 },
1058 {ST_EXP_OP_VAL, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_INT, F_3 },
1059 {ST_EXP_INFO, FAC_TAGFORM_CON, FAC_TAGCLASS_UNI, FAC_CODEUNI_SEQ, F_4 },
1060 {ST_EXP_INFO, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_NULL, F_4_1 },
1061 {ST_EXP_INFO, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 1, F_4_2 },
1062 {ST_EXP_RUL, FAC_TAGFORM_CON, FAC_TAGCLASS_COS, 1, F_5 },
1063 {ST_EXP_RU, FAC_TAGFORM_CON, FAC_TAGCLASS_UNI, FAC_CODEUNI_SEQ, F_6 },
1064 {ST_EXP_RNOU, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_INT, F_7 },
1065 {ST_EXP_TOCI, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 2, F_8 },
1066 {ST_EXP_DBID, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 3, F_9 },
1070 {ST_EXP_RR_INV_ID, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_INT, F_RR2 },
1071 {ST_EXP_RR_OP_VAL, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_INT, F_RR3 },
1072 {ST_EXP_RR_RESULT, FAC_TAGFORM_CON, FAC_TAGCLASS_UNI, FAC_CODEUNI_SET, F_RRR },
1074 /* current state tag form tag class tag code function */
1075 /* --------------------- ---------------------- ---------------------- ---------------------- ----------------*/
1078 {ST_EXP_REJ_INV_ID, FAC_TAGFORM_PRI, FAC_TAGCLASS_UNI, FAC_CODEUNI_INT, F_RJ2 },
1079 {ST_EXP_REJ_OP_VAL, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 0, F_RJ30 },
1080 {ST_EXP_REJ_OP_VAL, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 1, F_RJ31 },
1081 {ST_EXP_REJ_OP_VAL, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 2, F_RJ32 },
1082 {ST_EXP_REJ_OP_VAL, FAC_TAGFORM_PRI, FAC_TAGCLASS_COS, 3, F_RJ33 },
1086 {-1, -1, -1, -1, NULL }
1089 /*---------------------------------------------------------------------------*
1090 * state decode for do_component
1091 *---------------------------------------------------------------------------*/
1093 next_state(char *pbuf, int class, int form, int code, int val)
1098 sprintf((pbuf+strlen(pbuf)), "next_state: class=%d, form=%d, code=%d, val=%d\n", class, form, code, val);
1103 if((statetab[i].currstate > state) ||
1104 (statetab[i].currstate == -1))
1109 if((statetab[i].currstate == state) &&
1110 (statetab[i].form == form) &&
1111 (statetab[i].class == class) &&
1112 (statetab[i].code == code))
1114 (*statetab[i].func)(pbuf, val);
1120 /*---------------------------------------------------------------------------*
1121 * decode OBJECT IDENTIFIER
1122 *---------------------------------------------------------------------------*/
1124 object_id(int comp_length, unsigned char *pbuf)
1132 sprintf((pbuf+strlen(pbuf)), "\t");
1134 for(i = comp_length-1; i >= 0; i--, j++)
1136 sprintf((pbuf+strlen(pbuf)), "0x%02x = %d", *byte_buf, *byte_buf);
1142 if(x >= 0 && x <= 39)
1144 sprintf((pbuf+strlen(pbuf)), " ccitt/itu-t (0)");
1148 sprintf((pbuf+strlen(pbuf)), " recommendation (0)");
1151 sprintf((pbuf+strlen(pbuf)), " question (1)");
1154 sprintf((pbuf+strlen(pbuf)), " administration (2)");
1157 sprintf((pbuf+strlen(pbuf)), " network-operator (3)");
1160 sprintf((pbuf+strlen(pbuf)), " identified-organization (4)");
1164 sprintf((pbuf+strlen(pbuf)), " error: undefined-identifier (%d)", x);
1168 else if(x >= 40 && x <= 79)
1170 sprintf((pbuf+strlen(pbuf)), " iso (1)");
1175 sprintf((pbuf+strlen(pbuf)), " standard (0)");
1178 sprintf((pbuf+strlen(pbuf)), " registration-authority (1)");
1181 sprintf((pbuf+strlen(pbuf)), " member-body (2)");
1184 sprintf((pbuf+strlen(pbuf)), " identified-organization (3)");
1188 sprintf((pbuf+strlen(pbuf)), " error: undefined-identifier (%d)", x);
1195 sprintf((pbuf+strlen(pbuf)), " joint-iso-ccitt (3) ??? (%d)", x);
1205 sprintf((pbuf+strlen(pbuf)), " etsi (0)");
1217 sprintf((pbuf+strlen(pbuf)), " mobileDomain (0)");
1221 sprintf((pbuf+strlen(pbuf)), " inDomain (1)");
1230 sprintf((pbuf+strlen(pbuf)), "\n\t");
1232 sprintf((pbuf+strlen(pbuf)), "\n");